# HG changeset patch # User lbessard # Date 1186755273 -7200 # Node ID 66308e07402c2ceee1179aafaac07d9aad585f69 # Parent 3a1b0afdaf841e4bfd24b0acb50d640e03bc87ee Adding support for allowing declarations of function block into POU interface diff -r 3a1b0afdaf84 -r 66308e07402c PLCControler.py --- a/PLCControler.py Thu Aug 09 18:07:44 2007 +0200 +++ b/PLCControler.py Fri Aug 10 16:14:33 2007 +0200 @@ -269,23 +269,6 @@ pou_type = pou.getPouType().getValue() pou_infos = {"name": pou.getName(), "type": ITEM_POU} pou_values = [] -## var_types = {"Input": {"name": "Input", "type": ITEM_CLASS, "values": []}, -## "Output": {"name": "Output", "type": ITEM_CLASS, "values": []}, -## "InOut": {"name": "InOut", "type": ITEM_CLASS, "values": []}, -## "External": {"name": "External", "type": ITEM_CLASS, "values": []}, -## "Local": {"name": "Local", "type": ITEM_CLASS, "values": []}, -## "Temp": {"name": "Temp", "type": ITEM_CLASS, "values": []}, -## "Global": {"name": "Global", "type": ITEM_CLASS, "values": []}} -## for var in self.GetPouInterfaceVars(pou): -## var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []} -## if var["Class"] in var_types.keys(): -## var_types[var["Class"]]["values"].append(var_values) -## pou_values.append({"name": "Interface", "type": ITEM_CLASS, -## "values": [var_types["Input"], var_types["Output"], var_types["InOut"], var_types["External"]]}) -## pou_values.append({"name": "Variables", "type": ITEM_CLASS, -## "values": [var_types["Local"], var_types["Temp"]]}) -## if pou_type == "program": -## pou_values.append(var_types["Global"]) if pou.getBodyType() == "SFC": transitions = [] for transition in pou.getTransitionList(): @@ -302,21 +285,11 @@ for config in self.Project.getConfigurations(): config_name = config.getName() config_infos = {"name": config_name, "type": ITEM_CONFIGURATION, "values": []} -## config_vars = {"name": "Global", "type": ITEM_CLASS, "values": []} -## for var in self.GetConfigurationGlobalVars(config_name): -## var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []} -## config_vars["values"].append(var_values) resources = {"name": "Resources", "type": ITEM_UNEDITABLE, "values": []} for resource in config.getResource(): resource_name = resource.getName() resource_infos = {"name": resource_name, "type": ITEM_RESOURCE, "values": []} -## resource_vars = {"name": "Global", "type": ITEM_CLASS, "values": []} -## for var in self.GetConfigurationResourceGlobalVars(config_name, resource_name): -## var_values = {"name": var["Name"], "type": ITEM_VARIABLE, "values": []} -## resource_vars["values"].append(var_values) -## resource_infos["values"].append(resource_vars) resources["values"].append(resource_infos) -## config_infos["values"] = [config_vars, resources] config_infos["values"] = [resources] configurations["values"].append(config_infos) infos["values"] = [{"name": "Properties", "type": ITEM_UNEDITABLE, "values": []}, @@ -672,6 +645,7 @@ tempvar["Type"] = var_type else: tempvar["Type"] = var_type.getName() + tempvar["Edit"] = True initial = var.getInitialValue() if initial: tempvar["Initial Value"] = initial.getValue() @@ -719,6 +693,7 @@ tempvar["Type"] = var_type else: tempvar["Type"] = var_type.getName() + tempvar["Edit"] = True initial = var.getInitialValue() if initial: tempvar["Initial Value"] = initial.getValue() @@ -757,8 +732,10 @@ var_type = var.getType().getValue() if isinstance(var_type, (StringType, UnicodeType)): tempvar["Type"] = var_type + tempvar["Edit"] = True else: tempvar["Type"] = var_type.getName() + tempvar["Edit"] = not pou.hasBlock(tempvar["Name"]) initial = var.getInitialValue() if initial: tempvar["Initial Value"] = initial.getValue() @@ -896,6 +873,34 @@ return blocktypes return [] + # Return Function Block types checking for recursion + def GetFunctionBlockTypes(self): + if self.CurrentElementEditing != None: + if self.Project: + current_name = self.ElementsOpened[self.CurrentElementEditing] + words = current_name.split("::") + if len(words) == 1: + name = current_name + else: + name = words[1] + type = self.GetPouType(name) + else: + name = "" + type = None + blocktypes = [] + for category in BlockTypes[:-1]: + if category["name"] != "SVGUI function blocks": + for block in category["list"]: + if block["type"] != "function": + blocktypes.append(block["name"]) + if self.Project: + for blocktype in BlockTypes[-1]["list"]: + if blocktype["name"] != name and not self.PouIsUsedBy(name, blocktype["name"]) and not (type == "function" and blocktype["type"] != "function"): + blocktypes.append(blocktype["name"]) + return blocktypes + return [] + + # Return Block types checking for recursion def GetBlockResource(self): blocktypes = [] diff -r 3a1b0afdaf84 -r 66308e07402c PLCGenerator.py --- a/PLCGenerator.py Thu Aug 09 18:07:44 2007 +0200 +++ b/PLCGenerator.py Fri Aug 10 16:14:33 2007 +0200 @@ -61,6 +61,7 @@ self.ReturnType = None self.Interface = [] self.InitialSteps = [] + self.BlockComputed = {} self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}} self.ActionNumber = 0 self.Program = "" @@ -84,15 +85,15 @@ located = False for var in varlist["value"].getVariable(): type = var.getType().getValue() + if not isinstance(type, (StringType, UnicodeType)): + type = type.getName() initial = var.getInitialValue() if initial: initial_value = initial.getValue() else: initial_value = None address = var.getAddress() - if address == "": - address = None - else: + if address: located = True variables.append((type, var.getName(), address, initial_value)) self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), @@ -159,10 +160,7 @@ variable = instance.outputVariables.getVariable()[0] return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars))) elif block_infos["type"] == "functionBlock": - if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2] or self.Interface[-1][3]: - self.Interface.append(("VAR", False, False, False, [])) - if not self.IsAlreadyDefined(name): - self.Interface[-1][4].append((type, name, None, None)) + if not self.BlockComputed.get(name, False): vars = [] for variable in instance.inputVariables.getVariable(): connections = variable.connectionPointIn.getConnections() @@ -171,6 +169,7 @@ value = self.ComputeFBDExpression(body, connections[0]) vars.append(self.ExtractModifier(variable, "%s := %s"%(parameter, value))) self.Program += " %s(%s);\n"%(name, ", ".join(vars)) + self.BlockComputed[name] = True connectionPoint = link.getPosition()[-1] for variable in instance.outputVariables.getVariable(): blockPointx, blockPointy = variable.connectionPointOut.getRelPosition() diff -r 3a1b0afdaf84 -r 66308e07402c PLCOpenEditor.py --- a/PLCOpenEditor.py Thu Aug 09 18:07:44 2007 +0200 +++ b/PLCOpenEditor.py Fri Aug 10 16:14:33 2007 +0200 @@ -301,13 +301,9 @@ self.FileMenu = wx.Menu(title=u'') else: self.FileMenu = None - self.EditMenu = wx.Menu(title=u'') - self.HelpMenu = wx.Menu(title='') - self.SFCMenu = wx.Menu(title='') - self.ConfigMenu = wx.Menu(title='') self._init_coll_menuBar1_Menus(self.menuBar1) @@ -912,156 +908,6 @@ data = self.ProjectTree.GetPyData(selected) if name == "Properties": self.ShowProperties() -## elif data == ITEM_CLASS: -## item = self.ProjectTree.GetItemParent(selected) -## item_type = self.ProjectTree.GetPyData(item) -## while item_type not in [ITEM_POU, ITEM_RESOURCE, ITEM_CONFIGURATION] and item.IsOk(): -## item = self.ProjectTree.GetItemParent(item) -## item_type = self.ProjectTree.GetPyData(item) -## item_name = self.ProjectTree.GetItemText(item) -## if item_type == ITEM_POU: -## dialog = EditVariableDialog(self, item_name, self.Controler.GetPouType(item_name), self.Controler.PouIsUsed(item_name), name) -## dialog.SetPouNames(self.Controler.GetProjectPouNames()) -## values = {} -## values["returnType"] = self.Controler.GetPouInterfaceReturnTypeByName(item_name) -## values["data"] = self.Controler.GetPouInterfaceVarsByName(item_name) -## dialog.SetValues(values) -## if dialog.ShowModal() == wx.ID_OK: -## new_values = dialog.GetValues() -## if "returnType" in new_values: -## self.Controler.SetPouInterfaceReturnType(item_name, new_values["returnType"]) -## self.Controler.SetPouInterfaceVars(item_name, new_values["data"]) -## pou_names = self.Controler.GetElementsOpenedNames() -## if item_name in pou_names: -## window = self.TabsOpened.GetPage(pou_names.index(item_name)) -## if isinstance(window, TextViewer): -## varlist = [] -## if "returnType" in new_values: -## varlist.append(name) -## for var in new_values["data"]: -## varlist.append(var["Name"]) -## window.SetVariables(varlist) -## dialog.Destroy() -## self.RefreshProjectTree() -## elif item_type == ITEM_CONFIGURATION: -## dialog = EditVariableDialog(self, item_name, None, False, name) -## dialog.SetPouNames(self.Controler.GetProjectPouNames()) -## values = {"data" : self.Controler.GetConfigurationGlobalVars(item_name)} -## dialog.SetValues(values) -## if dialog.ShowModal() == wx.ID_OK: -## new_values = dialog.GetValues() -## self.Controler.SetConfigurationGlobalVars(item_name, new_values["data"]) -## dialog.Destroy() -## self.RefreshProjectTree() -## elif item_type == ITEM_RESOURCE: -## config = self.ProjectTree.GetItemParent(item) -## config_type = self.ProjectTree.GetPyData(config) -## while config_type != ITEM_CONFIGURATION and config.IsOk(): -## config = self.ProjectTree.GetItemParent(config) -## config_type = self.ProjectTree.GetPyData(config) -## if config.IsOk(): -## config_name = self.ProjectTree.GetItemText(config) -## dialog = EditVariableDialog(self, item_name, None, False, name) -## values = {"data" : self.Controler.GetConfigurationResourceGlobalVars(config_name, item_name)} -## dialog.SetValues(values) -## if dialog.ShowModal() == wx.ID_OK: -## new_values = dialog.GetValues() -## self.Controler.SetConfigurationResourceGlobalVars(config_name, item_name, new_values["data"]) -## dialog.Destroy() -## self.RefreshProjectTree() -## elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: -## if data == ITEM_POU: -## idx = self.Controler.OpenElementEditing(name) -## language = self.Controler.GetPouBodyType(name) -## varlist = [] -## returnType = self.Controler.GetPouInterfaceReturnTypeByName(name) -## if returnType: -## varlist.append(name) -## vars = self.Controler.GetPouInterfaceVarsByName(name) -## if vars: -## for var in vars: -## varlist.append(var["Name"]) -## self.EditVariable.SetPou(self.Controler.GetPouType(name), self.Controler.PouIsUsed(name)) -## self.EditVariable.SetValues({"returnType":returnType,"data":vars}) -## else: -## parent = self.ProjectTree.GetItemParent(selected) -## parent_name = self.ProjectTree.GetItemText(parent) -## grandparent = self.ProjectTree.GetItemParent(parent) -## grandparent_name = self.ProjectTree.GetItemText(grandparent) -## if data == ITEM_TRANSITION: -## idx = self.Controler.OpenPouTransitionEditing(grandparent_name, name) -## language = self.Controler.GetTransitionBodyType(grandparent_name, name) -## elif data == ITEM_ACTION: -## idx = self.Controler.OpenPouActionEditing(grandparent_name, name) -## language = self.Controler.GetActionBodyType(grandparent_name, name) -## varlist = [name] -## vars = self.Controler.GetPouInterfaceVarsByName(grandparent_name) -## if vars: -## for var in vars: -## varlist.append(var["Name"]) -## self.EditVariable.SetPou(self.Controler.GetPouType(grandparent_name), self.Controler.PouIsUsed(grandparent_name)) -## self.EditVariable.SetValues({"returnType":returnType,"data":vars}) -## if idx != None: -## if language == "FBD": -## new_window = Viewer(self.TabsOpened, self, self.Controler) -## elif language == "LD": -## new_window = LD_Viewer(self.TabsOpened, self, self.Controler) -## elif language == "SFC": -## new_window = SFC_Viewer(self.TabsOpened, self, self.Controler) -## elif language in ["IL", "ST"]: -## new_window = TextViewer(self.TabsOpened, self, self.Controler) -## new_window.SetTextSyntax(language) -## if language == "IL": -## new_window.SetKeywords(IL_KEYWORDS) -## else: -## new_window.SetKeywords(ST_KEYWORDS) -## new_window.SetVariables(varlist) -## new_window.SetFunctions(self.Controler.GetBlockTypes()) -## else: -## return -## new_window.RefreshView() -## self.TabsOpened.AddPage(new_window, "") -## self.TabsOpened.SetSelection(idx) -## self.RefreshTabsOpenedTitles() -## self.RefreshFileMenu() -## self.RefreshEditMenu() -## self.RefreshToolBar() -## else: -## if data == ITEM_POU: -## idx = self.Controler.ChangeElementEditing(name) -## elif data == ITEM_TRANSITION: -## idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name) -## elif data == ITEM_ACTION: -## idx = self.Controler.ChangePouActionEditing(grandparent_name, name) -## if idx != None: -## self.TabsOpened.SetSelection(idx) -## self.RefreshFileMenu() -## self.RefreshEditMenu() -## self.RefreshToolBar() -## elif data == ITEM_RESOURCE: -## item = self.ProjectTree.GetItemParent(selected) -## item_type = self.ProjectTree.GetPyData(item) -## while item_type != ITEM_CONFIGURATION: -## item = self.ProjectTree.GetItemParent(item) -## item_type = self.ProjectTree.GetPyData(item) -## config_name = self.ProjectTree.GetItemText(item) -## idx = self.Controler.OpenConfigurationResourceEditing(config_name, name) -## if idx != None: -## new_window = ResourceEditor(self.TabsOpened, self, self.Controler) -## new_window.RefreshView() -## self.TabsOpened.AddPage(new_window, "") -## self.TabsOpened.SetSelection(idx) -## self.RefreshTabsOpenedTitles() -## self.RefreshFileMenu() -## self.RefreshEditMenu() -## self.RefreshToolBar() -## else: -## idx = self.Controler.ChangeConfigurationResourceEditing(parent_name, name) -## if idx != None: -## self.TabsOpened.SetSelection(idx) -## self.RefreshFileMenu() -## self.RefreshEditMenu() -## self.RefreshToolBar() elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE, ITEM_CONFIGURATION]: if data == ITEM_CONFIGURATION: idx = self.Controler.OpenConfigurationEditing(name) @@ -1968,7 +1814,7 @@ return values #------------------------------------------------------------------------------- -# Pou Interface Dialog +# Pou Editor Panel #------------------------------------------------------------------------------- class VariableTable(wx.grid.PyGridTableBase): @@ -2009,9 +1855,6 @@ name = str(self.data[row].get(self.GetColLabelValue(col), "")) return name - def GetValueByName(self, row, colname): - return self.data[row].get(colname) - def SetValue(self, row, col, value): if col < len(self.colnames): colname = self.GetColLabelValue(col) @@ -2019,6 +1862,14 @@ self.old_value = self.data[row][colname] self.data[row][colname] = value + def GetValueByName(self, row, colname): + if row < self.GetNumberRows(): + return self.data[row].get(colname) + + def SetValueByName(self, row, colname, value): + if row < self.GetNumberRows(): + self.data[row][colname] = value + def GetOldValue(self): return self.old_value @@ -2077,37 +1928,34 @@ editor = None renderer = None colname = self.GetColLabelValue(col) - grid.SetReadOnly(row, col, False) - if col == 0: - grid.SetReadOnly(row, col, True) - elif colname == "Name": - if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]: - grid.SetReadOnly(row, col, True) - else: + if col != 0 and self.GetValueByName(row, "Edit"): + grid.SetReadOnly(row, col, False) + if colname == "Name": + if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]: + grid.SetReadOnly(row, col, True) + else: + editor = wx.grid.GridCellTextEditor() + renderer = wx.grid.GridCellStringRenderer() + elif colname in ["Initial Value","Location"]: editor = wx.grid.GridCellTextEditor() renderer = wx.grid.GridCellStringRenderer() - elif colname in ["Initial Value","Location"]: - editor = wx.grid.GridCellTextEditor() - renderer = wx.grid.GridCellStringRenderer() - elif colname == "Class": - if len(self.Parent.ClassList) == 1 or self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]: - grid.SetReadOnly(row, col, True) - else: + elif colname == "Class": + if len(self.Parent.ClassList) == 1 or self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]: + grid.SetReadOnly(row, col, True) + else: + editor = wx.grid.GridCellChoiceEditor() + excluded = [] + if self.Parent.PouIsUsed: + excluded.extend(["Input","Output","InOut"]) + editor.SetParameters(",".join([choice for choice in self.Parent.ClassList if choice not in excluded])) + elif colname in ["Retain", "Constant"]: editor = wx.grid.GridCellChoiceEditor() - excluded = [] - if self.Parent.PouIsUsed: - excluded.extend(["Input","Output","InOut"]) - editor.SetParameters(",".join([choice for choice in self.Parent.ClassList if choice not in excluded])) - elif colname == "Type": - if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]: - grid.SetReadOnly(row, col, True) - else: - editor = wx.grid.GridCellChoiceEditor() - editor.SetParameters(self.Parent.TypeList) - elif colname in ["Retain", "Constant"]: - editor = wx.grid.GridCellChoiceEditor() - editor.SetParameters(self.Parent.OptionList) - + editor.SetParameters(self.Parent.OptionList) + elif colname == "Type": + editor = wx.grid.GridCellTextEditor() + else: + grid.SetReadOnly(row, col, True) + grid.SetCellEditor(row, col, editor) grid.SetCellRenderer(row, col, renderer) @@ -2177,15 +2025,7 @@ ID_POUEDITORPANELSTATICTEXT2, ID_POUEDITORPANELSTATICTEXT3, ] = [wx.NewId() for _init_ctrls in range(12)] -class PouEditorPanel(wx.Panel): - def _init_coll_MainPanelSizer_Items(self, parent): - parent.AddWindow(self.Viewer, 0, border=0, flag=wx.GROW) - parent.AddSizer(self.VariablePanelSizer, 0, border=0, flag=wx.GROW) - - def _init_coll_MainPanelSizer_Growables(self, parent): - parent.AddGrowableCol(0) - parent.AddGrowableRow(0) - +class PouEditorPanel(wx.SplitterWindow): def _init_coll_VariablePanelSizer_Items(self, parent): parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW) parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wx.GROW) @@ -2223,14 +2063,11 @@ parent.AddGrowableRow(0) def _init_sizers(self): - self.MainPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) self.VariablePanelSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0) self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) self.ChoicePanelSizer = wx.GridSizer(cols=1, hgap=5, rows=4, vgap=5) self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0) - self._init_coll_MainPanelSizer_Items(self.MainPanelSizer) - self._init_coll_MainPanelSizer_Growables(self.MainPanelSizer) self._init_coll_VariablePanelSizer_Items(self.VariablePanelSizer) self._init_coll_VariablePanelSizer_Growables(self.VariablePanelSizer) self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer) @@ -2239,16 +2076,18 @@ self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer) self._init_coll_ButtonPanelSizer_Growables(self.ButtonPanelSizer) - self.SetSizer(self.MainPanelSizer) + self.VariablePanel.SetSizer(self.VariablePanelSizer) def _init_ctrls(self, prnt, element_type): - wx.Panel.__init__(self, id=ID_POUEDITORPANEL, + wx.SplitterWindow.__init__(self, id=ID_POUEDITORPANEL, name='EditVariablePanel', parent=prnt, pos=wx.Point(0, 0), - size=wx.Size(-1, -1), style=0) + size=wx.Size(-1, -1), style=wx.SP_3D) + self.SetNeedUpdating(True) + self.SetMinimumPaneSize(1) if element_type == "config": self.Viewer = wx.Panel(id=ID_POUEDITORPANELVIEWER, - name='ConfigPanel', parent=self, pos=wx.Point(0, 0), + name='ConfigPanel', parent=self.splitterWindow1, pos=wx.Point(0, 0), size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL) self.Viewer.ResetBuffer = lambda: None self.Viewer.RefreshView = lambda: None @@ -2268,25 +2107,29 @@ else: self.Viewer.SetKeywords(ST_KEYWORDS) + self.VariablePanel = wx.Panel(id=ID_POUEDITORPANELVIEWER, + name='VariablePanel', parent=self, pos=wx.Point(0, 0), + size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL) + self.staticText1 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT1, - label='Return Type:', name='staticText1', parent=self, + label='Return Type:', name='staticText1', parent=self.VariablePanel, pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0) self.ReturnType = wx.Choice(id=ID_POUEDITORPANELRETURNTYPE, - name='ReturnType', parent=self, pos=wx.Point(0, 0), + name='ReturnType', parent=self.VariablePanel, pos=wx.Point(0, 0), size=wx.Size(145, 24), style=0) self.staticText2 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT2, - label='Class Filter:', name='staticText2', parent=self, + label='Class Filter:', name='staticText2', parent=self.VariablePanel, pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0) self.ClassFilter = wx.Choice(id=ID_POUEDITORPANELCLASSFILTER, - name='ClassFilter', parent=self, pos=wx.Point(0, 0), + name='ClassFilter', parent=self.VariablePanel, pos=wx.Point(0, 0), size=wx.Size(145, 24), style=0) self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_POUEDITORPANELCLASSFILTER) self.VariablesGrid = wx.grid.Grid(id=ID_POUEDITORPANELVARIABLESGRID, - name='VariablesGrid', parent=self, pos=wx.Point(0, 0), + name='VariablesGrid', parent=self.VariablePanel, pos=wx.Point(0, 0), size=wx.Size(0, 150), style=wx.VSCROLL) self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False, 'Sans')) @@ -2295,29 +2138,31 @@ self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange) self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick) - + self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown) self.VariablesGrid.SetDropTarget(VariableDropTarget(self)) self.AddButton = wx.Button(id=ID_POUEDITORPANELADDBUTTON, label='Add', - name='AddButton', parent=self, pos=wx.Point(345, 340), + name='AddButton', parent=self.VariablePanel, pos=wx.Point(345, 340), size=wx.Size(72, 32), style=0) self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_POUEDITORPANELADDBUTTON) self.DeleteButton = wx.Button(id=ID_POUEDITORPANELDELETEBUTTON, label='Delete', - name='DeleteButton', parent=self, pos=wx.Point(425, 340), + name='DeleteButton', parent=self.VariablePanel, pos=wx.Point(425, 340), size=wx.Size(72, 32), style=0) self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_POUEDITORPANELDELETEBUTTON) self.UpButton = wx.Button(id=ID_POUEDITORPANELUPBUTTON, label='^', - name='UpButton', parent=self, pos=wx.Point(505, 340), + name='UpButton', parent=self.VariablePanel, pos=wx.Point(505, 340), size=wx.Size(32, 32), style=0) self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_POUEDITORPANELUPBUTTON) self.DownButton = wx.Button(id=ID_POUEDITORPANELDOWNBUTTON, label='v', - name='DownButton', parent=self, pos=wx.Point(545, 340), + name='DownButton', parent=self.VariablePanel, pos=wx.Point(545, 340), size=wx.Size(32, 32), style=0) self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_POUEDITORPANELDOWNBUTTON) + self.SplitHorizontally(self.Viewer, self.VariablePanel, -200) + self._init_sizers() def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None): @@ -2354,23 +2199,23 @@ if pou_type in ["config", "resource"]: self.DefaultTypes = {"All" : "Global"} - self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"} + self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : "True"} else: self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"} - self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"} + self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : "True"} if pou_type in ["config", "resource"] or pou_type == "program": - self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"]) + self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant", "Edit"]) if pou_type not in ["config", "resource"]: self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp","Global","Access"] else: self.FilterChoices = ["All","Global","Access"] - self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70] - self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] - else: - self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Initial Value", "Retain", "Constant"]) + self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70, 50] + self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER, wx.ALIGN_LEFT] + else: + self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Initial Value", "Retain", "Constant", "Edit"]) self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp"] - self.ColSizes = [40, 120, 70, 80, 120, 60, 70] - self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] + self.ColSizes = [40, 120, 70, 80, 120, 60, 70, 50] + self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER, wx.ALIGN_LEFT] for choice in self.FilterChoices: self.ClassFilter.Append(choice) reverse_transfer = {} @@ -2380,7 +2225,7 @@ self.RefreshTypeList() self.OptionList = "Yes,No" - self.TypeList = ",".join([value for value, parent in TypeHierarchy_list if not value.startswith("ANY")]) + self.TypeList = [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")] if pou_type == "function": for value, parent in TypeHierarchy_list: @@ -2424,10 +2269,21 @@ self.PouIsUsed = self.Controler.PouIsUsed(self.PouName) returnType = self.Controler.GetCurrentElementEditingInterfaceReturnType() self.Values = self.Controler.GetCurrentElementEditingInterfaceVars() + + if returnType and self.ReturnType.IsEnabled(): + self.ReturnType.SetStringSelection(returnType) + + self.RefreshValues() + self.RefreshViewerVarList() + self.RefreshButtons() + self.Viewer.RefreshView() + + def RefreshViewerVarList(self): + if self.ElementType not in ["config", "ressource"]: varlist = [var["Name"] for var in self.Values] - if self.ElementType == "transtion": + if self.ElementType == "transition": language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName) - varlist.append(self.ActionName) + varlist.append(self.TransitionName) elif self.ElementType == "action": language = self.Controler.GetActionBodyType(self.PouName, self.ActionName) varlist.append(self.ActionName) @@ -2437,12 +2293,6 @@ if language in ["IL", "ST"]: self.Viewer.SetVariables(varlist) self.Viewer.SetFunctions(self.Controler.GetBlockTypes()) - - if returnType and self.ReturnType.IsEnabled(): - self.ReturnType.SetStringSelection(returnType) - self.RefreshValues() - self.RefreshButtons() - self.Viewer.RefreshView() def OnClassFilter(self, event): self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()] @@ -2480,6 +2330,7 @@ else: new_row["Class"] = self.Filter self.Values.append(new_row) + self.SaveValues() self.RefreshValues() self.RefreshButtons() event.Skip() @@ -2487,6 +2338,7 @@ def OnDeleteButton(self, event): row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow()) self.Values.remove(row) + self.SaveValues() self.RefreshValues() self.RefreshButtons() event.Skip() @@ -2534,6 +2386,7 @@ self.Controler.BufferProject() self.Parent.RefreshTitle() self.Parent.RefreshEditMenu() + self.RefreshViewerVarList() self.Viewer.RefreshView() event.Skip() else: @@ -2541,6 +2394,49 @@ event.Skip() def OnVariablesGridCellLeftClick(self, event): + if event.GetCol() == "#": + row = event.GetRow() + var_name = self.Table.GetValueByName(row, "Name") + var_class = self.Table.GetValueByName(row, "Class") + var_type = self.Table.GetValueByName(row, "Type") + data = wx.TextDataObject(str((var_name, var_class, var_type))) + dragSource = wx.DropSource(self.VariablesGrid) + dragSource.SetData(data) + dragSource.DoDragDrop() + event.Skip() + + def OnVariablesGridEditorShown(self, event): + row, col = event.GetRow(), event.GetCol() + if self.Table.GetColLabelValue(col) == "Type": + type_menu = wx.Menu(title='') + base_menu = wx.Menu(title='') + for base_type in self.TypeList: + new_id = wx.NewId() + base_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type) + self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id) + type_menu.AppendMenu(-1, "Base Types", base_menu, '') + functionblock_menu = wx.Menu(title='') + for functionblock_type in self.Controler.GetFunctionBlockTypes(): + new_id = wx.NewId() + functionblock_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type) + self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id) + type_menu.AppendMenu(-1, "Function Block Types", functionblock_menu, '') + rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col)) + self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize()) + event.Veto() + else: + event.Skip() + + def GetVariableTypeFunction(self, base_type): + def VariableTypeFunction(event): + row = self.VariablesGrid.GetGridCursorRow() + self.Table.SetValueByName(row, "Type", base_type) + self.SaveValues() + self.Table.ResetView(self.VariablesGrid) + event.Skip() + return VariableTypeFunction + + def OnVariablesGridCellLeftClick(self, event): if event.GetCol() == 0: row = event.GetRow() var_name = self.Table.GetValueByName(row, "Name") @@ -2590,310 +2486,6 @@ self.Parent.RefreshTitle() self.Parent.RefreshEditMenu() -##[ID_EDITVARIABLEDIALOG, ID_EDITVARIABLEDIALOGMAINPANEL, -## ID_EDITVARIABLEDIALOGVARIABLESGRID, ID_EDITVARIABLEDIALOGRETURNTYPE, -## ID_EDITVARIABLEDIALOGCLASSFILTER, ID_EDITVARIABLEDIALOGADDBUTTON, -## ID_EDITVARIABLEDIALOGDELETEBUTTON, ID_EDITVARIABLEDIALOGUPBUTTON, -## ID_EDITVARIABLEDIALOGDOWNBUTTON, ID_EDITVARIABLEDIALOGSTATICTEXT1, -## ID_EDITVARIABLEDIALOGSTATICTEXT2, ID_EDITVARIABLEDIALOGSTATICTEXT3, -##] = [wx.NewId() for _init_ctrls in range(12)] -## -##class EditVariableDialog(wx.Dialog): -## def _init_coll_flexGridSizer1_Items(self, parent): -## parent.AddWindow(self.MainPanel, 0, border=0, flag=0) -## parent.AddWindow(self.ButtonSizer, 0, border=0, flag=wx.ALIGN_RIGHT) -## -## def _init_sizers(self): -## self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) -## -## self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) -## -## self.SetSizer(self.flexGridSizer1) -## -## def _init_ctrls(self, prnt, name): -## wx.Dialog.__init__(self, id=ID_EDITVARIABLEDIALOG, -## name='EditVariableDialog', parent=prnt, pos=wx.Point(376, 223), -## size=wx.Size(600, 440), style=wx.DEFAULT_DIALOG_STYLE, -## title='Edit variables of %s'%name) -## self.SetClientSize(wx.Size(600, 440)) -## -## self.MainPanel = wx.Panel(id=ID_EDITVARIABLEDIALOGMAINPANEL, -## name='MainPanel', parent=self, pos=wx.Point(0, 0), -## size=wx.Size(600, 440), style=wx.TAB_TRAVERSAL) -## self.MainPanel.SetAutoLayout(True) -## -## self.staticText1 = wx.StaticText(id=ID_EDITVARIABLEDIALOGSTATICTEXT1, -## label='Return Type:', name='staticText1', parent=self.MainPanel, -## pos=wx.Point(24, 29), size=wx.Size(95, 17), style=0) -## -## self.ReturnType = wx.Choice(id=ID_EDITVARIABLEDIALOGRETURNTYPE, -## name='ReturnType', parent=self.MainPanel, pos=wx.Point(124, 24), -## size=wx.Size(145, 24), style=0) -## -## self.staticText2 = wx.StaticText(id=ID_EDITVARIABLEDIALOGSTATICTEXT2, -## label='Class Filter:', name='staticText2', parent=self.MainPanel, -## pos=wx.Point(324, 29), size=wx.Size(95, 17), style=0) -## -## self.ClassFilter = wx.Choice(id=ID_EDITVARIABLEDIALOGCLASSFILTER, -## name='ClassFilter', parent=self.MainPanel, pos=wx.Point(424, 24), -## size=wx.Size(145, 24), style=0) -## self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_EDITVARIABLEDIALOGCLASSFILTER) -## -## self.staticText3 = wx.StaticText(id=ID_EDITVARIABLEDIALOGSTATICTEXT3, -## label='Variables:', name='staticText3', parent=self.MainPanel, -## pos=wx.Point(24, 60), size=wx.Size(95, 17), style=0) -## -## self.VariablesGrid = wx.grid.Grid(id=ID_EDITVARIABLEDIALOGVARIABLESGRID, -## name='VariablesGrid', parent=self.MainPanel, pos=wx.Point(24, 80), -## size=wx.Size(550, 250), style=wx.VSCROLL) -## self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False, -## 'Sans')) -## self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL, -## False, 'Sans')) -## self.VariablesGrid.DisableDragGridSize() -## self.VariablesGrid.EnableScrolling(False, True) -## self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange) -## self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell) -## -## self.AddButton = wx.Button(id=ID_EDITVARIABLEDIALOGADDBUTTON, label='Add', -## name='AddButton', parent=self.MainPanel, pos=wx.Point(345, 340), -## size=wx.Size(72, 32), style=0) -## self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_EDITVARIABLEDIALOGADDBUTTON) -## -## self.DeleteButton = wx.Button(id=ID_EDITVARIABLEDIALOGDELETEBUTTON, label='Delete', -## name='DeleteButton', parent=self.MainPanel, pos=wx.Point(425, 340), -## size=wx.Size(72, 32), style=0) -## self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_EDITVARIABLEDIALOGDELETEBUTTON) -## -## self.UpButton = wx.Button(id=ID_EDITVARIABLEDIALOGUPBUTTON, label='^', -## name='UpButton', parent=self.MainPanel, pos=wx.Point(505, 340), -## size=wx.Size(32, 32), style=0) -## self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_EDITVARIABLEDIALOGUPBUTTON) -## -## self.DownButton = wx.Button(id=ID_EDITVARIABLEDIALOGDOWNBUTTON, label='v', -## name='DownButton', parent=self.MainPanel, pos=wx.Point(545, 340), -## size=wx.Size(32, 32), style=0) -## self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_EDITVARIABLEDIALOGDOWNBUTTON) -## -## self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) -## self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId()) -## -## self._init_sizers() -## -## def __init__(self, parent, name, pou_type, pou_is_used, filter = "All"): -## self._init_ctrls(parent, name) -## -## self.Filter = filter -## self.PouIsUsed = pou_is_used -## self.FilterChoices = [] -## self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface", -## " Input" : "Input", " Output" : "Output", " InOut" : "InOut", -## " External" : "External", "Variables" : "Variables", " Local" : "Local", -## " Temp" : "Temp", "Global" : "Global", "Access" : "Access"} -## -## if pou_type: -## self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"} -## self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"} -## else: -## self.DefaultTypes = {"All" : "Global"} -## self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"} -## if not pou_type or pou_type == "program": -## self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"]) -## if pou_type: -## self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp","Global","Access"] -## else: -## self.FilterChoices = ["All","Global","Access"] -## self.ColSizes = [80, 70, 80, 80, 80, 60, 70] -## self.ColAlignements = [wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] -## else: -## self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Initial Value", "Retain", "Constant"]) -## self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp"] -## self.ColSizes = [120, 70, 80, 120, 60, 70] -## self.ColAlignements = [wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] -## for choice in self.FilterChoices: -## self.ClassFilter.Append(choice) -## reverse_transfer = {} -## for filter, choice in self.FilterChoiceTransfer.items(): -## reverse_transfer[choice] = filter -## self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter]) -## self.RefreshTypeList() -## self.RefreshButtons() -## -## self.OptionList = "Yes,No" -## self.TypeList = ",".join([value for value, parent in TypeHierarchy_list if not value.startswith("ANY")]) -## -## if pou_type == "function": -## for value, parent in TypeHierarchy_list: -## if not value.startswith("ANY"): -## self.ReturnType.Append(value) -## self.ReturnType.Enable(True) -## else: -## self.ReturnType.Enable(False) -## self.staticText2.Hide() -## self.ReturnType.Hide() -## -## self.VariablesGrid.SetTable(self.Table) -## self.VariablesGrid.SetRowLabelSize(0) -## -## self.Table.ResetView(self.VariablesGrid) -## -## self.PouNames = [] -## -## if self.PouIsUsed: -## wx.CallAfter(self.WarningMessage, name) -## -## def WarningMessage(self, name): -## message = wx.MessageDialog(self, "\"%s\" is used by one or more POUs. Its interface can't be changed!"%name, "WARNING", wx.OK|wx.ICON_EXCLAMATION) -## message.ShowModal() -## message.Destroy() -## -## def OnOK(self, event): -## self.VariablesGrid.SetGridCursor(0, 0) -## error = [] -## if self.ReturnType.IsEnabled() and self.ReturnType.GetStringSelection() == "": -## error.append("Return Type") -## if len(error) > 0: -## text = "" -## for i, item in enumerate(error): -## if i == 0: -## text += item -## elif i == len(error) - 1: -## text += " and %s"%item -## else: -## text += ", %s"%item -## message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR) -## message.ShowModal() -## message.Destroy() -## else: -## self.EndModal(wx.ID_OK) -## -## def OnClassFilter(self, event): -## self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()] -## self.RefreshTypeList() -## self.RefreshValues() -## self.RefreshButtons() -## event.Skip() -## -## def RefreshTypeList(self): -## if self.Filter == "All": -## self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]] -## elif self.Filter == "Interface": -## self.ClassList = ["Input","Output","InOut","External"] -## elif self.Filter == "Variables": -## self.ClassList = ["Local","Temp"] -## else: -## self.ClassList = [self.Filter] -## -## def RefreshButtons(self): -## table_length = len(self.Table.data) -## row_class = None -## if table_length and self.PouIsUsed: -## row = self.VariablesGrid.GetGridCursorRow() -## row_class = self.Table.GetValueByName(row, "Class") -## self.AddButton.Enable(not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"]) -## self.DeleteButton.Enable(table_length > 0 and row_class not in ["Input", "Output", "InOut"]) -## self.UpButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"]) -## self.DownButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"]) -## -## def OnAddButton(self, event): -## new_row = self.DefaultValue.copy() -## if self.Filter in self.DefaultTypes: -## new_row["Class"] = self.DefaultTypes[self.Filter] -## else: -## new_row["Class"] = self.Filter -## self.Values.append(new_row) -## self.RefreshValues() -## self.RefreshButtons() -## event.Skip() -## -## def OnDeleteButton(self, event): -## row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow()) -## self.Values.remove(row) -## self.RefreshValues() -## self.RefreshButtons() -## event.Skip() -## -## def OnUpButton(self, event): -## self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1) -## self.RefreshButtons() -## event.Skip() -## -## def OnDownButton(self, event): -## self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1) -## self.RefreshButtons() -## event.Skip() -## -## def OnVariablesGridCellChange(self, event): -## row, col = event.GetRow(), event.GetCol() -## colname = self.Table.GetColLabelValue(col) -## value = self.Table.GetValue(row, col) -## if colname == "Name": -## if not TestIdentifier(value): -## message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%value, "Error", wx.OK|wx.ICON_ERROR) -## message.ShowModal() -## message.Destroy() -## event.Veto() -## elif value.upper() in IEC_KEYWORDS: -## message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%value, "Error", wx.OK|wx.ICON_ERROR) -## message.ShowModal() -## message.Destroy() -## event.Veto() -## elif value.upper() in self.PouNames: -## message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wx.OK|wx.ICON_ERROR) -## message.ShowModal() -## message.Destroy() -## event.Veto() -## elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]: -## message = wx.MessageDialog(self, "A variable with \"%s\" as name exists in this pou!"%value, "Error", wx.OK|wx.ICON_ERROR) -## message.ShowModal() -## message.Destroy() -## event.Veto() -## else: -## event.Skip() -## else: -## event.Skip() -## -## def OnVariablesGridSelectCell(self, event): -## wx.CallAfter(self.RefreshButtons) -## event.Skip() -## -## def SetPouNames(self, pou_names): -## self.PouNames = [pou_name.upper() for pou_name in pou_names] -## -## def SetValues(self, values): -## for item, value in values.items(): -## if item == "returnType" and value and self.ReturnType.IsEnabled(): -## self.ReturnType.SetStringSelection(value) -## if item == "data": -## self.Values = value -## self.RefreshValues() -## -## def MoveValue(self, value_index, move): -## new_index = max(0, min(value_index + move, len(self.Values) - 1)) -## if new_index != value_index: -## self.Values.insert(new_index, self.Values.pop(value_index)) -## self.RefreshValues() -## self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol()) -## else: -## self.RefreshValues() -## -## def RefreshValues(self): -## if len(self.Table.data) > 0: -## self.VariablesGrid.SetGridCursor(0, 0) -## data = [] -## for variable in self.Values: -## if variable["Class"] in self.ClassList: -## data.append(variable) -## self.Table.SetData(data) -## self.Table.ResetView(self.VariablesGrid) -## -## def GetValues(self): -## values = {} -## if self.ReturnType.IsEnabled(): -## values["returnType"] = self.ReturnType.GetStringSelection() -## values["data"] = self.Values -## return values - #------------------------------------------------------------------------------- # Exception Handler #------------------------------------------------------------------------------- diff -r 3a1b0afdaf84 -r 66308e07402c TextViewer.py --- a/TextViewer.py Thu Aug 09 18:07:44 2007 +0200 +++ b/TextViewer.py Fri Aug 10 16:14:33 2007 +0200 @@ -195,7 +195,7 @@ self.Functions = [] for category in blocktypes: for blocktype in category["list"]: - if blocktype["name"] not in self.Keywords and blocktype["name"] not in self.Variables: + if blocktype["type"] == "function" and blocktype["name"] not in self.Keywords and blocktype["name"] not in self.Variables: self.Functions.append(blocktype["name"].upper()) self.Colourise(0, -1) diff -r 3a1b0afdaf84 -r 66308e07402c examples/example.xml --- a/examples/example.xml Thu Aug 09 18:07:44 2007 +0200 +++ b/examples/example.xml Fri Aug 10 16:14:33 2007 +0200 @@ -90,7 +90,7 @@ OUT - + @@ -132,7 +132,7 @@ IN3 - + @@ -442,6 +442,13 @@ + + + + + + + @@ -467,41 +474,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -517,16 +489,51 @@ IN2 - + - - - + + + TR2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3a1b0afdaf84 -r 66308e07402c plcopen/plcopen.py --- a/plcopen/plcopen.py Thu Aug 09 18:07:44 2007 +0200 +++ b/plcopen/plcopen.py Fri Aug 10 16:14:33 2007 +0200 @@ -413,7 +413,12 @@ def addPouVar(self, type, name): content = self.interface.getContent() if len(content) == 0 or content[-1]["name"] != "localVars": - self.interface.appendContent("localVars", PLCOpenClasses["varList"]()) + content.append({"name" : "localVars", "value" : PLCOpenClasses["varList"]()}) + else: + varlist = content[-1]["value"] + variables = varlist.getVariable() + if varlist.getConstant() or varlist.getRetain() or len(variables) > 0 and variables[0].getAddress(): + content.append({"name" : "localVars", "value" : PLCOpenClasses["varList"]()}) var = PLCOpenClasses["varListPlain_variable"]() var.setName(name) var_type = PLCOpenClasses["dataType"]() @@ -438,7 +443,23 @@ content.remove(varlist) break setattr(cls, "removePouVar", removePouVar) - + + def hasBlock(self, name): + if self.getBodyType() in ["FBD", "LD", "SFC"]: + for instance in self.getInstances(): + if isinstance(instance, PLCOpenClasses["block"]) and instance.getInstanceName() == name: + return True + for transition in self.transitions.getTransition(): + result = transition.hasBlock(name) + if result: + return result + for action in self.actions.getAction(): + result = action.hasBlock(name) + if result: + return result + return False + setattr(cls, "hasBlock", hasBlock) + def addTransition(self, name, type): if not self.transitions: self.addTransitions() @@ -540,6 +561,14 @@ self.body.updateElementName(old_name, new_name) setattr(cls, "updateElementName", updateElementName) + def hasBlock(self, name): + if self.getBodyType() in ["FBD", "LD", "SFC"]: + for instance in self.getInstances(): + if isinstance(instance, PLCOpenClasses["block"]) and instance.getInstanceName() == name: + return True + return False + setattr(cls, "hasBlock", hasBlock) + cls = PLCOpenClasses.get("actions_action", None) if cls: setattr(cls, "setBodyType", setBodyType) @@ -557,6 +586,14 @@ self.body.updateElementName(old_name, new_name) setattr(cls, "updateElementName", updateElementName) + def hasBlock(self, name): + if self.getBodyType() in ["FBD", "LD", "SFC"]: + for instance in self.getInstances(): + if isinstance(instance, PLCOpenClasses["block"]) and instance.getInstanceName() == name: + return True + return False + setattr(cls, "hasBlock", hasBlock) + cls = PLCOpenClasses.get("body", None) if cls: def appendContentInstance(self, name, instance):