]> gerrit.simantics Code Review - simantics/3d.git/commitdiff
Merge "Get inline component direction irrespectively of connectivity" into release...
authorMarko Luukkainen <marko.luukkainen@semantum.fi>
Wed, 11 Dec 2019 16:10:27 +0000 (16:10 +0000)
committerGerrit Code Review <gerrit2@simantics>
Wed, 11 Dec 2019 16:10:27 +0000 (16:10 +0000)
org.simantics.g3d/src/org/simantics/g3d/math/MathTools.java
org.simantics.g3d/src/org/simantics/g3d/property/DoubleArrayPropertyManipulator.java
org.simantics.g3d/src/org/simantics/g3d/property/DoubleArrayPropertyManipulator2.java
org.simantics.g3d/src/org/simantics/g3d/property/DoublePropertyManipulator.java
org.simantics.g3d/src/org/simantics/g3d/property/QuatPropertyManipulator.java
org.simantics.g3d/src/org/simantics/g3d/property/VectorPropertyManipulator.java
org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java
org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java
org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java

index aa8b0551fdc845ac8db698724f6ad38d7d612b76..b9941c8b94a774605ed91fd55752150fe3aab88d 100644 (file)
@@ -1010,4 +1010,25 @@ public class MathTools {
                mat.m23 = -(f+n)/(f-n);
                return mat;
        }
+
+       /**
+        * Round the number to a given number of decimals, if the rounded result contains at least three
+        * zero trailing decimal places within the rounded result.
+        */
+       public static double round(double value, int nsig) {
+               if (Math.abs(value) < NEAR_ZERO)
+                       return 0.0;
+               
+               int decimals = (int) Math.round(Math.log10(value));
+               int shift = nsig - decimals;
+               double multiplier = Math.pow(10.0, shift);
+               long roundedValue = Math.round(value * multiplier);
+               if (roundedValue % 1000 == 0) {
+                       // Rounding results in at least three zeroes at the end
+                       return roundedValue / multiplier;
+               } else {
+                       // Number was not close to a shorter decimal representation, return it as is
+                       return value;
+               }
+       }
 }
index a9971605af500f1433678bc20701f4b232c76734..e0148147b83bf608f878106ba031455f964f4aa6 100644 (file)
@@ -13,6 +13,8 @@ package org.simantics.g3d.property;
 
 import java.util.Arrays;
 
