package org.geogebra.common.geogebra3D.kernel3D.algos; import org.geogebra.common.euclidian3D.EuclidianView3DInterface; import org.geogebra.common.geogebra3D.kernel3D.geos.GeoPoint3D; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.Matrix.Coords; import org.geogebra.common.kernel.algos.AlgoDrawingPadCorner; import org.geogebra.common.kernel.arithmetic.NumberValue; import org.geogebra.common.kernel.commands.Commands; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.main.App; /** * Extends AlgoDrawingPadCorner for 3D view * * @author mathieu * */ public class AlgoDrawingPadCorner3D extends AlgoDrawingPadCorner { /** * * @param cons * cons * @param label * label * @param number * corner id * @param evNum * euclidian view id */ public AlgoDrawingPadCorner3D(Construction cons, String label, GeoNumberValue number, GeoNumberValue evNum) { super(cons, label, number, evNum, 9); } /** * * @param cons * construction * @return new point */ @Override protected GeoPointND newGeoPoint(Construction cons) { return new GeoPoint3D(cons); } /** * * @param nv * number value * @return true if nv has a value for 3D view (at this very moment) */ static final public boolean is3D(NumberValue nv) { return Kernel.isEqual(nv.getDouble(), -1); } @Override public final void compute() { App app = cons.getApplication(); if (evNum != null && is3D(evNum)) { if (!app.hasEuclidianView3D() || !corner.isGeoElement3D()) { corner.setUndefined(); return; } EuclidianView3DInterface ev = app.getEuclidianView3D(); switch ((int) number.getDouble()) { case 1: corner.setCoords(ev.getXmin(), ev.getYmin(), ev.getZmin(), 1.0); break; case 2: corner.setCoords(ev.getXmax(), ev.getYmin(), ev.getZmin(), 1.0); break; case 3: corner.setCoords(ev.getXmax(), ev.getYmax(), ev.getZmin(), 1.0); break; case 4: corner.setCoords(ev.getXmin(), ev.getYmax(), ev.getZmin(), 1.0); break; case 5: corner.setCoords(ev.getXmin(), ev.getYmin(), ev.getZmax(), 1.0); break; case 6: corner.setCoords(ev.getXmax(), ev.getYmin(), ev.getZmax(), 1.0); break; case 7: corner.setCoords(ev.getXmax(), ev.getYmax(), ev.getZmax(), 1.0); break; case 8: corner.setCoords(ev.getXmin(), ev.getYmax(), ev.getZmax(), 1.0); break; case 9: // return size of Graphics View in pixels corner.setCoords(ev.getWidth(), ev.getHeight(), 1.0); break; case 10: // return size of Window in pixels // (to help with sizing for export to applet) // doesn't work very well as it receives updates only when // EuclidianView is changed corner.setCoords(app.getWidth(), app.getHeight(), 1.0); break; case 11: // return view direction Coords eye = ev.getEyePosition(); corner.setCoords(eye.getX(), eye.getY(), eye.getZ(), 1.0); break; default: corner.setUndefined(); break; } } else { // ev1 or ev2 super.compute(); } } @Override public Commands getClassName() { if (corner.isGeoElement3D() && (kernel.isSaving() || kernel.isGettingUndo() || getConstruction().isGettingXMLForReplace())) { return Commands.CornerThreeD; // save in XML (and undo XML) this // specific token to distinguish // from 2D corner command } return super.getClassName(); } }