package org.geogebra.common.geogebra3D.kernel3D.commands; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.Path; import org.geogebra.common.kernel.algos.AlgoDependentNumber; import org.geogebra.common.kernel.arithmetic.Command; import org.geogebra.common.kernel.arithmetic.ExpressionNode; import org.geogebra.common.kernel.arithmetic.VectorArithmetic; import org.geogebra.common.kernel.arithmetic.VectorNDValue; import org.geogebra.common.kernel.commands.CmdCurveCartesian; import org.geogebra.common.kernel.geos.GeoCurveCartesian; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoFunction; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.geos.GeoNumeric; import org.geogebra.common.kernel.geos.GeoPoly; import org.geogebra.common.kernel.geos.ParametricCurve; import org.geogebra.common.kernel.kernelND.GeoConicND; import org.geogebra.common.kernel.kernelND.GeoLineND; import org.geogebra.common.main.MyError; /** * Surface[expression, expression, expression, u, umin, umax, v, vmin, vmax] * Surface[ point expression, u, umin, umax, v, vmin, vmax] */ public class CmdSurfaceCartesian3D extends CmdCurveCartesian { /** * @param kernel * Kernel */ public CmdSurfaceCartesian3D(Kernel kernel) { super(kernel); } @Override public GeoElement[] process(Command c) throws MyError { int n = c.getArgumentNumber(); boolean[] ok = new boolean[n]; GeoElement[] arg; switch (n) { case 2: arg = resArgs(c); if ((ok[0] = (arg[0] instanceof GeoFunction || arg[0] instanceof GeoCurveCartesian)) && (ok[1] = arg[1] instanceof GeoNumberValue)) { GeoElement[] ret = new GeoElement[1]; ret[0] = kernelA.getManager3D().SurfaceOfRevolution( c.getLabel(), (ParametricCurve) arg[0], (GeoNumberValue) arg[1]); return ret; } if ((ok[0] = (arg[0] instanceof GeoPoly || arg[0] instanceof GeoConicND)) && (ok[1] = arg[1] instanceof GeoNumberValue)) { GeoElement[] ret = new GeoElement[1]; ret[0] = kernelA.getManager3D().SurfaceOfRevolution( c.getLabel(), (Path) arg[0], (GeoNumberValue) arg[1], null); return ret; } throw argErr(app, c, getBadArg(ok, arg)); case 3: arg = resArgs(c); if ((ok[0] = (arg[0] instanceof ParametricCurve)) && (ok[1] = arg[1] instanceof GeoNumberValue) && (ok[2] = arg[2] instanceof GeoLineND)) { GeoElement[] ret = new GeoElement[1]; ret[0] = kernelA.getManager3D().SurfaceOfRevolution( c.getLabel(), (ParametricCurve) arg[0], (GeoNumberValue) arg[1], (GeoLineND) arg[2]); return ret; } if ((ok[0] = (arg[0] instanceof GeoPoly || arg[0] instanceof GeoConicND)) && (ok[1] = arg[1] instanceof GeoNumberValue) && (ok[2] = arg[2] instanceof GeoLineND)) { GeoElement[] ret = new GeoElement[1]; ret[0] = kernelA.getManager3D().SurfaceOfRevolution( c.getLabel(), (Path) arg[0], (GeoNumberValue) arg[1], (GeoLineND) arg[2]); return ret; } throw argErr(app, c, getBadArg(ok, arg)); case 7: // create local variables and resolve arguments // Surface[(1;a;b),a,0,pi,b,0,pi] arg = resArgsLocalNumVar(c, new int[] { 1, 4 }, new int[] { 2, 5 }); if ((ok[0] = arg[0] instanceof VectorNDValue) && (ok[1] = arg[1] instanceof GeoNumeric) && (ok[2] = arg[2] instanceof GeoNumberValue) && (ok[3] = arg[3] instanceof GeoNumberValue) && (ok[4] = arg[4] instanceof GeoNumeric) && (ok[5] = arg[5] instanceof GeoNumberValue) && (ok[6] = arg[6] instanceof GeoNumberValue)) { GeoNumberValue[] coords = new GeoNumberValue[3]; ExpressionNode exp = c.getArgument(0); for (int i = 0; i < 3; i++) { kernelA.getAlgebraProcessor(); ExpressionNode cx = VectorArithmetic .computeCoord(exp, i); AlgoDependentNumber nx = new AlgoDependentNumber(cons, cx, false); cons.removeFromConstructionList(nx); coords[i] = nx.getNumber(); } GeoElement[] ret = new GeoElement[1]; ret[0] = kernelA.getManager3D().SurfaceCartesian3D(c.getLabel(), exp, coords[0], coords[1], coords[2], (GeoNumeric) arg[1], (GeoNumberValue) arg[2], (GeoNumberValue) arg[3], (GeoNumeric) arg[4], (GeoNumberValue) arg[5], (GeoNumberValue) arg[6]); return ret; } throw argErr(app, c, getBadArg(ok, arg)); case 9: // create local variables and resolve arguments arg = resArgsLocalNumVar(c, new int[] { 3, 6 }, new int[] { 4, 7 }); if ((ok[0] = arg[0] instanceof GeoNumberValue) && (ok[1] = arg[1] instanceof GeoNumberValue) && (ok[2] = arg[2] instanceof GeoNumberValue) && (ok[3] = arg[3] instanceof GeoNumeric) && (ok[4] = arg[4] instanceof GeoNumberValue) && (ok[5] = arg[5] instanceof GeoNumberValue) && (ok[6] = arg[6] instanceof GeoNumeric) && (ok[7] = arg[7] instanceof GeoNumberValue) && (ok[8] = arg[8] instanceof GeoNumberValue)) { GeoElement[] ret = new GeoElement[1]; ret[0] = kernelA.getManager3D().SurfaceCartesian3D(c.getLabel(), null, (GeoNumberValue) arg[0], (GeoNumberValue) arg[1], (GeoNumberValue) arg[2], (GeoNumeric) arg[3], (GeoNumberValue) arg[4], (GeoNumberValue) arg[5], (GeoNumeric) arg[6], (GeoNumberValue) arg[7], (GeoNumberValue) arg[8]); return ret; } throw argErr(app, c, getBadArg(ok, arg)); default: throw argNumErr(app, c, n); } } @Override protected String[] replaceXYarguments(ExpressionNode[] arg) { String[] newXYZ = new String[3]; if (arg.length == 9 || arg.length == 7) { int offset = arg.length - 6; // we have to replace "x", "y" newXYZ[0] = checkReplaced(arg, offset, "x", "u", offset); if (newXYZ[0] == null) { newXYZ[0] = checkReplaced(arg, offset + 3, "x", "u", offset); } newXYZ[1] = checkReplaced(arg, offset + 3, "y", "v", offset); if (newXYZ[1] == null) { newXYZ[1] = checkReplaced(arg, offset, "y", "v", offset); } } return newXYZ; } }