Added support for speed up loading graphic viewers
authorLaurent Bessard
Thu, 06 Jun 2013 17:03:19 +0200
changeset 1232 b6894285d4cc
parent 1231 0b5d608ed2be
child 1233 5e6d0969bb5d
Added support for speed up loading graphic viewers
plcopen/plcopen.py
--- a/plcopen/plcopen.py	Thu Jun 06 16:02:46 2013 +0200
+++ b/plcopen/plcopen.py	Thu Jun 06 17:03:19 2013 +0200
@@ -1751,6 +1751,17 @@
 cls = PLCOpenClasses.get("body", None)
 if cls:
     cls.currentExecutionOrderId = 0
+    cls.instances_dict = {}
+    
+    setattr(cls, "_loadXMLTree", getattr(cls, "loadXMLTree"))
+    
+    def loadXMLTree(self, *args, **kwargs):
+        self._loadXMLTree(*args, **kwargs)
+        if self.content["name"] in ["LD","FBD","SFC"]:
+            self.instances_dict = dict(
+                [(element["value"].getlocalId(), element)
+                 for element in self.content["value"].getcontent()])
+    setattr(cls, "loadXMLTree", loadXMLTree)
     
     def resetcurrentExecutionOrderId(self):
         object.__setattr__(self, "currentExecutionOrderId", 0)
@@ -1825,7 +1836,9 @@
     
     def appendcontentInstance(self, name, instance):
         if self.content["name"] in ["LD","FBD","SFC"]:
-            self.content["value"].appendcontent({"name" : name, "value" : instance})
+            element = {"name" : name, "value" : instance}
+            self.content["value"].appendcontent(element)
+            self.instances_dict[instance.getlocalId()] = element
         else:
             raise TypeError, _("%s body don't have instances!")%self.content["name"]
     setattr(cls, "appendcontentInstance", appendcontentInstance)
@@ -1842,9 +1855,9 @@
 
     def getcontentInstance(self, id):
         if self.content["name"] in ["LD","FBD","SFC"]:
-            for element in self.content["value"].getcontent():
-                if element["value"].getlocalId() == id:
-                    return element["value"]
+            instance = self.instances_dict.get(id, None)
+            if instance is not None:
+                return instance["value"]
             return None
         else:
             raise TypeError, _("%s body don't have instances!")%self.content["name"]
@@ -1852,9 +1865,9 @@
     
     def getcontentRandomInstance(self, exclude):
         if self.content["name"] in ["LD","FBD","SFC"]:
-            for element in self.content["value"].getcontent():
-                if element["value"].getlocalId() not in exclude:
-                    return element["value"]
+            ids = self.instances_dict.viewkeys() - exclude
+            if len(ids) > 0:
+                return self.instances_dict[ids.pop()]["value"]
             return None
         else:
             raise TypeError, _("%s body don't have instances!")%self.content["name"]
@@ -1871,15 +1884,10 @@
     
     def removecontentInstance(self, id):
         if self.content["name"] in ["LD","FBD","SFC"]:
-            i = 0
-            removed = False
-            elements = self.content["value"].getcontent()
-            while i < len(elements) and not removed:
-                if elements[i]["value"].getlocalId() == id:
-                    self.content["value"].removecontent(i)
-                    removed = True
-                i += 1
-            if not removed:
+            element = self.instances_dict.get(id, None)
+            if element is not None:
+                self.content["value"].getcontent().remove(element)
+            else:
                 raise ValueError, _("Instance with id %d doesn't exist!")%id
         else:
             raise TypeError, "%s body don't have instances!"%self.content["name"]