package org.simantics.plant3d.utils;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import javax.vecmath.Vector3d;
import org.simantics.Simantics;
import org.simantics.db.ReadGraph;
+import org.simantics.db.RequestProcessor;
import org.simantics.db.Resource;
import org.simantics.db.common.request.ReadRequest;
import org.simantics.db.common.utils.NameUtils;
import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.Direction;
import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.simantics.plant3d.scenegraph.controlpoint.PipingRules;
public class ComponentUtils {
+ private final static Logger LOGGER = LoggerFactory.getLogger(ComponentUtils.class);
private static Map<String,Class<? extends PipelineComponent>> clazzes = new HashMap<String, Class<? extends PipelineComponent>>();
private static Map<String,GeometryProvider> providers = new HashMap<String,GeometryProvider>();
private static Map<String,String> names = new HashMap<String,String>();
- public static void preloadCache() {
- Simantics.getSession().asyncRequest(new ReadRequest() {
-
- @Override
- public void run(ReadGraph graph) throws DatabaseException {
- List<String> types = new ArrayList<String>();
- types.add(Plant3D.URIs.Builtin_Straight);
- types.add(Plant3D.URIs.Builtin_Elbow);
- types.add(Plant3D.URIs.Builtin_ConcentricReducer);
- types.add(Plant3D.URIs.Builtin_BranchSplitComponent);
- types.add(Plant3D.URIs.Builtin_EccentricReducer);
- types.add(Plant3D.URIs.Builtin_Elbow45);
- types.add(Plant3D.URIs.Builtin_Elbow90);
+ public static void preloadCache(RequestProcessor session) {
+ try {
+ session.syncRequest(new ReadRequest() {
- for (String typeURI : types) {
- load(graph, typeURI);
+ @Override
+ public void run(ReadGraph graph) throws DatabaseException {
+ List<String> types = new ArrayList<String>();
+ types.add(Plant3D.URIs.Builtin_Straight);
+ types.add(Plant3D.URIs.Builtin_Elbow);
+ types.add(Plant3D.URIs.Builtin_ConcentricReducer);
+ types.add(Plant3D.URIs.Builtin_BranchSplitComponent);
+ types.add(Plant3D.URIs.Builtin_EccentricReducer);
+ types.add(Plant3D.URIs.Builtin_Elbow45);
+ types.add(Plant3D.URIs.Builtin_Elbow90);
+
+ for (String typeURI : types) {
+ load(graph, typeURI);
+ }
}
- }
- });
+ });
+ } catch (DatabaseException e) {
+ LOGGER.error("ComponentUtils.preloadCache() failed unexpectedly", e);
+ }
}
private static GeometryProvider getProvider(ReadGraph graph, Resource type) throws DatabaseException {
public PositionType position = PositionType.NEXT;
public PositionType insertPosition = PositionType.NEXT;
+
+ // Component name
+ public String name;
// Reducer requires pipe specs
public Double diameter;
+ public Double thickness;
public Double turnRadius;
// Variable length
this.insertPosition = insertPosition;
}
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
public Double getDiameter() {
return diameter;
}
public void setDiameter(Double diameter) {
this.diameter = diameter;
}
+
+ public double getThickness() {
+ return thickness;
+ }
+
+ public void setThickness(double thickness) {
+ this.thickness = thickness;
+ }
public Double getTurnRadius() {
return turnRadius;
public static PipelineComponent addComponent(P3DRootNode root, PipelineComponent component, InsertInstruction inst) throws Exception {
PipelineComponent newComponent = ComponentUtils.createComponent(root, inst.typeUri);
+ if (inst.name != null)
+ newComponent.setName(inst.name);
+
PipeControlPoint newPcp = newComponent.getControlPoint();
PipeControlPoint toPcp = component.getControlPoint();
Vector3d v = new Vector3d(dir);
if (insertAdjustable) {
+ // Prevent moving of adjacent components - always insert at end of a connected variable length component
+ if (position == PositionType.NEXT && component.getNext() != null ||
+ position == PositionType.PREVIOUS && component.getPrevious() != null)
+ insertPosition = PositionType.PREVIOUS;
+
if (insertPosition == PositionType.NEXT)
v.scale(newComponent.getControlPoint().getInlineLength());
else if (insertPosition == PositionType.SPLIT)
case NEXT:
if (toPcp.isDualInline())
toPcp = toPcp.getDualSub();
- newPcp.insert(toPcp, Direction.NEXT);
newPcp.setWorldPosition(pos);
+ if (toPcp.getNext() != null)
+ PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, false);
+ else
+ newPcp.insert(toPcp, Direction.NEXT);
break;
case PREVIOUS:
if (toPcp.isDualSub())
toPcp = toPcp.parent;
- newPcp.insert(toPcp, Direction.PREVIOUS);
newPcp.setWorldPosition(pos);
+ if (toPcp.getPrevious() != null)
+ PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, false);
+ else
+ newPcp.insert(toPcp, Direction.PREVIOUS);
break;
case SPLIT:
PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, true);
String n = root.getUniqueName("PipeRun");
other.setName(n);
other.setPipeDiameter(inst.diameter);
+ other.setPipeThickness(inst.thickness);
other.setTurnRadius(inst.turnRadius);
root.addChild(other);
PipingRules.splitVariableLengthComponent(branchSplit, component, false);
return branchSplit;
}
+
+ public static Collection<String> getPipelineComponentNames(P3DRootNode root) {
+ Collection<String> usedNames = root.getChild().stream()
+ .filter(n -> n instanceof PipeRun)
+ .flatMap(n -> ((PipeRun)n).getChild().stream())
+ .filter(n -> n instanceof PipelineComponent)
+ .map(n -> ((PipelineComponent)n).getName())
+ .collect(Collectors.toSet());
+ return usedNames;
+ }
}