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