Xcos: Plant_DiscreteController simulation failed 43/12743/2
Clément DAVID [Mon, 30 Sep 2013 09:44:34 +0000 (11:44 +0200)]
while decoding links, only link non already connected links. Some fallbacks
are called to ensure that a valid link will be created.

This bug was not easily reproducible before bfd706a2 as this commit force
en decode/encode of all composite-blocks.

Change-Id: Ifeda66d57632228abd0433e0cac53584badc8932

scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/BasicBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/LinkElement.java

index 746daa8..0405a46 100644 (file)
@@ -660,7 +660,8 @@ public class BasicBlock extends ScilabGraphUniqueObject implements Serializable
         if (!hasAValidRpar && realParameters instanceof ScilabMList) {
             try {
                 final DiagramElement elem = new DiagramElement();
-                realParameters = elem.encode(elem.decode(realParameters, new XcosDiagram(false)), null);
+                final XcosDiagram d = elem.decode(realParameters, new XcosDiagram(false));
+                realParameters = elem.encode(d, null);
             } catch (ScicosFormatException e) {
                 // do nothing on error (no assignation)
             }
index a53c7e1..af74892 100644 (file)
@@ -327,7 +327,10 @@ public final class LinkElement extends AbstractElement<BasicLink> {
          */
         for (BasicPort p : startPorts) {
             if (startKlass.isInstance(p)) {
-                start = p;
+                // only link the same port once, fallback should be provided by the caller method
+                if (p.getEdgeCount() == 0) {
+                    start = p;
+                }
                 break;
             }
         }
@@ -337,7 +340,10 @@ public final class LinkElement extends AbstractElement<BasicLink> {
          */
         for (BasicPort p : endPorts) {
             if (endKlass.isInstance(p)) {
-                end = p;
+                // only link the same port once, fallback should be provided by the caller method
+                if (p.getEdgeCount() == 0) {
+                    end = p;
+                }
                 break;
             }
         }