package org.geogebra.common.geogebra3D.kernel3D.commands; import org.geogebra.common.geogebra3D.kernel3D.algos.AlgoTranslateVector3D; import org.geogebra.common.geogebra3D.kernel3D.algos.AlgoVectorPoint3D; import org.geogebra.common.geogebra3D.kernel3D.geos.GeoVector3D; import org.geogebra.common.kernel.CircularDefinitionException; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.algos.AlgoTranslateVector; import org.geogebra.common.kernel.arithmetic.Command; import org.geogebra.common.kernel.commands.CmdTranslate; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoPolygon; import org.geogebra.common.kernel.geos.Translateable; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.kernel.kernelND.GeoVectorND; import org.geogebra.common.main.MyError; /** * Translate command * */ public class CmdTranslate3D extends CmdTranslate { /** * @param kernel * Kernel */ public CmdTranslate3D(Kernel kernel) { super(kernel); } @Override public GeoElement[] process(Command c) throws MyError, CircularDefinitionException { String label = c.getLabel(); int n = c.getArgumentNumber(); boolean[] ok = new boolean[n]; GeoElement[] arg; GeoElement[] ret = new GeoElement[1]; switch (n) { case 2: arg = resArgs(c); // check if there is a 3D geo if (arg[0].isGeoElement3D() || arg[1].isGeoElement3D()) { if (arg[0].isGeoVector() && arg[1].isGeoPoint()) { AlgoTranslateVector algo = getAlgoTranslateVector(label, arg[0], arg[1]); ret[0] = (GeoElement) algo.getTranslatedVector(); return ret; } ok[0] = (arg[0] instanceof Translateable || arg[0] instanceof GeoPolygon || arg[0].isGeoList()); // translate object if (ok[0] && (ok[1] = (arg[1].isGeoVector()))) { ret = kernelA.getManager3D().Translate3D(label, arg[0], (GeoVectorND) arg[1]); return ret; } else if (ok[0] && (ok[1] = (arg[1] instanceof GeoPointND))) { // wrap (1,2,3) as Vector[(1,2,3)] AlgoVectorPoint3D algoVP = new AlgoVectorPoint3D(cons, (GeoPointND) arg[1]); cons.removeFromConstructionList(algoVP); ret = kernelA.getManager3D().Translate3D(label, arg[0], algoVP.getVector()); return ret; } throw argErr(app, c, getBadArg(ok, arg)); } break; } return super.process(c); } @Override protected AlgoTranslateVector getAlgoTranslateVector(String label, GeoElement v, GeoElement P) { if (v.isGeoElement3D()) { return new AlgoTranslateVector3D(cons, label, (GeoVector3D) v, (GeoPointND) P); } return super.getAlgoTranslateVector(label, v, P); } }