package org.geogebra.common.geogebra3D.kernel3D.commands;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.commands.CmdMirror;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.Transformable;
import org.geogebra.common.kernel.kernelND.GeoCoordSys2D;
import org.geogebra.common.kernel.kernelND.GeoLineND;
import org.geogebra.common.kernel.kernelND.GeoPointND;
/**
* Mirror at 3D point or 3D line
*
* @author mathieu
*
*/
public class CmdMirror3D extends CmdMirror {
/**
* constructor
*
* @param kernel
* kernel
*/
public CmdMirror3D(Kernel kernel) {
super(kernel);
}
@Override
protected GeoElement[] process2(String label, GeoElement[] arg,
boolean[] ok) {
GeoElement[] ret = new GeoElement[1];
if (arg[1] instanceof GeoCoordSys2D && !arg[1].isGeoConic()) { // no
// override
// for
// mirror
// at
// circle
ret = kernelA.getManager3D().Mirror3D(label, arg[0],
(GeoCoordSys2D) arg[1]);
return ret;
} else if (arg[0].isGeoElement3D() || arg[1].isGeoElement3D()) { // check
// if
// there
// is
// a
// 3D
// geo
if (arg[0] instanceof Transformable) {
if (arg[1].isGeoPoint()) {
ret = kernelA.getManager3D().Mirror3D(label, arg[0],
(GeoPointND) arg[1]);
return ret;
}
if (arg[1].isGeoLine()) {
ret = kernelA.getManager3D().Mirror3D(label, arg[0],
(GeoLineND) arg[1]);
return ret;
}
ok[1] = false;
} else {
ok[0] = false;
}
}
return super.process2(label, arg, ok);
}
}