package org.simantics.plant3d.scenegraph;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Map;
+import java.util.Map.Entry;
import javax.vecmath.Quat4d;
import javax.vecmath.Tuple3d;
import javax.vecmath.Vector3d;
import org.simantics.g3d.math.MathTools;
+import org.simantics.g3d.property.annotations.CompoundGetPropertyValue;
+import org.simantics.g3d.property.annotations.CompoundSetPropertyValue;
import org.simantics.g3d.property.annotations.GetPropertyValue;
import org.simantics.g3d.property.annotations.PropertyContributor;
+import org.simantics.objmap.graph.annotations.CompoundRelatedGetValue;
+import org.simantics.objmap.graph.annotations.CompoundRelatedSetValue;
import org.simantics.objmap.graph.annotations.RelatedGetObj;
import org.simantics.objmap.graph.annotations.RelatedSetObj;
import org.simantics.plant3d.ontology.Plant3D;
*/
@PropertyContributor
public abstract class PipelineComponent extends GeometryNode {
+
+ private static boolean DEBUG = false;
private PipeRun pipeRun;
return;
this.alternativePipeRun = pipeRun;
if (getControlPoint().isDualInline()) {
- PipeControlPoint sub = getControlPoint().getSubPoint().get(0);
- if (sub.getParent() != this.alternativePipeRun)
- this.alternativePipeRun.addChild(sub);
+ PipeControlPoint sub = getControlPoint().getDualSub();
+ if (sub.getParent() != this.alternativePipeRun) {
+ if (this.alternativePipeRun != null) {
+ this.alternativePipeRun.addChild(sub);
+ } else if (sub.getPipeRun() != null) {
+ // FIXME : how to handle child point without proper run?
+ sub.getPipeRun().remChild(sub);
+ }
+ }
+
}
firePropertyChanged(Plant3D.URIs.HasAlternativePipeRun);
}
super.updateParameters();
}
+ @Override
+ @CompoundRelatedGetValue(objRelation=Plant3D.URIs.hasParameter,objType=Plant3D.URIs.Parameter,valRelation=Plant3D.URIs.hasParameterValue)
+ public Map<String, Object> getParameterMap() {
+ return super.getParameterMap();
+ }
+
+ @Override
+ @CompoundRelatedSetValue(Plant3D.URIs.hasParameter)
+ public void setParameterMap(Map<String, Object> parameters) {
+ super.setParameterMap(parameters);
+ }
+
+ @CompoundGetPropertyValue(name="Parameters",tabId="Parameters",value="parameters")
+ public Map<String,Object> getParameterMapUI() {
+ // TODO : how to filter parameters that are calculated by geometry provider?
+ Map<String,Object> map = new HashMap<String, Object>(getParameterMap());
+ map.remove("radius");
+ map.remove("radius2");
+ map.remove("offset");
+ return map;
+ }
+
+ @CompoundSetPropertyValue(value="parameters")
+ public void setParameterMapUI(Map<String, Object> parameters) {
+ Map<String, Object> curr = getParameterMap();
+ for (Entry<String, Object> entry : curr.entrySet()) {
+ if (!parameters.containsKey(entry.getKey()))
+ parameters.put(entry.getKey(), entry.getValue());
+ }
+ setParameterMap(parameters);
+ }
+
+ public void setParameter(String name, Object value) {
+ Map<String, Object> parameters = new HashMap<>(getParameterMap());
+ parameters.put(name, value);
+ setParameterMap(parameters);
+ }
+
public abstract void setType(String typeURI) throws Exception;
@RelatedGetObj(Plant3D.URIs.HasNext)
@RelatedSetObj(Plant3D.URIs.HasNext)
public void setNext(PipelineComponent comp) {
- if (next == comp)
- return;
+ if (next == comp) {
+ syncNext();
+ return;
+ }
if (this.next != null)
- this.next._removeRef(this);
- this.next = comp;
- this.syncnext = false;
- syncNext();
- firePropertyChanged(Plant3D.URIs.HasNext);
- if (comp != null)
- comp.sync();
-// System.out.println(this + " next " + comp);
+ this.next._removeRef(this);
+ _setNext(comp);
+ this.syncnext = false;
+ if (DEBUG) System.out.println(this + " next " + comp);
+ syncNext();
+ firePropertyChanged(Plant3D.URIs.HasNext);
+ if (comp != null)
+ comp.sync();
+ }
+
+ protected void _setNext(PipelineComponent comp) {
+ this.next = comp;
}
@RelatedSetObj(Plant3D.URIs.HasPrevious)
public void setPrevious(PipelineComponent comp) {
- if (previous == comp)
+ if (previous == comp) {
+ syncPrevious();
return;
+ }
if (this.previous != null)
this.previous._removeRef(this);
- this.previous = comp;
+ _setPrevious(comp);
this.syncprev = false;
+ if (DEBUG) System.out.println(this + " prev " + comp);
syncPrevious();
firePropertyChanged(Plant3D.URIs.HasPrevious);
if (comp != null)
comp.sync();
-// System.out.println(this + " prev " + comp);
}
+
+ protected void _setPrevious(PipelineComponent comp) {
+ this.previous = comp;
+ }
+
private PipelineComponent branch0;
@RelatedGetObj(Plant3D.URIs.HasBranch0)
@RelatedSetObj(Plant3D.URIs.HasBranch0)
public void setBranch0(PipelineComponent comp) {
- if (branch0 == comp)
+ if (branch0 == comp) {
+ syncBranch0();
return;
+ }
if (this.branch0 != null)
this.branch0._removeRef(this);
this.branch0 = comp;
this.syncbr0 = false;
+ if (DEBUG) System.out.println(this + " br0 " + comp);
syncBranch0();
firePropertyChanged(Plant3D.URIs.HasBranch0);
if (comp != null)
comp.sync();
-// System.out.println(this + " next " + comp);
}
@GetPropertyValue(name="Previous",tabId="Debug",value=Plant3D.URIs.HasPrevious)
private PipeControlPoint getBranchPoint() {
PipeControlPoint branchPoint;
- if (getControlPoint().getSubPoint().size() > 0) {
- branchPoint = getControlPoint().getSubPoint().get(0);
+ if (getControlPoint().getChildPoints().size() > 0) {
+ branchPoint = getControlPoint().getChildPoints().get(0);
} else {
if (branch0.getPipeRun() == null)
return null;
if (pcp.getNext() != nextPCP) {
pcp.setNext(nextPCP);
}
- if (pcp.isDualInline()) {
- PipeControlPoint sub = pcp.getSubPoint().get(0);
- if (sub.getNext() != nextPCP)
- sub.setNext(nextPCP);
- }
+// if (pcp.isDualInline()) {
+// PipeControlPoint sub = pcp.getChildPoints().get(0);
+// if (sub.getNext() != nextPCP)
+// sub.setNext(nextPCP);
+// }
return true;
}
private boolean _connectPrev(PipeControlPoint pcp, PipeControlPoint prevPCP) {
if (prevPCP == null)
return false;
- if (prevPCP.isDualInline())
- prevPCP = prevPCP.getSubPoint().get(0);
+// if (prevPCP.isDualInline())
+// prevPCP = prevPCP.getChildPoints().get(0);
if (pcp.getPrevious() != prevPCP) {
pcp.setPrevious(prevPCP);
}
- if (pcp.isDualInline()) {
- PipeControlPoint sub = pcp.getSubPoint().get(0);
- if (sub.getPrevious() != prevPCP)
- sub.setPrevious(prevPCP);
- }
+// if (pcp.isDualInline()) {
+// PipeControlPoint sub = pcp.getChildPoints().get(0);
+// if (sub.getPrevious() != prevPCP)
+// sub.setPrevious(prevPCP);
+// }
return true;
}
// Control point structure is left into illegal state.
private void _removeRef(PipelineComponent comp) {
if (next == comp) {
- next = null;
+ _setNext(null);
syncnext = false;
+ if (DEBUG) System.out.println(this + " remove next " + comp);
+ firePropertyChanged(Plant3D.URIs.HasNext);
syncNext();
} else if (previous == comp) {
- previous = null;
+ _setPrevious(null);
syncprev = false;
+ if (DEBUG) System.out.println(this + " remove prev " + comp);
+ firePropertyChanged(Plant3D.URIs.HasPrevious);
syncPrevious();
} else if (branch0 == comp) {
branch0 = null;
syncbr0 = false;
+ if (DEBUG) System.out.println(this + " remove br0 " + comp);
+ firePropertyChanged(Plant3D.URIs.HasBranch0);
syncBranch0();
}
}
boolean syncnext = false;
- private void syncNext() {
+ protected void syncNext() {
if (syncnext)
return;
syncnext = _syncNext();
}
boolean syncprev = false;
- private void syncPrevious() {
+ protected void syncPrevious() {
if (syncprev)
return;
syncprev = _syncPrevious();
}
boolean syncbr0 = false;
- private void syncBranch0() {
+ protected void syncBranch0() {
if (syncbr0)
return;
syncbr0 = _syncBranch0();
return false;
}
- } else if (getControlPoint().getSubPoint().size() > 0) { // TODO : this may cause problems? (Removes branch point, before branch has been set?)
- getControlPoint().getSubPoint().get(0).remove();
- getControlPoint().children.clear();
+ } else if (getControlPoint().getChildPoints().size() > 0) { // TODO : this may cause problems? (Removes branch point, before branch has been set?)
+ //getControlPoint().getSubPoint().get(0).remove();
+ //getControlPoint().children.clear();
return true;
}
} else {
}
public Map<String,Object> updateParameterMap() {
- return Collections.EMPTY_MAP;
+ return Collections.emptyMap();
}
public abstract String getType();
@Override
public void remove() {
+ if (DEBUG) System.out.println(this + " remove");
PipeControlPoint pcp = getControlPoint();
// Second check is needed, when remove process is initiated from control point.
if (pcp != null && pcp.getPipelineComponent() != null) {
pcp.remove();
}
+ setPipeRun(null);
super.remove();
}
if (pcp != null && pcp.getPipelineComponent() != null) {
pcp.removeAndSplit();
}
+ setPipeRun(null);
super.remove();
}
super.setOrientation(orientation);
if (getControlPoint() != null) {
getControlPoint()._setWorldOrientation(getWorldOrientation());
- try {
- PipingRules.requestUpdate(getControlPoint());
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
+ PipingRules.requestUpdate(getControlPoint());
}
}
super.setPosition(position);
if (getControlPoint() != null) {
getControlPoint()._setWorldPosition(getWorldPosition());
- try {
- PipingRules.requestUpdate(getControlPoint());
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
+ PipingRules.requestUpdate(getControlPoint());
}
}
case END:
return null;
case TURN: {
- double r = getPipeRun().getTurnRadius();
+ double r = ((TurnComponent)this).getTurnRadius();
double a = pcp.getTurnAngle();
return a*r;
}
}
}
+ /**
+ * Returns diameter of the pipe
+ * @return
+ */
+ public Double getDiameter() {
+ return getPipeRun().getPipeDiameter();
+ }
+
+ /**
+ * Returns secondary diameter of the pipe for size change components
+ * @return
+ */
+ public Double getDiameter2() {
+ if (getAlternativePipeRun() == null)
+ return null;
+ return getAlternativePipeRun().getPipeDiameter();
+ }
+
public void getEnds(Tuple3d p1, Tuple3d p2) {
getControlPoint().getControlPointEnds(p1, p2);
}
case TURN: {
Vector3d loc = pcp.getRealPosition(PositionType.PREVIOUS);
- double r = getPipeRun().getTurnRadius();
+ double r = ((TurnComponent)this).getTurnRadius();
double a = pcp.getTurnAngle();
double pipeRadius = pcp.getPipeRun().getPipeDiameter() / 2;
double r2 = getAlternativePipeRun().getPipeDiameter() / 2;
return pcp.getLength() * Math.PI * (r1*r1 + r1*r2 + r2*r2) / 4;
case TURN: {
- double r = getPipeRun().getTurnRadius();
+ double r = ((TurnComponent)this).getTurnRadius();
double a = pcp.getTurnAngle();
return r * a * Math.PI * pipeRadius * pipeRadius;
}
throw new IllegalStateException("No centroid defined");
}
}
+
+
+ private String error;
+
+ /**
+ * Returns possible pipe modelling error, or null;
+ * @return
+ */
+ @GetPropertyValue(name="Error", value="error", tabId = "Default")
+ public String getError() {
+ return error;
+ }
+
+ /**
+ * Sets pipe modelling error.
+ *
+ * Error is usually set by PipingRules.
+ * @param error
+ */
+ public void setError(String error) {
+ if (this.error == null) {
+ if (error == null)
+ return;
+ } else if (this.error.equals(error))
+ return;
+ this.error = error;
+ firePropertyChanged("error");
+ }
}