From bf8d749e159470552b86484450b8b227b7985559 Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Fri, 13 Mar 2020 11:48:45 +0200 Subject: [PATCH 1/1] Fix direction calculations in addComponent() Change direction returned by getDirection(PREVIOUS) so that it matches the expectations of calling routines and is consistent with other direction vector getters. gitlab #110 Change-Id: I003d7c720f7643aedb5d545648bda1148cb96315 --- .../scenegraph/controlpoint/PipeControlPoint.java | 11 +++++++++-- .../simantics/plant3d/utils/ComponentUtils.java | 15 +++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java index fdb413ee..124e54bb 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java @@ -791,9 +791,15 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { } /** - * Returns direction vector. + * Returns direction vector pointing towards an adjacent component for + * directed control points or turn control points with one open end. * - * For directed control points, always returns outwards pointing vector. + * Always returns an outwards pointing vector. + * + * For any other type of component, the return value is null. + * + * For turn components this only return a non-null value for the unconnected + * end of the component. * * @param direction * @return normalized vector, or null @@ -837,6 +843,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { Vector3d offset = new Vector3d(); MathTools.rotate(q2, v, offset); MathTools.rotate(q, offset, dir); + dir.negate(); dir.normalize(); return dir; } diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java b/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java index 78f41665..913fceb9 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java @@ -405,6 +405,8 @@ public class ComponentUtils { sizeChange = ((InlineComponent)newComponent).isSizeChange(); } + // Calculate component position and direction vectors + // 'dir' is a unit vector that represents the direction from 'component' to 'newComponent' if (toPcp.isInline()) { switch (position) { case NEXT: @@ -434,6 +436,7 @@ public class ComponentUtils { break; case PREVIOUS: pos = new Vector3d(start); + dir.negate(); break; case SPLIT: pos = new Vector3d(toPcp.getWorldPosition()); @@ -441,11 +444,9 @@ public class ComponentUtils { default: break; } - } else if (toPcp.isDirected()) { - dir = new Vector3d(toPcp.getDirection(Direction.NEXT)); - if (position == PositionType.PREVIOUS) - dir.negate(); + // 'dir' always points out of a nozzle regardless of insertion direction + dir = new Vector3d(toPcp.getDirectedControlPointDirection()); pos = new Vector3d(toPcp.getWorldPosition()); } else if (toPcp.isTurn() && toPcp.asFixedAngle()) { dir = new Vector3d(toPcp.getDirection(position == PositionType.NEXT ? Direction.NEXT : Direction.PREVIOUS)); @@ -497,7 +498,6 @@ public class ComponentUtils { ((TurnComponent) newComponent).setRotationAngle(inst.rotationAngle); } - newComponent.updateParameters(); Vector3d v = new Vector3d(dir); @@ -516,12 +516,11 @@ public class ComponentUtils { } else { v.scale(newComponent.getControlPoint().getInlineLength()); } + switch (position) { case NEXT: - pos.add(v); - break; case PREVIOUS: - pos.sub(v); + pos.add(v); break; case SPLIT: break; -- 2.45.2