# HG changeset patch # User Laurent Bessard # Date 1381309040 -7200 # Node ID 533741e5075c49f802d3fc6104401e0b5ce44ce1 # Parent 92efd8fe3120e15c9cfae203190833aa07d172f1 Fixed pou variables information loading stylesheet diff -r 92efd8fe3120 -r 533741e5075c PLCControler.py --- a/PLCControler.py Fri Oct 04 12:17:03 2013 +0200 +++ b/PLCControler.py Wed Oct 09 10:57:20 2013 +0200 @@ -101,77 +101,89 @@ RESOURCES, PROPERTIES] = UNEDITABLE_NAMES #------------------------------------------------------------------------------- +# Helper object for loading library in xslt stylesheets +#------------------------------------------------------------------------------- + +class LibraryResolver(etree.Resolver): + + def __init__(self, controller, debug=False): + self.Controller = controller + self.Debug = debug + + def resolve(self, url, pubid, context): + lib_name = os.path.basename(url) + if lib_name in ["project", "stdlib", "extensions"]: + lib_el = etree.Element(lib_name) + if lib_name == "project": + lib_el.append(deepcopy(self.Controller.GetProject(self.Debug))) + elif lib_name == "stdlib": + for lib in [StdBlockLibrary, AddnlBlockLibrary]: + lib_el.append(deepcopy(lib)) + else: + for ctn in self.Controller.ConfNodeTypes: + lib_el.append(deepcopy(ctn["types"])) + return self.resolve_string(etree.tostring(lib_el), context) + +#------------------------------------------------------------------------------- +# Helpers functions for translating list of arguments +# from xslt to valid arguments +#------------------------------------------------------------------------------- + +_BoolValue = lambda x: x in ["true", "0"] + +def _translate_args(translations, args): + return [translate(arg[0]) if len(arg) > 0 else None + for translate, arg in + zip(translations, args)] + +#------------------------------------------------------------------------------- # Helpers object for generating pou var list #------------------------------------------------------------------------------- -def compute_dimensions(el): - return [ - (dimension.get("lower"), dimension.get("upper")) - for dimension in el.findall("dimension")] - -def extract_param(el): - if el.tag == "Type" and el.text is None: - array = el.find("array") - return ('array', array.text, compute_dimensions(array)) - elif el.tag == "Tree": - return generate_var_tree(el) - elif el.tag == "Edit": - return el.text == "True" - elif el.text is None: - return '' - return el.text - -def generate_var_tree(tree): - return ([ - (var.get("name"), var.text, generate_var_tree(var)) - for var in tree.findall("var")], - compute_dimensions(tree)) - -class AddVariable(etree.XSLTExtension): +class _VariableInfos(object): + __slots__ = ["Name", "Class", "Option", "Location", "InitialValue", + "Edit", "Documentation", "Type", "Tree", "Number"] + def __init__(self, *args): + for attr, value in zip(self.__slots__, args): + setattr(self, attr, value if value is not None else "") + def copy(self): + return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__]) + +class VariablesInfosFactory: def __init__(self, variables): - etree.XSLTExtension.__init__(self) self.Variables = variables - - def execute(self, context, self_node, input_node, output_parent): - infos = etree.Element('var_infos') - self.process_children(context, infos) - self.Variables.append( - {el.tag.replace("_", " "): extract_param(el) for el in infos}) - -class VarTree(etree.XSLTExtension): - - def __init__(self, controller, debug): - etree.XSLTExtension.__init__(self) - self.Controller = controller - self.Debug = debug - - def execute(self, context, self_node, input_node, output_parent): - typename = input_node.get("name") - pou_infos = self.Controller.GetPou(typename, self.Debug) - if pou_infos is not None: - self.apply_templates(context, pou_infos, output_parent) - return - - datatype_infos = self.Controller.GetDataType(typename, self.Debug) - if datatype_infos is not None: - self.apply_templates(context, datatype_infos, output_parent) - return - -class VarIsEdited(etree.XSLTExtension): - - def __init__(self, controller, debug): - etree.XSLTExtension.__init__(self) - self.Controller = controller - self.Debug = debug - - def execute(self, context, self_node, input_node, output_parent): - typename = input_node.get("name") - output_parent.text = str( - self.Controller.GetPou(typename, self.Debug) is None) - -variables_infos_xslt = etree.parse( - os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt")) + self.TreeStack = [] + self.Type = None + self.Dimensions = None + + def SetType(self, context, *args): + self.Type = args[0][0] + + def GetType(self): + if len(self.Dimensions) > 0: + return ("array", self.Type, self.Dimensions) + return self.Type + + def GetTree(self): + return (self.TreeStack.pop(-1), self.Dimensions) + + def AddDimension(self, context, *args): + self.Dimensions.append(tuple( + _translate_args([str] * 2, args))) + + def AddTree(self, context, *args): + self.TreeStack.append([]) + self.Dimensions = [] + + def AddVarToTree(self, context, *args): + var = (args[0][0], self.Type, self.GetTree()) + self.TreeStack[-1].append(var) + + def AddVariable(self, context, *args): + self.Variables.append(_VariableInfos(*(_translate_args( + [str] * 5 + [_BoolValue] + [str], args) + + [self.GetType(), self.GetTree()]))) #------------------------------------------------------------------------------- # Helpers object for generating pou variable instance list @@ -349,8 +361,6 @@ # Helpers object for generating pou block instances list #------------------------------------------------------------------------------- -_BoolValue = lambda x: x in ["true", "0"] - _Point = namedtuple("Point", ["x", "y"]) _BlockInstanceInfos = namedtuple("BlockInstanceInfos", @@ -427,11 +437,6 @@ def copy(self): return _ActionInfos(*[getattr(self, attr) for attr in self.__slots__]) -def _translate_args(translations, args): - return [translate(arg[0]) if len(arg) > 0 else None - for translate, arg in - zip(translations, args)] - class BlockInstanceFactory: def __init__(self, block_instances): @@ -677,7 +682,7 @@ if project is not None: for pou in project.getpous(): if pou_name is None or pou_name == pou.getname(): - variables.extend([var["Name"] for var in self.GetPouInterfaceVars(pou, debug)]) + variables.extend([var.Name for var in self.GetPouInterfaceVars(pou, debug=debug)]) for transition in pou.gettransitionList(): variables.append(transition.getname()) for action in pou.getactionList(): @@ -1299,35 +1304,35 @@ current_varlist = None current_type = None for var in vars: - next_type = (var["Class"], - var["Option"], - var["Location"] in ["", None] or + next_type = (var.Class, + var.Option, + var.Location in ["", None] or # When declaring globals, located # and not located variables are # in the same declaration block - var["Class"] == "Global") + var.Class == "Global") if current_type != next_type: current_type = next_type - infos = VAR_CLASS_INFOS.get(var["Class"], None) + infos = VAR_CLASS_INFOS.get(var.Class, None) if infos is not None: current_varlist = PLCOpenParser.CreateElement(infos[0], "interface") else: current_varlist = PLCOpenParser.CreateElement("varList") - varlist_list.append((var["Class"], current_varlist)) - if var["Option"] == "Constant": + varlist_list.append((var.Class, current_varlist)) + if var.Option == "Constant": current_varlist.setconstant(True) - elif var["Option"] == "Retain": + elif var.Option == "Retain": current_varlist.setretain(True) - elif var["Option"] == "Non-Retain": + elif var.Option == "Non-Retain": current_varlist.setnonretain(True) # Create variable and change its properties tempvar = PLCOpenParser.CreateElement("variable", "varListPlain") - tempvar.setname(var["Name"]) + tempvar.setname(var.Name) var_type = PLCOpenParser.CreateElement("type", "variable") - if isinstance(var["Type"], TupleType): - if var["Type"][0] == "array": - array_type, base_type_name, dimensions = var["Type"] + if isinstance(var.Type, TupleType): + if var.Type[0] == "array": + array_type, base_type_name, dimensions = var.Type array = PLCOpenParser.CreateElement("array", "dataType") baseType = PLCOpenParser.CreateElement("baseType", "array") array.setbaseType(baseType) @@ -1349,43 +1354,51 @@ derived_datatype.setname(base_type_name) baseType.setcontent(derived_datatype) var_type.setcontent(array) - elif var["Type"] in self.GetBaseTypes(): + elif var.Type in self.GetBaseTypes(): var_type.setcontent(PLCOpenParser.CreateElement( - var["Type"].lower() - if var["Type"] in ["STRING", "WSTRING"] - else var["Type"], "dataType")) + var.Type.lower() + if var.Type in ["STRING", "WSTRING"] + else var.Type, "dataType")) else: derived_type = PLCOpenParser.CreateElement("derived", "dataType") - derived_type.setname(var["Type"]) + derived_type.setname(var.Type) var_type.setcontent(derived_type) tempvar.settype(var_type) - if var["Initial Value"] != "": + if var.InitialValue != "": value = PLCOpenParser.CreateElement("initialValue", "variable") - value.setvalue(var["Initial Value"]) + value.setvalue(var.InitialValue) tempvar.setinitialValue(value) - if var["Location"] != "": - tempvar.setaddress(var["Location"]) + if var.Location != "": + tempvar.setaddress(var.Location) else: tempvar.setaddress(None) - if var['Documentation'] != "": + if var.Documentation != "": ft = PLCOpenParser.CreateElement("documentation", "variable") - ft.setanyText(var['Documentation']) + ft.setanyText(var.Documentation) tempvar.setdocumentation(ft) # Add variable to varList current_varlist.appendvariable(tempvar) return varlist_list - def GetVariableDictionary(self, object_with_vars, debug=False): + def GetVariableDictionary(self, object_with_vars, tree=False, debug=False): variables = [] + factory = VariablesInfosFactory(variables) + + parser = etree.XMLParser() + if tree: + parser.resolvers.add(LibraryResolver(self, debug)) variables_infos_xslt_tree = etree.XSLT( - variables_infos_xslt, extensions = { - ("var_infos_ns", "add_variable"): AddVariable(variables), - ("var_infos_ns", "var_tree"): VarTree(self, debug), - ("var_infos_ns", "is_edited"): VarIsEdited(self, debug)}) - variables_infos_xslt_tree(object_with_vars) + etree.parse( + os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"), + parser), + extensions = {("var_infos_ns", name): getattr(factory, name) + for name in ["SetType", "AddDimension", "AddTree", + "AddVarToTree", "AddVariable"]}) + variables_infos_xslt_tree(object_with_vars, + tree=etree.XSLT.strparam(str(tree))) return variables @@ -1479,12 +1492,12 @@ return variables # Return the interface for the given pou - def GetPouInterfaceVars(self, pou, debug = False): + def GetPouInterfaceVars(self, pou, tree=False, debug = False): interface = pou.interface # Verify that the pou has an interface if interface is not None: # Extract variables defined in interface - return self.GetVariableDictionary(interface, debug) + return self.GetVariableDictionary(interface, tree, debug) return [] # Replace the Pou interface by the one given @@ -1530,30 +1543,35 @@ if pou is not None: pou.updateElementName(old_name, new_name) - # Return the return type of the pou given by its name - def GetPouInterfaceReturnTypeByName(self, name): - project = self.GetProject(debug) - if project is not None: - # Found the pou correponding to name and return the return type - pou = project.getpou(name) - if pou is not None: - return self.GetPouInterfaceReturnType(pou) - return False - # Return the return type of the given pou - def GetPouInterfaceReturnType(self, pou): + def GetPouInterfaceReturnType(self, pou, tree=False, debug=False): # Verify that the pou has an interface if pou.interface is not None: # Return the return type if there is one return_type = pou.interface.getreturnType() if return_type is not None: + factory = VariablesInfosFactory([]) + + parser = etree.XMLParser() + if tree: + parser.resolvers.add(LibraryResolver(self)) + return_type_infos_xslt_tree = etree.XSLT( - variables_infos_xslt, extensions = { - ("var_infos_ns", "var_tree"): VarTree(self)}) - return [extract_param(el) - for el in return_type_infos_xslt_tree(return_type).getroot()] - - return [None, ([], [])] + etree.parse( + os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"), + parser), + extensions = {("var_infos_ns", name): getattr(factory, name) + for name in ["SetType", "AddDimension", + "AddTree", "AddVarToTree"]}) + return_type_infos_xslt_tree(return_type, + tree=etree.XSLT.strparam(str(tree))) + if tree: + return [factory.GetType(), factory.GetTree()] + return factory.GetType() + + if tree: + return [None, ([], [])] + return None # Function that add a new confnode to the confnode list def AddConfNodeTypesList(self, typeslist): @@ -2209,25 +2227,25 @@ return None # Return the edited element variables - def GetEditedElementInterfaceVars(self, tagname, debug = False): + def GetEditedElementInterfaceVars(self, tagname, tree=False, debug = False): words = tagname.split("::") if words[0] in ["P","T","A"]: project = self.GetProject(debug) if project is not None: pou = project.getpou(words[1]) if pou is not None: - return self.GetPouInterfaceVars(pou, debug) + return self.GetPouInterfaceVars(pou, tree, debug) return [] # Return the edited element return type - def GetEditedElementInterfaceReturnType(self, tagname, debug = False): + def GetEditedElementInterfaceReturnType(self, tagname, tree=False, debug = False): words = tagname.split("::") if words[0] == "P": project = self.GetProject(debug) if project is not None: pou = self.Project.getpou(words[1]) if pou is not None: - return self.GetPouInterfaceReturnType(pou) + return self.GetPouInterfaceReturnType(pou, tree, debug) elif words[0] == 'T': return "BOOL" return None @@ -2328,8 +2346,8 @@ names[datatype.getname().upper()] = True for pou in project.getpous(): names[pou.getname().upper()] = True - for var in self.GetPouInterfaceVars(pou, debug): - names[var["Name"].upper()] = True + for var in self.GetPouInterfaceVars(pou, debug=debug): + names[var.Name.upper()] = True for transition in pou.gettransitionList(): names[transition.getname().upper()] = True for action in pou.getactionList(): diff -r 92efd8fe3120 -r 533741e5075c controls/VariablePanel.py --- a/controls/VariablePanel.py Fri Oct 04 12:17:03 2013 +0200 +++ b/controls/VariablePanel.py Wed Oct 09 10:57:20 2013 +0200 @@ -37,6 +37,7 @@ from CustomTable import CustomTable from LocationCellEditor import LocationCellEditor from util.BitmapLibrary import GetBitmap +from PLCControler import _VariableInfos #------------------------------------------------------------------------------- # Helpers @@ -105,12 +106,22 @@ CustomTable.__init__(self, parent, data, colnames) self.old_value = None + def GetValueByName(self, row, colname): + if row < self.GetNumberRows(): + return getattr(self.data[row], colname) + + def SetValueByName(self, row, colname, value): + if row < self.GetNumberRows(): + setattr(self.data[row], colname, value) + def GetValue(self, row, col): if row < self.GetNumberRows(): if col == 0: - return self.data[row]["Number"] + return self.data[row].Number colname = self.GetColLabelValue(col, False) - value = self.data[row].get(colname, "") + if colname == "Initial Value": + colname = "InitialValue" + value = getattr(self.data[row], colname, "") if colname == "Type" and isinstance(value, TupleType): if value[0] == "array": return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1]) @@ -124,15 +135,17 @@ if col < len(self.colnames): colname = self.GetColLabelValue(col, False) if colname == "Name": - self.old_value = self.data[row][colname] + self.old_value = getattr(self.data[row], colname) elif colname == "Class": value = VARIABLE_CLASSES_DICT[value] self.SetValueByName(row, "Option", CheckOptionForClass[value](self.GetValueByName(row, "Option"))) if value == "External": - self.SetValueByName(row, "Initial Value", "") + self.SetValueByName(row, "InitialValue", "") elif colname == "Option": value = OPTIONS_DICT[value] - self.data[row][colname] = value + elif colname == "Initial Value": + colname = "InitialValue" + setattr(self.data[row], colname, value) def GetOldValue(self): return self.old_value @@ -314,8 +327,8 @@ for name in self.ParentWindow.Controler.\ GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: var_infos = self.ParentWindow.DefaultValue.copy() - var_infos["Name"] = var_name - var_infos["Type"] = values[2] + var_infos.Name = var_name + var_infos.Type = values[2] if values[1] == "location": location = values[0] if not location.startswith("%"): @@ -346,16 +359,16 @@ GetConfigurationVariableNames(configs[0])]: self.ParentWindow.Controler.AddConfigurationGlobalVar( configs[0], values[2], var_name, location, "") - var_infos["Class"] = "External" + var_infos.Class = "External" else: if element_type == "program": - var_infos["Class"] = "Local" + var_infos.Class = "Local" else: - var_infos["Class"] = "Global" - var_infos["Location"] = location + var_infos.Class = "Global" + var_infos.Location = location else: - var_infos["Class"] = "External" - var_infos["Number"] = len(self.ParentWindow.Values) + var_infos.Class = "External" + var_infos.Number = len(self.ParentWindow.Values) self.ParentWindow.Values.append(var_infos) self.ParentWindow.SaveValues() self.ParentWindow.RefreshValues() @@ -447,16 +460,7 @@ self.FilterChoices = [] self.FilterChoiceTransfer = GetFilterChoiceTransfer() - self.DefaultValue = { - "Name" : "", - "Class" : "", - "Type" : "INT", - "Location" : "", - "Initial Value" : "", - "Option" : "", - "Documentation" : "", - "Edit" : True - } + self.DefaultValue = _VariableInfos("", "", "", "", "", True, "", "INT", ([], []), 0) if element_type in ["config", "resource"]: self.DefaultTypes = {"All" : "Global"} @@ -527,32 +531,32 @@ if new_row > 0: row_content = self.Values[new_row - 1].copy() - result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"]) + result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content.Name) if result is not None: - name = row_content["Name"][:result.start(1)] + name = row_content.Name[:result.start(1)] suffix = result.group(1) if suffix != "": start_idx = int(suffix) else: start_idx = 0 else: - name = row_content["Name"] + name = row_content.Name start_idx = 0 else: row_content = None start_idx = 0 name = "LocalVar" - if row_content is not None and row_content["Edit"]: + if row_content is not None and row_content.Edit: row_content = self.Values[new_row - 1].copy() else: row_content = self.DefaultValue.copy() if self.Filter in self.DefaultTypes: - row_content["Class"] = self.DefaultTypes[self.Filter] + row_content.Class = self.DefaultTypes[self.Filter] else: - row_content["Class"] = self.Filter + row_content.Class = self.Filter - row_content["Name"] = self.Controler.GenerateNewName( + row_content.Name = self.Controler.GenerateNewName( self.TagName, None, name + "%d", start_idx) if self.Filter == "All" and len(self.Values) > 0: @@ -637,9 +641,9 @@ self.ReturnType.Clear() for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug): self.ReturnType.Append(data_type) - returnType, (var_tree, dimensions) = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug) + returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug) description = self.Controler.GetPouDescription(words[1]) - self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug) + self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug) if returnType is not None: self.ReturnType.SetStringSelection(returnType) @@ -712,7 +716,7 @@ message = _("\"%s\" is a keyword. It can't be used!") % value elif value.upper() in self.PouNames: message = _("A POU named \"%s\" already exists!") % value - elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]: + elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]: message = _("A variable with \"%s\" as name already exists in this pou!") % value else: self.SaveValues(False) @@ -846,8 +850,8 @@ def RefreshValues(self): data = [] for num, variable in enumerate(self.Values): - if variable["Class"] in self.ClassList: - variable["Number"] = num + 1 + if variable.Class in self.ClassList: + variable.Number = num + 1 data.append(variable) self.Table.SetData(data) self.Table.ResetView(self.VariablesGrid) diff -r 92efd8fe3120 -r 533741e5075c dialogs/ActionBlockDialog.py --- a/dialogs/ActionBlockDialog.py Fri Oct 04 12:17:03 2013 +0200 +++ b/dialogs/ActionBlockDialog.py Wed Oct 09 10:57:20 2013 +0200 @@ -198,7 +198,7 @@ self.DurationList = list def SetVariableList(self, list): - self.VariableList = "," + ",".join([variable["Name"] for variable in list]) + self.VariableList = "," + ",".join([variable.Name for variable in list]) def SetActionList(self, list): self.ActionList = "," + ",".join(list) diff -r 92efd8fe3120 -r 533741e5075c dialogs/BlockPreviewDialog.py --- a/dialogs/BlockPreviewDialog.py Fri Oct 04 12:17:03 2013 +0200 +++ b/dialogs/BlockPreviewDialog.py Wed Oct 09 10:57:20 2013 +0200 @@ -170,14 +170,14 @@ """ # Get list of variables defined in POU self.VariableList = { - var["Name"]: (var["Class"], var["Type"]) + var.Name: (var.Class, var.Type) for var in self.Controller.GetEditedElementInterfaceVars( self.TagName) - if var["Edit"]} + if var.Edit} # Add POU name to variable list if POU is a function returntype = self.Controller.GetEditedElementInterfaceReturnType( - self.TagName)[0] + self.TagName) if returntype is not None: self.VariableList[ self.Controller.GetEditedElementName(self.TagName)] = \ diff -r 92efd8fe3120 -r 533741e5075c dialogs/SFCStepNameDialog.py --- a/dialogs/SFCStepNameDialog.py Fri Oct 04 12:17:03 2013 +0200 +++ b/dialogs/SFCStepNameDialog.py Wed Oct 09 10:57:20 2013 +0200 @@ -67,7 +67,7 @@ self.PouNames = [pou_name.upper() for pou_name in pou_names] def SetVariables(self, variables): - self.Variables = [var["Name"].upper() for var in variables] + self.Variables = [var.Name.upper() for var in variables] def SetStepNames(self, step_names): self.StepNames = [step_name.upper() for step_name in step_names] diff -r 92efd8fe3120 -r 533741e5075c editors/LDViewer.py --- a/editors/LDViewer.py Fri Oct 04 12:17:03 2013 +0200 +++ b/editors/LDViewer.py Wed Oct 09 10:57:20 2013 +0200 @@ -482,12 +482,12 @@ dialog = LDElementDialog(self.ParentWindow, self.Controler, "coil") dialog.SetPreviewFont(self.GetFont()) varlist = [] - vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug) + vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug) if vars: for var in vars: - if var["Class"] != "Input" and var["Type"] == "BOOL": - varlist.append(var["Name"]) - returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug)[0] + if var.Class != "Input" and var.Type == "BOOL": + varlist.append(var.Name) + returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug) if returntype == "BOOL": varlist.append(self.Controler.GetEditedElementName(self.TagName)) dialog.SetVariables(varlist) @@ -582,11 +582,11 @@ dialog = LDElementDialog(self.ParentWindow, self.Controler, "contact") dialog.SetPreviewFont(self.GetFont()) varlist = [] - vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug) + vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug) if vars: for var in vars: - if var["Class"] != "Output" and var["Type"] == "BOOL": - varlist.append(var["Name"]) + if var.Class != "Output" and var.Type == "BOOL": + varlist.append(var.Name) dialog.SetVariables(varlist) dialog.SetValues({"name":"","type":CONTACT_NORMAL}) if dialog.ShowModal() == wx.ID_OK: @@ -796,12 +796,12 @@ dialog = LDElementDialog(self.ParentWindow, self.Controleur, "coil") dialog.SetPreviewFont(self.GetFont()) varlist = [] - vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug) + vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug) if vars: for var in vars: - if var["Class"] != "Input" and var["Type"] == "BOOL": - varlist.append(var["Name"]) - returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug)[0] + if var.Class != "Input" and var.Type == "BOOL": + varlist.append(var.Name) + returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug) if returntype == "BOOL": varlist.append(self.Controler.GetEditedElementName(self.TagName)) dialog.SetVariables(varlist) diff -r 92efd8fe3120 -r 533741e5075c editors/SFCViewer.py --- a/editors/SFCViewer.py Fri Oct 04 12:17:03 2013 +0200 +++ b/editors/SFCViewer.py Wed Oct 09 10:57:20 2013 +0200 @@ -358,7 +358,7 @@ def AddInitialStep(self, pos): dialog = SFCStepNameDialog(self.ParentWindow, _("Please enter step name"), _("Add a new initial step"), "", wx.OK|wx.CANCEL) dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) - dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) + dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)) dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)]) if dialog.ShowModal() == wx.ID_OK: id = self.GetNewId() @@ -380,7 +380,7 @@ if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, SFC_Step): dialog = SFCStepNameDialog(self.ParentWindow, _("Add a new step"), _("Please enter step name"), "", wx.OK|wx.CANCEL) dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) - dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) + dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)) dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)]) if dialog.ShowModal() == wx.ID_OK: name = dialog.GetValue() @@ -437,7 +437,7 @@ dialog = ActionBlockDialog(self.ParentWindow) dialog.SetQualifierList(self.Controler.GetQualifierTypes()) dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug)) - dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) + dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)) if dialog.ShowModal() == wx.ID_OK: actions = dialog.GetValues() self.SelectedElement.AddAction() @@ -724,7 +724,7 @@ else: dialog = SFCStepNameDialog(self.ParentWindow, _("Edit step name"), _("Please enter step name"), step.GetName(), wx.OK|wx.CANCEL) dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) - dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) + dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)) dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()]) if dialog.ShowModal() == wx.ID_OK: value = dialog.GetValue() diff -r 92efd8fe3120 -r 533741e5075c editors/TextViewer.py --- a/editors/TextViewer.py Fri Oct 04 12:17:03 2013 +0200 +++ b/editors/TextViewer.py Wed Oct 09 10:57:20 2013 +0200 @@ -458,9 +458,12 @@ def RefreshVariableTree(self): words = self.TagName.split("::") - self.Variables = self.GenerateVariableTree([(variable["Name"], variable["Type"], variable["Tree"]) for variable in self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)]) + self.Variables = self.GenerateVariableTree( + [(variable.Name, variable.Type, variable.Tree) + for variable in self.Controler.GetEditedElementInterfaceVars( + self.TagName, True, self.Debug)]) if self.Controler.GetEditedElementType(self.TagName, self.Debug)[1] == "function" or words[0] == "T" and self.TextSyntax == "IL": - return_type, (var_tree, var_dimension) = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug) + return_type, (var_tree, var_dimension) = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, True, self.Debug) if return_type is not None: self.Variables[words[-1].upper()] = self.GenerateVariableTree(var_tree) else: diff -r 92efd8fe3120 -r 533741e5075c editors/Viewer.py --- a/editors/Viewer.py Fri Oct 04 12:17:03 2013 +0200 +++ b/editors/Viewer.py Wed Oct 09 10:57:20 2013 +0200 @@ -332,7 +332,7 @@ var_class = INPUT else: var_class = INPUT - tree = dict([(var["Name"], var["Tree"]) for var in self.ParentWindow.Controler.GetEditedElementInterfaceVars(tagname, self.ParentWindow.Debug)]).get(values[0], None) + tree = dict([(var.Name, var.Tree) for var in self.ParentWindow.Controler.GetEditedElementInterfaceVars(tagname, True, self.ParentWindow.Debug)]).get(values[0], None) if tree is not None: if len(tree[0]) > 0: menu = wx.Menu(title='') @@ -2620,7 +2620,7 @@ dialog = ActionBlockDialog(self.ParentWindow) dialog.SetQualifierList(self.Controler.GetQualifierTypes()) dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug)) - dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) + dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)) if dialog.ShowModal() == wx.ID_OK: id = self.GetNewId() actionblock = SFC_ActionBlock(self, dialog.GetValues(), id) @@ -2870,7 +2870,7 @@ dialog = ActionBlockDialog(self.ParentWindow) dialog.SetQualifierList(self.Controler.GetQualifierTypes()) dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug)) - dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) + dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)) dialog.SetValues(actionblock.GetActions()) if dialog.ShowModal() == wx.ID_OK: actions = dialog.GetValues() diff -r 92efd8fe3120 -r 533741e5075c plcopen/variables_infos.xslt --- a/plcopen/variables_infos.xslt Fri Oct 04 12:17:03 2013 +0200 +++ b/plcopen/variables_infos.xslt Wed Oct 09 10:57:20 2013 +0200 @@ -1,213 +1,1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Constant - - - Retain - - - Non-Retain - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - STRING - - - WSTRING - - - - - - - - - True - - - - - - - - - ( - - ) - - - - := - - - - - - - - - - - - [ - - - - - , - - - - ] - - - ( - - - - - , - - - - ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - STRING - - - WSTRING - - - - - - - \ No newline at end of file +ConstantRetainNon-RetaintrueLocalGlobalExternalTempInputOutputInOutSTRINGWSTRINGfalsetruetrue() := , []() \ No newline at end of file diff -r 92efd8fe3120 -r 533741e5075c plcopen/variables_infos.ysl2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plcopen/variables_infos.ysl2 Wed Oct 09 10:57:20 2013 +0200 @@ -0,0 +1,233 @@ +include yslt.yml2 +estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" + xmlns:xhtml="http://www.w3.org/1999/xhtml" + xmlns:ns="var_infos_ns" + extension-element-prefixes="ns" + exclude-result-prefixes="ns" { + + param "tree"; + + template "text()"; + + variable "project" { + choose { + when "$tree='True'" { + copy "document('project')/project/*"; + } + } + } + + variable "stdlib" { + choose { + when "$tree='True'" { + copy "document('stdlib')/stdlib/*"; + } + } + } + variable "extensions" { + choose { + when "$tree='True'" { + copy "document('extensions')/extensions/*"; + } + } + } + + template "ppx:returnType" { + value "ns:AddTree()"; + apply; + } + + function "variables_infos" { + param "var_class"; + variable "var_option" { + choose { + when "@constant='true' or @constant='1'" > Constant + when "@retain='true' or @retain='1'" > Retain + when "@nonretain='true' or @nonretain='1'" > Non-Retain + } + } + foreach "ppx:variable" { + variable "initial_value" { + apply "ppx:initialValue"; + } + variable "edit" { + choose { + when "$var_class='Global' or $var_class='External'" > true + otherwise { + apply "ppx:type", mode="var_edit"; + } + } + } + value "ns:AddTree()"; + apply "ppx:type"; + value "ns:AddVariable(@name, $var_class, $var_option, @address, $initial_value, $edit, ppx:documentation/xhtml:p/text())"; + } + } + + template "ppx:localVars" { + call "variables_infos" { + with "var_class" > Local + } + } + + template "ppx:globalVars" { + call "variables_infos" { + with "var_class" > Global + } + } + + template "ppx:externalVars" { + call "variables_infos" { + with "var_class" > External + } + } + + template "ppx:tempVars" { + call "variables_infos" { + with "var_class" > Temp + } + } + + template "ppx:inputVars" { + call "variables_infos" { + with "var_class" > Input + } + } + + template "ppx:outputVars" { + call "variables_infos" { + with "var_class" > Output + } + } + + template "ppx:inOutVars" { + call "variables_infos" { + with "var_class" > InOut + } + } + + template "ppx:pou" { + apply "ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars or self::ppx:outputVars]/ppx:variable"; + } + + template "ppx:variable" { + variable "name" > «@name» + value "ns:AddTree($name)"; + apply "ppx:type"; + value "ns:AddVarToTree($name)"; + } + + template "ppx:dataType" { + apply "ppx:baseType"; + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:struct" { + apply "ppx:variable"; + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived" { + variable "type_name" > «@name» + choose { + when "$tree='True'" { + apply """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] | + exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] | + exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]"""; + } + } + value "ns:SetType($type_name)"; + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:array" { + apply "ppx:baseType"; + foreach "ppx:dimension" { + value "ns:AddDimension(@lower, @upper)"; + } + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string" { + variable "name" > STRING + value "ns:SetType($name)"; + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring" { + variable "name" > WSTRING + value "ns:SetType($name)"; + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*" { + variable "name" > «local-name()» + value "ns:SetType($name)"; + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived", mode="var_edit" { + variable "type_name", "@name"; + variable "pou_infos" { + copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"""; + } + choose { + when "$pou_infos != ''" > false + otherwise > true + } + } + + template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*", mode="var_edit" { + > true + } + + template "ppx:value" { + choose { + when "@repetitionValue" { + > «@repetitionValue»( + apply; + > ) + } + when "@member" { + > «@member» := + apply; + } + otherwise { + apply; + } + } + } + + template "ppx:simpleValue" { + > «@value» + } + + function "complex_type_value" { + param "start_bracket"; + param "end_bracket"; + > «@start_bracket» + foreach "ppx:value" { + apply "."; + choose { + when "position()!=last()" > , + } + } + > «@end_bracket» + } + + template "ppx:arrayValue" { + call "complex_type_value" { + with "start_bracket" > [ + with "end_bracket" > ] + } + } + + template "ppx:structValue" { + call "complex_type_value" { + with "start_bracket" > ( + with "end_bracket" > ) + } + } + +} + + + \ No newline at end of file diff -r 92efd8fe3120 -r 533741e5075c util/MiniTextControler.py --- a/util/MiniTextControler.py Fri Oct 04 12:17:03 2013 +0200 +++ b/util/MiniTextControler.py Wed Oct 09 10:57:20 2013 +0200 @@ -29,7 +29,7 @@ return text return "" - def GetEditedElementInterfaceVars(self, tagname, debug = False): + def GetEditedElementInterfaceVars(self, tagname, tree=False, debug = False): return [] def GetEditedElementType(self, tagname, debug = False):