package org.geogebra.common.geogebra3D.kernel3D.commands; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.arithmetic.Command; import org.geogebra.common.kernel.commands.CmdCircle; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.kernelND.GeoDirectionND; import org.geogebra.common.kernel.kernelND.GeoLineND; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.main.MyError; /** * Circle command * */ public class CmdCircle3D extends CmdCircle { /** * @param kernel * Kernel */ public CmdCircle3D(Kernel kernel) { super(kernel); } @Override protected GeoElement[] process2(Command c, GeoElement[] arg, boolean[] ok) throws MyError { if ((ok[0] = (arg[0] instanceof GeoLineND)) && (ok[1] = (arg[1].isGeoPoint()))) { GeoElement[] ret = { kernelA.getManager3D().Circle3D(c.getLabel(), (GeoLineND) arg[0], (GeoPointND) arg[1]) }; return ret; } return super.process2(c, arg, ok); } @Override protected GeoElement circle(String label, GeoPointND a, GeoNumberValue v) { GeoDirectionND orientation = CommandProcessor3D .getCurrentViewOrientation(kernelA, app); if (orientation == null) { if (a.isGeoElement3D()) { orientation = kernelA.getXOYPlane(); } else { // use 2D algo return super.circle(label, a, v); } } return kernelA.getManager3D().Circle3D(label, a, v, orientation); } @Override protected GeoElement circle(String label, GeoPointND a, GeoPointND b) { GeoDirectionND orientation = CommandProcessor3D .getCurrentViewOrientation(kernelA, app); if (orientation == null) { if (a.isGeoElement3D() || b.isGeoElement3D()) { orientation = kernelA.getXOYPlane(); } else { // use 2D algo return super.circle(label, a, b); } } return kernelA.getManager3D().Circle3D(label, a, b, orientation); } @Override protected GeoElement[] process3(Command c, GeoElement[] arg, boolean[] ok) throws MyError { if ((ok[0] = (arg[0].isGeoPoint())) && (ok[2] = (arg[2] instanceof GeoDirectionND))) { if (arg[1] instanceof GeoNumberValue) { GeoElement[] ret = { kernelA.getManager3D().Circle3D( c.getLabel(), (GeoPointND) arg[0], (GeoNumberValue) arg[1], (GeoDirectionND) arg[2]) }; return ret; } else if (arg[1].isGeoPoint()) { GeoElement[] ret = { kernelA.getManager3D().Circle3D( c.getLabel(), (GeoPointND) arg[0], (GeoPointND) arg[1], (GeoDirectionND) arg[2]) }; return ret; } ok[1] = false; } return super.process3(c, arg, ok); } @Override protected GeoElement circle(String label, GeoPointND a, GeoPointND b, GeoPointND c) { if (a.isGeoElement3D() || b.isGeoElement3D() || c.isGeoElement3D()) { return kernelA.getManager3D().Circle3D(label, a, b, c); } return super.circle(label, a, b, c); } }