import javax.vecmath.Vector3d;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
import org.simantics.g3d.math.EulerTools;
import org.simantics.g3d.math.EulerTools.Order;
import org.simantics.g3d.math.MathTools;
import org.simantics.g3d.scenegraph.IG3DNode;
import org.simantics.g3d.scenegraph.base.INode;
import org.simantics.g3d.scenegraph.structural.IStructuralNode;
+import org.simantics.g3d.toolbar.ToolComposite;
import org.simantics.g3d.vtk.Activator;
import org.simantics.g3d.vtk.common.VTKNodeMap;
import org.simantics.g3d.vtk.gizmo.RotateAxisGizmo;
//AxisAngle4d rotation = new AxisAngle4d();
Quat4d worldOrientation = new Quat4d();
+ protected ToolComposite toolComposite;
+ protected Combo axisCombo;
+
public void setNode(IG3DNode node) {
this.node = node;
if ((node instanceof IStructuralNode) && ((IStructuralNode)node).isPartOfInstantiatedModel() && !((IStructuralNode)node).isInstantiatedModelRoot()) {
return node;
}
- public RotateAction(InteractiveVtkComposite panel, VTKNodeMap<?, ? extends INode> nodeMap) {
+ public RotateAction(InteractiveVtkComposite panel, VTKNodeMap<?, ? extends INode> nodeMap, ToolComposite toolComposite) {
super(panel);
setImageDescriptor(Activator.imageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_rotate_clockwise.png"));
setText("Rotate");
this.nodeMap = nodeMap;
-
+ this.toolComposite = toolComposite;
steps = 36;
angles = new double[steps+1];
dragCursor = Display.getCurrent().getSystemCursor(SWT.CURSOR_CROSS);
}
+ protected void createTools(ToolComposite toolComposite) {
+ Label label = new Label(toolComposite, SWT.READ_ONLY);
+ label.setText("Rotate axis:");
+ axisCombo = new Combo(toolComposite, SWT.READ_ONLY);
+ axisCombo.add("X");
+ axisCombo.add("Y");
+ axisCombo.add("Z");
+ axisCombo.add("Camera");
+ axisCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Combo c = (Combo)e.getSource();
+ index = c.getSelectionIndex();
+ updateLock();
+ panel.getComponent().setFocus();
+ }
+ });
+ axisCombo.select(index);
+
+ Button close = new Button(toolComposite, SWT.PUSH);
+ close.setText("Close");
+ close.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ panel.useDefaultAction();
+ };
+ });
+ toolComposite.relayout();
+ }
+
public void attach() {
if (node == null)
return;
-
+ if (toolComposite != null) {
+ createTools(toolComposite);
+ }
super.attach();
ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() {
public void run() {
}
public void deattach() {
-
+ if (toolComposite != null) {
+ toolComposite.clear();
+ axisCombo = null;
+ }
node = null;
nodeMap.commit("Rotate");
deattachUI();
if (e.getKeyCode() == KeyEvent.VK_G) {
worldCoord = !worldCoord;
}
- gizmo.setType(index);
- panel.refresh();
+
+ updateLock();
+
return true;
}
+ private void updateLock() {
+ gizmo.setType(index);
+ if (axisCombo != null)
+ axisCombo.select(index);
+ panel.refresh();
+ }
+
@Override
public boolean keyReleased(KeyEvent e) {
return false;
private void update() {
Vector3d nodePos = node.getWorldPosition();
- System.out.println(nodePos);
+// System.out.println(nodePos);
gizmo.setPosition(nodePos);
if (worldCoord) {
gizmo.setRotation(new AxisAngle4d());
// intersection point
j.set(i2);
i.cross(j, axis);
- System.out.println("I,J " + i + " " + j);
+// System.out.println("I,J " + i + " " + j);
double angleI = i2.angle(i);
double angleJ = i2.angle(j);
prevAngle = Math.atan2(Math.cos(angleJ), Math.cos(angleI));
taxis = new Vector3d(axis);
MathTools.rotate(parentWorldOrientation, axis, axis);
}
- System.out.println(inputType);
+// System.out.println(inputType);
if (inputType == InputType.INTERSECT) {
double s[] = new double[2];
double angleI = i2.angle(i);
double angleJ = i2.angle(j);
double angle = Math.atan2(Math.cos(angleJ), Math.cos(angleI));
- System.out.println("Angle " + angle + " i " + angleI + " j " + angleJ + " prev " + prevAngle);
+// System.out.println("Angle " + angle + " i " + angleI + " j " + angleJ + " prev " + prevAngle);
if(!worldCoord)
axis = taxis;
if (useStep) {
//Quat4d q = MathTools.getQuat(euler);
Quat4d q = EulerTools.getQuatFromEuler(order, euler);
setOrientation(q);
- System.out.println(" (" + MathTools.radToDeg(euler.x) + " " + MathTools.radToDeg(euler.y) + " " + MathTools.radToDeg(euler.z) + ") " + qrot + " "+ q);
+// System.out.println(" (" + MathTools.radToDeg(euler.x) + " " + MathTools.radToDeg(euler.y) + " " + MathTools.radToDeg(euler.z) + ") " + qrot + " "+ q);
} else {
setOrientation(qrot);
}
//Quat4d q = MathTools.getQuat(euler);
Quat4d q = EulerTools.getQuatFromEuler(order, euler);
setOrientation(q);
- System.out.println(" (" + MathTools.radToDeg(euler.x) + " " + MathTools.radToDeg(euler.y) + " " + MathTools.radToDeg(euler.z) + ") " + qrot + " "+ q);
+// System.out.println(" (" + MathTools.radToDeg(euler.x) + " " + MathTools.radToDeg(euler.y) + " " + MathTools.radToDeg(euler.z) + ") " + qrot + " "+ q);
} else {
setOrientation(qrot);
}
case Z:
return new Vector3d(0.0, 0.0, 1.0);
case P:
- Vector3d axis = new Vector3d(panel.getRenderer().GetActiveCamera()
- .GetDirectionOfProjection());
+ Vector3d axis = new Vector3d(panel.getRenderer().GetActiveCamera().GetDirectionOfProjection());
axis.normalize();
return axis;
default: