package org.geogebra.common.geogebra3D.kernel3D.commands; import org.geogebra.common.geogebra3D.kernel3D.algos.AlgoPointVector3D; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.Path; import org.geogebra.common.kernel.Region; import org.geogebra.common.kernel.algos.AlgoPointsFromList; import org.geogebra.common.kernel.arithmetic.Command; import org.geogebra.common.kernel.commands.CmdPoint; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoList; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.kernel.kernelND.GeoVectorND; import org.geogebra.common.main.MyError; /** * Point[ <Path (3D)> ] or Point[ <Region (3D)> ] or CmdPoint */ public class CmdPoint3D extends CmdPoint { /** * @param kernel * Kernel */ public CmdPoint3D(Kernel kernel) { super(kernel); } @Override public GeoElement[] process(Command c) throws MyError { int n = c.getArgumentNumber(); GeoElement[] arg; switch (n) { case 1: arg = resArgs(c); GeoElement geo0 = arg[0]; if (geo0.isGeoElement3D() || (geo0.isGeoList() && ((GeoList) geo0).containsGeoElement3D())) { if (geo0.isPath()) { GeoElement[] ret = { (GeoElement) kernelA.getManager3D() .Point3D(c.getLabel(), (Path) geo0, false) }; return ret; } // if arg[0] isn't a Path, try to process it as a region (e.g. // GeoPlane3D) if (geo0.isRegion()) { GeoElement[] ret = { (GeoElement) kernelA.getManager3D() .Point3DIn(c.getLabel(), (Region) arg[0], false) }; return ret; } throw argErr(app, c, geo0); } else if (geo0.isRegion3D() && !geo0.isPath()) { GeoElement[] ret = { (GeoElement) kernelA.getManager3D() .Point3DIn(c.getLabel(), (Region) arg[0], false) }; return ret; } else if (arg[0].isGeoList() && ((GeoList) arg[0]) .getGeoElementForPropertiesDialog().isGeoNumeric()) { if ((((GeoList) arg[0]).get(0).isGeoNumeric() && ((GeoList) arg[0]).size() == 3) || (((GeoList) arg[0]).get(0).isGeoList() && ((GeoList) ((GeoList) arg[0]).get(0)) .size() == 3)) { AlgoPointsFromList algo = new AlgoPointsFromList(cons, c.getLabels(), !cons.isSuppressLabelsActive(), (GeoList) arg[0]); GeoElement[] ret = algo.getPoints3D(); return ret; } } } return super.process(c); } @Override protected GeoElement point(String label, Path path, GeoNumberValue value) { if (path.isGeoElement3D() || (((GeoElement) path).isGeoList() && ((GeoList) path).containsGeoElement3D())) { return (GeoElement) kernelA.getManager3D().Point3D(label, path, value); } return super.point(label, path, value); } @Override protected GeoPointND point(String label, GeoPointND point, GeoVectorND vector) { if (point.isGeoElement3D() || vector.isGeoElement3D()) { AlgoPointVector3D algo = new AlgoPointVector3D(cons, point, vector); algo.getQ().setLabel(label); return algo.getQ(); } return super.point(label, point, vector); } }