import java.util.HashSet;
import java.util.Set;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ResourceLocator;
import org.eclipse.swt.widgets.Display;
import org.simantics.db.Resource;
+import org.simantics.g3d.math.MathTools;
import org.simantics.g3d.scenegraph.NodeMap;
import org.simantics.g3d.scenegraph.base.INode;
import org.simantics.g3d.vtk.swt.InteractiveVtkComposite;
private Item toAdd = null;
private PositionType insertPosition;
+ @SuppressWarnings("unused")
private boolean insertAdjustable;
+ @SuppressWarnings("unused")
private boolean lengthAdjustable;
private String libUri;
+ private double lengthFactor = 1.0;
+
public AddComponentAction(InteractiveVtkComposite panel, P3DRootNode root, String libUri) {
super(panel);
this.root = root;
setText("Add Component");
- setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Component.png"));
+ setImageDescriptor(ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/Component.png").get());
nodeMap = root.getNodeMap();
gizmo = new TerminalSelectionGizmo(panel);
this.libUri = libUri;
}
+ public void setLengthFactor(double lengthFactor) {
+ this.lengthFactor = lengthFactor;
+ }
+
public void setComponent(PipelineComponent component) {
this.component = component;
allowed.add(PositionType.NEXT);
}
} else {
- if (component.getNext() == null) {
+ if (component.getNext() == null || component.getControlPoint().isVariableLength()) {
allowed.add(PositionType.NEXT);
}
- if (component.getPrevious() == null) {
+ if (component.getPrevious() == null || component.getControlPoint().isVariableLength()) {
allowed.add(PositionType.PREVIOUS);
}
- if (component instanceof InlineComponent && !component.getControlPoint().isFixed()){
+ if (component instanceof InlineComponent && component.getControlPoint().isVariableLength()){
allowed.add(PositionType.SPLIT);
}
}
setEnabled(allowed.size() > 0);
}
+ private String name;
+
private Double length;
private Double angle;
+ private Double rotationAngle;
private Double diameter;
+ private Double thickness;
private Double turnRadius;
@Override
public void run() {
ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed, component, libUri);
+
+ // Set list of already reserved component names
+ dialog.addUsedNames(ComponentUtils.getPipelineComponentNames(root));
+ dialog.setLengthFactor(lengthFactor);
+
if (dialog.open() == ComponentSelectionDialog.CANCEL)
return;
toAdd = dialog.getSelected();
if (toAdd == null)
return;
+ this.name = dialog.getName();
this.insertPosition = dialog.getInsertPosition();
this.insertAdjustable = dialog.isInsertAdjustable();
this.lengthAdjustable = dialog.isLenghtAdjustable();
this.length = dialog.getLength();
this.angle = dialog.getAngle();
+ this.rotationAngle = dialog.getRotationAngle();
this.diameter = dialog.getDiameter();
+ this.thickness = dialog.getThickness();
this.turnRadius = dialog.getTurnRadius();
allowed = dialog.filterAllowed();
gizmo.setComponent(component, allowed);
public void doInsert(PositionType position) {
try {
+ if (position == PositionType.SPLIT && length != null && length > component.getControlPoint().getLength()) {
+ MessageDialog.openError(panel.getComponent().getShell(), "Error", "There is no room for a component of length " + length * lengthFactor + " units");
+ return;
+ }
+
InsertInstruction inst = new InsertInstruction();
inst.typeUri = toAdd.getUri();
- inst.angle = angle;
+ inst.name = name;
+ inst.angle = angle != null ? MathTools.degToRad(angle) : null;
inst.diameter = diameter;
+ inst.thickness = thickness;
inst.length = length;
inst.turnRadius = turnRadius;
inst.insertPosition = insertPosition;
+ inst.rotationAngle = rotationAngle;
inst.position = position;
ComponentUtils.addComponent(root, component, inst);
} catch (Exception e) {