]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java
Merge "Added missing change to generated ontology class."
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipingRules.java
index 3fc0488105fe8a24a8bd7197a188fb448ec3bfe7..67c5f35b8755d91c506d87211cd98497000ac9ee 100644 (file)
@@ -442,12 +442,28 @@ public class PipingRules {
                updatePathLeg(new UpdateStruct2(start, startPoint, list, end, endPoint, dir, offset, hasOffsets, iter, reversed, toRemove, updated), lengthChange);
 
        }
-
+       
+       private static boolean asDirected(PipeControlPoint pcp, Direction direction) {
+           if (pcp.isDirected())
+               return true;
+           if (pcp.isTurn() && pcp.isFixed()) {
+              if (!pcp._getReversed())
+                  return direction == Direction.NEXT;
+              else
+                  return direction == Direction.PREVIOUS;
+           }
+           return false;
+       }
+       
+       private static Vector3d direction(PipeControlPoint pcp, Direction direction) {
+           return pcp.getDirection(direction);
+       }
        private static void updatePathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) throws Exception {
                int directed = 0;
-               if (u.start.isDirected())
+               if (asDirected(u.start, Direction.NEXT))
                        directed++;
-               if (u.end.isDirected())
+               if (asDirected(u.end, Direction.PREVIOUS))
                        directed++;
                switch (directed) {
                case 0:
@@ -467,7 +483,7 @@ public class PipingRules {
                if (DEBUG)
                        System.out.println("PipingRules.updateFreePipeRun " + u + " " + lengthChange);
                checkExpandPathLeg(u, lengthChange);
-               if (u.start.isInline() || u.end.isInline())
+               if (u.start.isInline() || u.end.isInline() || u.start.isFixed() || u.end.isFixed())
                        processPathLeg(u, true, false);
        }
 
@@ -789,7 +805,7 @@ public class PipingRules {
                boolean dcpStart = false;
                boolean inlineEnd = false;
                Vector3d position;
-               if (u.start.isDirected()) {
+               if (asDirected(u.start, Direction.NEXT)) {
                        dcp = u.start;
                        other = u.end;
                        position = u.startPoint;
@@ -807,7 +823,7 @@ public class PipingRules {
                        inlineEnd = u.start.isInline();
                }
 
-               Vector3d directedDirection = dcp.getDirection();
+               Vector3d directedDirection = direction(dcp, dcpStart ? Direction.NEXT : Direction.PREVIOUS);
                Point3d directedEndPoint = new Point3d(u.endPoint);
                if (u.hasOffsets)
                        directedEndPoint.add(u.offset);
@@ -828,6 +844,8 @@ public class PipingRules {
                double distance = t.length();
                boolean aligned = (distance < ALLOWED_OFFSET);
                if (aligned) {
+                   if (u.start.isInline() || u.end.isInline() || u.start.isFixed() || u.end.isFixed())
+                   processPathLeg(u, true, false);
                        checkExpandPathLeg(u, lengthChange, inlineEnd);
                        
                } else {
@@ -944,8 +962,8 @@ public class PipingRules {
                position1offset.sub(u.offset);
                Point3d position2offset = new Point3d(position2);
                position2offset.add(u.offset);
-               Vector3d dir1 = dcp1.getDirection();
-               Vector3d dir2 = dcp2.getDirection();
+               Vector3d dir1 = direction(dcp1, Direction.NEXT);
+               Vector3d dir2 = direction(dcp2, Direction.PREVIOUS);
                Vector3d p1 = MathTools.closestPointOnStraight(position1offset, position2, dir2);
                Vector3d p2 = MathTools.closestPointOnStraight(position2offset, position1, dir1);
                double d1 = position1.distance(new Point3d(p1));
@@ -1516,12 +1534,43 @@ public class PipingRules {
        private static double updateTurnControlPointTurn(PipeControlPoint tcp, PipeControlPoint prev, PipeControlPoint next) {
                if (DEBUG)
                        System.out.println("PipingTools.updateTurnControlPointTurn()" + tcp);
-               if (next == null || prev == null)
-                       return Math.PI; // FIXME : argh
-               Vector3d middlePoint = tcp.getWorldPosition();
-               Vector3d nextPoint = next.getWorldPosition();
-               Vector3d prevPoint = prev.getWorldPosition();
-               return updateTurnControlPointTurn(tcp, middlePoint, prevPoint, nextPoint);
+               
+               if (!tcp.isFixed()) {
+                   if (next == null || prev == null)
+                   return Math.PI; // FIXME : argh
+               Vector3d middlePoint = tcp.getWorldPosition();
+               Vector3d nextPoint = next.getWorldPosition();
+               Vector3d prevPoint = prev.getWorldPosition();
+               return updateTurnControlPointTurn(tcp, middlePoint, prevPoint, nextPoint);
+               } else {
+                   Vector3d dir;
+                   if (!tcp._getReversed()) {
+                   if (prev == null)
+                   return Math.PI; // FIXME : argh
+                   
+                   Vector3d middlePoint = tcp.getWorldPosition();
+                   Vector3d prevPoint = prev.getWorldPosition();
+                   dir = new Vector3d();
+                   dir.sub(middlePoint, prevPoint);        
+                  
+                   } else {
+                       if (next == null)
+                    return Math.PI; // FIXME : argh
+                
+                Vector3d middlePoint = tcp.getWorldPosition();
+                Vector3d nextPoint = next.getWorldPosition();
+                dir = new Vector3d();
+                dir.sub(nextPoint,middlePoint);
+                   }
+                   dir.normalize();
+            
+            Quat4d q = PipeControlPoint.getControlPointOrientationQuat(dir, tcp.getRotationAngle() != null ? tcp.getRotationAngle() : 0.0);
+            Vector3d v = new Vector3d();
+            MathTools.rotate(q, MathTools.Y_AXIS,v);
+            tcp.setTurnAxis(v);
+            tcp.setWorldOrientation(q);
+            return tcp.getTurnAngle();
+               }
        }
 
        /**
@@ -1563,7 +1612,7 @@ public class PipingRules {
                        turnAngle = 0.0;
                        tcp.setTurnAngle(0.0);
                        tcp.setLength(0.0);
-                       tcp.setTurnAxis(MathTools.Y_AXIS);
+                       tcp.setTurnAxis(new Vector3d(MathTools.Y_AXIS));
                }
                updateControlPointOrientation(tcp);
                if (DEBUG)
@@ -1682,7 +1731,7 @@ public class PipingRules {
                }
                List<PipeControlPoint> runPcps = getControlPoints(pipeRun);
                if (runPcps.size() != count) {
-                       System.out.println("Run is not connected");
+                       System.out.println("Run " + pipeRun.getName() + " contains unconnected control points");
                }
                for (PipeControlPoint pcp : pcps) {
                        if (!pcp.isDirected() && pcp.getNext() == null && pcp.getPrevious() == null)