plcopen/plcopen.py
changeset 1291 42ea51d083ce
parent 1290 13ee5f4ab612
child 1293 40117d02601b
--- a/plcopen/plcopen.py	Mon Aug 26 10:55:03 2013 +0200
+++ b/plcopen/plcopen.py	Wed Aug 28 11:52:46 2013 +0200
@@ -186,7 +186,7 @@
     setattr(cls, "hasblock", hasblock)
     
     def Search(self, criteria, parent_infos):
-        return [(tuple(parent_infos),) + result for result in TestTextElement(self.gettext(), criteria)]
+        return [(tuple(parent_infos),) + result for result in TestTextElement(self.getanyText(), criteria)]
     setattr(cls, "Search", Search)
     
 cls = PLCOpenParser.GetElementClass("project")
@@ -473,9 +473,9 @@
         block_infos = {"name" : pou_name, "type" : pou_type, "extensible" : False,
                        "inputs" : [], "outputs" : [], "comment" : pou.getdescription(),
                        "generate" : generate_block, "initialise" : initialise_block}
-        if pou.getinterface():
+        if pou.interface is not None:
             return_type = pou.interface.getreturnType()
-            if return_type:
+            if return_type is not None:
                 var_type = return_type.getcontent()
                 var_type_name = var_type.getLocalTag()
                 if var_type_name == "derived":
@@ -553,7 +553,7 @@
         # Analyze each pou
         for pou in self.getpous():
             name = pou.getname()
-            if pou.interface:
+            if pou.interface is not None:
                 # Extract variables from every varLists
                 for varlist_type, varlist in pou.getvars():
                     for var in varlist.getvariable():
@@ -869,14 +869,11 @@
         var.setname(name)
         var_type_obj = PLCOpenParser.CreateElement("dataType")
         if var_type in [x for x,y in TypeHierarchy_list if not x.startswith("ANY")]:
-            if var_type == "STRING":
-                var_type_obj.setcontent(PLCOpenParser.CreateElement("string", "elementaryTypes"))
-            elif var_type == "WSTRING":
-                var_type_obj.setcontent(PLCOpenParser.CreateElement("wstring", "elementaryTypes"))
-            else:
-                var_type_obj.setcontent(PLCOpenParser.CreateElement(var_type))
+            var_type_obj.setcontent(PLCOpenParser.CreateElement(
+                var_type.lower() if var_type in ["STRING", "WSTRING"]
+                else vartype, "dataType"))
         else:
-            derived_type = PLCOpenParser.CreateElement("derived", "derivedTypes")
+            derived_type = PLCOpenParser.CreateElement("derived", "dataType")
             derived_type.setname(var_type)
             var_type_obj.setcontent(derived_type)
         var.settype(var_type_obj)
@@ -884,7 +881,7 @@
             var.setaddress(location)
         if description != "":
             ft = PLCOpenParser.CreateElementClass("formattedText")
-            ft.settext(description)
+            ft.setanyText(description)
             var.setdocumentation(ft)
         globalvars[-1].appendvariable(var)
     setattr(cls, "addglobalVar", addglobalVar)
@@ -1197,7 +1194,7 @@
         return search_result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("array", "derivedTypes")
+cls = PLCOpenParser.GetElementClass("array", "dataType")
 if cls:
     setattr(cls, "updateElementName", _updateBaseTypeElementName)
     
@@ -1217,17 +1214,17 @@
                                  criteria, parent_infos))
     return search_result
 
-cls = PLCOpenParser.GetElementClass("subrangeSigned", "derivedTypes")
+cls = PLCOpenParser.GetElementClass("subrangeSigned", "dataType")
 if cls:
     setattr(cls, "updateElementName", _updateBaseTypeElementName)
     setattr(cls, "Search", _SearchInSubrange)
 
-cls = PLCOpenParser.GetElementClass("subrangeUnsigned", "derivedTypes")
+cls = PLCOpenParser.GetElementClass("subrangeUnsigned", "dataType")
 if cls:
     setattr(cls, "updateElementName", _updateBaseTypeElementName)
     setattr(cls, "Search", _SearchInSubrange)
 
