PLCOpenEditor.py
changeset 577 9dbb79722fbc
parent 575 a7c706b9492e
child 586 9aa96a36cf33
equal deleted inserted replaced
576:3f2024f30553 577:9dbb79722fbc
   113 from RessourceEditor import *
   113 from RessourceEditor import *
   114 from DataTypeEditor import *
   114 from DataTypeEditor import *
   115 from PLCControler import *
   115 from PLCControler import *
   116 from VariablePanel import VariablePanel
   116 from VariablePanel import VariablePanel
   117 from SearchResultPanel import SearchResultPanel
   117 from SearchResultPanel import SearchResultPanel
       
   118 from controls import CustomGrid
   118 
   119 
   119 # Define PLCOpenEditor controls id
   120 # Define PLCOpenEditor controls id
   120 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   121 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   121  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   122  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   122  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   123  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   179               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool",
   180               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool",
   180               "add_block.png", _("Create a new block")),
   181               "add_block.png", _("Create a new block")),
   181              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   182              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   182               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   183               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   183               "add_connection.png", _("Create a new connection"))],
   184               "add_connection.png", _("Create a new connection"))],
   184     "LD"  : [((True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   185     "LD"  : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   185               ID_PLCOPENEDITORTOOLBARMOTION, "OnMotionTool",
   186               ID_PLCOPENEDITORTOOLBARMOTION, "OnMotionTool",
   186               "move.png", _("Move the view")),
   187               "move.png", _("Move the view")),
   187              True, FREEDRAWING_MODE, 
   188              (True, FREEDRAWING_MODE, 
   188               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", 
   189               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", 
   189               "add_comment.png", _("Create a new comment")),
   190               "add_comment.png", _("Create a new comment")),
   190              (True, FREEDRAWING_MODE, 
   191              (True, FREEDRAWING_MODE, 
   191               ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
   192               ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
   192               "add_powerrail.png", _("Create a new power rail")),
   193               "add_powerrail.png", _("Create a new power rail")),
  4190     def _init_ctrls(self, prnt):
  4191     def _init_ctrls(self, prnt):
  4191         wx.Panel.__init__(self, id=ID_DEBUGVARIABLEPANEL,
  4192         wx.Panel.__init__(self, id=ID_DEBUGVARIABLEPANEL,
  4192               name='DebugVariablePanel', parent=prnt, pos=wx.Point(0, 0),
  4193               name='DebugVariablePanel', parent=prnt, pos=wx.Point(0, 0),
  4193               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  4194               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  4194 
  4195 
  4195         self.VariablesGrid = wx.grid.Grid(id=ID_DEBUGVARIABLEPANELVARIABLESGRID,
  4196         self.VariablesGrid = CustomGrid(id=ID_DEBUGVARIABLEPANELVARIABLESGRID,
  4196               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
  4197               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
  4197               size=wx.Size(0, 150), style=wx.VSCROLL)
  4198               size=wx.Size(0, 150), style=wx.VSCROLL)
  4198         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
  4199         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
  4199               'Sans'))
  4200               'Sans'))
  4200         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
  4201         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
  4201               False, 'Sans'))
  4202               False, 'Sans'))
  4202         self.VariablesGrid.SetSelectionBackground(wx.WHITE)
  4203         self.VariablesGrid.SetSelectionBackground(wx.WHITE)
  4203         self.VariablesGrid.SetSelectionForeground(wx.BLACK)
  4204         self.VariablesGrid.SetSelectionForeground(wx.BLACK)
  4204         self.VariablesGrid.SetDropTarget(DebugVariableDropTarget(self))
  4205         self.VariablesGrid.SetDropTarget(DebugVariableDropTarget(self))
  4205         if wx.VERSION >= (2, 6, 0):
  4206         if wx.VERSION >= (2, 6, 0):
  4206             self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridCellSelect)
       
  4207             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.OnVariablesGridCellRightClick)
  4207             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.OnVariablesGridCellRightClick)
  4208         else:
  4208         else:
  4209             wx.grid.EVT_GRID_SELECT_CELL(self.VariablesGrid, self.OnVariablesGridCellSelect)
       
  4210             wx.grid.EVT_GRID_CELL_RIGHT_CLICK(self.VariablesGrid, self.OnVariablesGridCellRightClick)
  4209             wx.grid.EVT_GRID_CELL_RIGHT_CLICK(self.VariablesGrid, self.OnVariablesGridCellRightClick)
  4211         
  4210         
  4212         self.UpButton = wx.Button(id=ID_DEBUGVARIABLEPANELUPBUTTON, label='^',
  4211         self.UpButton = wx.Button(id=ID_DEBUGVARIABLEPANELUPBUTTON, label='^',
  4213               name='UpButton', parent=self, pos=wx.Point(0, 0),
  4212               name='UpButton', parent=self, pos=wx.Point(0, 0),
  4214               size=wx.Size(32, 32), style=0)
  4213               size=wx.Size(32, 32), style=0)
  4215         self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_DEBUGVARIABLEPANELUPBUTTON)
       
  4216         
  4214         
  4217         self.DownButton = wx.Button(id=ID_DEBUGVARIABLEPANELDOWNBUTTON, label='v',
  4215         self.DownButton = wx.Button(id=ID_DEBUGVARIABLEPANELDOWNBUTTON, label='v',
  4218               name='DownButton', parent=self, pos=wx.Point(0, 0),
  4216               name='DownButton', parent=self, pos=wx.Point(0, 0),
  4219               size=wx.Size(32, 32), style=0)
  4217               size=wx.Size(32, 32), style=0)
  4220         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_DEBUGVARIABLEPANELDOWNBUTTON)
       
  4221         
  4218         
  4222         self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label=_('Delete'),
  4219         self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label=_('Delete'),
  4223               name='DeleteButton', parent=self, pos=wx.Point(0, 0),
  4220               name='DeleteButton', parent=self, pos=wx.Point(0, 0),
  4224               size=wx.DefaultSize, style=0)
  4221               size=wx.DefaultSize, style=0)
  4225         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_DEBUGVARIABLEPANELDELETEBUTTON)
       
  4226         
  4222         
  4227         self._init_sizers()
  4223         self._init_sizers()
  4228     
  4224     
  4229     def __init__(self, parent, producer):
  4225     def __init__(self, parent, producer):
  4230         self._init_ctrls(parent)
  4226         self._init_ctrls(parent)
  4231         DebugViewer.__init__(self, producer, True)
  4227         DebugViewer.__init__(self, producer, True)
  4232         self.HasNewData = False
  4228         self.HasNewData = False
  4233         
  4229         
  4234         self.Table = DebugVariableTable(self, [], GetDebugVariablesTableColnames())
  4230         self.Table = DebugVariableTable(self, [], GetDebugVariablesTableColnames())
  4235         self.VariablesGrid.SetTable(self.Table)
  4231         self.VariablesGrid.SetTable(self.Table)
       
  4232         self.VariablesGrid.SetButtons({"Delete": self.DeleteButton,
       
  4233                                        "Up": self.UpButton,
       
  4234                                        "Down": self.DownButton})
       
  4235         
       
  4236         def _AddVariable(new_row):
       
  4237             return self.VariablesGrid.GetGridCursorRow()
       
  4238         setattr(self.VariablesGrid, "_AddRow", _AddVariable)
       
  4239         
       
  4240         def _DeleteVariable(row):
       
  4241             item = self.Table.GetItem(row)
       
  4242             self.RemoveDataConsumer(item)
       
  4243             self.Table.RemoveItem(row)
       
  4244             self.RefreshGrid()
       
  4245         setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
       
  4246         
       
  4247         def _MoveVariable(row, move):
       
  4248             new_row = max(0, min(row + move, self.Table.GetNumberRows() - 1))
       
  4249             if new_row != row:
       
  4250                 self.Table.MoveItem(row, new_row)
       
  4251                 self.RefreshGrid()
       
  4252             return new_row
       
  4253         setattr(self.VariablesGrid, "_MoveRow", _MoveVariable)
       
  4254         
  4236         self.VariablesGrid.SetRowLabelSize(0)
  4255         self.VariablesGrid.SetRowLabelSize(0)
  4237         
  4256         
  4238         for col in range(self.Table.GetNumberCols()):
  4257         for col in range(self.Table.GetNumberCols()):
  4239             attr = wx.grid.GridCellAttr()
  4258             attr = wx.grid.GridCellAttr()
  4240             attr.SetAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER)
  4259             attr.SetAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER)
  4241             self.VariablesGrid.SetColAttr(col, attr)
  4260             self.VariablesGrid.SetColAttr(col, attr)
  4242             self.VariablesGrid.SetColSize(col, 100)
  4261             self.VariablesGrid.SetColSize(col, 100)
  4243         
  4262         
  4244         self.Table.ResetView(self.VariablesGrid)
  4263         self.Table.ResetView(self.VariablesGrid)
  4245         self.RefreshButtons()
  4264         self.VariablesGrid.RefreshButtons()
  4246     
  4265     
  4247     def RefreshNewData(self):
  4266     def RefreshNewData(self):
  4248         if self.HasNewData:
  4267         if self.HasNewData:
  4249             self.HasNewData = False
  4268             self.HasNewData = False
  4250             self.RefreshGrid()
  4269             self.RefreshGrid()
  4251         DebugViewer.RefreshNewData(self)
  4270         DebugViewer.RefreshNewData(self)
  4252     
  4271     
  4253     def RefreshGrid(self):
  4272     def RefreshGrid(self):
  4254         self.Freeze()
  4273         self.Freeze()
  4255         self.Table.ResetView(self.VariablesGrid)
  4274         self.Table.ResetView(self.VariablesGrid)
       
  4275         self.VariablesGrid.RefreshButtons()
  4256         self.Thaw()
  4276         self.Thaw()
  4257     
  4277     
  4258     def ResetGrid(self):
  4278     def ResetGrid(self):
  4259         self.DeleteDataConsumers()
  4279         self.DeleteDataConsumers()
  4260         self.Table.Empty()
  4280         self.Table.Empty()
  4261         self.Freeze()
  4281         self.Freeze()
  4262         self.Table.ResetView(self.VariablesGrid)
  4282         self.Table.ResetView(self.VariablesGrid)
       
  4283         self.VariablesGrid.RefreshButtons()
  4263         self.Thaw()
  4284         self.Thaw()
  4264     
  4285     
  4265     def GetForceVariableMenuFunction(self, iec_path, item):
  4286     def GetForceVariableMenuFunction(self, iec_path, item):
  4266         iec_type = self.GetDataType(iec_path)
  4287         iec_type = self.GetDataType(iec_path)
  4267         def ForceVariableFunction(event):
  4288         def ForceVariableFunction(event):
  4273 
  4294 
  4274     def GetReleaseVariableMenuFunction(self, iec_path):
  4295     def GetReleaseVariableMenuFunction(self, iec_path):
  4275         def ReleaseVariableFunction(event):
  4296         def ReleaseVariableFunction(event):
  4276             self.ReleaseDataValue(iec_path)
  4297             self.ReleaseDataValue(iec_path)
  4277         return ReleaseVariableFunction
  4298         return ReleaseVariableFunction
  4278     
       
  4279     def OnVariablesGridCellSelect(self, event):
       
  4280         wx.CallAfter(self.RefreshButtons)
       
  4281         event.Skip()
       
  4282     
  4299     
  4283     def OnVariablesGridCellRightClick(self, event):
  4300     def OnVariablesGridCellRightClick(self, event):
  4284         row, col = event.GetRow(), event.GetCol()
  4301         row, col = event.GetRow(), event.GetCol()
  4285         if self.Table.GetColLabelValue(col, False) == "Value":
  4302         if self.Table.GetColLabelValue(col, False) == "Value":
  4286             iec_path = self.Table.GetValueByName(row, "Variable").upper()
  4303             iec_path = self.Table.GetValueByName(row, "Variable").upper()
  4297             else:
  4314             else:
  4298                 menu.Enable(new_id, False)
  4315                 menu.Enable(new_id, False)
  4299             self.PopupMenu(menu)
  4316             self.PopupMenu(menu)
  4300         event.Skip()
  4317         event.Skip()
  4301     
  4318     
  4302     def RefreshButtons(self):
       
  4303         if getattr(self, "Table", None):
       
  4304             table_length = len(self.Table.data)
       
  4305             row = 0
       
  4306             if table_length > 0:
       
  4307                 row = self.VariablesGrid.GetGridCursorRow()
       
  4308             self.DeleteButton.Enable(table_length > 0)
       
  4309             self.UpButton.Enable(table_length > 0 and row > 0)
       
  4310             self.DownButton.Enable(table_length > 0 and row < table_length - 1)
       
  4311     
       
  4312     def OnDeleteButton(self, event):
       
  4313         idx = self.VariablesGrid.GetGridCursorRow()
       
  4314         if idx >= 0:
       
  4315             item = self.Table.GetItem(idx)
       
  4316             self.RemoveDataConsumer(item)
       
  4317             self.Table.RemoveItem(idx)
       
  4318             self.RefreshGrid()
       
  4319             self.RefreshButtons()
       
  4320         event.Skip()
       
  4321 
       
  4322     def OnUpButton(self, event):
       
  4323         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
       
  4324         event.Skip()
       
  4325 
       
  4326     def OnDownButton(self, event):
       
  4327         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
       
  4328         event.Skip()
       
  4329 
       
  4330     def InsertValue(self, iec_path, idx = None):
  4319     def InsertValue(self, iec_path, idx = None):
  4331         if idx is None:
  4320         if idx is None:
  4332             idx = self.Table.GetNumberRows()
  4321             idx = self.Table.GetNumberRows()
  4333         for item in self.Table.GetData():
  4322         for item in self.Table.GetData():
  4334             if iec_path == item.GetVariable():
  4323             if iec_path == item.GetVariable():
  4336         item = VariableTableItem(self, iec_path, "")
  4325         item = VariableTableItem(self, iec_path, "")
  4337         result = self.AddDataConsumer(iec_path.upper(), item)
  4326         result = self.AddDataConsumer(iec_path.upper(), item)
  4338         if result is not None:
  4327         if result is not None:
  4339             self.Table.InsertItem(idx, item)
  4328             self.Table.InsertItem(idx, item)
  4340             self.RefreshGrid()
  4329             self.RefreshGrid()
  4341             self.RefreshButtons()
  4330 
  4342 
  4331         
  4343     def MoveValue(self, idx, move):
       
  4344         new_idx = max(0, min(idx + move, self.Table.GetNumberRows() - 1))
       
  4345         if new_idx != idx:
       
  4346             self.Table.MoveItem(idx, new_idx)
       
  4347             self.RefreshGrid()
       
  4348             self.VariablesGrid.SetGridCursor(new_idx, self.VariablesGrid.GetGridCursorCol())
       
  4349             self.RefreshButtons()
       
  4350             
       
  4351 #-------------------------------------------------------------------------------
  4332 #-------------------------------------------------------------------------------
  4352 #                               Viewer Printout
  4333 #                               Viewer Printout
  4353 #-------------------------------------------------------------------------------
  4334 #-------------------------------------------------------------------------------
  4354 
  4335 
  4355 UPPER_DIV = lambda x, y: (x / y) + {True : 0, False : 1}[(x % y) == 0]
  4336 UPPER_DIV = lambda x, y: (x / y) + {True : 0, False : 1}[(x % y) == 0]