plcopen/plcopen.py
changeset 1611 5e64d552b25a
parent 1581 2295fdc5c271
child 1616 3638463d6e02
equal deleted inserted replaced
1610:31703a04789a 1611:5e64d552b25a
   126         start = TextLenInRowColumn(text[:result.start()])
   126         start = TextLenInRowColumn(text[:result.start()])
   127         end = TextLenInRowColumn(text[:result.end() - 1])
   127         end = TextLenInRowColumn(text[:result.end() - 1])
   128         test_result.append((start, end, "\n".join(lines[start[0]:end[0] + 1])))
   128         test_result.append((start, end, "\n".join(lines[start[0]:end[0] + 1])))
   129         result = criteria["pattern"].search(text, result.end())
   129         result = criteria["pattern"].search(text, result.end())
   130     return test_result
   130     return test_result
       
   131 
       
   132 def TextMatched(str1, str2):
       
   133     return str1 and str2 and (str1.upper() == str2.upper())
   131 
   134 
   132 PLCOpenParser = GenerateParserFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
   135 PLCOpenParser = GenerateParserFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
   133 PLCOpen_XPath = lambda xpath: etree.XPath(xpath, namespaces=PLCOpenParser.NSMAP)
   136 PLCOpen_XPath = lambda xpath: etree.XPath(xpath, namespaces=PLCOpenParser.NSMAP)
   134 
   137 
   135 LOAD_POU_PROJECT_TEMPLATE = """
   138 LOAD_POU_PROJECT_TEMPLATE = """
   288 
   291 
   289 cls = PLCOpenParser.GetElementClass("formattedText")
   292 cls = PLCOpenParser.GetElementClass("formattedText")
   290 if cls:
   293 if cls:
   291     def updateElementName(self, old_name, new_name):
   294     def updateElementName(self, old_name, new_name):
   292         text = self.getanyText()
   295         text = self.getanyText()
   293         index = text.find(old_name)
   296         pattern = re.compile('\\b' + old_name + '\\b', re.IGNORECASE)
   294         while index != -1:
   297         text = pattern.sub(new_name, text)
   295             if index > 0 and (text[index - 1].isalnum() or text[index - 1] == "_"):
       
   296                 index = text.find(old_name, index + len(old_name))
       
   297             elif index < len(text) - len(old_name) and (text[index + len(old_name)].isalnum() or text[index + len(old_name)] == "_"):
       
   298                 index = text.find(old_name, index + len(old_name))
       
   299             else:
       
   300                 text = text[:index] + new_name + text[index + len(old_name):]
       
   301                 index = text.find(old_name, index + len(new_name))
       
   302         self.setanyText(text)
   298         self.setanyText(text)
   303     setattr(cls, "updateElementName", updateElementName)
   299     setattr(cls, "updateElementName", updateElementName)
   304     
   300     
   305     def updateElementAddress(self, address_model, new_leading):
   301     def updateElementAddress(self, address_model, new_leading):
   306         text = self.getanyText()
   302         text = self.getanyText()
   314             result = address_model.search(text, startpos)
   310             result = address_model.search(text, startpos)
   315         self.setanyText(text)
   311         self.setanyText(text)
   316     setattr(cls, "updateElementAddress", updateElementAddress)
   312     setattr(cls, "updateElementAddress", updateElementAddress)
   317     
   313     
   318     def hasblock(self, block_type):
   314     def hasblock(self, block_type):
   319         text = self.getanyText().upper()
   315         text = self.getanyText()        
   320         index = text.find(block_type.upper())
   316         pattern = re.compile('\\b' + block_type + '\\b', re.IGNORECASE)
   321         while index != -1:
   317         return pattern.search(text) is not None
   322             if (not (index > 0 and (text[index - 1].isalnum() or text[index - 1] == "_")) and 
       
   323                 not (index < len(text) - len(block_type) and text[index + len(block_type)] != "(")):
       
   324                 return True
       
   325             index = text.find(block_type.upper(), index + len(block_type))
       
   326         return False
       
   327     setattr(cls, "hasblock", hasblock)
   318     setattr(cls, "hasblock", hasblock)
   328     
   319     
   329     def Search(self, criteria, parent_infos):
   320     def Search(self, criteria, parent_infos):
   330         return [(tuple(parent_infos),) + result for result in TestTextElement(self.getanyText(), criteria)]
   321         return [(tuple(parent_infos),) + result for result in TestTextElement(self.getanyText(), criteria)]
   331     setattr(cls, "Search", Search)
   322     setattr(cls, "Search", Search)
   638 def _updateConfigurationResourceElementName(self, old_name, new_name):
   629 def _updateConfigurationResourceElementName(self, old_name, new_name):
   639     for varlist in self.getglobalVars():
   630     for varlist in self.getglobalVars():
   640         for var in varlist.getvariable():
   631         for var in varlist.getvariable():
   641             var_address = var.getaddress()
   632             var_address = var.getaddress()
   642             if var_address is not None:
   633             if var_address is not None:
   643                 if var_address == old_name:
   634                 if TextMatched(var_address, old_name):
   644                     var.setaddress(new_name)
   635                     var.setaddress(new_name)
   645                 if var.getname() == old_name:
   636                 if TextMatched(var.getname(), old_name):
   646                     var.setname(new_name)
   637                     var.setname(new_name)
   647 
   638 
   648 def _updateConfigurationResourceElementAddress(self, address_model, new_leading):
   639 def _updateConfigurationResourceElementAddress(self, address_model, new_leading):
   649     for varlist in self.getglobalVars():
   640     for varlist in self.getglobalVars():
   650         for var in varlist.getvariable():
   641         for var in varlist.getvariable():
   774     setattr(cls, "Search", Search)
   765     setattr(cls, "Search", Search)
   775 
   766 
   776 cls = PLCOpenParser.GetElementClass("task", "resource")
   767 cls = PLCOpenParser.GetElementClass("task", "resource")
   777 if cls:
   768 if cls:
   778     def updateElementName(self, old_name, new_name):
   769     def updateElementName(self, old_name, new_name):
   779         if self.single == old_name:
   770         if TextMatched(self.single, old_name):
   780             self.single = new_name
   771             self.single = new_name
   781         if self.interval == old_name:
   772         if TextMatched(self.interval, old_name):
   782             self.interval = new_name
   773             self.interval = new_name
   783         for instance in self.getpouInstance():
   774         for instance in self.getpouInstance():
   784             instance.updateElementName(old_name, new_name)
   775             instance.updateElementName(old_name, new_name)
   785     setattr(cls, "updateElementName", updateElementName)
   776     setattr(cls, "updateElementName", updateElementName)
   786 
   777 
   799     setattr(cls, "Search", Search)
   790     setattr(cls, "Search", Search)
   800 
   791 
   801 cls = PLCOpenParser.GetElementClass("pouInstance")
   792 cls = PLCOpenParser.GetElementClass("pouInstance")
   802 if cls:
   793 if cls:
   803     def updateElementName(self, old_name, new_name):
   794     def updateElementName(self, old_name, new_name):
   804         if self.typeName == old_name:
   795         if TextMatched(self.typeName, old_name):
   805             self.typeName = new_name
   796             self.typeName = new_name
   806     setattr(cls, "updateElementName", updateElementName)
   797     setattr(cls, "updateElementName", updateElementName)
   807 
   798 
   808     def Search(self, criteria, parent_infos=[]):
   799     def Search(self, criteria, parent_infos=[]):
   809         return _Search([("name", self.getname()), 
   800         return _Search([("name", self.getname()), 
   861     setattr(cls, "getdataTypeElements", getdataTypeElements)
   852     setattr(cls, "getdataTypeElements", getdataTypeElements)
   862     
   853     
   863     def getdataTypeElement(self, name):
   854     def getdataTypeElement(self, name):
   864         elements = self.dataTypes.getdataType()
   855         elements = self.dataTypes.getdataType()
   865         for element in elements:
   856         for element in elements:
   866             if element.getname() == name:
   857             if TextMatched(element.getname(), name):
   867                 return element
   858                 return element
   868         return None
   859         return None
   869     setattr(cls, "getdataTypeElement", getdataTypeElement)
   860     setattr(cls, "getdataTypeElement", getdataTypeElement)
   870 
   861 
   871     def appenddataTypeElement(self, name):
   862     def appenddataTypeElement(self, name):
   880     setattr(cls, "insertdataTypeElement", insertdataTypeElement)
   871     setattr(cls, "insertdataTypeElement", insertdataTypeElement)
   881     
   872     
   882     def removedataTypeElement(self, name):
   873     def removedataTypeElement(self, name):
   883         found = False
   874         found = False
   884         for element in self.dataTypes.getdataType():
   875         for element in self.dataTypes.getdataType():
   885             if element.getname() == name:
   876             if TextMatched(element.getname(), name):
   886                 self.dataTypes.remove(element)
   877                 self.dataTypes.remove(element)
   887                 found = True
   878                 found = True
   888                 break
   879                 break
   889         if not found:
   880         if not found:
   890             raise ValueError, _("\"%s\" Data Type doesn't exist !!!")%name
   881             raise ValueError, _("\"%s\" Data Type doesn't exist !!!")%name
   895     setattr(cls, "getpouElements", getpouElements)
   886     setattr(cls, "getpouElements", getpouElements)
   896     
   887     
   897     def getpouElement(self, name):
   888     def getpouElement(self, name):
   898         elements = self.pous.getpou()
   889         elements = self.pous.getpou()
   899         for element in elements:
   890         for element in elements:
   900             if element.getname() == name:
   891             if TextMatched(element.getname(), name):
   901                 return element
   892                 return element
   902         return None
   893         return None
   903     setattr(cls, "getpouElement", getpouElement)
   894     setattr(cls, "getpouElement", getpouElement)
   904 
   895 
   905     def appendpouElement(self, name, pou_type, body_type):
   896     def appendpouElement(self, name, pou_type, body_type):
   906         for element in self.pous.getpou():
   897         for element in self.pous.getpou():
   907             if element.getname() == name:
   898             if TextMatched(element.getname(), name):
   908                 raise ValueError, _("\"%s\" POU already exists !!!")%name
   899                 raise ValueError, _("\"%s\" POU already exists !!!")%name
   909         new_pou = PLCOpenParser.CreateElement("pou", "pous")
   900         new_pou = PLCOpenParser.CreateElement("pou", "pous")
   910         self.pous.appendpou(new_pou)
   901         self.pous.appendpou(new_pou)
   911         new_pou.setname(name)
   902         new_pou.setname(name)
   912         new_pou.setpouType(pou_type)
   903         new_pou.setpouType(pou_type)
   919     setattr(cls, "insertpouElement", insertpouElement)
   910     setattr(cls, "insertpouElement", insertpouElement)
   920     
   911     
   921     def removepouElement(self, name):
   912     def removepouElement(self, name):
   922         found = False
   913         found = False
   923         for element in self.pous.getpou():
   914         for element in self.pous.getpou():
   924             if element.getname() == name:
   915             if TextMatched(element.getname(), name):
   925                 self.pous.remove(element)
   916                 self.pous.remove(element)
   926                 found = True
   917                 found = True
   927                 break
   918                 break
   928         if not found:
   919         if not found:
   929             raise ValueError, _("\"%s\" POU doesn't exist !!!")%name
   920             raise ValueError, _("\"%s\" POU doesn't exist !!!")%name
   986     setattr(cls, "Search", Search)
   977     setattr(cls, "Search", Search)
   987 
   978 
   988 cls = PLCOpenParser.GetElementClass("derived", "dataType")
   979 cls = PLCOpenParser.GetElementClass("derived", "dataType")
   989 if cls:
   980 if cls:
   990     def updateElementName(self, old_name, new_name):
   981     def updateElementName(self, old_name, new_name):
   991         if self.name == old_name:
   982         if TextMatched(self.name, old_name):
   992             self.name = new_name
   983             self.name = new_name
   993     setattr(cls, "updateElementName", updateElementName)
   984     setattr(cls, "updateElementName", updateElementName)
   994     
   985     
   995     def Search(self, criteria, parent_infos=[]):
   986     def Search(self, criteria, parent_infos=[]):
   996         return [(tuple(parent_infos),) + result for result in TestTextElement(self.name, criteria)]
   987         return [(tuple(parent_infos),) + result for result in TestTextElement(self.name, criteria)]
  1231         if self.interface is not None:
  1222         if self.interface is not None:
  1232             content = self.interface.getcontent()
  1223             content = self.interface.getcontent()
  1233             for varlist in content:
  1224             for varlist in content:
  1234                 variables = varlist.getvariable()
  1225                 variables = varlist.getvariable()
  1235                 for var in variables:
  1226                 for var in variables:
  1236                     if var.getname() == old_name:
  1227                     if TextMatched(var.getname(), old_name):
  1237                         vartype_content = var.gettype().getcontent()
  1228                         vartype_content = var.gettype().getcontent()
  1238                         if vartype_content.getLocalTag() == "derived" and vartype_content.getname() == old_type:
  1229                         if vartype_content.getLocalTag() == "derived" and TextMatched(vartype_content.getname(), old_type):
  1239                             var.setname(new_name)
  1230                             var.setname(new_name)
  1240                             vartype_content.setname(new_type)
  1231                             vartype_content.setname(new_type)
  1241                             return
  1232                             return
  1242     setattr(cls, "changepouVar", changepouVar)
  1233     setattr(cls, "changepouVar", changepouVar)
  1243     
  1234     
  1244     def removepouVar(self, var_type, name):
  1235     def removepouVar(self, var_type, name):
  1245         if self.interface is not None:
  1236         if self.interface is not None:
  1246             content = self.interface.getcontent()
  1237             content = self.interface.getcontent()
  1247             for varlist in content:
  1238             for varlist in content:
  1248                 for var in varlist.getvariable():
  1239                 for var in varlist.getvariable():
  1249                     if var.getname() == name:
  1240                     if TextMatched(var.getname(), name):
  1250                         vartype_content = var.gettype().getcontent()
  1241                         vartype_content = var.gettype().getcontent()
  1251                         if vartype_content.getLocalTag() == "derived" and vartype_content.getname() == var_type:
  1242                         if vartype_content.getLocalTag() == "derived" and TextMatched(vartype_content.getname(), var_type):
  1252                             varlist.remove(var)
  1243                             varlist.remove(var)
  1253                             if len(varlist.getvariable()) == 0:
  1244                             if len(varlist.getvariable()) == 0:
  1254                                 self.interface.remove(varlist)
  1245                                 self.interface.remove(varlist)
  1255                             break
  1246                             break
  1256     setattr(cls, "removepouVar", removepouVar)
  1247     setattr(cls, "removepouVar", removepouVar)
  1257     
  1248     
  1258     def hasblock(self, name=None, block_type=None):
  1249     def hasblock(self, name=None, block_type=None):
  1259         if self.getbodyType() in ["FBD", "LD", "SFC"]:
  1250         if self.getbodyType() in ["FBD", "LD", "SFC"]:
  1260             for instance in self.getinstances():
  1251             for instance in self.getinstances():
  1261                 if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and 
  1252                 if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and 
  1262                     (name and instance.getinstanceName() == name or
  1253                     (TextMatched(instance.getinstanceName(), name) or TextMatched(instance.gettypeName(), block_type))):
  1263                      block_type and instance.gettypeName() == block_type)):
       
  1264                     return True
  1254                     return True
  1265             if self.transitions:
  1255             if self.transitions:
  1266                 for transition in self.transitions.gettransition():
  1256                 for transition in self.transitions.gettransition():
  1267                     result = transition.hasblock(name, block_type)
  1257                     result = transition.hasblock(name, block_type)
  1268                     if result:
  1258                     if result:
  1292     setattr(cls, "addtransition", addtransition)
  1282     setattr(cls, "addtransition", addtransition)
  1293     
  1283     
  1294     def gettransition(self, name):
  1284     def gettransition(self, name):
  1295         if self.transitions is not None:
  1285         if self.transitions is not None:
  1296             for transition in self.transitions.gettransition():
  1286             for transition in self.transitions.gettransition():
  1297                 if transition.getname() == name:
  1287                 if TextMatched(transition.getname(), name):
  1298                     return transition
  1288                     return transition
  1299         return None
  1289         return None
  1300     setattr(cls, "gettransition", gettransition)
  1290     setattr(cls, "gettransition", gettransition)
  1301         
  1291         
  1302     def gettransitionList(self):
  1292     def gettransitionList(self):
  1307     
  1297     
  1308     def removetransition(self, name):
  1298     def removetransition(self, name):
  1309         if self.transitions is not None:
  1299         if self.transitions is not None:
  1310             removed = False
  1300             removed = False
  1311             for transition in self.transitions.gettransition():
  1301             for transition in self.transitions.gettransition():
  1312                 if transition.getname() == name:
  1302                 if TextMatched(transition.getname(), name):
  1313                     if transition.getbodyType() in ["FBD", "LD", "SFC"]:
  1303                     if transition.getbodyType() in ["FBD", "LD", "SFC"]:
  1314                         for instance in transition.getinstances():
  1304                         for instance in transition.getinstances():
  1315                             if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
  1305                             if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
  1316                                 self.removepouVar(instance.gettypeName(), 
  1306                                 self.removepouVar(instance.gettypeName(), 
  1317                                                   instance.getinstanceName())
  1307                                                   instance.getinstanceName())
  1333     setattr(cls, "addaction", addaction)
  1323     setattr(cls, "addaction", addaction)
  1334     
  1324     
  1335     def getaction(self, name):
  1325     def getaction(self, name):
  1336         if self.actions is not None:
  1326         if self.actions is not None:
  1337             for action in self.actions.getaction():
  1327             for action in self.actions.getaction():
  1338                 if action.getname() == name:
  1328                 if TextMatched(action.getname(), name):
  1339                     return action
  1329                     return action
  1340         return None
  1330         return None
  1341     setattr(cls, "getaction", getaction)
  1331     setattr(cls, "getaction", getaction)
  1342     
  1332     
  1343     def getactionList(self):
  1333     def getactionList(self):
  1348     
  1338     
  1349     def removeaction(self, name):
  1339     def removeaction(self, name):
  1350         if self.actions is not None:
  1340         if self.actions is not None:
  1351             removed = False
  1341             removed = False
  1352             for action in self.actions.getaction():
  1342             for action in self.actions.getaction():
  1353                 if action.getname() == name:
  1343                 if TextMatched(action.getname(), name):
  1354                     if action.getbodyType() in ["FBD", "LD", "SFC"]:
  1344                     if action.getbodyType() in ["FBD", "LD", "SFC"]:
  1355                         for instance in action.getinstances():
  1345                         for instance in action.getinstances():
  1356                             if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
  1346                             if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
  1357                                 self.removepouVar(instance.gettypeName(), 
  1347                                 self.removepouVar(instance.gettypeName(), 
  1358                                                   instance.getinstanceName())
  1348                                                   instance.getinstanceName())
  1367         if self.interface is not None:
  1357         if self.interface is not None:
  1368             for content in self.interface.getcontent():
  1358             for content in self.interface.getcontent():
  1369                 for var in content.getvariable():
  1359                 for var in content.getvariable():
  1370                     var_address = var.getaddress()
  1360                     var_address = var.getaddress()
  1371                     if var_address is not None:
  1361                     if var_address is not None:
  1372                         if var_address == old_name:
  1362                         if TextMatched(var_address, old_name):
  1373                             var.setaddress(new_name)
  1363                             var.setaddress(new_name)
  1374                         if var.getname() == old_name:
  1364                         if TextMatched(var.getname(), old_name):
  1375                             var.setname(new_name)
  1365                             var.setname(new_name)
  1376                     var_type_content = var.gettype().getcontent()
  1366                     var_type_content = var.gettype().getcontent()
  1377                     if var_type_content.getLocalTag() == "derived":
  1367                     if var_type_content.getLocalTag() == "derived":
  1378                         if var_type_content.getname() == old_name:
  1368                         if TextMatched(var_type_content.getname(), old_name):
  1379                             var_type_content.setname(new_name)
  1369                             var_type_content.setname(new_name)
  1380         self.body[0].updateElementName(old_name, new_name)
  1370         self.body[0].updateElementName(old_name, new_name)
  1381         for action in self.getactionList():
  1371         for action in self.getactionList():
  1382             action.updateElementName(old_name, new_name)
  1372             action.updateElementName(old_name, new_name)
  1383         for transition in self.gettransitionList():
  1373         for transition in self.gettransitionList():
  1400 
  1390 
  1401     def removeVariableByAddress(self, address):
  1391     def removeVariableByAddress(self, address):
  1402         if self.interface is not None:
  1392         if self.interface is not None:
  1403             for content in self.interface.getcontent():
  1393             for content in self.interface.getcontent():
  1404                 for variable in content.getvariable():
  1394                 for variable in content.getvariable():
  1405                     if variable.getaddress() == address:
  1395                     if TextMatched(variable.getaddress(), address):
  1406                         content.remove(variable)
  1396                         content.remove(variable)
  1407     setattr(cls, "removeVariableByAddress", removeVariableByAddress)
  1397     setattr(cls, "removeVariableByAddress", removeVariableByAddress)
  1408 
  1398 
  1409     def removeVariableByFilter(self, address_model):
  1399     def removeVariableByFilter(self, address_model):
  1410         if self.interface is not None:
  1400         if self.interface is not None:
  1491 
  1481 
  1492 def hasblock(self, name=None, block_type=None):
  1482 def hasblock(self, name=None, block_type=None):
  1493     if self.getbodyType() in ["FBD", "LD", "SFC"]:
  1483     if self.getbodyType() in ["FBD", "LD", "SFC"]:
  1494         for instance in self.getinstances():
  1484         for instance in self.getinstances():
  1495             if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and 
  1485             if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and 
  1496                 (name and instance.getinstanceName() == name or
  1486                 (TextMatched(instance.getinstanceName(), name) or TextMatched(instance.gettypeName(), block_type))):
  1497                  block_type and instance.gettypeName() == block_type)):
       
  1498                 return True
  1487                 return True
  1499     elif block_type is not None:
  1488     elif block_type is not None:
  1500         return self.body.hasblock(block_type)
  1489         return self.body.hasblock(block_type)
  1501     return False
  1490     return False
  1502 
  1491 
  1614                         if (checkedBlocksDict.has_key(connections[0].getrefLocalId()) == False):
  1603                         if (checkedBlocksDict.has_key(connections[0].getrefLocalId()) == False):
  1615                             self.compileelementExecutionOrder(connections[0])
  1604                             self.compileelementExecutionOrder(connections[0])
  1616                 if instance.getexecutionOrderId() == 0:
  1605                 if instance.getexecutionOrderId() == 0:
  1617                     instance.setexecutionOrderId(self.getnewExecutionOrderId())
  1606                     instance.setexecutionOrderId(self.getnewExecutionOrderId())
  1618             elif isinstance(instance, PLCOpenParser.GetElementClass("continuation", "commonObjects")) and instance.getexecutionOrderId() == 0:
  1607             elif isinstance(instance, PLCOpenParser.GetElementClass("continuation", "commonObjects")) and instance.getexecutionOrderId() == 0:
  1619                 name = instance.getname()
       
  1620                 for tmp_instance in self.getcontentInstances():
  1608                 for tmp_instance in self.getcontentInstances():
  1621                     if isinstance(tmp_instance, PLCOpenParser.GetElementClass("connector", "commonObjects")) and tmp_instance.getname() == name and tmp_instance.getexecutionOrderId() == 0:
  1609                     if (isinstance(tmp_instance, PLCOpenParser.GetElementClass("connector", "commonObjects")) and
       
  1610                         TextMatched(tmp_instance.getname(), instance.getname()) and tmp_instance.getexecutionOrderId() == 0):
  1622                         connections = tmp_instance.connectionPointIn.getconnections()
  1611                         connections = tmp_instance.connectionPointIn.getconnections()
  1623                         if connections and len(connections) == 1:
  1612                         if connections and len(connections) == 1:
  1624                             self.compileelementExecutionOrder(connections[0])
  1613                             self.compileelementExecutionOrder(connections[0])
  1625         else:
  1614         else:
  1626             raise TypeError, _("Can only generate execution order on FBD networks!")
  1615             raise TypeError, _("Can only generate execution order on FBD networks!")
  1916             bbox.union(_getConnectionsBoundingBox(input.connectionPointIn))
  1905             bbox.union(_getConnectionsBoundingBox(input.connectionPointIn))
  1917         return bbox
  1906         return bbox
  1918     setattr(cls, "getBoundingBox", getBoundingBox)
  1907     setattr(cls, "getBoundingBox", getBoundingBox)
  1919 
  1908 
  1920     def updateElementName(self, old_name, new_name):
  1909     def updateElementName(self, old_name, new_name):
  1921         if self.typeName == old_name:
  1910         if TextMatched(self.typeName, old_name):
  1922             self.typeName = new_name
  1911             self.typeName = new_name
  1923     setattr(cls, "updateElementName", updateElementName)
  1912     setattr(cls, "updateElementName", updateElementName)
  1924 
  1913 
  1925     def filterConnections(self, connections):
  1914     def filterConnections(self, connections):
  1926         for input in self.inputVariables.getvariable():
  1915         for input in self.inputVariables.getvariable():
  1956 
  1945 
  1957 _initElementClass("leftPowerRail", "ldObjects")
  1946 _initElementClass("leftPowerRail", "ldObjects")
  1958 _initElementClass("rightPowerRail", "ldObjects", "multiple")
  1947 _initElementClass("rightPowerRail", "ldObjects", "multiple")
  1959 
  1948 
  1960 def _UpdateLDElementName(self, old_name, new_name):
  1949 def _UpdateLDElementName(self, old_name, new_name):
  1961     if self.variable == old_name:
  1950     if TextMatched(self.variable, old_name):
  1962         self.variable = new_name
  1951         self.variable = new_name
  1963 
  1952 
  1964 def _UpdateLDElementAddress(self, address_model, new_leading):
  1953 def _UpdateLDElementAddress(self, address_model, new_leading):
  1965     self.variable = update_address(self.variable, address_model, new_leading)
  1954     self.variable = update_address(self.variable, address_model, new_leading)
  1966 
  1955 
  2062     def updateElementName(self, old_name, new_name):
  2051     def updateElementName(self, old_name, new_name):
  2063         if self.condition is not None:
  2052         if self.condition is not None:
  2064             content = self.condition.getcontent()
  2053             content = self.condition.getcontent()
  2065             content_name = content.getLocalTag()
  2054             content_name = content.getLocalTag()
  2066             if content_name == "reference":
  2055             if content_name == "reference":
  2067                 if content.getname() == old_name:
  2056                 if TextMatched(content.getname(), old_name):
  2068                     content.setname(new_name)
  2057                     content.setname(new_name)
  2069             elif content_name == "inline":
  2058             elif content_name == "inline":
  2070                 content.updateElementName(old_name, new_name)
  2059                 content.updateElementName(old_name, new_name)
  2071     setattr(cls, "updateElementName", updateElementName)
  2060     setattr(cls, "updateElementName", updateElementName)
  2072 
  2061 
  2134             return self.inline.gettext()
  2123             return self.inline.gettext()
  2135         return None
  2124         return None
  2136     setattr(cls, "getinlineContent", getinlineContent)
  2125     setattr(cls, "getinlineContent", getinlineContent)
  2137 
  2126 
  2138     def updateElementName(self, old_name, new_name):
  2127     def updateElementName(self, old_name, new_name):
  2139         if self.reference is not None and self.reference.getname() == old_name:
  2128         if self.reference is not None and TextMatched(self.reference.getname(), old_name):
  2140             self.reference.setname(new_name)
  2129             self.reference.setname(new_name)
  2141         if self.inline is not None:
  2130         if self.inline is not None:
  2142             self.inline.updateElementName(old_name, new_name)
  2131             self.inline.updateElementName(old_name, new_name)
  2143     setattr(cls, "updateElementName", updateElementName)
  2132     setattr(cls, "updateElementName", updateElementName)
  2144 
  2133 
  2224 
  2213 
  2225 def _SearchInIOVariable(self, criteria, parent_infos=[]):
  2214 def _SearchInIOVariable(self, criteria, parent_infos=[]):
  2226     return _Search([("expression", self.expression)], criteria, parent_infos + ["io_variable", self.getlocalId()])
  2215     return _Search([("expression", self.expression)], criteria, parent_infos + ["io_variable", self.getlocalId()])
  2227 
  2216 
  2228 def _UpdateIOElementName(self, old_name, new_name):
  2217 def _UpdateIOElementName(self, old_name, new_name):
  2229     if self.expression == old_name:
  2218     if TextMatched(self.expression, old_name):
  2230         self.expression = new_name
  2219         self.expression = new_name
  2231 
  2220 
  2232 def _UpdateIOElementAddress(self, address_model, new_leading):
  2221 def _UpdateIOElementAddress(self, address_model, new_leading):
  2233     self.expression = update_address(self.expression, address_model, new_leading)
  2222     self.expression = update_address(self.expression, address_model, new_leading)
  2234 
  2223 
  2257 cls = _initElementClass("continuation", "commonObjects")
  2246 cls = _initElementClass("continuation", "commonObjects")
  2258 if cls:
  2247 if cls:
  2259     setattr(cls, "Search", _SearchInConnector)
  2248     setattr(cls, "Search", _SearchInConnector)
  2260 
  2249 
  2261     def updateElementName(self, old_name, new_name):
  2250     def updateElementName(self, old_name, new_name):
  2262         if self.name == old_name:
  2251         if TextMatched(self.name, old_name):
  2263             self.name = new_name
  2252             self.name = new_name
  2264     setattr(cls, "updateElementName", updateElementName)
  2253     setattr(cls, "updateElementName", updateElementName)
  2265 
  2254 
  2266 cls = _initElementClass("connector", "commonObjects", "single")
  2255 cls = _initElementClass("connector", "commonObjects", "single")
  2267 if cls:
  2256 if cls:
  2268     setattr(cls, "Search", _SearchInConnector)
  2257     setattr(cls, "Search", _SearchInConnector)
  2269 
  2258 
  2270     def updateElementName(self, old_name, new_name):
  2259     def updateElementName(self, old_name, new_name):
  2271         if self.name == old_name:
  2260         if TextMatched(self.name, old_name):
  2272             self.name = new_name
  2261             self.name = new_name
  2273     setattr(cls, "updateElementName", updateElementName)
  2262     setattr(cls, "updateElementName", updateElementName)
  2274 
  2263 
  2275 cls = PLCOpenParser.GetElementClass("connection")
  2264 cls = PLCOpenParser.GetElementClass("connection")
  2276 if cls:
  2265 if cls: