]> gerrit.simantics Code Review - simantics/3d.git/commitdiff
Fix directed path leg update failing to update inline lengths 80/3680/1
authorMarko Luukkainen <marko.luukkainen@semantum.fi>
Thu, 5 Dec 2019 12:31:00 +0000 (14:31 +0200)
committerMarko Luukkainen <marko.luukkainen@semantum.fi>
Thu, 5 Dec 2019 12:35:29 +0000 (12:35 +0000)
Changed PipeControlPoint.getPathLegDirection to return normalized
vectors, or null.

Also, now Plant3D editor reports PipingRule errors happening during
model load.

gitlab #35

Change-Id: I159db0a8f04ed69df0b98fd859a4bf0fd58427de
(cherry picked from commit 61ce1ae33f46cf6d73a8d0ec151dcf1cd27db49f)

org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java
org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java
org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java

index 9051d44a55f0c79aa92e00078d19bf61296af3d0..a97be312f5e3605947f3a45a80c2c2a735bce984 100644 (file)
@@ -179,7 +179,7 @@ public class Plant3DEditor extends ResourceEditorPart {
                                
                                @Override
                                public void run(ReadGraph graph) throws DatabaseException {
-                                   System.out.println("START PLANT3D LOAD");
+                                   //System.out.println("START PLANT3D LOAD");
                                        PipingRules.setEnabled(false);
                                        IMappingSchema<Resource,INode> schema = getSchema(graph);
                                        mapping = Mappings.createWithListening(schema);
@@ -195,7 +195,7 @@ public class Plant3DEditor extends ResourceEditorPart {
                         throw new DatabaseException(e);
                     }
                                        
-                                       System.out.println("END PLANT3D LOAD");
+                                       //System.out.println("END PLANT3D LOAD");
                                }
                        });
                        
@@ -293,6 +293,7 @@ public class Plant3DEditor extends ResourceEditorPart {
                             if (nodeMap.isRangeModified());
                                 nodeMap.commit("Load sync");
                         } catch (Exception e) {
+                            ExceptionUtils.logAndShowError("Failed to load model correctly", e);
                             //throw new DatabaseException(e);
                         }
                         panel.removeListener(this);  
index c5d780c36b8d5f2dc3b4d0abf5642410509614f3..eec074a68b88693812f7c8f686a08036ea72a548 100644 (file)
@@ -331,9 +331,9 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
         // We need to calculate turnAngle and rotationAngle
            Vector3d dirOut = getPathLegDirection(direction == Direction.NEXT ? Direction.NEXT : Direction.PREVIOUS);
         Vector3d dir = getPathLegDirection(direction == Direction.NEXT ? Direction.PREVIOUS : Direction.NEXT);
+        if (dir == null || dirOut == null)
+            return;
         dir.negate();
-        dirOut.normalize();
-        dir.normalize();
         double angle = dir.angle(dirOut);
         //super._setNext(null);
         if (direction == Direction.NEXT)
@@ -751,6 +751,14 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                return dir;
        }
        
+       /**
+        * Returns direction vector. 
+        * 
+        * For directed control points, always returns outwards pointing vector.
+        * 
+        * @param direction
+        * @return normalized vector, or null
+        */
        public Vector3d getDirection(Direction direction) {
         if (isDirected())
             return getDirectedControlPointDirection();
@@ -771,6 +779,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                     Vector3d offset = new Vector3d();
                     MathTools.rotate(q2, v, offset);
                     MathTools.rotate(q, offset, dir);
+                    dir.normalize();
                     return dir;
                 }
             } else {
@@ -789,6 +798,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                     Vector3d offset = new Vector3d();
                     MathTools.rotate(q2, v, offset);
                     MathTools.rotate(q, offset, dir);
+                    dir.normalize();
                     return dir;
                 }
             }
@@ -796,6 +806,14 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
         return null;
     }
 
