plcopen/plcopen.py
changeset 576 3f2024f30553
parent 566 6014ef82a98a
child 590 b2442bb10c0b
--- a/plcopen/plcopen.py	Wed Oct 12 15:08:47 2011 +0200
+++ b/plcopen/plcopen.py	Wed Oct 12 23:47:48 2011 +0200
@@ -353,18 +353,7 @@
 
     def updateElementName(self, old_name, new_name):
         for datatype in self.types.getdataTypeElements():
-            datatype_content = datatype.baseType.getcontent()
-            if datatype_content["name"] == "derived" and datatype_content["value"].getname() == old_name:
-                datatype_content["value"].setname(new_name)
-            elif datatype_content["name"] in ["array", "subrangeSigned", "subrangeUnsigned"]:
-                basetype_content = datatype_content["value"].baseType.getcontent()
-                if basetype_content["name"] == "derived" and basetype_content["value"].getname() == old_name:
-                    basetype_content["value"].setname(new_name)
-            elif datatype_content["name"] == "struct":
-                for element in datatype_content["value"].getvariable():
-                    element_type = element.type.getcontent()
-                    if element_type["name"] == "derived" and element_type["value"].getname() == old_name:
-                        element_type["value"].setname(new_name)
+            datatype.updateElementName(old_name, new_name)
         for pou in self.types.getpouElements():
             pou.updateElementName(old_name, new_name)
         for configuration in self.instances.configurations.getconfiguration():
@@ -823,9 +812,7 @@
                     variables.pop(i)
 
 def _SearchInConfigurationResource(self, criteria, parent_infos=[]):
-    search_result = []
-    for result in TestTextElement(self.getname(), criteria):
-        search_result.append((tuple(parent_infos + ["name"]),) + result)
+    search_result = _Search([("name", self.getname())], criteria, parent_infos)
     var_number = 0
     for varlist in self.getglobalVars():
         variable_type = searchResultVarTypes.get("globalVars", "var_local")
@@ -1097,14 +1084,103 @@
     def Search(self, criteria, parent_infos=[]):
         search_result = []
         filter = criteria["filter"]
-        #if filter == "all" or "datatype" in filter:
-        #    for datatype in self.dataTypes.getdataType():
-        #        search_result.extend(datatype.Search(criteria, parent_infos))
+        for datatype in self.dataTypes.getdataType():
+            search_result.extend(datatype.Search(criteria, parent_infos))
         for pou in self.pous.getpou():
             search_result.extend(pou.Search(criteria, parent_infos))
         return search_result
     setattr(cls, "Search", Search)
 
+def _updateBaseTypeElementName(self, old_name, new_name):
+    self.baseType.updateElementName(old_name, new_name)
+
+cls = PLCOpenClasses.get("dataTypes_dataType", None)
+if cls:
+    setattr(cls, "updateElementName", _updateBaseTypeElementName)
+    
+    def Search(self, criteria, parent_infos=[]):
+        search_result = []
+        filter = criteria["filter"]
+        if filter == "all" or "datatype" in filter:
+            parent_infos = parent_infos + ["D::%s" % self.getname()]
+            search_result.extend(_Search([("name", self.getname())], criteria, parent_infos))
+            search_result.extend(self.baseType.Search(criteria, parent_infos))
+            if self.initialValue is not None:
+                search_result.extend(_Search([("initial", self.initialValue.getvalue())], criteria, parent_infos))
+        return search_result
+    setattr(cls, "Search", Search)
+
+cls = PLCOpenClasses.get("dataType", None)
+if cls:
+    
+    def updateElementName(self, old_name, new_name):
+        if self.content["name"] in ["derived", "array", "subrangeSigned", "subrangeUnsigned"]:
+            self.content["value"].updateElementName(old_name, new_name)
+        elif self.content["name"] == "struct":
+            for element in datatype_content["value"].getvariable():
+                element_type = element.type.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
+    def Search(self, criteria, parent_infos=[]):
+        search_result = []
+        if self.content["name"] in ["derived", "array", "enum", "subrangeSigned", "subrangeUnsigned"]:
+            search_result.extend(self.content["value"].Search(criteria, parent_infos))
+        elif self.content["name"] == "struct":
+            for i, element in enumerate(self.content["value"].getvariable()):
+                search_result.extend(element.Search(criteria, parent_infos + ["struct", i]))
+        else:
+            basetype = self.content["name"]
+            if basetype in ["string", "wstring"]:
+                basetype = basetype.upper()
+            search_result.extend(_Search([("base", basetype)], criteria, parent_infos))
+        return search_result
+    setattr(cls, "Search", Search)
+
+cls = PLCOpenClasses.get("derivedTypes_array", None)
+if cls:
+    setattr(cls, "updateElementName", _updateBaseTypeElementName)
+    
+    def Search(self, criteria, parent_infos=[]):
+        search_result = self.baseType.Search(criteria, parent_infos)
+        for i, dimension in enumerate(self.getdimension()):
+            search_result.extend(_Search([("lower", dimension.getlower()),
+                                          ("upper", dimension.getupper())],
+                                         criteria, parent_infos + ["range", i]))
+        return search_result
+    setattr(cls, "Search", Search)
+
+def _SearchInSubrange(self, criteria, parent_infos=[]):
+    search_result = self.baseType.Search(criteria, parent_infos)
+    search_result.extend(_Search([("lower", self.range.getlower()),
+                                  ("upper", self.range.getupper())],
+                                 criteria, parent_infos))
+    return search_result
+
+cls = PLCOpenClasses.get("derivedTypes_subrangeSigned", None)
+if cls:
+    setattr(cls, "updateElementName", _updateBaseTypeElementName)
+    setattr(cls, "Search", _SearchInSubrange)
+
+cls = PLCOpenClasses.get("derivedTypes_subrangeUnsigned", None)
+if cls:
+    setattr(cls, "updateElementName", _updateBaseTypeElementName)
+    setattr(cls, "Search", _SearchInSubrange)
+
+cls = PLCOpenClasses.get("derivedTypes_enum", None)
+if cls:
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+    
+    def Search(self, criteria, parent_infos=[]):
+        search_result = []
+        for i, value in enumerate(self.values.getvalue()):
+            for result in TestTextElement(value.getname(), criteria):
+                search_result.append((tuple(parent_infos + ["value", i]),) + result)
+        return search_result
+    setattr(cls, "Search", Search)
+
 cls = PLCOpenClasses.get("pous_pou", None)
 if cls:
     
@@ -1433,8 +1509,7 @@
         filter = criteria["filter"]
         if filter == "all" or self.getpouType() in filter:
             parent_infos = parent_infos + ["P::%s" % self.getname()]
-            for result in TestTextElement(self.getname(), criteria):
-                search_result.append((tuple(parent_infos + ["name"]),) + result)
+            search_result.extend(_Search([("name", self.getname())], criteria, parent_infos))
             if self.interface is not None:
                 var_number = 0
                 for content in self.interface.getcontent():