plcopen/plcopen.py
changeset 1232 b6894285d4cc
parent 1171 a506e4de8f84
child 1234 9623d591efb9
equal deleted inserted replaced
1231:0b5d608ed2be 1232:b6894285d4cc
  1749     setattr(cls, "Search", Search)
  1749     setattr(cls, "Search", Search)
  1750 
  1750 
  1751 cls = PLCOpenClasses.get("body", None)
  1751 cls = PLCOpenClasses.get("body", None)
  1752 if cls:
  1752 if cls:
  1753     cls.currentExecutionOrderId = 0
  1753     cls.currentExecutionOrderId = 0
       
  1754     cls.instances_dict = {}
       
  1755     
       
  1756     setattr(cls, "_loadXMLTree", getattr(cls, "loadXMLTree"))
       
  1757     
       
  1758     def loadXMLTree(self, *args, **kwargs):
       
  1759         self._loadXMLTree(*args, **kwargs)
       
  1760         if self.content["name"] in ["LD","FBD","SFC"]:
       
  1761             self.instances_dict = dict(
       
  1762                 [(element["value"].getlocalId(), element)
       
  1763                  for element in self.content["value"].getcontent()])
       
  1764     setattr(cls, "loadXMLTree", loadXMLTree)
  1754     
  1765     
  1755     def resetcurrentExecutionOrderId(self):
  1766     def resetcurrentExecutionOrderId(self):
  1756         object.__setattr__(self, "currentExecutionOrderId", 0)
  1767         object.__setattr__(self, "currentExecutionOrderId", 0)
  1757     setattr(cls, "resetcurrentExecutionOrderId", resetcurrentExecutionOrderId)
  1768     setattr(cls, "resetcurrentExecutionOrderId", resetcurrentExecutionOrderId)
  1758     
  1769     
  1823             raise TypeError, _("Can only generate execution order on FBD networks!")
  1834             raise TypeError, _("Can only generate execution order on FBD networks!")
  1824     setattr(cls, "setelementExecutionOrder", setelementExecutionOrder)
  1835     setattr(cls, "setelementExecutionOrder", setelementExecutionOrder)
  1825     
  1836     
  1826     def appendcontentInstance(self, name, instance):
  1837     def appendcontentInstance(self, name, instance):
  1827         if self.content["name"] in ["LD","FBD","SFC"]:
  1838         if self.content["name"] in ["LD","FBD","SFC"]:
  1828             self.content["value"].appendcontent({"name" : name, "value" : instance})
  1839             element = {"name" : name, "value" : instance}
       
  1840             self.content["value"].appendcontent(element)
       
  1841             self.instances_dict[instance.getlocalId()] = element
  1829         else:
  1842         else:
  1830             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1843             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1831     setattr(cls, "appendcontentInstance", appendcontentInstance)
  1844     setattr(cls, "appendcontentInstance", appendcontentInstance)
  1832     
  1845     
  1833     def getcontentInstances(self):
  1846     def getcontentInstances(self):
  1840             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1853             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1841     setattr(cls, "getcontentInstances", getcontentInstances)
  1854     setattr(cls, "getcontentInstances", getcontentInstances)
  1842 
  1855 
  1843     def getcontentInstance(self, id):
  1856     def getcontentInstance(self, id):
  1844         if self.content["name"] in ["LD","FBD","SFC"]:
  1857         if self.content["name"] in ["LD","FBD","SFC"]:
  1845             for element in self.content["value"].getcontent():
  1858             instance = self.instances_dict.get(id, None)
  1846                 if element["value"].getlocalId() == id:
  1859             if instance is not None:
  1847                     return element["value"]
  1860                 return instance["value"]
  1848             return None
  1861             return None
  1849         else:
  1862         else:
  1850             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1863             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1851     setattr(cls, "getcontentInstance", getcontentInstance)
  1864     setattr(cls, "getcontentInstance", getcontentInstance)
  1852     
  1865     
  1853     def getcontentRandomInstance(self, exclude):
  1866     def getcontentRandomInstance(self, exclude):
  1854         if self.content["name"] in ["LD","FBD","SFC"]:
  1867         if self.content["name"] in ["LD","FBD","SFC"]:
  1855             for element in self.content["value"].getcontent():
  1868             ids = self.instances_dict.viewkeys() - exclude
  1856                 if element["value"].getlocalId() not in exclude:
  1869             if len(ids) > 0:
  1857                     return element["value"]
  1870                 return self.instances_dict[ids.pop()]["value"]
  1858             return None
  1871             return None
  1859         else:
  1872         else:
  1860             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1873             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1861     setattr(cls, "getcontentRandomInstance", getcontentRandomInstance)
  1874     setattr(cls, "getcontentRandomInstance", getcontentRandomInstance)
  1862     
  1875     
  1869             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1882             raise TypeError, _("%s body don't have instances!")%self.content["name"]
  1870     setattr(cls, "getcontentInstanceByName", getcontentInstanceByName)
  1883     setattr(cls, "getcontentInstanceByName", getcontentInstanceByName)
  1871     
  1884     
  1872     def removecontentInstance(self, id):
  1885     def removecontentInstance(self, id):
  1873         if self.content["name"] in ["LD","FBD","SFC"]:
  1886         if self.content["name"] in ["LD","FBD","SFC"]:
  1874             i = 0
  1887             element = self.instances_dict.get(id, None)
  1875             removed = False
  1888             if element is not None:
  1876             elements = self.content["value"].getcontent()
  1889                 self.content["value"].getcontent().remove(element)
  1877             while i < len(elements) and not removed:
  1890             else:
  1878                 if elements[i]["value"].getlocalId() == id:
       
  1879                     self.content["value"].removecontent(i)
       
  1880                     removed = True
       
  1881                 i += 1
       
  1882             if not removed:
       
  1883                 raise ValueError, _("Instance with id %d doesn't exist!")%id
  1891                 raise ValueError, _("Instance with id %d doesn't exist!")%id
  1884         else:
  1892         else:
  1885             raise TypeError, "%s body don't have instances!"%self.content["name"]
  1893             raise TypeError, "%s body don't have instances!"%self.content["name"]
  1886     setattr(cls, "removecontentInstance", removecontentInstance)
  1894     setattr(cls, "removecontentInstance", removecontentInstance)
  1887     
  1895