X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2Fcontrolpoint%2FPipingRules.java;h=100852bf5fe01aeeb59e1caec34323c43a48606b;hb=refs%2Fchanges%2F62%2F3862%2F1;hp=4f95e7964c8194db3df5afc950e043748efba808;hpb=a0ce9388e1f21b332bdeb6c3afc5a73ce6df18cb;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java index 4f95e796..100852bf 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipingRules.java @@ -138,8 +138,11 @@ public class PipingRules { public static void setEnabled(boolean enabled) { PipingRules.enabled = enabled; - if(!enabled) - currentUpdates.clear(); + if(!enabled) { + synchronized (ruleMutex) { + currentUpdates.clear(); + } + } } public static boolean isEnabled() { @@ -277,6 +280,9 @@ public class PipingRules { scp.insert(pcp1, pcp2); scp.setWorldPosition(pos); + Vector3d dir = new Vector3d(); + dir.sub(pcp2.getWorldPosition(), pcp1.getWorldPosition()); + updateControlPointOrientation(scp, dir); scp.setLength(length); validate(scp.getPipeRun()); return scp; @@ -363,26 +369,18 @@ public class PipingRules { } - @SuppressWarnings("unused") - private static boolean calculateOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList list, PipeControlPoint end, Vector3d dir, Vector3d offset) { - boolean hasOffsets = false; - List offsets = new ArrayList(list.size()); - // Only start offset affects the calculation - if (start.isOffset()) - offsets.add(start); - for (PipeControlPoint icp : list) { - if (icp.isOffset()) { - offsets.add(icp); - } else if (icp.isDualSub()) - ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp, new Exception("ASSERT!")); - } + public static boolean calculateDirectedOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList list, PipeControlPoint end, Vector3d dir, Vector3d offset) { + return calculateOffset(startPoint, endPoint, start, list, end, dir, offset, true); + } + + public static boolean calculateOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList list, PipeControlPoint end, Vector3d dir, Vector3d offset) { + return calculateOffset(startPoint, endPoint, start, list, end, dir, offset, false); + } + + private static boolean calculateOffset(Vector3d startPoint, Vector3d endPoint, PipeControlPoint start, ArrayList list, PipeControlPoint end, Vector3d dir, Vector3d offset, boolean directed) { + List offsets = getOffsetPoints(start, list); if (offsets.size() == 0) { - dir.set(endPoint); - dir.sub(startPoint); - double l = dir.lengthSquared(); - if (l > MathTools.NEAR_ZERO) - dir.scale(1.0/Math.sqrt(l)); - offset.set(0.0, 0.0, 0.0); + setZeroOffset(startPoint, endPoint, dir, offset); return false; } else { Vector3d sp = new Vector3d(startPoint); @@ -392,6 +390,7 @@ public class PipingRules { double l = dir.lengthSquared(); if (l > MathTools.NEAR_ZERO) dir.scale(1.0/Math.sqrt(l)); + int iter = 100; while (iter >= 0) { iter--; @@ -401,11 +400,16 @@ public class PipingRules { Vector3d v = icp.getSizeChangeOffsetVector(dir); offset.add(v); } + + if (directed) + break; + Point3d nep = new Point3d(endPoint); nep.sub(offset); if (nep.distance(ep) < 0.0000000001) { break; - } + } + ep = nep; dir.set(ep); dir.sub(sp); @@ -413,14 +417,37 @@ public class PipingRules { if (l > MathTools.NEAR_ZERO) dir.scale(1.0/Math.sqrt(l)); } - hasOffsets = true; + + if (DEBUG) + System.out.println("calcOffset s:"+ startPoint + " e:" + endPoint + " d:" + dir + " o:"+offset) ; + + return true; } - - if (DEBUG && hasOffsets) - System.out.println("calcOffset s:"+ startPoint + " e:" + endPoint + " d:" + dir + " o:"+offset) ; - return hasOffsets; } + public static void setZeroOffset(Vector3d startPoint, Vector3d endPoint, Vector3d dir, Vector3d offset) { + dir.set(endPoint); + dir.sub(startPoint); + double l = dir.lengthSquared(); + if (l > MathTools.NEAR_ZERO) + dir.scale(1.0/Math.sqrt(l)); + offset.set(0.0, 0.0, 0.0); + } + + public static List getOffsetPoints(PipeControlPoint start, ArrayList list) { + List offsets = new ArrayList(list.size()); + // Only start offset affects the calculation + if (start.isOffset()) + offsets.add(start); + for (PipeControlPoint icp : list) { + if (icp.isOffset()) { + offsets.add(icp); + } else if (icp.isDualSub()) + ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp, new Exception("ASSERT!")); + } + return offsets; + } + private static UpdateStruct2 createUS(PipeControlPoint start, Direction direction, int iter, ArrayList toRemove, PipeControlPoint updated) { ArrayList list = new ArrayList(); PipeControlPoint end = null; @@ -447,7 +474,6 @@ public class PipingRules { Vector3d endPoint = end.getWorldPosition(); Vector3d dir = new Vector3d(); hasOffsets = calculateOffset(startPoint, endPoint, start, list, end, dir, offset); - System.out.println(); return new UpdateStruct2(start, startPoint, list, end, endPoint, dir, offset, hasOffsets, iter, direction == Direction.PREVIOUS, toRemove, updated); } @@ -865,7 +891,8 @@ public class PipingRules { double l2next = icp.getInlineLength(); double l2 = l2prev + l2next; double l2s = l2 * l2; - if (l > l2s) { + double diff = l - l2s; + if (diff >= MIN_INLINE_LENGTH) { if (allowInsertRemove) { dir.normalize(); double length = Math.sqrt(l) - l2; // true length of the variable length component @@ -887,7 +914,11 @@ public class PipingRules { Vector3d dir = new Vector3d(); dir.sub(currentPos, prevPos); - boolean simple = currentUpdates.contains(icp); + boolean simple; + synchronized (ruleMutex) { + simple = currentUpdates.contains(icp); + } + if (simple) { // Update based on position -> adjust length double currentLength = (dir.length() - prev.getInlineLength()) * 2.0; @@ -926,12 +957,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 +976,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 list, PipeControlPoint end, Vector3d endPoint, boolean hasOffsets, int iter, boolean reversed, ArrayList toRemove, PipeControlPoint updated) throws Exception { @@ -950,7 +986,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 { @@ -989,16 +1025,19 @@ public class PipingRules { other = u.end; position = u.startPoint; dcpStart = true; + if (!u.reversed) + canMoveOther = true; inlineEnd = u.end.isInline(); } else { dcp = u.end; other = u.start; position = u.endPoint; + if (u.reversed) + canMoveOther = true; inlineEnd = u.start.isInline(); } - canMoveOther = !(other == u.updated); - + Vector3d directedDirection = direction(dcp, dcpStart ? Direction.NEXT : Direction.PREVIOUS); if (directedDirection == null) { //updateTurnControlPointTurn(dcp, dcp.getPrevious(), dcp.getNext()); @@ -1010,7 +1049,7 @@ public class PipingRules { } Point3d directedEndPoint = new Point3d(u.endPoint); if (u.hasOffsets) - directedEndPoint.add(u.offset); + directedEndPoint.sub(u.offset); double mu[] = new double[2]; @@ -1038,10 +1077,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) { backIter(u); @@ -1074,13 +1112,26 @@ public class PipingRules { if (canMoveOther) { if (DEBUG) System.out.println("PipingRules.updateDirectedPipeRun() moved end " + other + " to " + closest); + + // Not aligned - we need to recalculate the offset to reflect new end points. + Vector3d offset; + if (u.hasOffsets) { + offset = new Vector3d(); + Vector3d newDir = new Vector3d(); + calculateDirectedOffset(position, closest, u.start, u.list, u.end, newDir, offset); + closest.add(offset); + } else { + offset = new Vector3d(); + } + 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)); + checkExpandPathLeg(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Vector3d(closest), directedDirection, offset, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated), PathLegUpdateType.NONE, 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)); + checkExpandPathLeg(new UpdateStruct2(u.start, new Vector3d(closest), u.list, u.end, u.endPoint, directedDirection, offset, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated), PathLegUpdateType.NONE, true); if (u.start.getPrevious() != null) updatePathLegPrev(u.start, u.updated, PathLegUpdateType.PREV); } @@ -1262,7 +1313,6 @@ public class PipingRules { return tr; // space for 90 deg Vector3d dir = dcp.getDirectedControlPointDirection(); Vector3d dp = dcp.getWorldPosition(); - //Vector3d tp = tcp.getWorldPosition(); Vector3d op = other.getWorldPosition(); double u[] = new double[1]; Vector3d closest = MathTools.closestPointOnStraight(op, dp, dir,u); @@ -1288,7 +1338,7 @@ public class PipingRules { R = tr / t; if (R <= curr) break; - curr = R*1.01; + curr = R*1.001; iter--; } return curr; @@ -1893,7 +1943,6 @@ public class PipingRules { List list2 = pcps.get(i+1); PipeControlPoint prev = list.get(list.size()-1); PipeControlPoint next = list2.get(0); - System.out.println(); if (prev == next) { // Reverse the component on the boundary. InlineComponent ic = (InlineComponent)prev.getPipelineComponent();