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.MathTools;
import org.simantics.g3d.math.Ray;
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.TranslateAxisGizmo;
import org.simantics.g3d.vtk.utils.vtkUtil;
-import org.simantics.utils.threads.AWTThread;
import org.simantics.utils.threads.ThreadUtils;
import vtk.vtkProp;
public static final int YZ = 5;
public static final int P = 6;
- private VTKNodeMap nodeMap;
+ private VTKNodeMap<?, ? extends INode> nodeMap;
//private TranslateGizmo gizmo = new TranslateGizmo();
private TranslateAxisGizmo gizmo = new TranslateAxisGizmo();
protected IG3DNode node;
private Cursor activeCursor;// = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
private Cursor dragCursor;// = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
+ 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 TranslateAction(InteractiveVtkComposite panel, VTKNodeMap nodeMap) {
+ public TranslateAction(InteractiveVtkComposite panel, VTKNodeMap<?, ? extends INode> nodeMap, ToolComposite toolComposite) {
super(panel);
setImageDescriptor(Activator.imageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_out.png"));
setText("Translate");
activeCursor = Display.getCurrent().getSystemCursor(SWT.CURSOR_HAND);
dragCursor = Display.getCurrent().getSystemCursor(SWT.CURSOR_SIZEALL);
+ this.toolComposite = toolComposite;
+ }
+
+ protected void createTools(ToolComposite toolComposite) {
+ Label label = new Label(toolComposite, SWT.READ_ONLY);
+ label.setText("Translate direction:");
+ axisCombo = new Combo(toolComposite, SWT.READ_ONLY);
+ axisCombo.add("X");
+ axisCombo.add("Y");
+ axisCombo.add("Z");
+ axisCombo.add("XY");
+ axisCombo.add("XZ");
+ axisCombo.add("YZ");
+ 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);
+ }
+ setDBUndo(false);
super.attach();
ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() {
public void run() {
update();
}
});
-
-
-
}
public void deattach() {
-
+ if (toolComposite != null) {
+ toolComposite.clear();
+ axisCombo = null;
+ }
+ setDBUndo(true);
node = null;
nodeMap.commit("Translate");
deattachUI();
if (e.getKeyCode() == KeyEvent.VK_G) {
worldCoord = !worldCoord;
}
- gizmo.setType(index);
+ updateLock();
update();
//panel.repaint();
return true;
}
+ private void updateLock() {
+ gizmo.setType(index);
+ if (axisCombo != null)
+ axisCombo.select(index);
+ panel.refresh();
+ }
@Override
translate.x = s[0];
break;
- case Y :
- dir = new Vector3d(0.0,1.0,0.0);
- if(!worldCoord)
- MathTools.rotate(q, dir, dir);
- i1 = new Vector3d();
- i2 = new Vector3d();
- s = new double[2];
- MathTools.intersectStraightStraight( p, dir,ray.pos, ray.dir, i2, i1,s);
- translate.y = s[0];
- break;
- case Z :
- dir = new Vector3d(0.0,0.0,1.0);
- if(!worldCoord)
- MathTools.rotate(q, dir, dir);
- i1 = new Vector3d();
- i2 = new Vector3d();
- s = new double[2];
- MathTools.intersectStraightStraight( p, dir,ray.pos, ray.dir, i2, i1,s);
- translate.z = s[0];
- break;
- case XY :
- normal = new Vector3d(0.0,0.0,1.0);
- if(!worldCoord)
- MathTools.rotate(q, normal, normal);
- r = new Vector3d();
- if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) {
- r.sub(p);
- translate.x = r.x;
- translate.y = r.y;
- }
- break;
- case XZ :
- normal = new Vector3d(0.0,1.0,0.0);
- if(!worldCoord)
- MathTools.rotate(q, normal, normal);
- r = new Vector3d();
- if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) {
- r.sub(p);
- translate.x = r.x;
- translate.z = r.z;
- }
- break;
- case YZ :
- normal = new Vector3d(1.0,0.0,0.0);
- if(!worldCoord)
- MathTools.rotate(q, normal, normal);
- r = new Vector3d();
- if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) {
- r.sub(p);
- translate.y = r.y;
- translate.z = r.z;
- }
- break;
- default :
-
- return null;
+ case Y :
+ dir = new Vector3d(0.0,1.0,0.0);
+ if(!worldCoord)
+ MathTools.rotate(q, dir, dir);
+ i1 = new Vector3d();
+ i2 = new Vector3d();
+ s = new double[2];
+ MathTools.intersectStraightStraight( p, dir,ray.pos, ray.dir, i2, i1,s);
+ translate.y = s[0];
+ break;
+ case Z :
+ dir = new Vector3d(0.0,0.0,1.0);
+ if(!worldCoord)
+ MathTools.rotate(q, dir, dir);
+ i1 = new Vector3d();
+ i2 = new Vector3d();
+ s = new double[2];
+ MathTools.intersectStraightStraight( p, dir,ray.pos, ray.dir, i2, i1,s);
+ translate.z = s[0];
+ break;
+ case XY :
+ normal = new Vector3d(0.0,0.0,1.0);
+ if(!worldCoord)
+ MathTools.rotate(q, normal, normal);
+ r = new Vector3d();
+ if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) {
+ r.sub(p);
+ translate.x = r.x;
+ translate.y = r.y;
}
- translate.sub(offset);
- return translate;
+ break;
+ case XZ :
+ normal = new Vector3d(0.0,1.0,0.0);
+ if(!worldCoord)
+ MathTools.rotate(q, normal, normal);
+ r = new Vector3d();
+ if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) {
+ r.sub(p);
+ translate.x = r.x;
+ translate.z = r.z;
+ }
+ break;
+ case YZ :
+ normal = new Vector3d(1.0,0.0,0.0);
+ if(!worldCoord)
+ MathTools.rotate(q, normal, normal);
+ r = new Vector3d();
+ if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) {
+ r.sub(p);
+ translate.y = r.y;
+ translate.z = r.z;
+ }
+ break;
+ default :
+
+ return null;
+ }
+ translate.sub(offset);
+ return translate;
}
}