# HG changeset patch # User Edouard Tisserant # Date 1403292983 -7200 # Node ID 71b1545d746f574bb8e45952b4985302928021e2 # Parent d6adca8b6697d31f85e7551ef79ea4746b6a0d40 Enable overloading of task triggerring source cell editor (SINGLE) in resource editor. PLCGenerator now generates MULTI keywork instead of SINGLE when task's activation is surroundes with square brackets diff -r d6adca8b6697 -r 71b1545d746f PLCGenerator.py --- a/PLCGenerator.py Thu Jun 12 18:15:04 2014 +0200 +++ b/PLCGenerator.py Fri Jun 20 21:36:23 2014 +0200 @@ -393,7 +393,11 @@ single = task.getsingle() # Single argument if exists if single is not None: - resrce += [("SINGLE := ", ()), + if single[0]=='[' and single[-1]==']' : + SNGLKW = "MULTI" + else: + SNGLKW = "SINGLE" + resrce += [(SNGLKW + " := ", ()), (single, (tagname, "task", task_number, "single")), (",", ())] # Interval argument if exists diff -r d6adca8b6697 -r 71b1545d746f editors/ResourceEditor.py --- a/editors/ResourceEditor.py Thu Jun 12 18:15:04 2014 +0200 +++ b/editors/ResourceEditor.py Fri Jun 20 21:36:23 2014 +0200 @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor -#based on the plcopen standard. +#based on the plcopen standard. # #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD # @@ -36,25 +36,25 @@ # Configuration Editor class #------------------------------------------------------------------------------- -[ID_CONFIGURATIONEDITOR, +[ID_CONFIGURATIONEDITOR, ] = [wx.NewId() for _init_ctrls in range(1)] class ConfigurationEditor(EditorPanel): - + ID = ID_CONFIGURATIONEDITOR VARIABLE_PANEL_TYPE = "config" - + def GetBufferState(self): return self.Controler.GetBufferState() - + def Undo(self): self.Controler.LoadPrevious() self.ParentWindow.CloseTabsWithoutModel() - + def Redo(self): self.Controler.LoadNext() self.ParentWindow.CloseTabsWithoutModel() - + def HasNoModel(self): return self.Controler.GetEditedElement(self.TagName) is None @@ -77,7 +77,7 @@ return [_("Name"), _("Type"), _("Task")] class ResourceTable(CustomTable): - + """ A custom wx.grid.Grid Table using user supplied data """ @@ -86,16 +86,16 @@ CustomTable.__init__(self, parent, data, colnames) self.ColAlignements = [] self.ColSizes = [] - + def GetColAlignements(self): return self.ColAlignements - + def SetColAlignements(self, list): self.ColAlignements = list def GetColSizes(self): return self.ColSizes - + def SetColSizes(self, list): self.ColSizes = list @@ -106,14 +106,16 @@ if colname == "Triggering": return _(value) return value - + def SetValue(self, row, col, value): if col < len(self.colnames): colname = self.GetColLabelValue(col, False) if colname == "Triggering": value = TASKTRIGGERINGOPTIONS_DICT[value] self.data[row][colname] = value - + + SingleCellEditor = lambda x,c : wx.grid.GridCellChoiceEditor(x) + def _updateColAttrs(self, grid): """ wx.grid.Grid -> update the column attributes to add the @@ -121,13 +123,13 @@ Otherwise default to the default renderer. """ - + for col in range(self.GetNumberCols()): attr = wx.grid.GridCellAttr() attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE) grid.SetColAttr(col, attr) grid.SetColSize(col, self.ColSizes[col]) - + for row in range(self.GetNumberRows()): row_highlights = self.Highlights.get(row, {}) for col in range(self.GetNumberCols()): @@ -148,7 +150,7 @@ if interval != "" and IEC_TIME_MODEL.match(interval.upper()) is None: error = True elif colname == "Single": - editor = wx.grid.GridCellChoiceEditor() + editor = self.SingleCellEditor(self,colname) editor.SetParameters(self.Parent.VariableList) if self.GetValueByName(row, "Triggering") != "Interrupt": grid.SetReadOnly(row, col, True) @@ -164,10 +166,10 @@ elif colname == "Task": editor = wx.grid.GridCellChoiceEditor() editor.SetParameters(self.Parent.TaskList) - + grid.SetCellEditor(row, col, editor) grid.SetCellRenderer(row, col, renderer) - + if error: highlight_colours = ERROR_HIGHLIGHT else: @@ -176,7 +178,7 @@ grid.SetCellTextColour(row, col, highlight_colours[1]) self.ResizeRow(grid, row) - + #------------------------------------------------------------------------------- # Highlights showing functions #------------------------------------------------------------------------------- @@ -185,7 +187,7 @@ row_highlights = self.Highlights.setdefault(infos[0], {}) col_highlights = row_highlights.setdefault(infos[1], []) col_highlights.append(highlight_type) - + def ClearHighlights(self, highlight_type=None): if highlight_type is None: self.Highlights = {} @@ -201,84 +203,84 @@ class ResourceEditor(EditorPanel): - + VARIABLE_PANEL_TYPE = "resource" def _init_Editor(self, parent): self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL) - + main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) main_sizer.AddGrowableCol(0) main_sizer.AddGrowableRow(0) main_sizer.AddGrowableRow(1) - + tasks_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) tasks_sizer.AddGrowableCol(0) tasks_sizer.AddGrowableRow(1) - main_sizer.AddSizer(tasks_sizer, border=5, + main_sizer.AddSizer(tasks_sizer, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) - + tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) tasks_buttons_sizer.AddGrowableCol(0) tasks_buttons_sizer.AddGrowableRow(0) tasks_sizer.AddSizer(tasks_buttons_sizer, flag=wx.GROW) - + tasks_label = wx.StaticText(self.Editor, label=_(u'Tasks:')) tasks_buttons_sizer.AddWindow(tasks_label, flag=wx.ALIGN_BOTTOM) - + for name, bitmap, help in [ ("AddTaskButton", "add_element", _("Add task")), ("DeleteTaskButton", "remove_element", _("Remove task")), ("UpTaskButton", "up", _("Move task up")), ("DownTaskButton", "down", _("Move task down"))]: - button = wx.lib.buttons.GenBitmapButton(self.Editor, + button = wx.lib.buttons.GenBitmapButton(self.Editor, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) tasks_buttons_sizer.AddWindow(button) - + self.TasksGrid = CustomGrid(self.Editor, style=wx.VSCROLL) self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange) tasks_sizer.AddWindow(self.TasksGrid, flag=wx.GROW) - + instances_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) instances_sizer.AddGrowableCol(0) instances_sizer.AddGrowableRow(1) - main_sizer.AddSizer(instances_sizer, border=5, + main_sizer.AddSizer(instances_sizer, border=5, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT) - + instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) instances_buttons_sizer.AddGrowableCol(0) instances_buttons_sizer.AddGrowableRow(0) instances_sizer.AddSizer(instances_buttons_sizer, flag=wx.GROW) - + instances_label = wx.StaticText(self.Editor, label=_(u'Instances:')) instances_buttons_sizer.AddWindow(instances_label, flag=wx.ALIGN_BOTTOM) - + for name, bitmap, help in [ ("AddInstanceButton", "add_element", _("Add instance")), ("DeleteInstanceButton", "remove_element", _("Remove instance")), ("UpInstanceButton", "up", _("Move instance up")), ("DownInstanceButton", "down", _("Move instance down"))]: - button = wx.lib.buttons.GenBitmapButton(self.Editor, + button = wx.lib.buttons.GenBitmapButton(self.Editor, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) instances_buttons_sizer.AddWindow(button) - + self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL) - self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, + self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange) instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW) - + self.Editor.SetSizer(main_sizer) - + def __init__(self, parent, tagname, window, controler): EditorPanel.__init__(self, parent, tagname, window, controler) - + self.RefreshHighlightsTimer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer) - + self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0} self.TasksTable = ResourceTable(self, [], GetTasksTableColnames()) self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT]) @@ -288,20 +290,20 @@ "Delete": self.DeleteTaskButton, "Up": self.UpTaskButton, "Down": self.DownTaskButton}) - + def _AddTask(new_row): self.TasksTable.InsertRow(new_row, self.TasksDefaultValue.copy()) self.RefreshModel() self.RefreshView() return new_row setattr(self.TasksGrid, "_AddRow", _AddTask) - + def _DeleteTask(row): self.TasksTable.RemoveRow(row) self.RefreshModel() self.RefreshView() setattr(self.TasksGrid, "_DeleteRow", _DeleteTask) - + def _MoveTask(row, move): new_row = self.TasksTable.MoveRow(row, move) if new_row != row: @@ -309,11 +311,11 @@ self.RefreshView() return new_row setattr(self.TasksGrid, "_MoveRow", _MoveTask) - + self.TasksGrid.SetRowLabelSize(0) self.TasksTable.ResetView(self.TasksGrid) self.TasksGrid.RefreshButtons() - + self.InstancesDefaultValue = {"Name" : "", "Type" : "", "Task" : ""} self.InstancesTable = ResourceTable(self, [], GetInstancesTableColnames()) self.InstancesTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]) @@ -323,48 +325,48 @@ "Delete": self.DeleteInstanceButton, "Up": self.UpInstanceButton, "Down": self.DownInstanceButton}) - + def _AddInstance(new_row): self.InstancesTable.InsertRow(new_row, self.InstancesDefaultValue.copy()) self.RefreshModel() self.RefreshView() return new_row setattr(self.InstancesGrid, "_AddRow", _AddInstance) - + def _DeleteInstance(row): self.InstancesTable.RemoveRow(row) self.RefreshModel() self.RefreshView() setattr(self.InstancesGrid, "_DeleteRow", _DeleteInstance) - + def _MoveInstance(row, move): new_row = max(0, min(row + move, self.InstancesTable.GetNumberRows() - 1)) if new_row != row: if self.InstancesTable.GetValueByName(row, "Task") != self.InstancesTable.GetValueByName(new_row, "Task"): - return row + return row self.InstancesTable.MoveRow(row, move) self.RefreshModel() self.RefreshView() return new_row setattr(self.InstancesGrid, "_MoveRow", _MoveInstance) - + def _RefreshInstanceButtons(): if self: rows = self.InstancesTable.GetNumberRows() row = self.InstancesGrid.GetGridCursorRow() self.DeleteInstanceButton.Enable(rows > 0) - self.UpInstanceButton.Enable(row > 0 and + self.UpInstanceButton.Enable(row > 0 and self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row - 1, "Task")) - self.DownInstanceButton.Enable(0 <= row < rows - 1 and + self.DownInstanceButton.Enable(0 <= row < rows - 1 and self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row + 1, "Task")) setattr(self.InstancesGrid, "RefreshButtons", _RefreshInstanceButtons) - + self.InstancesGrid.SetRowLabelSize(0) self.InstancesTable.ResetView(self.InstancesGrid) self.InstancesGrid.RefreshButtons() - + self.TasksGrid.SetFocus() - + def __del__(self): self.RefreshHighlightsTimer.Stop() @@ -383,11 +385,11 @@ self.VariableList = "" for variable in self.Controler.GetEditedResourceVariables(self.TagName): self.VariableList += ",%s"%variable - + def RefreshModel(self): self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData()) self.RefreshBuffer() - + # Buffer the last model state def RefreshBuffer(self): self.Controler.BufferProject() @@ -397,21 +399,21 @@ def GetBufferState(self): return self.Controler.GetBufferState() - + def Undo(self): self.Controler.LoadPrevious() self.ParentWindow.CloseTabsWithoutModel() - + def Redo(self): self.Controler.LoadNext() self.ParentWindow.CloseTabsWithoutModel() - + def HasNoModel(self): return self.Controler.GetEditedElement(self.TagName) is None def RefreshView(self, variablepanel=True): EditorPanel.RefreshView(self, variablepanel) - + tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName) self.TasksTable.SetData(tasks) self.InstancesTable.SetData(instances) @@ -422,7 +424,7 @@ self.InstancesTable.ResetView(self.InstancesGrid) self.TasksGrid.RefreshButtons() self.InstancesGrid.RefreshButtons() - + def OnTasksGridCellChange(self, event): row, col = event.GetRow(), event.GetCol() if self.TasksTable.GetColLabelValue(col) == "Name": @@ -452,14 +454,14 @@ #------------------------------------------------------------------------------- # Highlights showing functions #------------------------------------------------------------------------------- - + def OnRefreshHighlightsTimer(self, event): self.RefreshView() event.Skip() - + def AddHighlight(self, infos, start, end, highlight_type): EditorPanel.AddHighlight(self, infos, start, end, highlight_type) - + if infos[0] == "task": self.TasksTable.AddHighlight(infos[1:], highlight_type) elif infos[0] == "instance": @@ -468,7 +470,7 @@ def ClearHighlights(self, highlight_type=None): EditorPanel.ClearHighlights(self, highlight_type) - + self.TasksTable.ClearHighlights(highlight_type) self.InstancesTable.ClearHighlights(highlight_type) self.TasksTable.ResetView(self.TasksGrid)