-cls = PLCOpenParser.GetElementClass("enum", "derivedTypes")
+cls = PLCOpenParser.GetElementClass("enum", "dataType")
 if cls:
     
     def updateElementName(self, old_name, new_name):
@@ -1250,13 +1247,13 @@
         if doc is None:
             doc = PLCOpenParser.CreateElement("formattedText")
             self.setdocumentation(doc)
-        doc.settext(description)
+        doc.setanyText(description)
     setattr(cls, "setdescription", setdescription)
     
     def getdescription(self):
         doc = self.getdocumentation()
         if doc is not None:
-            return doc.gettext()
+            return doc.getanyText()
         return ""
     setattr(cls, "getdescription", getdescription)
     
@@ -1348,6 +1345,7 @@
         if self.interface is None:
             self.interface = PLCOpenParser.CreateElement("interface", "pou")
         self.interface.setcontent(vars)
+        print self.interface.tostring()
     setattr(cls, "setvars", setvars)
     
     def addpouLocalVar(self, var_type, name, location="", description=""):
@@ -1373,14 +1371,11 @@
         var.setname(name)
         var_type_obj = PLCOpenParser.CreateElement("dataType")
         if var_type in [x for x,y in TypeHierarchy_list if not x.startswith("ANY")]:
-            if var_type == "STRING":
-                var_type_obj.setcontent(PLCOpenParser.CreateElement("string", "elementaryTypes"))
-            elif var_type == "WSTRING":
-                var_type_obj.setcontent(PLCOpenParser.CreateElement("wstring", "elementaryTypes"))
-            else:
-                var_type_obj.setcontent(PLCOpenParser.CreateElement(var_type))
+            var_type_obj.setcontent(PLCOpenParser.CreateElement(
+                var_type.lower() if var_type in ["STRING", "WSTRING"]
+                else var_type, "dataType"))
         else:
-            derived_type = PLCOpenParser.CreateElement("derived", "derivedTypes")
+            derived_type = PLCOpenParser.CreateElement("derived", "dataType")
             derived_type.setname(var_type)
             var_type_obj.setcontent(derived_type)
         var.settype(var_type_obj)
@@ -1388,7 +1383,7 @@
             var.setaddress(location)
         if description != "":
             ft = PLCOpenParser.GetElementClass("formattedText")()
-            ft.settext(description)
+            ft.setanyText(description)
             var.setdocumentation(ft)
         
         content[-1]["value"].appendvariable(var)
@@ -1453,9 +1448,9 @@
         transition.setname(name)
         transition.setbodyType(body_type)
         if body_type == "ST":
-            transition.settext(":= ;")
+            transition.setanyText(":= ;")
         elif body_type == "IL":
-            transition.settext("\tST\t%s"%name)
+            transition.setanyText("\tST\t%s"%name)
         self.transitions.appendtransition(transition)
     setattr(cls, "addtransition", addtransition)
     
@@ -1832,7 +1827,10 @@
     
     def getcontentRandomInstance(self, exclude):
         if self.content.getLocalTag() in ["LD","FBD","SFC"]:
-            instance = self.content.xpath("*[regexp:test(@localId,'(%s)')]" % "|".join(map(str, exclude)))
+            instance = self.content.xpath("*%s[position()=1]" %  
+                ("[not(%s)]" % " or ".join(
+                    map(lambda x: "@localId=%d" % x, exclude))
+                if len(exclude) > 0 else ""))
             if len(instance) > 0:
                 return instance[0]
             return None
@@ -1863,14 +1861,14 @@
     
     def settext(self, text):
         if self.content.getLocalTag() in ["IL","ST"]:
-            self.content.settext(text)
+            self.content.setanyText(text)
         else:
             raise TypeError, _("%s body don't have text!")%self.content["name"]
     setattr(cls, "settext", settext)
 
     def gettext(self):
         if self.content.getLocalTag() in ["IL","ST"]:
-            return self.content.gettext()
+            return self.content.getanyText()
         else:
             raise TypeError, _("%s body don't have text!")%self.content["name"]
     setattr(cls, "gettext", gettext)
@@ -2103,7 +2101,7 @@
         infos = _getelementinfos(self)
         infos["type"] = type
         specific_values = infos["specific_values"]
