plcopen/plcopen.py
changeset 566 6014ef82a98a
parent 557 0f591ac019f3
child 576 3f2024f30553
equal deleted inserted replaced
565:94c11207aa6f 566:6014ef82a98a
    32 """
    32 """
    33 VarTypes = {"Local" : "localVars", "Temp" : "tempVars", "Input" : "inputVars",
    33 VarTypes = {"Local" : "localVars", "Temp" : "tempVars", "Input" : "inputVars",
    34             "Output" : "outputVars", "InOut" : "inOutVars", "External" : "externalVars",
    34             "Output" : "outputVars", "InOut" : "inOutVars", "External" : "externalVars",
    35             "Global" : "globalVars", "Access" : "accessVars"}
    35             "Global" : "globalVars", "Access" : "accessVars"}
    36 
    36 
       
    37 searchResultVarTypes = {
       
    38     "inputVars": "var_input",
       
    39     "outputVars": "var_output",
       
    40     "inOutVars": "var_inout"
       
    41 }
       
    42 
    37 """
    43 """
    38 Define in which order var types must be displayed
    44 Define in which order var types must be displayed
    39 """
    45 """
    40 VarOrder = ["Local","Temp","Input","Output","InOut","External","Global","Access"]
    46 VarOrder = ["Local","Temp","Input","Output","InOut","External","Global","Access"]
    41 
    47 
    94         if self.x_min is not None and self.x_max is not None:
   100         if self.x_min is not None and self.x_max is not None:
    95             width = self.x_max - self.x_min
   101             width = self.x_max - self.x_min
    96         if self.y_min is not None and self.y_max is not None:
   102         if self.y_min is not None and self.y_max is not None:
    97             height = self.y_max - self.y_min
   103             height = self.y_max - self.y_min
    98         return self.x_min, self.y_min, width, height
   104         return self.x_min, self.y_min, width, height
    99             
   105 
       
   106 def TextLenInRowColumn(text):
       
   107     if text == "":
       
   108         return (0, 0)
       
   109     lines = text.split("\n")
       
   110     return len(lines) - 1, len(lines[-1])
       
   111 
       
   112 def TestTextElement(text, criteria):
       
   113     lines = text.splitlines()
       
   114     if not criteria["case_sensitive"]:
       
   115         text = text.upper()
       
   116     test_result = []
       
   117     result = criteria["pattern"].search(text)
       
   118     while result is not None:
       
   119         start = TextLenInRowColumn(text[:result.start()])
       
   120         end = TextLenInRowColumn(text[:result.end() - 1])
       
   121         test_result.append((start, end, "\n".join(lines[start[0]:end[0] + 1])))
       
   122         result = criteria["pattern"].search(text, result.end())
       
   123     return test_result
   100 
   124 
   101 PLCOpenClasses = GenerateClassesFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
   125 PLCOpenClasses = GenerateClassesFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
   102 
   126 
   103 ElementNameToClass = {}
   127 ElementNameToClass = {}
   104 
   128 
   124             new_address = groups[0] + new_leading + groups[2]
   148             new_address = groups[0] + new_leading + groups[2]
   125             self.text = self.text[:result.start()] + new_address + self.text[result.end():]
   149             self.text = self.text[:result.start()] + new_address + self.text[result.end():]
   126             startpos = result.start() + len(new_address)
   150             startpos = result.start() + len(new_address)
   127             result = address_model.search(self.text, startpos)
   151             result = address_model.search(self.text, startpos)
   128     setattr(cls, "updateElementAddress", updateElementAddress)
   152     setattr(cls, "updateElementAddress", updateElementAddress)
       
   153     
       
   154     def Search(self, criteria, parent_infos):
       
   155         return [(tuple(parent_infos),) + result for result in TestTextElement(self.gettext(), criteria)]
       
   156     setattr(cls, "Search", Search)
   129     
   157     
   130 cls = PLCOpenClasses.get("project", None)
   158 cls = PLCOpenClasses.get("project", None)
   131 if cls:
   159 if cls:
   132     cls.singleLineAttributes = False
   160     cls.singleLineAttributes = False
   133     cls.EnumeratedDataTypeValues = {}
   161     cls.EnumeratedDataTypeValues = {}
   675                 if base_type is not None:
   703                 if base_type is not None:
   676                     return self.IsLocatableType(base_type)
   704                     return self.IsLocatableType(base_type)
   677         return True
   705         return True
   678     setattr(cls, "IsLocatableType", IsLocatableType)
   706     setattr(cls, "IsLocatableType", IsLocatableType)
   679 
   707 
       
   708     def Search(self, criteria, parent_infos=[]):
       
   709         result = self.types.Search(criteria, parent_infos)
       
   710         for configuration in self.instances.configurations.getconfiguration():
       
   711             result.extend(configuration.Search(criteria, parent_infos))
       
   712         return result
       
   713     setattr(cls, "Search", Search)
       
   714 
   680 cls = PLCOpenClasses.get("project_fileHeader", None)
   715 cls = PLCOpenClasses.get("project_fileHeader", None)
   681 if cls:
   716 if cls:
   682     cls.singleLineAttributes = False
   717     cls.singleLineAttributes = False
   683 
   718 
   684 cls = PLCOpenClasses.get("project_contentHeader", None)
   719 cls = PLCOpenClasses.get("project_contentHeader", None)
   744         elif language == "SFC":
   779         elif language == "SFC":
   745             return self.sfc.scaling.getx(), self.sfc.scaling.gety()
   780             return self.sfc.scaling.getx(), self.sfc.scaling.gety()
   746         return 0, 0
   781         return 0, 0
   747     setattr(cls, "getscaling", getscaling)
   782     setattr(cls, "getscaling", getscaling)
   748 
   783 
       
   784 def _Search(attributes, criteria, parent_infos):
       
   785     search_result = []
       
   786     for attr, value in attributes:
       
   787         if value is not None:
       
   788             search_result.extend([(tuple(parent_infos + [attr]),) + result for result in TestTextElement(value, criteria)])
       
   789     return search_result
       
   790 
       
   791 def _updateConfigurationResourceElementName(self, old_name, new_name):
       
   792     for varlist in self.getglobalVars():
       
   793         for var in varlist.getvariable():
       
   794             var_address = var.getaddress()
       
   795             if var_address is not None:
       
   796                 if var_address == old_name:
       
   797                     var.setaddress(new_name)
       
   798                 if var.getname() == old_name:
       
   799                     var.setname(new_name)
       
   800 
       
   801 def _updateConfigurationResourceElementAddress(self, address_model, new_leading):
       
   802     for varlist in self.getglobalVars():
       
   803         for var in varlist.getvariable():
       
   804             var_address = var.getaddress()
       
   805             if var_address is not None:
       
   806                 var.setaddress(update_address(var_address, address_model, new_leading))
       
   807 
       
   808 def _removeConfigurationResourceVariableByAddress(self, address):
       
   809     for varlist in self.getglobalVars():
       
   810         variables = varlist.getvariable()
       
   811         for i in xrange(len(variables)-1, -1, -1):
       
   812             if variables[i].getaddress() == address:
       
   813                 variables.pop(i)
       
   814 
       
   815 def _removeConfigurationResourceVariableByFilter(self, address_model):
       
   816     for varlist in self.getglobalVars():
       
   817         variables = varlist.getvariable()
       
   818         for i in xrange(len(variables)-1, -1, -1):
       
   819             var_address = variables[i].getaddress()
       
   820             if var_address is not None:
       
   821                 result = address_model.match(var_address)
       
   822                 if result is not None:
       
   823                     variables.pop(i)
       
   824 
       
   825 def _SearchInConfigurationResource(self, criteria, parent_infos=[]):
       
   826     search_result = []
       
   827     for result in TestTextElement(self.getname(), criteria):
       
   828         search_result.append((tuple(parent_infos + ["name"]),) + result)
       
   829     var_number = 0
       
   830     for varlist in self.getglobalVars():
       
   831         variable_type = searchResultVarTypes.get("globalVars", "var_local")
       
   832         variables = varlist.getvariable()
       
   833         for modifier, has_modifier in [("constant", varlist.getconstant()),
       
   834                                        ("retain", varlist.getretain()),
       
   835                                        ("non_retain", varlist.getnonretain())]:
       
   836             if has_modifier:
       
   837                 for result in TestTextElement(modifier, criteria):
       
   838                     search_result.append((tuple(parent_infos + [variable_type, (var_number, var_number + len(variables)), modifier]),) + result)
       
   839                 break
       
   840         for variable in variables:
       
   841             search_result.extend(variable.Search(criteria, parent_infos + [variable_type, var_number]))
       
   842             var_number += 1
       
   843     return search_result
       
   844 
   749 cls = PLCOpenClasses.get("configurations_configuration", None)
   845 cls = PLCOpenClasses.get("configurations_configuration", None)
   750 if cls:
   846 if cls:
   751     def updateElementName(self, old_name, new_name):
   847     def updateElementName(self, old_name, new_name):
   752         for varlist in self.getglobalVars():
   848         _updateConfigurationResourceElementName(self, old_name, new_name)
   753             for var in varlist.getvariable():
       
   754                 var_address = var.getaddress()
       
   755                 if var_address is not None:
       
   756                     if var_address == old_name:
       
   757                         var.setaddress(new_name)
       
   758                     if var.getname() == old_name:
       
   759                         var.setname(new_name)
       
   760         for resource in self.getresource():
   849         for resource in self.getresource():
   761             resource.updateElementName(old_name, new_name)
   850             resource.updateElementName(old_name, new_name)
   762     setattr(cls, "updateElementName", updateElementName)
   851     setattr(cls, "updateElementName", updateElementName)
   763 
   852 
   764     def updateElementAddress(self, address_model, new_leading):
   853     def updateElementAddress(self, address_model, new_leading):
   765         for varlist in self.getglobalVars():
   854         _updateConfigurationResourceElementAddress(self, address_model, new_leading)
   766             for var in varlist.getvariable():
       
   767                 var_address = var.getaddress()
       
   768                 if var_address is not None:
       
   769                     var.setaddress(update_address(var_address, address_model, new_leading))
       
   770         for resource in self.getresource():
   855         for resource in self.getresource():
   771             resource.updateElementAddress(address_model, new_leading)
   856             resource.updateElementAddress(address_model, new_leading)
   772     setattr(cls, "updateElementAddress", updateElementAddress)
   857     setattr(cls, "updateElementAddress", updateElementAddress)
   773 
   858 
   774     def removeVariableByAddress(self, address):
   859     setattr(cls, "removeVariableByAddress", _removeConfigurationResourceVariableByAddress)
   775         for varlist in self.getglobalVars():
   860     setattr(cls, "removeVariableByFilter", _removeConfigurationResourceVariableByFilter)
   776             variables = varlist.getvariable()
   861 
   777             for i in xrange(len(variables)-1, -1, -1):
   862     def Search(self, criteria, parent_infos=[]):
   778                 if variables[i].getaddress() == address:
   863         search_result = []
   779                     variables.pop(i)
   864         parent_infos = parent_infos + ["C::%s" % self.getname()]
   780     setattr(cls, "removeVariableByAddress", removeVariableByAddress)
   865         filter = criteria["filter"]
   781 
   866         if filter == "all" or "configuration" in filter:
   782     def removeVariableByFilter(self, address_model):
   867             search_result = _SearchInConfigurationResource(self, criteria, parent_infos)
   783         for varlist in self.getglobalVars():
   868             for resource in self.getresource():
   784             variables = varlist.getvariable()
   869                 search_result.extend(resource.Search(criteria, parent_infos))
   785             for i in xrange(len(variables)-1, -1, -1):
   870         return search_result
   786                 var_address = variables[i].getaddress()
   871     setattr(cls, "Search", Search)
   787                 if var_address is not None:
   872     
   788                     result = address_model.match(var_address)
       
   789                     if result is not None:
       
   790                         variables.pop(i)
       
   791     setattr(cls, "removeVariableByFilter", removeVariableByFilter)
       
   792 
       
   793 cls = PLCOpenClasses.get("configuration_resource", None)
   873 cls = PLCOpenClasses.get("configuration_resource", None)
   794 if cls:
   874 if cls:
   795     def updateElementName(self, old_name, new_name):
   875     def updateElementName(self, old_name, new_name):
   796         for varlist in self.getglobalVars():
   876         _updateConfigurationResourceElementName(self, old_name, new_name)
   797             for var in varlist.getvariable():
       
   798                 var_address = var.getaddress()
       
   799                 if var_address is not None:
       
   800                     if var_address == old_name:
       
   801                         var.setaddress(new_name)
       
   802                     if var.getname() == old_name:
       
   803                         var.setname(new_name)
       
   804         for instance in self.getpouInstance():
   877         for instance in self.getpouInstance():
   805             instance.updateElementName(old_name, new_name)
   878             instance.updateElementName(old_name, new_name)
   806         for task in self.gettask():
   879         for task in self.gettask():
   807             task.updateElementName(old_name, new_name)
   880             task.updateElementName(old_name, new_name)
   808     setattr(cls, "updateElementName", updateElementName)
   881     setattr(cls, "updateElementName", updateElementName)
   809 
   882 
   810     def updateElementAddress(self, address_model, new_leading):
   883     def updateElementAddress(self, address_model, new_leading):
   811         for varlist in self.getglobalVars():
   884         _updateConfigurationResourceElementAddress(self, address_model, new_leading)
   812             for var in varlist.getvariable():
       
   813                 var_address = var.getaddress()
       
   814                 if var_address is not None:
       
   815                     var.setaddress(update_address(var_address, address_model, new_leading))
       
   816         for task in self.gettask():
   885         for task in self.gettask():
   817             task.updateElementAddress(address_model, new_leading)
   886             task.updateElementAddress(address_model, new_leading)
   818     setattr(cls, "updateElementAddress", updateElementAddress)
   887     setattr(cls, "updateElementAddress", updateElementAddress)
   819 
   888 
   820     def removeVariableByAddress(self, address):
   889     setattr(cls, "removeVariableByAddress", _removeConfigurationResourceVariableByAddress)
   821         for varlist in self.getglobalVars():
   890     setattr(cls, "removeVariableByFilter", _removeConfigurationResourceVariableByFilter)
   822             variables = varlist.getvariable()
   891 
   823             for i in xrange(len(variables)-1, -1, -1):
   892     def Search(self, criteria, parent_infos=[]):
   824                 if variables[i].getaddress() == address:
   893         parent_infos = parent_infos[:-1] + ["R::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())]
   825                     variables.pop(i)
   894         search_result = _SearchInConfigurationResource(self, criteria, parent_infos)
   826     setattr(cls, "removeVariableByAddress", removeVariableByAddress)
   895         task_number = 0
   827 
   896         instance_number = 0
   828     def removeVariableByFilter(self, address_model):
   897         for task in self.gettask():
   829         for varlist in self.getglobalVars():
   898             results = TestTextElement(task.getname(), criteria)
   830             variables = varlist.getvariable()
   899             for result in results:
   831             for i in xrange(len(variables)-1, -1, -1):
   900                 search_result.append((tuple(parent_infos + ["task", task_number, "name"]),) + result)
   832                 var_address = variables[i].getaddress()
   901             search_result.extend(task.Search(criteria, parent_infos + ["task", task_number]))
   833                 if var_address is not None:
   902             task_number += 1
   834                     result = address_model.match(var_address)
   903             for instance in task.getpouInstance():
   835                     if result is not None:
   904                 search_result.extend(task.Search(criteria, parent_infos + ["instance", instance_number]))
   836                         variables.pop(i)
   905                 for result in results:
   837     setattr(cls, "removeVariableByFilter", removeVariableByFilter)
   906                     search_result.append((tuple(parent_infos + ["instance", instance_number, "task"]),) + result)
       
   907                 instance_number += 1
       
   908         for instance in self.getpouInstance():
       
   909             search_result.extend(instance.Search(criteria, parent_infos + ["instance", instance_number]))
       
   910             instance_number += 1
       
   911         return search_result
       
   912     setattr(cls, "Search", Search)
   838 
   913 
   839 cls = PLCOpenClasses.get("resource_task", None)
   914 cls = PLCOpenClasses.get("resource_task", None)
   840 if cls:
   915 if cls:
   841     def compatibility(self, tree):
   916     def compatibility(self, tree):
   842         if tree.hasAttribute("interval"):
   917         if tree.hasAttribute("interval"):
   876             self.single = update_address(self.single, address_model, new_leading)
   951             self.single = update_address(self.single, address_model, new_leading)
   877         if self.interval is not None:
   952         if self.interval is not None:
   878             self.interval = update_address(self.interval, address_model, new_leading)
   953             self.interval = update_address(self.interval, address_model, new_leading)
   879     setattr(cls, "updateElementAddress", updateElementAddress)
   954     setattr(cls, "updateElementAddress", updateElementAddress)
   880 
   955 
       
   956     def Search(self, criteria, parent_infos=[]):
       
   957         return _Search([("single", self.getsingle()), 
       
   958                         ("interval", self.getinterval()),
       
   959                         ("priority", str(self.getpriority()))],
       
   960                        criteria, parent_infos)
       
   961     setattr(cls, "Search", Search)
       
   962 
   881 cls = PLCOpenClasses.get("pouInstance", None)
   963 cls = PLCOpenClasses.get("pouInstance", None)
   882 if cls:
   964 if cls:
   883     def compatibility(self, tree):
   965     def compatibility(self, tree):
   884         if tree.hasAttribute("type"):
   966         if tree.hasAttribute("type"):
   885             NodeRenameAttr(tree, "type", "typeName")
   967             NodeRenameAttr(tree, "type", "typeName")
   887     
   969     
   888     def updateElementName(self, old_name, new_name):
   970     def updateElementName(self, old_name, new_name):
   889         if self.typeName == old_name:
   971         if self.typeName == old_name:
   890             self.typeName = new_name
   972             self.typeName = new_name
   891     setattr(cls, "updateElementName", updateElementName)
   973     setattr(cls, "updateElementName", updateElementName)
       
   974 
       
   975     def Search(self, criteria, parent_infos=[]):
       
   976         return _Search([("name", self.getname()), 
       
   977                         ("type", self.gettypeName())],
       
   978                        criteria, parent_infos)
       
   979     setattr(cls, "Search", Search)
       
   980 
       
   981 cls = PLCOpenClasses.get("varListPlain_variable", None)
       
   982 if cls:
       
   983     def gettypeAsText(self):
       
   984         vartype_content = self.gettype().getcontent()
       
   985         # Variable type is a user data type
       
   986         if vartype_content["name"] == "derived":
       
   987             return vartype_content["value"].getname()
       
   988         # Variable type is a string type
       
   989         elif vartype_content["name"] in ["string", "wstring"]:
       
   990             return vartype_content["name"].upper()
       
   991         # Variable type is an array
       
   992         elif vartype_content["name"] == "array":
       
   993             base_type = vartype_content["value"].baseType.getcontent()
       
   994             # Array derived directly from a user defined type 
       
   995             if base_type["name"] == "derived":
       
   996                 basetype_name = base_type["value"].getname()
       
   997             # Array derived directly from a string type 
       
   998             elif base_type["name"] in ["string", "wstring"]:
       
   999                 basetype_name = base_type["name"].upper()
       
  1000             # Array derived directly from an elementary type 
       
  1001             else:
       
  1002                 basetype_name = base_type["name"]
       
  1003             return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "%s..%s" % (x.getlower(), x.getupper()), vartype_content["value"].getdimension())), basetype_name)
       
  1004         # Variable type is an elementary type
       
  1005         return vartype_content["name"]
       
  1006     setattr(cls, "gettypeAsText", gettypeAsText)
       
  1007     
       
  1008     def Search(self, criteria, parent_infos=[]):
       
  1009         search_result = _Search([("name", self.getname()), 
       
  1010                                  ("type", self.gettypeAsText()),
       
  1011                                  ("address", self.getaddress())],
       
  1012                                 criteria, parent_infos)
       
  1013         initial = self.getinitialValue()
       
  1014         if initial is not None:
       
  1015             search_result.extend(_Search([("initial", initial.getvalue())], criteria, parent_infos))
       
  1016         doc = self.getdocumentation()
       
  1017         if doc is not None:
       
  1018             search_result.extend(doc.Search(criterias, parent_infos + ["documentation"]))
       
  1019         return search_result
       
  1020     setattr(cls, "Search", Search)
   892 
  1021 
   893 cls = PLCOpenClasses.get("project_types", None)
  1022 cls = PLCOpenClasses.get("project_types", None)
   894 if cls:
  1023 if cls:
   895     def getdataTypeElements(self):
  1024     def getdataTypeElements(self):
   896         return self.dataTypes.getdataType()
  1025         return self.dataTypes.getdataType()
   962                 found = True
  1091                 found = True
   963                 break
  1092                 break
   964         if not found:
  1093         if not found:
   965             raise ValueError, _("\"%s\" POU doesn't exist !!!")%name
  1094             raise ValueError, _("\"%s\" POU doesn't exist !!!")%name
   966     setattr(cls, "removepouElement", removepouElement)
  1095     setattr(cls, "removepouElement", removepouElement)
       
  1096 
       
  1097     def Search(self, criteria, parent_infos=[]):
       
  1098         search_result = []
       
  1099         filter = criteria["filter"]
       
  1100         #if filter == "all" or "datatype" in filter:
       
  1101         #    for datatype in self.dataTypes.getdataType():
       
  1102         #        search_result.extend(datatype.Search(criteria, parent_infos))
       
  1103         for pou in self.pous.getpou():
       
  1104             search_result.extend(pou.Search(criteria, parent_infos))
       
  1105         return search_result
       
  1106     setattr(cls, "Search", Search)
   967 
  1107 
   968 cls = PLCOpenClasses.get("pous_pou", None)
  1108 cls = PLCOpenClasses.get("pous_pou", None)
   969 if cls:
  1109 if cls:
   970     
  1110     
   971     def setbodyType(self, type):
  1111     def setbodyType(self, type):
  1285                     if var_address is not None:
  1425                     if var_address is not None:
  1286                         result = address_model.match(var_address)
  1426                         result = address_model.match(var_address)
  1287                         if result is not None:
  1427                         if result is not None:
  1288                             variables.pop(i)
  1428                             variables.pop(i)
  1289     setattr(cls, "removeVariableByFilter", removeVariableByFilter)
  1429     setattr(cls, "removeVariableByFilter", removeVariableByFilter)
       
  1430     
       
  1431     def Search(self, criteria, parent_infos=[]):
       
  1432         search_result = []
       
  1433         filter = criteria["filter"]
       
  1434         if filter == "all" or self.getpouType() in filter:
       
  1435             parent_infos = parent_infos + ["P::%s" % self.getname()]
       
  1436             for result in TestTextElement(self.getname(), criteria):
       
  1437                 search_result.append((tuple(parent_infos + ["name"]),) + result)
       
  1438             if self.interface is not None:
       
  1439                 var_number = 0
       
  1440                 for content in self.interface.getcontent():
       
  1441                     variable_type = searchResultVarTypes.get(content["value"], "var_local")
       
  1442                     variables = content["value"].getvariable()
       
  1443                     for modifier, has_modifier in [("constant", content["value"].getconstant()),
       
  1444                                                    ("retain", content["value"].getretain()),
       
  1445                                                    ("non_retain", content["value"].getnonretain())]:
       
  1446                         if has_modifier:
       
  1447                             for result in TestTextElement(modifier, criteria):
       
  1448                                 search_result.append((tuple(parent_infos + [variable_type, (var_number, var_number + len(variables)), modifier]),) + result)
       
  1449                             break
       
  1450                     for variable in variables:
       
  1451                         search_result.extend(variable.Search(criteria, parent_infos + [variable_type, var_number]))
       
  1452                         var_number += 1
       
  1453             if len(self.body) > 0:
       
  1454                 search_result.extend(self.body[0].Search(criteria, parent_infos))
       
  1455             for action in self.getactionList():
       
  1456                 search_result.extend(action.Search(criteria, parent_infos))
       
  1457             for transition in self.gettransitionList():
       
  1458                 search_result.extend(transition.Search(criteria, parent_infos))
       
  1459         return search_result
       
  1460     setattr(cls, "Search", Search)
  1290 
  1461 
  1291 def setbodyType(self, type):
  1462 def setbodyType(self, type):
  1292     if type == "IL":
  1463     if type == "IL":
  1293         self.body.setcontent({"name" : "IL", "value" : PLCOpenClasses["formattedText"]()})
  1464         self.body.setcontent({"name" : "IL", "value" : PLCOpenClasses["formattedText"]()})
  1294     elif type == "ST":
  1465     elif type == "ST":
  1368                 if isinstance(instance, PLCOpenClasses["fbdObjects_block"]) and instance.getinstanceName() == name:
  1539                 if isinstance(instance, PLCOpenClasses["fbdObjects_block"]) and instance.getinstanceName() == name:
  1369                     return True
  1540                     return True
  1370         return False
  1541         return False
  1371     setattr(cls, "hasblock", hasblock)
  1542     setattr(cls, "hasblock", hasblock)
  1372 
  1543 
       
  1544     def Search(self, criteria, parent_infos):
       
  1545         search_result = []
       
  1546         parent_infos = parent_infos[:-1] + ["T::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())]
       
  1547         for result in TestTextElement(self.getname(), criteria):
       
  1548             search_result.append((tuple(parent_infos + ["name"]),) + result)
       
  1549         search_result.extend(self.body.Search(criteria, parent_infos))
       
  1550         return search_result
       
  1551     setattr(cls, "Search", Search)
       
  1552 
  1373 cls = PLCOpenClasses.get("actions_action", None)
  1553 cls = PLCOpenClasses.get("actions_action", None)
  1374 if cls:
  1554 if cls:
  1375     setattr(cls, "setbodyType", setbodyType)
  1555     setattr(cls, "setbodyType", setbodyType)
  1376     setattr(cls, "getbodyType", getbodyType)
  1556     setattr(cls, "getbodyType", getbodyType)
  1377     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
  1557     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
  1399             for instance in self.getinstances():
  1579             for instance in self.getinstances():
  1400                 if isinstance(instance, PLCOpenClasses["fbdObjects_block"]) and instance.getinstanceName() == name:
  1580                 if isinstance(instance, PLCOpenClasses["fbdObjects_block"]) and instance.getinstanceName() == name:
  1401                     return True
  1581                     return True
  1402         return False
  1582         return False
  1403     setattr(cls, "hasblock", hasblock)
  1583     setattr(cls, "hasblock", hasblock)
       
  1584 
       
  1585     def Search(self, criteria, parent_infos):
       
  1586         search_result = []
       
  1587         parent_infos = parent_infos[:-1] + ["A::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())]
       
  1588         for result in TestTextElement(self.getname(), criteria):
       
  1589             search_result.append((tuple(parent_infos + ["name"]),) + result)
       
  1590         search_result.extend(self.body.Search(criteria, parent_infos))
       
  1591         return search_result
       
  1592     setattr(cls, "Search", Search)
  1404 
  1593 
  1405 cls = PLCOpenClasses.get("body", None)
  1594 cls = PLCOpenClasses.get("body", None)
  1406 if cls:
  1595 if cls:
  1407     cls.currentExecutionOrderId = 0
  1596     cls.currentExecutionOrderId = 0
  1408     
  1597     
  1567         else:
  1756         else:
  1568             for element in self.content["value"].getcontent():
  1757             for element in self.content["value"].getcontent():
  1569                 element["value"].updateElementAddress(address_model, new_leading)
  1758                 element["value"].updateElementAddress(address_model, new_leading)
  1570     setattr(cls, "updateElementAddress", updateElementAddress)
  1759     setattr(cls, "updateElementAddress", updateElementAddress)
  1571 
  1760 
       
  1761     def Search(self, criteria, parent_infos=[]):
       
  1762         if self.content["name"] in ["IL", "ST"]:
       
  1763             search_result = self.content["value"].Search(criteria, parent_infos + ["body", 0])
       
  1764         else:
       
  1765             search_result = []
       
  1766             for element in self.content["value"].getcontent():
       
  1767                 search_result.extend(element["value"].Search(criteria, parent_infos))
       
  1768         return search_result
       
  1769     setattr(cls, "Search", Search)
       
  1770 
  1572 def getx(self):
  1771 def getx(self):
  1573     return self.position.getx()
  1772     return self.position.getx()
  1574 
  1773 
  1575 def gety(self):
  1774 def gety(self):
  1576     return self.position.gety()
  1775     return self.position.gety()
  1679     pass
  1878     pass
  1680 
  1879 
  1681 def _updateElementAddress(self, address_model, new_leading):
  1880 def _updateElementAddress(self, address_model, new_leading):
  1682     pass
  1881     pass
  1683 
  1882 
       
  1883 def _SearchInElement(self, criteria, parent_infos=[]):
       
  1884     return []
       
  1885 
  1684 _connectionsFunctions = {
  1886 _connectionsFunctions = {
  1685     "bbox": {"none": _getBoundingBox,
  1887     "bbox": {"none": _getBoundingBox,
  1686              "single": _getBoundingBoxSingle,
  1888              "single": _getBoundingBoxSingle,
  1687              "multiple": _getBoundingBoxMultiple},
  1889              "multiple": _getBoundingBoxMultiple},
  1688     "translate": {"none": _translate,
  1890     "translate": {"none": _translate,
  1691     "filter": {"none": lambda self, connections: None,
  1893     "filter": {"none": lambda self, connections: None,
  1692                "single": _filterConnectionsSingle,
  1894                "single": _filterConnectionsSingle,
  1693                "multiple": _filterConnectionsMultiple},
  1895                "multiple": _filterConnectionsMultiple},
  1694     "update": {"none": lambda self, translation: {},
  1896     "update": {"none": lambda self, translation: {},
  1695                "single": _updateConnectionsIdSingle,
  1897                "single": _updateConnectionsIdSingle,
  1696                "multiple": _updateConnectionsIdMultiple}
  1898                "multiple": _updateConnectionsIdMultiple},
  1697 }
  1899 }
  1698 
  1900 
  1699 def _initElementClass(name, classname, connectionPointInType="none"):
  1901 def _initElementClass(name, classname, connectionPointInType="none"):
  1700     ElementNameToClass[name] = classname
  1902     ElementNameToClass[name] = classname
  1701     cls = PLCOpenClasses.get(classname, None)
  1903     cls = PLCOpenClasses.get(classname, None)
  1708         setattr(cls, "updateElementAddress", _updateElementAddress)
  1910         setattr(cls, "updateElementAddress", _updateElementAddress)
  1709         setattr(cls, "getBoundingBox", _connectionsFunctions["bbox"][connectionPointInType])
  1911         setattr(cls, "getBoundingBox", _connectionsFunctions["bbox"][connectionPointInType])
  1710         setattr(cls, "translate", _connectionsFunctions["translate"][connectionPointInType])
  1912         setattr(cls, "translate", _connectionsFunctions["translate"][connectionPointInType])
  1711         setattr(cls, "filterConnections", _connectionsFunctions["filter"][connectionPointInType])
  1913         setattr(cls, "filterConnections", _connectionsFunctions["filter"][connectionPointInType])
  1712         setattr(cls, "updateConnectionsId", _connectionsFunctions["update"][connectionPointInType])
  1914         setattr(cls, "updateConnectionsId", _connectionsFunctions["update"][connectionPointInType])
       
  1915         setattr(cls, "Search", _SearchInElement)
  1713     return cls
  1916     return cls
  1714 
  1917 
  1715 def _getexecutionOrder(instance, specific_values):
  1918 def _getexecutionOrder(instance, specific_values):
  1716     executionOrder = instance.getexecutionOrderId()
  1919     executionOrder = instance.getexecutionOrderId()
  1717     if executionOrder is None:
  1920     if executionOrder is None:
  1865 
  2068 
  1866     def updateElementAddress(self, address_model, new_leading):
  2069     def updateElementAddress(self, address_model, new_leading):
  1867         self.content.updateElementAddress(address_model, new_leading)
  2070         self.content.updateElementAddress(address_model, new_leading)
  1868     setattr(cls, "updateElementAddress", updateElementAddress)
  2071     setattr(cls, "updateElementAddress", updateElementAddress)
  1869 
  2072 
       
  2073     def Search(self, criteria, parent_infos=[]):
       
  2074         return self.content.Search(criteria, parent_infos + ["comment", self.getlocalId(), "content"])
       
  2075     setattr(cls, "Search", Search)
       
  2076 
  1870 cls = _initElementClass("block", "fbdObjects_block")
  2077 cls = _initElementClass("block", "fbdObjects_block")
  1871 if cls:
  2078 if cls:
  1872     def getBoundingBox(self):
  2079     def getBoundingBox(self):
  1873         bbox = _getBoundingBox(self)
  2080         bbox = _getBoundingBox(self)
  1874         for input in self.inputVariables.getvariable():
  2081         for input in self.inputVariables.getvariable():
  1910         _translate(self, dx, dy)
  2117         _translate(self, dx, dy)
  1911         for input in self.inputVariables.getvariable():
  2118         for input in self.inputVariables.getvariable():
  1912             _translateConnections(input.connectionPointIn, dx, dy)
  2119             _translateConnections(input.connectionPointIn, dx, dy)
  1913     setattr(cls, "translate", translate)
  2120     setattr(cls, "translate", translate)
  1914 
  2121 
       
  2122     def Search(self, criteria, parent_infos=[]):
       
  2123         parent_infos = parent_infos + ["block", self.getlocalId()]
       
  2124         search_result = _Search([("name", self.getinstanceName()),
       
  2125                                  ("type", self.gettypeName())],
       
  2126                                 criteria, parent_infos)
       
  2127         for i, variable in enumerate(self.inputVariables.getvariable()):
       
  2128             for result in TestTextElement(variable.getformalParameter(), criteria):
       
  2129                 search_result.append((tuple(parent_infos + ["input", i]),) + result)
       
  2130         for i, variable in enumerate(self.outputVariables.getvariable()):
       
  2131             for result in TestTextElement(variable.getformalParameter(), criteria):
       
  2132                 search_result.append((tuple(parent_infos + ["output", i]),) + result)
       
  2133         return search_result
       
  2134     setattr(cls, "Search", Search)
       
  2135 
  1915 cls = _initElementClass("leftPowerRail", "ldObjects_leftPowerRail")
  2136 cls = _initElementClass("leftPowerRail", "ldObjects_leftPowerRail")
  1916 if cls:
  2137 if cls:
  1917     setattr(cls, "getinfos", _getpowerrailinfosFunction("leftPowerRail"))
  2138     setattr(cls, "getinfos", _getpowerrailinfosFunction("leftPowerRail"))
  1918 
  2139 
  1919 cls = _initElementClass("rightPowerRail", "ldObjects_rightPowerRail", "multiple")
  2140 cls = _initElementClass("rightPowerRail", "ldObjects_rightPowerRail", "multiple")
  1931     
  2152     
  1932     def updateElementAddress(self, address_model, new_leading):
  2153     def updateElementAddress(self, address_model, new_leading):
  1933         self.variable = update_address(self.variable, address_model, new_leading)
  2154         self.variable = update_address(self.variable, address_model, new_leading)
  1934     setattr(cls, "updateElementAddress", updateElementAddress)
  2155     setattr(cls, "updateElementAddress", updateElementAddress)
  1935     
  2156     
       
  2157     def Search(self, criteria, parent_infos=[]):
       
  2158         return _Search([("reference", self.getvariable())], criteria, parent_infos + ["contact", self.getlocalId()])
       
  2159     setattr(cls, "Search", Search)
       
  2160 
  1936 cls = _initElementClass("coil", "ldObjects_coil", "single")
  2161 cls = _initElementClass("coil", "ldObjects_coil", "single")
  1937 if cls:
  2162 if cls:
  1938     setattr(cls, "getinfos", _getldelementinfosFunction("coil"))
  2163     setattr(cls, "getinfos", _getldelementinfosFunction("coil"))
  1939     
  2164     
  1940     def updateElementName(self, old_name, new_name):
  2165     def updateElementName(self, old_name, new_name):
  1943     setattr(cls, "updateElementName", updateElementName)
  2168     setattr(cls, "updateElementName", updateElementName)
  1944 
  2169 
  1945     def updateElementAddress(self, address_model, new_leading):
  2170     def updateElementAddress(self, address_model, new_leading):
  1946         self.variable = update_address(self.variable, address_model, new_leading)
  2171         self.variable = update_address(self.variable, address_model, new_leading)
  1947     setattr(cls, "updateElementAddress", updateElementAddress)
  2172     setattr(cls, "updateElementAddress", updateElementAddress)
       
  2173 
       
  2174     def Search(self, criteria, parent_infos=[]):
       
  2175         return _Search([("reference", self.getvariable())], criteria, parent_infos + ["coil", self.getlocalId()])
       
  2176     setattr(cls, "Search", Search)
  1948 
  2177 
  1949 cls = _initElementClass("step", "sfcObjects_step", "single")
  2178 cls = _initElementClass("step", "sfcObjects_step", "single")
  1950 if cls:
  2179 if cls:
  1951     def getinfos(self):
  2180     def getinfos(self):
  1952         infos = _getelementinfos(self)
  2181         infos = _getelementinfos(self)
  1960             infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
  2189             infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
  1961         if self.connectionPointOutAction:
  2190         if self.connectionPointOutAction:
  1962             specific_values["action"] = _getconnectioninfos(self, self.connectionPointOutAction)
  2191             specific_values["action"] = _getconnectioninfos(self, self.connectionPointOutAction)
  1963         return infos
  2192         return infos
  1964     setattr(cls, "getinfos", getinfos)
  2193     setattr(cls, "getinfos", getinfos)
       
  2194 
       
  2195     def Search(self, criteria, parent_infos=[]):
       
  2196         return _Search([("name", self.getname())], criteria, parent_infos + ["step", self.getlocalId()])
       
  2197     setattr(cls, "Search", Search)
  1965 
  2198 
  1966 cls = PLCOpenClasses.get("transition_condition", None)
  2199 cls = PLCOpenClasses.get("transition_condition", None)
  1967 if cls:
  2200 if cls:
  1968     def compatibility(self, tree):
  2201     def compatibility(self, tree):
  1969         connections = []
  2202         connections = []
  2056             content = self.condition.getcontent()
  2289             content = self.condition.getcontent()
  2057             if content["name"] == "connectionPointIn":
  2290             if content["name"] == "connectionPointIn":
  2058                 return content["value"].getconnections()
  2291                 return content["value"].getconnections()
  2059     setattr(cls, "getconnections", getconnections)
  2292     setattr(cls, "getconnections", getconnections)
  2060     
  2293     
       
  2294     def Search(self, criteria, parent_infos=[]):
       
  2295         parent_infos = parent_infos + ["transition", self.getlocalId()]
       
  2296         search_result = []
       
  2297         content = self.condition.getcontent()
       
  2298         if content["name"] == "reference":
       
  2299             search_result.extend(_Search([("reference", content["value"].getname())], criteria, parent_infos))
       
  2300         elif content["name"] == "inline":
       
  2301             search_result.extend(content["value"].Search(criteria, parent_infos + ["inline"]))
       
  2302         return search_result
       
  2303     setattr(cls, "Search", Search)
       
  2304     
  2061 cls = _initElementClass("selectionDivergence", "sfcObjects_selectionDivergence", "single")
  2305 cls = _initElementClass("selectionDivergence", "sfcObjects_selectionDivergence", "single")
  2062 if cls:
  2306 if cls:
  2063     setattr(cls, "getinfos", _getdivergenceinfosFunction(True, False))
  2307     setattr(cls, "getinfos", _getdivergenceinfosFunction(True, False))
  2064 
  2308 
  2065 cls = _initElementClass("selectionConvergence", "sfcObjects_selectionConvergence", "multiple")
  2309 cls = _initElementClass("selectionConvergence", "sfcObjects_selectionConvergence", "multiple")
  2081         infos["type"] = "jump"
  2325         infos["type"] = "jump"
  2082         infos["specific_values"]["target"] = self.gettargetName()
  2326         infos["specific_values"]["target"] = self.gettargetName()
  2083         infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
  2327         infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
  2084         return infos
  2328         return infos
  2085     setattr(cls, "getinfos", getinfos)
  2329     setattr(cls, "getinfos", getinfos)
       
  2330 
       
  2331     def Search(self, criteria, parent_infos):
       
  2332         return _Search([("target", self.gettargetName())], criteria, parent_infos + ["jump", self.getlocalId()])
       
  2333     setattr(cls, "Search", Search)
  2086 
  2334 
  2087 cls = PLCOpenClasses.get("actionBlock_action", None)
  2335 cls = PLCOpenClasses.get("actionBlock_action", None)
  2088 if cls:
  2336 if cls:
  2089     def compatibility(self, tree):
  2337     def compatibility(self, tree):
  2090         relPosition = reduce(lambda x, y: x | (y.nodeName == "relPosition"), tree.childNodes, False)
  2338         relPosition = reduce(lambda x, y: x | (y.nodeName == "relPosition"), tree.childNodes, False)
  2131         if self.reference:
  2379         if self.reference:
  2132             self.reference.setname(update_address(self.reference.getname(), address_model, new_leading))
  2380             self.reference.setname(update_address(self.reference.getname(), address_model, new_leading))
  2133         if self.inline:
  2381         if self.inline:
  2134             self.inline.updateElementAddress(address_model, new_leading)
  2382             self.inline.updateElementAddress(address_model, new_leading)
  2135     setattr(cls, "updateElementAddress", updateElementAddress)
  2383     setattr(cls, "updateElementAddress", updateElementAddress)
       
  2384 
       
  2385     def Search(self, criteria, parent_infos=[]):
       
  2386         qualifier = self.getqualifier()
       
  2387         if qualifier is None:
       
  2388             qualifier = "N"
       
  2389         return _Search([("inline", self.getinlineContent()),
       
  2390                         ("reference", self.getreferenceName()), 
       
  2391                         ("qualifier", qualifier),
       
  2392                         ("duration", self.getduration()),
       
  2393                         ("indicator", self.getindicator())],
       
  2394                        criteria, parent_infos)
       
  2395     setattr(cls, "Search", Search)
  2136 
  2396 
  2137 cls = _initElementClass("actionBlock", "commonObjects_actionBlock", "single")
  2397 cls = _initElementClass("actionBlock", "commonObjects_actionBlock", "single")
  2138 if cls:
  2398 if cls:
  2139     def compatibility(self, tree):
  2399     def compatibility(self, tree):
  2140         for child in tree.childNodes[:]:
  2400         for child in tree.childNodes[:]:
  2199     def updateElementAddress(self, address_model, new_leading):
  2459     def updateElementAddress(self, address_model, new_leading):
  2200         for action in self.action:
  2460         for action in self.action:
  2201             action.updateElementAddress(address_model, new_leading)
  2461             action.updateElementAddress(address_model, new_leading)
  2202     setattr(cls, "updateElementAddress", updateElementAddress)
  2462     setattr(cls, "updateElementAddress", updateElementAddress)
  2203 
  2463 
       
  2464     def Search(self, criteria, parent_infos=[]):
       
  2465         parent_infos = parent_infos + ["action_block", self.getlocalId()]
       
  2466         search_result = []
       
  2467         for idx, action in enumerate(self.action):
       
  2468             search_result.extend(action.Search(criteria, parent_infos + ["action", idx]))
       
  2469         return search_result
       
  2470     setattr(cls, "Search", Search)
       
  2471 
       
  2472 def _SearchInIOVariable(self, criteria, parent_infos=[]):
       
  2473     return _Search([("expression", self.getexpression())], criteria, parent_infos + ["io_variable", self.getlocalId()])
       
  2474 
  2204 cls = _initElementClass("inVariable", "fbdObjects_inVariable")
  2475 cls = _initElementClass("inVariable", "fbdObjects_inVariable")
  2205 if cls:
  2476 if cls:
  2206     setattr(cls, "getinfos", _getvariableinfosFunction("input", False, True))
  2477     setattr(cls, "getinfos", _getvariableinfosFunction("input", False, True))
  2207     
  2478     
  2208     def updateElementName(self, old_name, new_name):
  2479     def updateElementName(self, old_name, new_name):
  2212 
  2483 
  2213     def updateElementAddress(self, address_model, new_leading):
  2484     def updateElementAddress(self, address_model, new_leading):
  2214         self.expression = update_address(self.expression, address_model, new_leading)
  2485         self.expression = update_address(self.expression, address_model, new_leading)
  2215     setattr(cls, "updateElementAddress", updateElementAddress)
  2486     setattr(cls, "updateElementAddress", updateElementAddress)
  2216 
  2487 
       
  2488     setattr(cls, "Search", _SearchInIOVariable)
       
  2489 
  2217 cls = _initElementClass("outVariable", "fbdObjects_outVariable", "single")
  2490 cls = _initElementClass("outVariable", "fbdObjects_outVariable", "single")
  2218 if cls:
  2491 if cls:
  2219     setattr(cls, "getinfos", _getvariableinfosFunction("output", True, False))
  2492     setattr(cls, "getinfos", _getvariableinfosFunction("output", True, False))
  2220     
  2493     
  2221     def updateElementName(self, old_name, new_name):
  2494     def updateElementName(self, old_name, new_name):
  2225 
  2498 
  2226     def updateElementAddress(self, address_model, new_leading):
  2499     def updateElementAddress(self, address_model, new_leading):
  2227         self.expression = update_address(self.expression, address_model, new_leading)
  2500         self.expression = update_address(self.expression, address_model, new_leading)
  2228     setattr(cls, "updateElementAddress", updateElementAddress)
  2501     setattr(cls, "updateElementAddress", updateElementAddress)
  2229 
  2502 
       
  2503     setattr(cls, "Search", _SearchInIOVariable)
       
  2504 
  2230 cls = _initElementClass("inOutVariable", "fbdObjects_inOutVariable", "single")
  2505 cls = _initElementClass("inOutVariable", "fbdObjects_inOutVariable", "single")
  2231 if cls:
  2506 if cls:
  2232     setattr(cls, "getinfos", _getvariableinfosFunction("inout", True, True))
  2507     setattr(cls, "getinfos", _getvariableinfosFunction("inout", True, True))
  2233     
  2508     
  2234     def updateElementName(self, old_name, new_name):
  2509     def updateElementName(self, old_name, new_name):
  2238 
  2513 
  2239     def updateElementAddress(self, address_model, new_leading):
  2514     def updateElementAddress(self, address_model, new_leading):
  2240         self.expression = update_address(self.expression, address_model, new_leading)
  2515         self.expression = update_address(self.expression, address_model, new_leading)
  2241     setattr(cls, "updateElementAddress", updateElementAddress)
  2516     setattr(cls, "updateElementAddress", updateElementAddress)
  2242 
  2517 
       
  2518     setattr(cls, "Search", _SearchInIOVariable)
       
  2519 
       
  2520 
       
  2521 def _SearchInConnector(self, criteria, parent_infos=[]):
       
  2522     return _Search([("name", self.getname())], criteria, parent_infos + ["connector", self.getlocalId()])
       
  2523 
  2243 cls = _initElementClass("continuation", "commonObjects_continuation")
  2524 cls = _initElementClass("continuation", "commonObjects_continuation")
  2244 if cls:
  2525 if cls:
  2245     setattr(cls, "getinfos", _getconnectorinfosFunction("continuation"))
  2526     setattr(cls, "getinfos", _getconnectorinfosFunction("continuation"))
       
  2527     setattr(cls, "Search", _SearchInConnector)
  2246 
  2528 
  2247 cls = _initElementClass("connector", "commonObjects_connector", "single")
  2529 cls = _initElementClass("connector", "commonObjects_connector", "single")
  2248 if cls:
  2530 if cls:
  2249     setattr(cls, "getinfos", _getconnectorinfosFunction("connector"))
  2531     setattr(cls, "getinfos", _getconnectorinfosFunction("connector"))
       
  2532     setattr(cls, "Search", _SearchInConnector)
  2250 
  2533 
  2251 cls = PLCOpenClasses.get("connection", None)
  2534 cls = PLCOpenClasses.get("connection", None)
  2252 if cls:
  2535 if cls:
  2253     def setpoints(self, points):
  2536     def setpoints(self, points):
  2254         self.position = []
  2537         self.position = []