+import org.simantics.g3d.math.MathTools;
+
 public class DoubleArrayPropertyManipulator implements PropertyManipulator {
        
        ValueProvider provider;
@@ -52,7 +54,7 @@ public class DoubleArrayPropertyManipulator implements PropertyManipulator {
                try {
                    double[] val = getValue();
                        if (val == null) return null;
-                   return Arrays.toString(val);
+                   return Double.toString(MathTools.round(val[i], 10));
                } catch (Exception e) {
                        return null;
                }
index 6b7a2e115dbe833632888cc85024a4a2edd22ee0..9275bfead2e9dbdfc63bf1dc196472eeb1fbaf1f 100644 (file)
@@ -11,6 +11,8 @@
  *******************************************************************************/
 package org.simantics.g3d.property;
 
+import org.simantics.g3d.math.MathTools;
+
 public class DoubleArrayPropertyManipulator2 implements PropertyManipulator {
        
        ValueProvider provider;
@@ -57,7 +59,7 @@ public class DoubleArrayPropertyManipulator2 implements PropertyManipulator {
                        return "New";
             if (val.length < i)
                 return null;
-            return Double.toString(val[i]);
+            return Double.toString(MathTools.round(val[i], 10));
                } catch (Exception e) {
                        return null;
                }
index 4f7c670fc71ab186e722c31ff72adc0bab35ca71..46f892f3c849b3c0171981c56965f0f6d7dcf523 100644 (file)
@@ -11,6 +11,8 @@
  *******************************************************************************/
 package org.simantics.g3d.property;
 
+import org.simantics.g3d.math.MathTools;
+
 public class DoublePropertyManipulator implements PropertyManipulator {
        
        ValueProvider provider;
@@ -43,6 +45,8 @@ public class DoublePropertyManipulator implements PropertyManipulator {
                try {
                        Object value = provider.getValue(input);
                        if (value == null) return null;
+                       if (value instanceof Double)
+                               return Double.toString(MathTools.round((Double)value, 10));
                        return value.toString();
                } catch (Exception e) {
                        return null;
@@ -70,7 +74,8 @@ public class DoublePropertyManipulator implements PropertyManipulator {
                editMode = b;
                if (editMode) {
                        try {
-                               editValue = provider.getValue(input).toString();
+                               Object value = provider.getValue(input);
+                               editValue = value.toString();
                        } catch (Exception e) {
                                
                        }
index 2104fbcaf6f55651ca8ec066f86fec944467f80c..8c3359925f43915e12d357849d773d44c7fe469d 100644 (file)
@@ -158,7 +158,7 @@ public class QuatPropertyManipulator implements PropertyManipulator {
                        default:\r
                                break;\r
                        }\r
-                       return Double.toString(d);\r
+                       return Double.toString(MathTools.round(d, 10));\r
                } catch (Exception e) {\r
                        return null;\r
                }\r
index e0a8021925ff87635da054ced8170e9c71926a13..47587fbca2ffa44e2fd2963ce8d222695efac09a 100644 (file)
@@ -13,6 +13,8 @@ package org.simantics.g3d.property;
 
 import javax.vecmath.Vector3d;
 
+import org.simantics.g3d.math.MathTools;
+
 public class VectorPropertyManipulator implements PropertyManipulator {
        
        ValueProvider provider;
@@ -49,11 +51,11 @@ public class VectorPropertyManipulator implements PropertyManipulator {
                        if (v == null)
                                return null;
                        if (i == 0)
-                               return Double.toString(v.x);
+                               return Double.toString(MathTools.round(v.x, 10));
                        if (i == 1)
-                               return Double.toString(v.y);
+                               return Double.toString(MathTools.round(v.y, 10));
                        if (i == 2)
-                               return Double.toString(v.z);
+                               return Double.toString(MathTools.round(v.z, 10));
                        return null;
                } catch (Exception e) {
                        return null;
index 00b52f3bb1073b0e12e1cb43dd64b5b18f47b97d..0c292bc8ff8a5ec2c0173e8a40f63fce4c954eea 100644 (file)
@@ -472,25 +472,16 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange
                        }
                
                        if (selected.isSizeChange()) {
-                               filterAllowed.add(PositionType.NEXT);
-                               filterAllowed.add(PositionType.PREVIOUS);
-                               if (inlineSplit) {
-                                       turnRadiusText.setEnabled(false);
-                                       diameterText.setEnabled(false);
+                               turnRadiusText.setEnabled(true);
+                               diameterText.setEnabled(true);
+                               if (diameter == null || turnRadius == null)
                                        ok = false;
-                               } else {
-                                       turnRadiusText.setEnabled(true);
-                                       diameterText.setEnabled(true);
-                                       if (diameter == null || turnRadius == null)
-                                               ok = false;
-                               }
-                               
                        } else {
                                turnRadiusText.setEnabled(false);
                                diameterText.setEnabled(false);
                        }
                        
-                       if (!selected.isSizeChange() && !selected.isVariable()) {
+                       if (!selected.isVariable()) {
                                switch (selected.getType()) {
                                        case END:
                                                filterAllowed.add(PositionType.NEXT);
index 493f3b894702d8f86606c08e744f75afdffedf9c..e240dc585426b972dd93a42174ce99e24f4403c1 100644 (file)
@@ -15,6 +15,7 @@ import javax.vecmath.Vector3d;
 import org.simantics.g3d.math.MathTools;
 import org.simantics.g3d.property.annotations.GetPropertyValue;
 import org.simantics.g3d.scenegraph.G3DNode;
+import org.simantics.g3d.scenegraph.base.ParentNode;
 import org.simantics.plant3d.scenegraph.IP3DNode;
 import org.simantics.plant3d.scenegraph.Nozzle;
 import org.simantics.plant3d.scenegraph.P3DRootNode;
@@ -616,8 +617,8 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                if (isDualSub())
                        throw new RuntimeException("Dual sub points cannot be inserted.");
                // size change control point cannot be inserted this way, because it ends PipeRun
-               if (isSizeChange())
-                       throw new RuntimeException("Size change points cannot be inserted.");
+//             if (isSizeChange())
+//                     throw new RuntimeException("Size change points cannot be inserted.");
                PipeRun piperun = previous.getPipeRun();
                // and just to make sure that control point structure is not corrupted
                if (getPipeRun() != null) {
index 0ae36e33a2f51ca7a3aa549c14244f4547c873c9..5a84a5244839cd2b94f1660312005b68273bc2f9 100644 (file)
@@ -436,77 +436,79 @@ public class ComponentUtils {
                        }
                }
                
-               
-               if (!sizeChange) {
-                       String name = component.getPipeRun().getUniqueName(typeName);
-                       newComponent.setName(name);
+               String name = component.getPipeRun().getUniqueName(typeName);
+               newComponent.setName(name);
 
-                       pipeRun.addChild(newComponent);
+               pipeRun.addChild(newComponent);
+               if (newPcp.isSizeChange())
+                       newComponent.setAlternativePipeRun(pipeRun);
 
-                       if (newComponent instanceof InlineComponent) {
-                           InlineComponent inlineComponent = (InlineComponent)newComponent;
-                           if (inlineComponent.isVariableLength()|| inlineComponent.isModifialble()) {
-                               newPcp.setLength(inst.length);
-                               newComponent.setParameter("length", inst.length);
-                           }
-                           if (inst.rotationAngle != null)
-                               ((InlineComponent) newComponent).setRotationAngle(inst.rotationAngle);
-                       } else if (newComponent instanceof TurnComponent) {
-                           TurnComponent turnComponent = (TurnComponent)newComponent;
-                           if  (turnComponent.isVariableAngle()) {
-                               newPcp.setTurnAngle(inst.angle);
-                               newComponent.setParameter("turnAngle", inst.angle);
-                           }
-                           if (inst.rotationAngle != null)
-                       ((TurnComponent) newComponent).setRotationAngle(inst.rotationAngle);
-                       }
-                       
-                       
-                       newComponent.updateParameters();
-                       
-                       Vector3d v = new Vector3d(dir);
-                       if (insertAdjustable) {
-                               if (insertPosition == PositionType.NEXT)
-                                       v.scale(newComponent.getControlPoint().getInlineLength());
-                               else if (insertPosition == PositionType.SPLIT)
-                                       v.set(0, 0, 0);
-                               else if (insertPosition == PositionType.PREVIOUS)
-                                       v.scale(-newComponent.getControlPoint().getInlineLength());
-                       } else {
+               if (newComponent instanceof InlineComponent) {
+                   InlineComponent inlineComponent = (InlineComponent)newComponent;
+                   if (inlineComponent.isVariableLength()|| inlineComponent.isModifialble()) {
+                       newPcp.setLength(inst.length);
+                       newComponent.setParameter("length", inst.length);
+                   }
+                   if (inst.rotationAngle != null)
+                       ((InlineComponent) newComponent).setRotationAngle(inst.rotationAngle);
+               } else if (newComponent instanceof TurnComponent) {
+                   TurnComponent turnComponent = (TurnComponent)newComponent;
+                   if  (turnComponent.isVariableAngle()) {
+                               newPcp.setTurnAngle(inst.angle);
+                               newComponent.setParameter("turnAngle", inst.angle);
+                   }
+                   if (inst.rotationAngle != null)
+                ((TurnComponent) newComponent).setRotationAngle(inst.rotationAngle);
+               }
+               
+               
+               newComponent.updateParameters();
+               
+               Vector3d v = new Vector3d(dir);
+               if (insertAdjustable) {
+                       if (insertPosition == PositionType.NEXT)
                                v.scale(newComponent.getControlPoint().getInlineLength());
-                       }
-                       switch (position) {
-                       case NEXT:
-                               pos.add(v);
-                               break;
-                       case PREVIOUS:
-                               pos.sub(v);
-                               break;
-                       case SPLIT:
-                               break;
-                       default:
-                               break;
-                       }
-                       
-                       switch (position) {
-                       case NEXT: 
-                               if (toPcp.isDualInline())
-                                       toPcp = toPcp.getDualSub();
-                               newPcp.insert(toPcp, Direction.NEXT);
-                               newPcp.setWorldPosition(pos);
-                               break;
-                       case PREVIOUS:
-                               if (toPcp.isDualSub())
-                                       toPcp = toPcp.parent;
-                               newPcp.insert(toPcp, Direction.PREVIOUS);
-                               newPcp.setWorldPosition(pos);
-                               break;
-                       case SPLIT:
-                               PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, true);
-                       default:
-                               break;
-                       }
+                       else if (insertPosition == PositionType.SPLIT)
+                               v.set(0, 0, 0);
+                       else if (insertPosition == PositionType.PREVIOUS)
+                               v.scale(-newComponent.getControlPoint().getInlineLength());
                } else {
+                       v.scale(newComponent.getControlPoint().getInlineLength());
+               }
+               switch (position) {
+               case NEXT:
+                       pos.add(v);
+                       break;
+               case PREVIOUS:
+                       pos.sub(v);
+                       break;
+               case SPLIT:
+                       break;
+               default:
+                       break;
+               }
+               
+               switch (position) {
+               case NEXT: 
+                       if (toPcp.isDualInline())
+                               toPcp = toPcp.getDualSub();
+                       newPcp.insert(toPcp, Direction.NEXT);
+                       newPcp.setWorldPosition(pos);
+                       break;
+               case PREVIOUS:
+                       if (toPcp.isDualSub())
+                               toPcp = toPcp.parent;
+                       newPcp.insert(toPcp, Direction.PREVIOUS);
+                       newPcp.setWorldPosition(pos);
+                       break;
+               case SPLIT:
+                       PipingRules.splitVariableLengthComponent(newComponent, (InlineComponent)component, true);
+               default:
+                       break;
+               }
+               
+               // Move the size change and the rest of the components in the pipe run to a new pipe run
+               if (sizeChange) {
                        PipeRun other = new PipeRun();
                        String n = root.getUniqueName("PipeRun");
                        other.setName(n);
@@ -514,39 +516,31 @@ public class ComponentUtils {
                        other.setTurnRadius(inst.turnRadius);
                        root.addChild(other);
                        
+                       other.addChild(newComponent.getControlPoint().getDualSub());
+                       newComponent.setAlternativePipeRun(other);
                        
-                       if (position == PositionType.NEXT) {
-                               PipingRules.addSizeChange(false, pipeRun, other, (InlineComponent)newComponent, toPcp, null);
-                       } else if (position == PositionType.PREVIOUS){
-                               PipingRules.addSizeChange(true, pipeRun, other, (InlineComponent)newComponent, toPcp, null);
-                       }
-                       newPcp.setWorldPosition(pos);
-
-                       // TODO : chicken-egg problem
-                       newComponent.updateParameters();
-                       Vector3d v = new Vector3d(dir);
-                       v.scale(newComponent.getControlPoint().getLength()*0.5);
-                       switch (position) {
-                       case NEXT:
-                               pos.add(v);
-                               break;
-                       case PREVIOUS:
-                               pos.sub(v);
-                               break;
-                       case SPLIT:
-                               break;
-                       default:
-                               break;
+                       boolean forward = position != PositionType.PREVIOUS;
+                       PipelineComponent comp = forward ? newComponent.getNext() : newComponent.getPrevious();
+                       while (comp != null && comp.getPipeRun() == pipeRun) {
+                               if (comp.getParent() == pipeRun) {
+                                       comp.deattach();
+                                       other.addChild(comp);
+                               } else {
+                                       comp.setPipeRun(other);
+                               }
+                               
+                               // Reset parameters to match new pipe run
+                               comp.updateParameters();
+                               
+                               comp = forward ? comp.getNext() : comp.getPrevious();
                        }
-                       newPcp.setWorldPosition(pos);
-               if (inst.rotationAngle != null)
-                  ((InlineComponent) newComponent).setRotationAngle(inst.rotationAngle);
                        
+                       newComponent.updateParameters();
                }
-                               
                
                return newComponent;
        }
+       
        public static boolean connect(PipelineComponent current, PipelineComponent endTo) throws Exception {
                return connect(current, endTo, null, null);
        }