-        specific_values["name"] = self.getexpression()
+        specific_values["name"] = self.getexpression().text
         _getexecutionOrder(self, specific_values)
         if input and output:
             infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True, "input"))
@@ -2116,7 +2114,7 @@
     return getvariableinfos
 
 def _getconnectorinfosFunction(type):
-    def getvariableinfos(self):
+    def getconnectorinfos(self):
         infos = _getelementinfos(self)
         infos["type"] = type
         infos["specific_values"]["name"] = self.getname()
@@ -2125,7 +2123,7 @@
         elif type == "continuation":
             infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
         return infos
-    return getvariableinfos
+    return getconnectorinfos
 
 def _getpowerrailinfosFunction(type):
     def getpowerrailinfos(self):
@@ -2190,11 +2188,11 @@
     setattr(cls, "getinfos", getinfos)
     
     def setcontentText(self, text):
-        self.content.settext(text)
+        self.content.setanyText(text)
     setattr(cls, "setcontentText", setcontentText)
         
     def getcontentText(self):
-        return self.content.gettext()
+        return self.content.getanyText()
     setattr(cls, "getcontentText", getcontentText)
     
     def updateElementName(self, old_name, new_name):
@@ -2378,7 +2376,7 @@
         elif condition_type == "inline":
             condition = PLCOpenParser.CreateElement("inline", "condition")
             condition.setcontent(PLCOpenParser.GetElementClass("ST", "inline"))
-            condition.settext(value)
+            condition.setanyText(value)
         elif condition_type == "connection":
             condition = PLCOpenParser.CreateElementClass("connectionPointIn")
         self.condition.setcontent(condition)
@@ -2391,7 +2389,7 @@
             if values["type"] == "reference":
                 values["value"] = content.getname()
             elif values["type"] == "inline":
-                values["value"] = content.gettext()
+                values["value"] = content.getanyText()
             elif values["type"] == "connectionPointIn":
                 values["type"] = "connection"
                 values["value"] = content
@@ -2479,23 +2477,23 @@
         return search_result
     setattr(cls, "Search", Search)
     
-cls = _initElementClass("selectionDivergence", "sfcObjects_selectionDivergence", "single")
+cls = _initElementClass("selectionDivergence", "sfcObjects", "single")
 if cls:
     setattr(cls, "getinfos", _getdivergenceinfosFunction(True, False))
 
-cls = _initElementClass("selectionConvergence", "sfcObjects_selectionConvergence", "multiple")
+cls = _initElementClass("selectionConvergence", "sfcObjects", "multiple")
 if cls:
     setattr(cls, "getinfos", _getdivergenceinfosFunction(False, False))
 
-cls = _initElementClass("simultaneousDivergence", "sfcObjects_simultaneousDivergence", "single")
+cls = _initElementClass("simultaneousDivergence", "sfcObjects", "single")
 if cls:
     setattr(cls, "getinfos", _getdivergenceinfosFunction(True, True))
 
-cls = _initElementClass("simultaneousConvergence", "sfcObjects_simultaneousConvergence", "multiple")
+cls = _initElementClass("simultaneousConvergence", "sfcObjects", "multiple")
 if cls:
     setattr(cls, "getinfos", _getdivergenceinfosFunction(False, True))
 
-cls = _initElementClass("jumpStep", "sfcObjects_jumpStep", "single")
+cls = _initElementClass("jumpStep", "sfcObjects", "single")
 if cls:
     def getinfos(self):
         infos = _getelementinfos(self)
@@ -2536,12 +2534,12 @@
     def setinlineContent(self, content):
         if self.inline:
             self.inline.setcontent(PLCOpenParser.CreateElementClass("ST", "action"))
-            self.inline.settext(content)
+            self.inline.setanyText(content)
     setattr(cls, "setinlineContent", setinlineContent)
     
     def getinlineContent(self):
         if self.inline:
-            return self.inline.gettext()
+            return self.inline.getanyText()
         return None
     setattr(cls, "getinlineContent", getinlineContent)
 
@@ -2571,7 +2569,7 @@
                        criteria, parent_infos)
     setattr(cls, "Search", Search)
 