+       /**
+        * Returns path leg direction of the control point.
+        * 
+        * This method differs from getDirection by also returning inward pointing vectors for directed control points.
+        * 
+        * @param direction
+        * @return
+        */
        public Vector3d getPathLegDirection(Direction direction) {
                if (direction == Direction.NEXT) {
                        if (next != null) {
@@ -805,6 +823,10 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                }
                                Vector3d v = new Vector3d();
                                v.sub(next.getWorldPosition(),pcp.getWorldPosition());
+                               if (v.lengthSquared() > MathTools.NEAR_ZERO)
+                    v.normalize();
+                else
+                    return null;
                                return v;
                        } else {
                                if (previous == null) {
@@ -822,12 +844,20 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                                }
                                                Vector3d v = new Vector3d();
                                                v.sub(pcp.getWorldPosition(),previous.getWorldPosition());
+                                               if (v.lengthSquared() > MathTools.NEAR_ZERO)
+                               v.normalize();
+                                               else
+                                                   return null;
                                                return v;
                                        } else if (isDirected()) {
                                                return getDirectedControlPointDirection();
                                        } else if (isEnd()) {
                                                Vector3d v = new Vector3d();
                                                v.sub(getWorldPosition(),previous.getWorldPosition());
+                                               if (v.lengthSquared() > MathTools.NEAR_ZERO)
+                            v.normalize();
+                        else
+                            return null;
                                                return v;
                                        } else if (isTurn() && asFixedAngle() && !_getReversed()) {
                                                return getDirection(Direction.NEXT);
@@ -842,6 +872,10 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                        pcp = getParentPoint();
                                Vector3d v = new Vector3d();
                                v.sub(previous.getWorldPosition(),pcp.getWorldPosition());
+                               if (v.lengthSquared() > MathTools.NEAR_ZERO)
+                    v.normalize();
+                else
+                    return null;
                                return v;
                        } else {
                                if (next == null)  {
@@ -860,6 +894,10 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                                }
                                                Vector3d v = new Vector3d();
                                                v.sub(pcp.getWorldPosition(),next.getWorldPosition());
+                                               if (v.lengthSquared() > MathTools.NEAR_ZERO)
+                            v.normalize();
+                        else
+                            return null;
                                                return v;
                                        } else if (isDirected()) {
                                                Vector3d v = getDirectedControlPointDirection();
@@ -868,6 +906,10 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                        } else if (isEnd()) {
                                                Vector3d v = new Vector3d();
                                                v.sub(getWorldPosition(),next.getWorldPosition());
+                                               if (v.lengthSquared() > MathTools.NEAR_ZERO)
+                            v.normalize();
+                        else
+                            return null;
                                                return v;
                                        } else if (isTurn() && asFixedAngle() && _getReversed()) {
                                                return getDirection(Direction.PREVIOUS);
@@ -898,9 +940,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                Vector3d pos = getWorldPosition(), pos2 = sub == this ? pos : sub.getWorldPosition();
                
                Vector3d dir1 = getPathLegDirection(Direction.PREVIOUS);
-               dir1.normalize();
                Vector3d dir2 = sub.getPathLegDirection(Direction.NEXT);
-               dir2.normalize();
                if (isInline()) {
                        dir1.scale(length * 0.5);
                        dir2.scale(length * 0.5);
@@ -918,9 +958,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                PipeControlPoint sub = isAxial() ? this : getDualSub();
                
                Vector3d dir1 = getPathLegDirection(Direction.PREVIOUS);
-               dir1.normalize();
                Vector3d dir2 = sub.getPathLegDirection(Direction.NEXT);
-               dir2.normalize();
                v1.set(dir1);
                v2.set(dir2);
        }
@@ -1470,6 +1508,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        public void setOrientation(Quat4d orientation) {
                if (MathTools.equals(orientation, getOrientation()))
                        return;
+               if (getPipelineComponent() != null && (getPipelineComponent() instanceof Nozzle))
+                   System.out.println();
                super.setOrientation(orientation);
                if (getParentPoint() == null && component != null)
                        component._setWorldOrientation(getWorldOrientation());
index 57ee4ba86a382e9ac49ed7253ccdaf03f0a248e4..e8e39c081d7c1461e297777bd08336335a9641e9 100644 (file)
@@ -926,12 +926,17 @@ public class PipingRules {
                }
        }
 
-       private static void ppNoOffset(UpdateStruct2 u) throws Exception {
+       /**
+        * Recalculates offset vector based on current direction, and calls checkExpandPathLeg
+        * @param u
+        * @param updateEnds
+        * @throws Exception
+        */
+       private static void ppNoOffset(UpdateStruct2 u, boolean updateEnds) throws Exception {
                if (DEBUG)
                        System.out.println("PipingRules.ppNoOffset() " + u);
                Vector3d offset = new Vector3d();
                if (u.hasOffsets) {
-                       u.dir.normalize();
                        for (PipeControlPoint icp : u.list) {
                                if (icp.isOffset()) {
                                        offset.add(icp.getSizeChangeOffsetVector(u.dir));
@@ -940,7 +945,7 @@ public class PipingRules {
                        }
                }
                u.offset = offset;
-               checkExpandPathLeg(u, PathLegUpdateType.NONE);
+               checkExpandPathLeg(u, PathLegUpdateType.NONE, updateEnds);
        }
 
        private static void ppNoDir(PipeControlPoint start, Vector3d startPoint, ArrayList<PipeControlPoint> list, PipeControlPoint end, Vector3d endPoint, boolean hasOffsets, int iter, boolean reversed, ArrayList<ExpandIterInfo> toRemove, PipeControlPoint updated) throws Exception {
@@ -950,7 +955,7 @@ public class PipingRules {
                Vector3d dir = new Vector3d();
                Vector3d offset = new Vector3d();
                hasOffsets = calculateOffset(startPoint, endPoint, start, list, end, dir, offset);
-               ppNoOffset(new UpdateStruct2(start, startPoint, list, end, endPoint, dir, null, hasOffsets, iter, reversed, toRemove, updated));
+               ppNoOffset(new UpdateStruct2(start, startPoint, list, end, endPoint, dir, null, hasOffsets, iter, reversed, toRemove, updated),true);
        }
 
        private static void checkExpandPathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) throws Exception {
@@ -1041,9 +1046,9 @@ public class PipingRules {
                    canMoveOther = true;
                }
                if (aligned) {
-                       if (u.start.isInline() || u.end.isInline() || u.start.asFixedAngle() || u.end.asFixedAngle())
-                               processPathLeg(u, true, false);
-                       checkExpandPathLeg(u, lengthChange, inlineEnd);
+                       //if (u.start.isInline() || u.end.isInline() || u.start.asFixedAngle() || u.end.asFixedAngle())
+                   //    processPathLeg(u, true, false);
+                       checkExpandPathLeg(u, lengthChange, inlineEnd || u.start.isInline() || u.end.isInline() || u.start.asFixedAngle() || u.end.asFixedAngle());
                        
                } else {
                        if (u.iter > 0) {
@@ -1079,11 +1084,11 @@ public class PipingRules {
                                                        System.out.println("PipingRules.updateDirectedPipeRun() moved end " + other + " to " + closest);
                                                other.setWorldPosition(closest);
                                                if (dcpStart) {
-                                                       ppNoOffset(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Vector3d(closest), directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated));
+                                                       ppNoOffset(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Vector3d(closest), directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated),true);
                                                        if (u.end.getNext() != null)
                                                                updatePathLegNext(u.end, u.updated, PathLegUpdateType.NEXT);
                                                } else {
-                                                       ppNoOffset(new UpdateStruct2(u.start, new Vector3d(closest), u.list, u.end, u.endPoint, directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated));
+                                                       ppNoOffset(new UpdateStruct2(u.start, new Vector3d(closest), u.list, u.end, u.endPoint, directedDirection, null, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated),true);
                                                        if (u.start.getPrevious() != null)
                                                                updatePathLegPrev(u.start, u.updated, PathLegUpdateType.PREV);
                                                }