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;
private String libUri;
+ private double lengthFactor = 1.0;
+
public AddComponentAction(InteractiveVtkComposite panel, P3DRootNode root, String libUri) {
super(panel);
this.root = root;
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().isFixedLength()){
+ if (component instanceof InlineComponent && component.getControlPoint().isVariableLength()){
allowed.add(PositionType.SPLIT);
}
}
private Double angle;
private Double rotationAngle;
private Double diameter;
+ private Double thickness;
private Double turnRadius;
@Override
// Set list of already reserved component names
dialog.addUsedNames(ComponentUtils.getPipelineComponentNames(root));
+ dialog.setLengthFactor(lengthFactor);
if (dialog.open() == ComponentSelectionDialog.CANCEL)
return;
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.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);
+ PipelineComponent newComponent = ComponentUtils.addComponent(root, component, inst);
+ componentAdded(newComponent);
} catch (Exception e) {
ExceptionUtils.logAndShowError("Cannot add component", e);
}
}
+ /**
+ * This method does nothing, but can be overridden by a subclass to do additional
+ * post-processing for a newly added component.
+ *
+ * @param newComponent A newly added pipeline component
+ */
+ protected void componentAdded(PipelineComponent newComponent) {
+ // Nothing to do here
+ }
+
public boolean mouseClicked(MouseEvent e) {
if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) {
int type = panel.getPickType();