X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Factions%2FAddComponentAction.java;h=174d6f1166eac0718aa4aa814bb491b34ae67c66;hb=0ad74f024bc769b126a2e46d0015fe0deb30b34c;hp=bf220dd8776dc03959acc6a1410e78771a4adac1;hpb=a460e609147d064dd3da464bcf1626845e0f93b4;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java b/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java index bf220dd8..174d6f11 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java @@ -2,6 +2,7 @@ package org.simantics.plant3d.actions; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; import java.util.HashSet; import java.util.Set; @@ -10,12 +11,13 @@ import javax.vecmath.Vector3d; import org.eclipse.swt.widgets.Display; import org.simantics.g3d.scenegraph.NodeMap; import org.simantics.g3d.scenegraph.base.INode; -import org.simantics.g3d.vtk.action.vtkAction; -import org.simantics.g3d.vtk.common.InteractiveVtkPanel; +import org.simantics.g3d.vtk.swt.InteractiveVtkComposite; +import org.simantics.g3d.vtk.swt.vtkSwtAction; import org.simantics.plant3d.Activator; import org.simantics.plant3d.dialog.ComponentSelectionDialog; import org.simantics.plant3d.gizmo.TerminalSelectionGizmo; import org.simantics.plant3d.scenegraph.InlineComponent; +import org.simantics.plant3d.scenegraph.Nozzle; import org.simantics.plant3d.scenegraph.P3DRootNode; import org.simantics.plant3d.scenegraph.PipeRun; import org.simantics.plant3d.scenegraph.PipelineComponent; @@ -26,13 +28,12 @@ import org.simantics.plant3d.scenegraph.controlpoint.PipingRules; import org.simantics.plant3d.utils.ComponentUtils; import org.simantics.plant3d.utils.Item; import org.simantics.plant3d.utils.Item.Type; -import org.simantics.utils.threads.AWTThread; import org.simantics.utils.threads.ThreadUtils; import org.simantics.utils.ui.ExceptionUtils; import vtk.vtkProp; -public class AddComponentAction extends vtkAction { +public class AddComponentAction extends vtkSwtAction { private P3DRootNode root; @@ -44,8 +45,11 @@ public class AddComponentAction extends vtkAction { private Set allowed = new HashSet(); private Item toAdd = null; + private PositionType insertPosition; + private boolean insertAdjustable; + private boolean lengthAdjustable; - public AddComponentAction(InteractiveVtkPanel panel, P3DRootNode root) { + public AddComponentAction(InteractiveVtkComposite panel, P3DRootNode root) { super(panel); this.root = root; setText("Add Component"); @@ -58,14 +62,20 @@ public class AddComponentAction extends vtkAction { this.component = component; allowed.clear(); - if (component.getNext() == null) { - allowed.add(PositionType.NEXT); - } - if (component.getPrevious() == null) { - allowed.add(PositionType.PREVIOUS); - } - if (component instanceof InlineComponent && !component.getControlPoint().isFixed()){ - allowed.add(PositionType.SPLIT); + if (component instanceof Nozzle) { + if (component.getNext() == null && component.getPrevious() == null) { + allowed.add(PositionType.NEXT); + } + } else { + if (component.getNext() == null) { + allowed.add(PositionType.NEXT); + } + if (component.getPrevious() == null) { + allowed.add(PositionType.PREVIOUS); + } + if (component instanceof InlineComponent && !component.getControlPoint().isFixed()){ + allowed.add(PositionType.SPLIT); + } } setEnabled(allowed.size() > 0); } @@ -77,12 +87,16 @@ public class AddComponentAction extends vtkAction { @Override public void run() { - ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed); + + ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed, component); if (dialog.open() == ComponentSelectionDialog.CANCEL) return; toAdd = dialog.getSelected(); if (toAdd == null) return; + this.insertPosition = dialog.getInsertPosition(); + this.insertAdjustable = dialog.isInsertAdjustable(); + this.lengthAdjustable = dialog.isLenghtAdjustable(); this.length = dialog.getLength(); this.angle = dialog.getAngle(); this.diameter = dialog.getDiameter(); @@ -90,14 +104,14 @@ public class AddComponentAction extends vtkAction { allowed = dialog.filterAllowed(); gizmo.setComponent(component, allowed); super.run(); - panel.repaint(); + panel.refresh(); } @Override - public void keyPressed(KeyEvent e) { + public boolean keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) panel.useDefaultAction(); - + return true; } @@ -106,7 +120,7 @@ public class AddComponentAction extends vtkAction { return; super.attach(); - ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { + ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() { public void run() { attachUI(); } @@ -117,15 +131,15 @@ public class AddComponentAction extends vtkAction { public void deattach() { // deactivate(); component = null; - nodeMap.commit(); + nodeMap.commit("Add component"); deattachUI(); super.deattach(); - panel.repaint(); + panel.refresh(); } private void attachUI() { //panel.setCursor(activeCursor); - gizmo.attach(panel.GetRenderer()); + gizmo.attach(panel); } private void deattachUI() { @@ -134,23 +148,23 @@ public class AddComponentAction extends vtkAction { } @Override - public void mouseMoved(MouseEvent e) { - panel.getDefaultAction().mouseMoved(e); + public boolean mouseMoved(MouseEvent e) { + return getDefaultAction().mouseMoved(e); } @Override - public void mousePressed(MouseEvent e) { - panel.getDefaultAction().mousePressed(e); + public boolean mousePressed(MouseEvent e) { + return getDefaultAction().mousePressed(e); } @Override - public void mouseReleased(MouseEvent e) { - panel.getDefaultAction().mouseReleased(e); + public boolean mouseReleased(MouseEvent e) { + return getDefaultAction().mouseReleased(e); } @Override - public void mouseDragged(MouseEvent e) { - panel.getDefaultAction().mouseDragged(e); + public boolean mouseDragged(MouseEvent e) { + return getDefaultAction().mouseDragged(e); } public void doInsert(PositionType position) { @@ -159,23 +173,78 @@ public class AddComponentAction extends vtkAction { PipeControlPoint newPcp = newComponent.getControlPoint(); PipeControlPoint toPcp = component.getControlPoint(); - Vector3d start = new Vector3d(); - Vector3d end = new Vector3d(); - Vector3d dir = new Vector3d(); - toPcp.getInlineControlPointEnds(start, end, dir); - dir.normalize(); + PipeRun pipeRun = toPcp.getPipeRun(); - switch (position) { - case NEXT: - if (toPcp.isDualInline()) - toPcp = toPcp.getSubPoint().get(0); - - break; - case PREVIOUS: - if (toPcp.isDualSub()) - toPcp = toPcp.parent; + Vector3d dir = null; + Vector3d pos = null; + + + if (toPcp.isInline()) { + switch (position) { + case NEXT: + if (toPcp.isDualInline()) + toPcp = toPcp.getSubPoint().get(0); + + break; + case PREVIOUS: + if (toPcp.isDualSub()) + toPcp = toPcp.parent; + } + Vector3d start = new Vector3d(); + Vector3d end = new Vector3d(); + dir = new Vector3d(); + toPcp.getInlineControlPointEnds(start, end, dir); + dir.normalize(); + if (!insertAdjustable || insertPosition == PositionType.NEXT) { + switch (position) { + case NEXT: + pos = new Vector3d(end); + break; + case PREVIOUS: + pos = new Vector3d(start); + break; + case SPLIT: + break; + } + } else if (insertPosition == PositionType.SPLIT) { + pos = new Vector3d(toPcp.getWorldPosition()); + } else { + switch (position) { + case NEXT: + pos = new Vector3d(start); + break; + case PREVIOUS: + pos = new Vector3d(end); + break; + case SPLIT: + break; + } + } + + } else if (toPcp.isDirected()) { + dir = new Vector3d(toPcp.getDirection(Direction.NEXT)); + pos = new Vector3d(toPcp.getWorldPosition()); + } else if (toPcp.isTurn() && toPcp.isFixed()) { + dir = new Vector3d(toPcp.getDirection(position == PositionType.NEXT ? Direction.NEXT : Direction.PREVIOUS)); + pos = new Vector3d(toPcp.getWorldPosition()); + if (!lengthAdjustable) { + Vector3d v = new Vector3d(dir); + v.scale(toPcp.getInlineLength()); + pos.add(v); + } else { + if (insertPosition == PositionType.NEXT) { + Vector3d v = new Vector3d(dir); + v.scale(toPcp.getInlineLength()); + pos.add(v); + } else if (insertPosition == PositionType.SPLIT) { + // scale 0.5*length so that we don't remove the length twice from the new component + Vector3d v = new Vector3d(dir); + v.scale(toPcp.getInlineLength()*0.5); + pos.add(v); + } + } } - PipeRun pipeRun = toPcp.getPipeRun(); + if (!toAdd.isSizeChange()) { String name = component.getPipeRun().getUniqueName(toAdd.getName()); @@ -193,29 +262,46 @@ public class AddComponentAction extends vtkAction { } } newComponent.updateParameters(); - - dir.scale(newComponent.getControlPoint().getLength()*0.5); - start.sub(dir); - end.add(dir); + + Vector3d v = new Vector3d(dir); + if (insertAdjustable) { + if (insertPosition == PositionType.NEXT) + v.scale(newComponent.getControlPoint().getInlineLength()); + else if (insertPosition == PositionType.SPLIT) + v.set(0, 0, 0); + else if (insertPosition == PositionType.PREVIOUS) + v.scale(-newComponent.getControlPoint().getInlineLength()); + } else { + v.scale(newComponent.getControlPoint().getInlineLength()); + } + switch (position) { + case NEXT: + pos.add(v); + break; + case PREVIOUS: + pos.sub(v); + break; + case SPLIT: + break; + } + switch (position) { case NEXT: if (toPcp.isDualInline()) toPcp = toPcp.getSubPoint().get(0); newPcp.insert(toPcp, Direction.NEXT); - newPcp.setWorldPosition(end); + newPcp.setWorldPosition(pos); break; case PREVIOUS: if (toPcp.isDualSub()) toPcp = toPcp.parent; newPcp.insert(toPcp, Direction.PREVIOUS); - newPcp.setWorldPosition(start); + newPcp.setWorldPosition(pos); break; case SPLIT: PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, true); } } else { - - PipeRun other = new PipeRun(); String n = root.getUniqueName("PipeRun"); other.setName(n); @@ -224,24 +310,28 @@ public class AddComponentAction extends vtkAction { root.addChild(other); - if (position == PositionType.NEXT) { PipingRules.addSizeChange(false, pipeRun, other, (InlineComponent)newComponent, toPcp, null); - newPcp.setWorldPosition(end); } else if (position == PositionType.PREVIOUS){ PipingRules.addSizeChange(true, pipeRun, other, (InlineComponent)newComponent, toPcp, null); - newPcp.setWorldPosition(start); } + newPcp.setWorldPosition(pos); // TODO : chicken-egg problem newComponent.updateParameters(); - dir.scale(newComponent.getControlPoint().getLength()*0.5); - start.sub(dir); - end.add(dir); - if (position == PositionType.NEXT) { - newPcp.setWorldPosition(end); - } else if (position == PositionType.PREVIOUS){ - newPcp.setWorldPosition(start); - } + Vector3d v = new Vector3d(dir); + v.scale(newComponent.getControlPoint().getLength()*0.5); + switch (position) { + case NEXT: + pos.add(v); + break; + case PREVIOUS: + pos.sub(v); + break; + case SPLIT: + break; + } + newPcp.setWorldPosition(pos); + } @@ -250,19 +340,26 @@ public class AddComponentAction extends vtkAction { } } - public void mouseClicked(MouseEvent e) { + public boolean mouseClicked(MouseEvent e) { if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) { int type = panel.getPickType(); - panel.setPickType(0); + //panel.setPickType(0); + panel.setPickType(5); vtkProp[] picked = panel.pick(e.getX(), e.getY()); panel.setPickType(type); PositionType position = gizmo.getPickedPosition(picked); + if (position != null) { doInsert(position); panel.useDefaultAction(); - return; + return true; } } - panel.getDefaultAction().mouseClicked(e); + return getDefaultAction().mouseClicked(e); + } + + @Override + public boolean mouseWheelMoved(MouseWheelEvent e) { + return getDefaultAction().mouseWheelMoved(e); } }