--- /dev/null
+package org.simantics.plant3d.scenegraph;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.simantics.g3d.math.MathTools;
+import org.simantics.g3d.property.annotations.GetPropertyValue;
+import org.simantics.g3d.property.annotations.PropertyTabBlacklist;
+import org.simantics.g3d.property.annotations.SetPropertyValue;
+import org.simantics.g3d.scenegraph.IG3DNode;
+import org.simantics.objmap.graph.annotations.GraphType;
+import org.simantics.objmap.graph.annotations.RelatedElementsAdd;
+import org.simantics.objmap.graph.annotations.RelatedElementsGet;
+import org.simantics.objmap.graph.annotations.RelatedElementsRem;
+import org.simantics.objmap.graph.annotations.RelatedGetValue;
+import org.simantics.objmap.graph.annotations.RelatedSetValue;
+import org.simantics.plant3d.ontology.Plant3D;
+import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
+
+import vtk.vtkPanel;
+import vtk.vtkProp3D;
+import vtk.vtkRenderer;
+
+@GraphType(Plant3D.URIs.PipeRun)
+@PropertyTabBlacklist("Transform")
+public class PipeRun extends P3DParentNode<IP3DNode> {
+
+ private double pipeDiameter = 0.1;
+ private double turnRadius = 0.2;
+
+ @Override
+ public void update(vtkRenderer ren) {
+
+ }
+
+ @Override
+ public void visualize(vtkPanel panel) {
+
+ }
+
+ @Override
+ public Collection<vtkProp3D> getActors() {
+ return Collections.EMPTY_LIST;
+ }
+
+ @Override
+ public void stopVisualize() {
+
+ }
+
+ @RelatedGetValue(Plant3D.URIs.HasTurnRadius)
+ @GetPropertyValue(value=Plant3D.URIs.HasTurnRadius, name = "Elbow radius")
+ public double getTurnRadius() {
+ return turnRadius;
+ }
+
+ @RelatedSetValue(Plant3D.URIs.HasTurnRadius)
+ @SetPropertyValue(Plant3D.URIs.HasTurnRadius)
+ public void setTurnRadius(double turnRadius) {
+ this.turnRadius = turnRadius;
+ firePropertyChanged(Plant3D.URIs.HasTurnRadius);
+ }
+
+ @RelatedGetValue(Plant3D.URIs.HasPipeDiameter)
+ @GetPropertyValue(value=Plant3D.URIs.HasPipeDiameter, name = "Diameter")
+ public double getPipeDiameter() {
+ return pipeDiameter;
+ }
+
+ @RelatedSetValue(Plant3D.URIs.HasPipeDiameter)
+ @SetPropertyValue(Plant3D.URIs.HasPipeDiameter)
+ public void setPipeDiameter(double pipeDiameter) {
+ this.pipeDiameter = pipeDiameter;
+ firePropertyChanged(Plant3D.URIs.HasPipeDiameter);
+ }
+
+ @RelatedElementsAdd(Plant3D.URIs.childen)
+ public void addChild(PipelineComponent node) {
+ addNode(Plant3D.URIs.childen,node);
+ }
+
+ @RelatedElementsGet(Plant3D.URIs.childen)
+ public Collection<PipelineComponent> getChild() {
+ Collection<PipelineComponent> coll = new ArrayList<PipelineComponent>();
+ for (IG3DNode n : getNodes(Plant3D.URIs.childen)) {
+ coll.add((PipelineComponent)n);
+ }
+ return coll;
+ }
+
+ @RelatedElementsRem(Plant3D.URIs.childen)
+ public void remChild(PipelineComponent node) {
+ removeNode(Plant3D.URIs.childen, node);
+ }
+
+
+ public List<PipelineComponent> getSortedChild() {
+ List<PipelineComponent> coll = new ArrayList<PipelineComponent>();
+ for (IG3DNode n : getNodes(Plant3D.URIs.childen)) {
+ coll.add((PipelineComponent)n);
+ }
+ Collections.sort(coll, new ComponentComparator());
+ return coll;
+ }
+ public void addChild(PipeControlPoint node) {
+ addNode("pipecp",node);
+ }
+
+ public void remChild(PipeControlPoint node) {
+ removeNode("pipecp", node);
+ }
+
+ public void deattachChild(PipeControlPoint node) {
+ deattachNode("pipecp", node);
+ }
+
+ public Collection<PipeControlPoint> getControlPoints() {
+ Collection<PipeControlPoint> coll = new ArrayList<PipeControlPoint>();
+ for (IG3DNode n : getNodes("pipecp")) {
+ coll.add((PipeControlPoint)n);
+ }
+ return coll;
+ }
+
+ public boolean equalSpecs(PipeRun other) {
+ if (!MathTools.equals(pipeDiameter,other.pipeDiameter))
+ return false;
+ if (!MathTools.equals(turnRadius,other.turnRadius))
+ return false;
+ return true;
+ }
+
+ private class ComponentComparator implements Comparator<PipelineComponent> {
+ @Override
+ public int compare(PipelineComponent o1, PipelineComponent o2) {
+ if (o1 == o2)
+ return 0;
+ int i = 1;
+ PipelineComponent c = o1.getPrevious();
+ while (c != null) {
+ if (c == o2)
+ return i;
+ c = c.getPrevious();
+ i++;
+ }
+ i = -1;
+ c = o1.getNext();
+ while (c != null) {
+ if (c == o2)
+ return i;
+ c = c.getNext();
+ i--;
+ }
+ return 0;
+
+ }
+ }
+}