-cls = _initElementClass("actionBlock", "commonObjects_actionBlock", "single")
+cls = _initElementClass("actionBlock", "commonObjects", "single")
 if cls:
     def compatibility(self, tree):
         for child in tree.childNodes[:]:
@@ -2649,7 +2647,7 @@
 def _SearchInIOVariable(self, criteria, parent_infos=[]):
     return _Search([("expression", self.getexpression())], criteria, parent_infos + ["io_variable", self.getlocalId()])
 
-cls = _initElementClass("inVariable", "fbdObjects_inVariable")
+cls = _initElementClass("inVariable", "fbdObjects")
 if cls:
     setattr(cls, "getinfos", _getvariableinfosFunction("input", False, True))
     
@@ -2664,7 +2662,7 @@
 
     setattr(cls, "Search", _SearchInIOVariable)
 
-cls = _initElementClass("outVariable", "fbdObjects_outVariable", "single")
+cls = _initElementClass("outVariable", "fbdObjects", "single")
 if cls:
     setattr(cls, "getinfos", _getvariableinfosFunction("output", True, False))
     
@@ -2679,7 +2677,7 @@
 
     setattr(cls, "Search", _SearchInIOVariable)
 
-cls = _initElementClass("inOutVariable", "fbdObjects_inOutVariable", "single")
+cls = _initElementClass("inOutVariable", "fbdObjects", "single")
 if cls:
     setattr(cls, "getinfos", _getvariableinfosFunction("inout", True, True))
     
@@ -2698,7 +2696,7 @@
 def _SearchInConnector(self, criteria, parent_infos=[]):
     return _Search([("name", self.getname())], criteria, parent_infos + ["connector", self.getlocalId()])
 
-cls = _initElementClass("continuation", "commonObjects_continuation")
+cls = _initElementClass("continuation", "commonObjects")
 if cls:
     setattr(cls, "getinfos", _getconnectorinfosFunction("continuation"))
     setattr(cls, "Search", _SearchInConnector)
@@ -2708,7 +2706,7 @@
             self.name = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-cls = _initElementClass("connector", "commonObjects_connector", "single")
+cls = _initElementClass("connector", "commonObjects", "single")
 if cls:
     setattr(cls, "getinfos", _getconnectorinfosFunction("connector"))
     setattr(cls, "Search", _SearchInConnector)
@@ -2746,10 +2744,9 @@
     setattr(cls, "setrelPositionXY", setrelPositionXY)
 
     def getrelPositionXY(self):
-        if self.relPosition:
+        if self.relPosition is not None:
             return self.relPosition.getx(), self.relPosition.gety()
-        else:
-            return self.relPosition
+        return self.relPosition
     setattr(cls, "getrelPositionXY", getrelPositionXY)
 
     def addconnection(self):
@@ -2766,7 +2763,7 @@
     setattr(cls, "removeconnections", removeconnections)
     
     def getconnections(self):
-        return self.content
+        return self.xpath("ppx:connection", namespaces=PLCOpenParser.NSMAP)
     setattr(cls, "getconnections", getconnections)
     
     def setconnectionId(self, idx, local_id):
@@ -2811,7 +2808,7 @@
     setattr(cls, "setrelPositionXY", setrelPositionXY)
 
     def getrelPositionXY(self):
-        if self.relPosition:
+        if self.relPosition is not None:
             return self.relPosition.getx(), self.relPosition.gety()
         return self.relPosition
     setattr(cls, "getrelPositionXY", getrelPositionXY)
@@ -2821,12 +2818,13 @@
     def setvalue(self, value):
         value = value.strip()
         if value.startswith("[") and value.endswith("]"):
-            self.content = PLCOpenParser.CreateElement("arrayValue", "value")
+            content = PLCOpenParser.CreateElement("arrayValue", "value")
         elif value.startswith("(") and value.endswith(")"):
-            self.content = PLCOpenParser.CreateElement("structValue", "value")
+            content = PLCOpenParser.CreateElement("structValue", "value")
         else:
-            self.content = PLCOpenParser.CreateElement("simpleValue", "value")
-        self.content.setvalue(value)
+            content = PLCOpenParser.CreateElement("simpleValue", "value")
+        content.setvalue(value)
+        self.setcontent(content)
     setattr(cls, "setvalue", setvalue)
     
     def getvalue(self):