Reorganization of Dialog classes by splitting Dialogs.py into several files, one for each Dialog class
--- a/Dialogs.py Tue Sep 15 15:02:23 2009 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2597 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
-#based on the plcopen standard.
-#
-#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-#See COPYING file for copyrights details.
-#
-#This library is free software; you can redistribute it and/or
-#modify it under the terms of the GNU General Public
-#License as published by the Free Software Foundation; either
-#version 2.1 of the License, or (at your option) any later version.
-#
-#This library is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-#General Public License for more details.
-#
-#You should have received a copy of the GNU General Public
-#License along with this library; if not, write to the Free Software
-#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-import wx
-import wx.grid
-
-from graphics import *
-
-#-------------------------------------------------------------------------------
-# Create New Block Dialog
-#-------------------------------------------------------------------------------
-
-[ID_BLOCKPROPERTIESDIALOG, ID_BLOCKPROPERTIESDIALOGNAME,
- ID_BLOCKPROPERTIESDIALOGTYPETREE, ID_BLOCKPROPERTIESDIALOGTYPEDESC,
- ID_BLOCKPROPERTIESDIALOGINPUTS, ID_BLOCKPROPERTIESDIALOGPREVIEW,
- ID_BLOCKPROPERTIESDIALOGEXECUTIONORDER, ID_BLOCKPROPERTIESDIALOGEXECUTIONCONTROL,
- ID_BLOCKPROPERTIESDIALOGSTATICTEXT1, ID_BLOCKPROPERTIESDIALOGSTATICTEXT2,
- ID_BLOCKPROPERTIESDIALOGSTATICTEXT3, ID_BLOCKPROPERTIESDIALOGSTATICTEXT4,
- ID_BLOCKPROPERTIESDIALOGSTATICTEXT5, ID_BLOCKPROPERTIESDIALOGSTATICTEXT6,
-] = [wx.NewId() for _init_ctrls in range(14)]
-
-[CATEGORY, BLOCK] = range(2)
-
-class BlockPropertiesDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.LeftBoxSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftBoxSizer_Items(self, parent):
- parent.AddWindow(self.TypeTree, 3, border=5, flag=wx.GROW|wx.BOTTOM)
- parent.AddWindow(self.TypeDesc, 1, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddSizer(self.RightUpGridSizer, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText6, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(2)
-
- def _init_coll_RightUpGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
- parent.AddWindow(self.BlockName, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText3, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
- parent.AddWindow(self.Inputs, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText4, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
- parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText5, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
- parent.AddWindow(self.ExecutionControl, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightUpGridSizer_Growables(self, parent):
- parent.AddGrowableCol(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftBoxSizer = wx.StaticBoxSizer(self.staticbox1, wx.VERTICAL)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
- self.RightUpGridSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=4, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_LeftBoxSizer_Items(self.LeftBoxSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
- self._init_coll_RightUpGridSizer_Items(self.RightUpGridSizer)
- self._init_coll_RightUpGridSizer_Growables(self.RightUpGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt):
- wx.Dialog.__init__(self, id=ID_BLOCKPROPERTIESDIALOG,
- name='BlockPropertiesDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(600, 400), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
- title=_('Block Properties'))
- self.SetClientSize(wx.Size(600, 400))
-
- self.staticbox1 = wx.StaticBox(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT1,
- label=_('Type:'), name='staticBox1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
-
- self.staticText2 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT2,
- label=_('Name:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
- self.staticText3 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT2,
- label=_('Inputs:'), name='staticText4', parent=self,
- pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
- self.staticText4 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT4,
- label=_('Execution Order:'), name='staticText4', parent=self,
- pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
- self.staticText5 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT5,
- label=_('Execution Control:'), name='staticText5', parent=self,
- pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
- self.staticText6 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT6,
- label=_('Preview:'), name='staticText6', parent=self,
- pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
- if wx.Platform == '__WXMSW__':
- treestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
- else:
- treestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
- self.TypeTree = wx.TreeCtrl(id=ID_BLOCKPROPERTIESDIALOGTYPETREE,
- name='TypeTree', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=treestyle)
- self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypeTreeItemSelected,
- id=ID_BLOCKPROPERTIESDIALOGTYPETREE)
-
- self.TypeDesc = wx.TextCtrl(id=ID_BLOCKPROPERTIESDIALOGTYPEDESC,
- name='TypeDesc', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TE_READONLY|wx.TE_MULTILINE)
-
- self.BlockName = wx.TextCtrl(id=ID_BLOCKPROPERTIESDIALOGNAME, value='',
- name='BlockName', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_BLOCKPROPERTIESDIALOGNAME)
-
- self.Inputs = wx.SpinCtrl(id=ID_BLOCKPROPERTIESDIALOGINPUTS,
- name='Inputs', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=2, max=20)
- self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, id=ID_BLOCKPROPERTIESDIALOGINPUTS)
-
- self.ExecutionOrder = wx.SpinCtrl(id=ID_BLOCKPROPERTIESDIALOGEXECUTIONORDER,
- name='ExecutionOrder', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
- self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, id=ID_BLOCKPROPERTIESDIALOGEXECUTIONORDER)
-
- self.ExecutionControl = wx.CheckBox(id=ID_BLOCKPROPERTIESDIALOGEXECUTIONCONTROL,
- name='ExecutionControl', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, id=ID_BLOCKPROPERTIESDIALOGEXECUTIONCONTROL)
-
- self.Preview = wx.Panel(id=ID_BLOCKPROPERTIESDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "GetScaling", lambda:None)
- setattr(self.Preview, "GetBlockType", self.Controler.GetBlockType)
- setattr(self.Preview, "IsOfType", self.Controler.IsOfType)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
- if wx.VERSION >= (2, 5, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler):
- self.Controler = controler
- self._init_ctrls(parent)
- self.BlockName.SetValue("")
- self.BlockName.Enable(False)
- self.Inputs.Enable(False)
- self.Block = None
- self.MinBlockSize = None
- self.First = True
-
- self.PouNames = []
- self.PouElementNames = []
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def FindTreeItem(self, root, name, inputs = None):
- if root.IsOk():
- pydata = self.TypeTree.GetPyData(root)
- type_inputs = pydata.get("inputs", None)
- type_extension = pydata.get("extension", None)
- if inputs is not None and type_inputs is not None:
- if type_extension is not None:
- same_inputs = type_inputs == inputs[:type_extension]
- else:
- same_inputs = type_inputs == inputs
- else:
- same_inputs = True
- if self.TypeTree.GetItemText(root) == name and same_inputs:
- return root
- else:
- if wx.VERSION < (2, 6, 0):
- item, root_cookie = self.TypeTree.GetFirstChild(root, 0)
- else:
- item, root_cookie = self.TypeTree.GetFirstChild(root)
- while item.IsOk():
- result = self.FindTreeItem(item, name, inputs)
- if result:
- return result
- item, root_cookie = self.TypeTree.GetNextChild(root, root_cookie)
- return None
-
- def OnOK(self, event):
- selected = self.TypeTree.GetSelection()
- block_name = self.BlockName.GetValue()
- name_enabled = self.BlockName.IsEnabled()
- if not selected.IsOk() or self.TypeTree.GetItemParent(selected) == self.TypeTree.GetRootItem() or selected == self.TypeTree.GetRootItem():
- message = wx.MessageDialog(self, _("Form isn't complete. Valid block type must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif name_enabled and block_name == "":
- message = wx.MessageDialog(self, _("Form isn't complete. Name must be filled!"), _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif name_enabled and not TestIdentifier(block_name):
- message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif name_enabled and block_name.upper() in IEC_KEYWORDS:
- message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif name_enabled and block_name.upper() in self.PouNames:
- message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif name_enabled and block_name.upper() in self.PouElementNames:
- message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- else:
- self.EndModal(wx.ID_OK)
-
- def SetBlockList(self, blocktypes):
- if wx.Platform == '__WXMSW__':
- root = self.TypeTree.AddRoot(_("Block Types"))
- else:
- root = self.TypeTree.AddRoot("")
- self.TypeTree.SetPyData(root, {"type" : CATEGORY})
- for category in blocktypes:
- category_name = category["name"]
- category_item = self.TypeTree.AppendItem(root, _(category_name))
- self.TypeTree.SetPyData(category_item, {"type" : CATEGORY})
- for blocktype in category["list"]:
- blocktype_item = self.TypeTree.AppendItem(category_item, blocktype["name"])
- block_data = {"type" : BLOCK,
- "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]]),
- "extension" : None}
- if blocktype["extensible"]:
- block_data["extension"] = len(blocktype["inputs"])
- self.TypeTree.SetPyData(blocktype_item, block_data)
- if wx.Platform == '__WXMSW__':
- self.TypeTree.Expand(root)
-
- def SetMinBlockSize(self, size):
- self.MinBlockSize = size
-
- def SetPouNames(self, pou_names):
- self.PouNames = [pou_name.upper() for pou_name in pou_names]
-
- def SetPouElementNames(self, element_names):
- self.PouElementNames = [element_name.upper() for element_name in element_names]
-
- def SetValues(self, values):
- blocktype = values.get("type", None)
- if blocktype is not None:
- inputs = values.get("inputs", None)
- item = self.FindTreeItem(self.TypeTree.GetRootItem(), blocktype, inputs)
- if item:
- self.TypeTree.SelectItem(item)
- for name, value in values.items():
- if name == "name":
- self.BlockName.SetValue(value)
- elif name == "extension":
- self.Inputs.SetValue(value)
- elif name == "executionOrder":
- self.ExecutionOrder.SetValue(value)
- elif name == "executionControl":
- self.ExecutionControl.SetValue(value)
- self.RefreshPreview()
-
- def GetValues(self):
- values = {}
- item = self.TypeTree.GetSelection()
- values["type"] = self.TypeTree.GetItemText(item)
- values["inputs"] = self.TypeTree.GetPyData(item)["inputs"]
- if self.BlockName.GetValue() != "":
- values["name"] = self.BlockName.GetValue()
- values["width"], values["height"] = self.Block.GetSize()
- values["extension"] = self.Inputs.GetValue()
- values["executionOrder"] = self.ExecutionOrder.GetValue()
- values["executionControl"] = self.ExecutionControl.GetValue()
- return values
-
- def OnTypeTreeItemSelected(self, event):
- self.BlockName.SetValue("")
- selected = event.GetItem()
- pydata = self.TypeTree.GetPyData(selected)
- if pydata["type"] != CATEGORY:
- blocktype = self.Controler.GetBlockType(self.TypeTree.GetItemText(selected), pydata["inputs"])
- if blocktype:
- self.Inputs.SetValue(len(blocktype["inputs"]))
- self.Inputs.Enable(blocktype["extensible"])
- self.BlockName.Enable(blocktype["type"] != "function")
- comment = blocktype["comment"]
- self.TypeDesc.SetValue(_(comment) + blocktype.get("usage", ""))
- wx.CallAfter(self.RefreshPreview)
- else:
- self.BlockName.Enable(False)
- self.Inputs.Enable(False)
- self.Inputs.SetValue(2)
- self.TypeDesc.SetValue("")
- wx.CallAfter(self.ErasePreview)
- else:
- self.BlockName.Enable(False)
- self.Inputs.Enable(False)
- self.Inputs.SetValue(2)
- self.TypeDesc.SetValue("")
- wx.CallAfter(self.ErasePreview)
- event.Skip()
-
- def OnNameChanged(self, event):
- if self.BlockName.IsEnabled():
- self.RefreshPreview()
- event.Skip()
-
- def OnInputsChanged(self, event):
- if self.Inputs.IsEnabled():
- self.RefreshPreview()
- event.Skip()
-
- def OnExecutionOrderChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def OnExecutionControlChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def ErasePreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.Clear()
- self.Block = None
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- item = self.TypeTree.GetSelection()
- if item.IsOk():
- pydata = self.TypeTree.GetPyData(item)
- if pydata["type"] == CATEGORY:
- self.Block = None
- else:
- blocktype = self.TypeTree.GetItemText(item)
- if blocktype:
- self.Block = FBD_Block(self.Preview, blocktype,
- self.BlockName.GetValue(),
- extension = self.Inputs.GetValue(),
- inputs = pydata["inputs"],
- executionControl = self.ExecutionControl.GetValue(),
- executionOrder = self.ExecutionOrder.GetValue())
- width, height = self.MinBlockSize
- min_width, min_height = self.Block.GetMinSize()
- width, height = max(min_width, width), max(min_height, height)
- self.Block.SetSize(width, height)
- clientsize = self.Preview.GetClientSize()
- x = (clientsize.width - width) / 2
- y = (clientsize.height - height) / 2
- self.Block.SetPosition(x, y)
- self.Block.Draw(dc)
- else:
- self.Block = None
-
- def OnPaint(self, event):
- if self.Block is not None:
- self.RefreshPreview()
- event.Skip()
-
-#-------------------------------------------------------------------------------
-# Create New Variable Dialog
-#-------------------------------------------------------------------------------
-
-[ID_VARIABLEPROPERTIESDIALOG, ID_VARIABLEPROPERTIESDIALOGSPACER,
- ID_VARIABLEPROPERTIESDIALOGNAME, ID_VARIABLEPROPERTIESDIALOGCLASS,
- ID_VARIABLEPROPERTIESDIALOGPREVIEW, ID_VARIABLEPROPERTIESDIALOGEXPRESSION,
- ID_VARIABLEPROPERTIESDIALOGEXECUTIONORDER, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT1,
- ID_VARIABLEPROPERTIESDIALOGSTATICTEXT2, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT3,
- ID_VARIABLEPROPERTIESDIALOGSTATICTEXT4, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT5
-] = [wx.NewId() for _init_ctrls in range(12)]
-
-VARIABLE_CLASSES_DICT = {INPUT : _("Input"),
- INOUT : _("InOut"),
- OUTPUT : _("Output")}
-VARIABLE_CLASSES_DICT_REVERSE = dict([(value, key) for key, value in VARIABLE_CLASSES_DICT.iteritems()])
-
-class VariablePropertiesDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.TopSizer, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText5, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_MainSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(2)
-
- def _init_coll_TopSizer_Items(self, parent):
- parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Class, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Expression, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
-
- def _init_coll_LeftGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(2)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText4, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.VariableName, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
- self.TopSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=7, vgap=5)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_MainSizer_Growables(self.MainSizer)
- self._init_coll_TopSizer_Items(self.TopSizer)
- self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
- self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, ctrler):
- wx.Dialog.__init__(self, id=ID_VARIABLEPROPERTIESDIALOG,
- name='VariablePropertiesDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(400, 380), style=wx.DEFAULT_DIALOG_STYLE,
- title=_('Variable Properties'))
- self.SetClientSize(wx.Size(400, 380))
-
- self.staticText1 = wx.StaticText(id=ID_VARIABLEPROPERTIESDIALOGSTATICTEXT1,
- label=_('Class:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText2 = wx.StaticText(id=ID_VARIABLEPROPERTIESDIALOGSTATICTEXT2,
- label=_('Expression:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText3 = wx.StaticText(id=ID_VARIABLEPROPERTIESDIALOGSTATICTEXT3,
- label=_('Execution Order:'), name='staticText3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText4 = wx.StaticText(id=ID_VARIABLEPROPERTIESDIALOGSTATICTEXT4,
- label=_('Name:'), name='staticText4', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText5 = wx.StaticText(id=ID_VARIABLEPROPERTIESDIALOGSTATICTEXT5,
- label=_('Preview:'), name='staticText5', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.Class = wx.ComboBox(id=ID_VARIABLEPROPERTIESDIALOGCLASS,
- name='Class', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 28), style=wx.CB_READONLY)
- self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, id=ID_VARIABLEPROPERTIESDIALOGCLASS)
-
- self.VariableName = wx.ListBox(id=ID_VARIABLEPROPERTIESDIALOGNAME,
- name='Name', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 90), style=wx.LB_SINGLE|wx.LB_SORT)
- self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, id=ID_VARIABLEPROPERTIESDIALOGNAME)
-
- self.Expression = wx.TextCtrl(id=ID_VARIABLEPROPERTIESDIALOGEXPRESSION,
- name='Expression', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, id=ID_VARIABLEPROPERTIESDIALOGEXPRESSION)
-
- self.ExecutionOrder = wx.SpinCtrl(id=ID_VARIABLEPROPERTIESDIALOGEXECUTIONORDER,
- name='ExecutionOrder', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
- self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, id=ID_VARIABLEPROPERTIESDIALOGEXECUTIONORDER)
-
- self.Spacer = wx.Panel(id=ID_VARIABLEPROPERTIESDIALOGSPACER,
- name='Spacer', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
- self.Preview = wx.Panel(id=ID_VARIABLEPROPERTIESDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "GetScaling", lambda:None)
- setattr(self.Preview, "IsOfType", ctrler.IsOfType)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
- if wx.VERSION >= (2, 5, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler, transition = ""):
- self._init_ctrls(parent, controler)
- self.Transition = transition
- self.Variable = None
- self.VarList = []
- self.MinVariableSize = None
-
- for choice in VARIABLE_CLASSES_DICT.itervalues():
- self.Class.Append(choice)
- self.Class.SetStringSelection(VARIABLE_CLASSES_DICT[INPUT])
-
- self.RefreshNameList()
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def RefreshNameList(self):
- selected = self.VariableName.GetStringSelection()
- var_class = VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()]
- self.VariableName.Clear()
- self.VariableName.Append("")
- for name, var_type, value_type in self.VarList:
- if var_type != "Input" or var_class == INPUT:
- self.VariableName.Append(name)
- if selected != "" and self.VariableName.FindString(selected) != wx.NOT_FOUND:
- self.VariableName.SetStringSelection(selected)
- self.Expression.Enable(False)
- else:
- self.VariableName.SetStringSelection("")
- self.Expression.Enable(var_class == INPUT)
- self.VariableName.Enable(self.VariableName.GetCount() > 0)
-
- def SetMinVariableSize(self, size):
- self.MinVariableSize = size
-
- def SetVariables(self, vars):
- self.VarList = vars
- self.RefreshNameList()
-
- def SetValues(self, values):
- value_type = values.get("type", None)
- value_name = values.get("name", None)
- if value_type:
- self.Class.SetStringSelection(VARIABLE_CLASSES_DICT[value_type])
- self.RefreshNameList()
- if value_name:
- if self.VariableName.FindString(value_name) != wx.NOT_FOUND:
- self.VariableName.SetStringSelection(value_name)
- self.Expression.Enable(False)
- else:
- self.Expression.SetValue(value_name)
- self.VariableName.Enable(False)
- if "executionOrder" in values:
- self.ExecutionOrder.SetValue(values["executionOrder"])
- self.RefreshPreview()
-
- def GetValues(self):
- values = {}
- values["type"] = VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()]
- expression = self.Expression.GetValue()
- if self.Expression.IsEnabled() and expression != "":
- values["name"] = expression
- else:
- values["name"] = self.VariableName.GetStringSelection()
- values["value_type"] = None
- for var_name, var_type, value_type in self.VarList:
- if var_name == values["name"]:
- values["value_type"] = value_type
- values["width"], values["height"] = self.Variable.GetSize()
- values["executionOrder"] = self.ExecutionOrder.GetValue()
- return values
-
- def OnOK(self, event):
- expression = self.Expression.GetValue()
- if self.Expression.IsEnabled():
- value = expression
- else:
- value = self.VariableName.GetStringSelection()
- if value == "":
- message = wx.MessageDialog(self, _("At least a variable or an expression must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- 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()
- else:
- self.EndModal(wx.ID_OK)
-
- def OnClassChanged(self, event):
- self.RefreshNameList()
- self.RefreshPreview()
- event.Skip()
-
- def OnNameChanged(self, event):
- if self.VariableName.GetStringSelection() != "":
- self.Expression.Enable(False)
- elif VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()] == INPUT:
- self.Expression.Enable(True)
- self.RefreshPreview()
- event.Skip()
-
- def OnExpressionChanged(self, event):
- if self.Expression.GetValue() != "":
- self.VariableName.Enable(False)
- else:
- self.VariableName.Enable(True)
- self.RefreshPreview()
- event.Skip()
-
- def OnExecutionOrderChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- expression = self.Expression.GetValue()
- if self.Expression.IsEnabled() and expression != "":
- name = expression
- else:
- name = self.VariableName.GetStringSelection()
- type = ""
- for var_name, var_type, value_type in self.VarList:
- if var_name == name:
- type = value_type
- classtype = VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()]
- self.Variable = FBD_Variable(self.Preview, classtype, name, type, executionOrder = self.ExecutionOrder.GetValue())
- width, height = self.MinVariableSize
- min_width, min_height = self.Variable.GetMinSize()
- width, height = max(min_width, width), max(min_height, height)
- self.Variable.SetSize(width, height)
- clientsize = self.Preview.GetClientSize()
- x = (clientsize.width - width) / 2
- y = (clientsize.height - height) / 2
- self.Variable.SetPosition(x, y)
- self.Variable.Draw(dc)
-
- def OnPaint(self, event):
- self.RefreshPreview()
- event.Skip()
-
-#-------------------------------------------------------------------------------
-# Create New Connection Dialog
-#-------------------------------------------------------------------------------
-
-[ID_CONNECTIONPROPERTIESDIALOG, ID_CONNECTIONPROPERTIESDIALOGSPACER,
- ID_CONNECTIONPROPERTIESDIALOGNAME, ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON1,
- ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON2, ID_CONNECTIONPROPERTIESDIALOGPREVIEW,
- ID_CONNECTIONPROPERTIESDIALOGSTATICTEXT1, ID_CONNECTIONPROPERTIESDIALOGSTATICTEXT2,
- ID_CONNECTIONPROPERTIESDIALOGSTATICTEXT3,
-] = [wx.NewId() for _init_ctrls in range(9)]
-
-class ConnectionPropertiesDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.ConnectionName, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
-
- def _init_coll_LeftGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(5)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=5)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
- self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, ctrler):
- wx.Dialog.__init__(self, id=ID_CONNECTIONPROPERTIESDIALOG,
- name='ConnectionPropertiesDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(350, 220), style=wx.DEFAULT_DIALOG_STYLE,
- title=_('Connection Properties'))
- self.SetClientSize(wx.Size(350, 220))
-
- self.staticText1 = wx.StaticText(id=ID_CONNECTIONPROPERTIESDIALOGSTATICTEXT1,
- label=_('Type:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText2 = wx.StaticText(id=ID_CONNECTIONPROPERTIESDIALOGSTATICTEXT2,
- label=_('Name:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText3 = wx.StaticText(id=ID_CONNECTIONPROPERTIESDIALOGSTATICTEXT3,
- label=_('Preview:'), name='staticText3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.radioButton1 = wx.RadioButton(id=ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON1,
- label=_('Connector'), name='radioButton1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON1)
- self.radioButton1.SetValue(True)
-
- self.radioButton2 = wx.RadioButton(id=ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON2,
- label=_('Continuation'), name='radioButton2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON2)
- self.radioButton2.SetValue(False)
-
- self.ConnectionName = wx.TextCtrl(id=ID_CONNECTIONPROPERTIESDIALOGNAME,
- name='Name', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_CONNECTIONPROPERTIESDIALOGNAME)
-
- self.Preview = wx.Panel(id=ID_CONNECTIONPROPERTIESDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "GetScaling", lambda:None)
- setattr(self.Preview, "IsOfType", ctrler.IsOfType)
-
- self.Spacer = wx.Panel(id=ID_CONNECTIONPROPERTIESDIALOGSPACER,
- name='Spacer', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
- if wx.VERSION >= (2, 5, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler):
- self._init_ctrls(parent, controler)
- self.Connection = None
- self.MinConnectionSize = None
-
- self.PouNames = []
- self.PouElementNames = []
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def SetMinConnectionSize(self, size):
- self.MinConnectionSize = size
-
- def SetValues(self, values):
- for name, value in values.items():
- if name == "type":
- if value == CONNECTOR:
- self.radioButton1.SetValue(True)
- elif value == CONTINUATION:
- self.radioButton2.SetValue(True)
- elif name == "name":
- self.ConnectionName.SetValue(value)
- self.RefreshPreview()
-
- def GetValues(self):
- values = {}
- if self.radioButton1.GetValue():
- values["type"] = CONNECTOR
- else:
- values["type"] = CONTINUATION
- values["name"] = self.ConnectionName.GetValue()
- values["width"], values["height"] = self.Connection.GetSize()
- return values
-
- def SetPouNames(self, pou_names):
- self.PouNames = [pou_name.upper() for pou_name in pou_names]
-
- def SetPouElementNames(self, element_names):
- self.PouElementNames = [element_name.upper() for element_name in element_names]
-
- def OnOK(self, event):
- connection_name = self.ConnectionName.GetValue()
- if connection_name == "":
- message = wx.MessageDialog(self, _("Form isn't complete. Name must be filled!"), _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif not TestIdentifier(connection_name):
- message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif connection_name.upper() in IEC_KEYWORDS:
- message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif connection_name.upper() in self.PouNames:
- message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif connection_name.upper() in self.PouElementNames:
- message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- else:
- self.EndModal(wx.ID_OK)
-
- def OnTypeChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def OnNameChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- if self.radioButton1.GetValue():
- self.Connection = FBD_Connector(self.Preview, CONNECTOR, self.ConnectionName.GetValue())
- else:
- self.Connection = FBD_Connector(self.Preview, CONTINUATION, self.ConnectionName.GetValue())
- width, height = self.MinConnectionSize
- min_width, min_height = self.Connection.GetMinSize()
- width, height = max(min_width, width), max(min_height, height)
- self.Connection.SetSize(width, height)
- clientsize = self.Preview.GetClientSize()
- x = (clientsize.width - width) / 2
- y = (clientsize.height - height) / 2
- self.Connection.SetPosition(x, y)
- self.Connection.Draw(dc)
-
- def OnPaint(self, event):
- self.RefreshPreview()
- event.Skip()
-
-#-------------------------------------------------------------------------------
-# Edit Ladder Element Properties Dialog
-#-------------------------------------------------------------------------------
-
-
-[ID_LDELEMENTDIALOG, ID_LDELEMENTDIALOGSPACER,
- ID_LDELEMENTDIALOGNAME, ID_LDELEMENTDIALOGRADIOBUTTON1,
- ID_LDELEMENTDIALOGRADIOBUTTON2, ID_LDELEMENTDIALOGRADIOBUTTON3,
- ID_LDELEMENTDIALOGRADIOBUTTON4, ID_LDELEMENTDIALOGRADIOBUTTON5,
- ID_LDELEMENTDIALOGRADIOBUTTON6, ID_LDELEMENTDIALOGPREVIEW,
- ID_LDELEMENTDIALOGSTATICTEXT1, ID_LDELEMENTDIALOGSTATICTEXT2,
- ID_LDELEMENTDIALOGSTATICTEXT3,
-] = [wx.NewId() for _init_ctrls in range(13)]
-
-class LDElementDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddSizer(self.RadioButtonSizer, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.ElementName, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
-
- def _init_coll_LeftGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(7)
-
- def _init_coll_RadioButtonSizer_Items(self, parent):
- parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton4, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton5, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton6, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=5)
- self.RadioButtonSizer = wx.BoxSizer(wx.VERTICAL)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
- self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
- self._init_coll_RadioButtonSizer_Items(self.RadioButtonSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, ctrler, title, extra_size = 0):
- wx.Dialog.__init__(self, id=ID_LDELEMENTDIALOG,
- name='LDElementDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(350, 260 + extra_size), style=wx.DEFAULT_DIALOG_STYLE,
- title=title)
- self.SetClientSize(wx.Size(350, 260 + extra_size))
-
- self.staticText1 = wx.StaticText(id=ID_LDELEMENTDIALOGSTATICTEXT1,
- label=_('Modifier:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText2 = wx.StaticText(id=ID_LDELEMENTDIALOGSTATICTEXT2,
- label=_('Name:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText3 = wx.StaticText(id=ID_LDELEMENTDIALOGSTATICTEXT3,
- label=_('Preview:'), name='staticText3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.radioButton1 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON1,
- label=_("Normal"), name='radioButton1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON1)
- self.radioButton1.SetValue(True)
-
- self.radioButton2 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON2,
- label=_("Negated"), name='radioButton2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON2)
-
- self.radioButton3 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON3,
- label=_("Set"), name='radioButton3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON3)
-
- self.radioButton4 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON4,
- label=_("Reset"), name='radioButton4', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON4)
-
- self.radioButton5 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON5,
- label=_("Rising Edge"), name='radioButton5', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON5)
-
- self.radioButton6 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON6,
- label=_("Falling Edge"), name='radioButton6', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON6)
-
- self.ElementName = wx.ComboBox(id=ID_LDELEMENTDIALOGNAME,
- name='Name', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 28), style=wx.CB_READONLY)
- self.Bind(wx.EVT_COMBOBOX, self.OnNameChanged, id=ID_LDELEMENTDIALOGNAME)
-
- self.Preview = wx.Panel(id=ID_LDELEMENTDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "GetScaling", lambda:None)
- setattr(self.Preview, "IsOfType", ctrler.IsOfType)
-
- self.Spacer = wx.Panel(id=ID_LDELEMENTDIALOGSPACER,
- name='Spacer', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
-
- if wx.VERSION >= (2, 5, 0):
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler, type):
- self.Type = type
- if type == "contact":
- self._init_ctrls(parent, controler, _("Edit Contact Values"))
- self.Element = LD_Contact(self.Preview, CONTACT_NORMAL, "")
- self.radioButton3.Hide()
- self.radioButton4.Hide()
- elif type == "coil":
- self._init_ctrls(parent, controler, _("Edit Coil Values"), 50)
- self.Element = LD_Coil(self.Preview, COIL_NORMAL, "")
-
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def SetElementSize(self, size):
- min_width, min_height = self.Element.GetMinSize()
- width, height = max(min_width, size[0]), max(min_height, size[1])
- self.Element.SetSize(width, height)
-
- def SetVariables(self, vars):
- self.ElementName.Clear()
- for name in vars:
- self.ElementName.Append(name)
- self.ElementName.Enable(self.ElementName.GetCount() > 0)
-
- def SetValues(self, values):
- for name, value in values.items():
- if name == "name":
- self.Element.SetName(value)
- self.ElementName.SetStringSelection(value)
- elif name == "type":
- self.Element.SetType(value)
- if self.Type == "contact":
- if value == CONTACT_NORMAL:
- self.radioButton1.SetValue(True)
- elif value == CONTACT_REVERSE:
- self.radioButton2.SetValue(True)
- elif value == CONTACT_RISING:
- self.radioButton5.SetValue(True)
- elif value == CONTACT_FALLING:
- self.radioButton6.SetValue(True)
- elif self.Type == "coil":
- if value == COIL_NORMAL:
- self.radioButton1.SetValue(True)
- elif value == COIL_REVERSE:
- self.radioButton2.SetValue(True)
- elif value == COIL_SET:
- self.radioButton3.SetValue(True)
- elif value == COIL_RESET:
- self.radioButton4.SetValue(True)
- elif value == COIL_RISING:
- self.radioButton5.SetValue(True)
- elif value == COIL_FALLING:
- self.radioButton6.SetValue(True)
-
- def GetValues(self):
- values = {}
- values["name"] = self.Element.GetName()
- values["type"] = self.Element.GetType()
- values["width"], values["height"] = self.Element.GetSize()
- return values
-
- def OnTypeChanged(self, event):
- if self.Type == "contact":
- if self.radioButton1.GetValue():
- self.Element.SetType(CONTACT_NORMAL)
- elif self.radioButton2.GetValue():
- self.Element.SetType(CONTACT_REVERSE)
- elif self.radioButton5.GetValue():
- self.Element.SetType(CONTACT_RISING)
- elif self.radioButton6.GetValue():
- self.Element.SetType(CONTACT_FALLING)
- elif self.Type == "coil":
- if self.radioButton1.GetValue():
- self.Element.SetType(COIL_NORMAL)
- elif self.radioButton2.GetValue():
- self.Element.SetType(COIL_REVERSE)
- elif self.radioButton3.GetValue():
- self.Element.SetType(COIL_SET)
- elif self.radioButton4.GetValue():
- self.Element.SetType(COIL_RESET)
- elif self.radioButton5.GetValue():
- self.Element.SetType(COIL_RISING)
- elif self.radioButton6.GetValue():
- self.Element.SetType(COIL_FALLING)
- self.RefreshPreview()
- event.Skip()
-
- def OnNameChanged(self, event):
- self.Element.SetName(self.ElementName.GetStringSelection())
- self.RefreshPreview()
- event.Skip()
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- clientsize = self.Preview.GetClientSize()
- width, height = self.Element.GetSize()
- self.Element.SetPosition((clientsize.width - width) / 2, (clientsize.height - height) / 2)
- self.Element.Draw(dc)
-
- def OnPaint(self, event):
- self.RefreshPreview()
- event.Skip()
-
-
-#-------------------------------------------------------------------------------
-# Edit Ladder Power Rail Properties Dialog
-#-------------------------------------------------------------------------------
-
-
-[ID_LDPOWERRAILDIALOG, ID_LDPOWERRAILDIALOGSPACER,
- ID_LDPOWERRAILDIALOGTYPE, ID_LDPOWERRAILDIALOGRADIOBUTTON1,
- ID_LDPOWERRAILDIALOGRADIOBUTTON2, ID_LDPOWERRAILDIALOGPREVIEW,
- ID_LDPOWERRAILDIALOGSTATICTEXT1, ID_LDPOWERRAILDIALOGSTATICTEXT2,
- ID_LDPOWERRAILDIALOGSTATICTEXT3, ID_LDPOWERRAILDIALOGPINNUMBER,
-] = [wx.NewId() for _init_ctrls in range(10)]
-
-class LDPowerRailDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.PinNumber, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
-
- def _init_coll_LeftGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(5)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=5)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
- self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, ctrler):
- wx.Dialog.__init__(self, id=ID_LDPOWERRAILDIALOG,
- name='PowerRailDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(350, 260), style=wx.DEFAULT_DIALOG_STYLE,
- title=_('Power Rail Properties'))
- self.SetClientSize(wx.Size(350, 260))
-
- self.staticText1 = wx.StaticText(id=ID_LDPOWERRAILDIALOGSTATICTEXT1,
- label=_('Type:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText2 = wx.StaticText(id=ID_LDPOWERRAILDIALOGSTATICTEXT2,
- label=_('Pin number:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText3 = wx.StaticText(id=ID_LDPOWERRAILDIALOGSTATICTEXT3,
- label=_('Preview:'), name='staticText3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.radioButton1 = wx.RadioButton(id=ID_LDPOWERRAILDIALOGRADIOBUTTON1,
- label=_('Left PowerRail'), name='radioButton1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDPOWERRAILDIALOGRADIOBUTTON1)
- self.radioButton1.SetValue(True)
-
- self.radioButton2 = wx.RadioButton(id=ID_LDPOWERRAILDIALOGRADIOBUTTON2,
- label=_('Right PowerRail'), name='radioButton2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDPOWERRAILDIALOGRADIOBUTTON2)
-
- self.PinNumber = wx.SpinCtrl(id=ID_LDPOWERRAILDIALOGPINNUMBER,
- name='PinNumber', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=1, max=50)
- self.Bind(wx.EVT_SPINCTRL, self.OnPinNumberChanged, id=ID_LDPOWERRAILDIALOGPINNUMBER)
-
- self.Preview = wx.Panel(id=ID_LDPOWERRAILDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "GetScaling", lambda:None)
- setattr(self.Preview, "IsOfType", ctrler.IsOfType)
-
- self.Spacer = wx.Panel(id=ID_LDELEMENTDIALOGSPACER,
- name='Spacer', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
-
- if wx.VERSION >= (2, 5, 0):
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler, type = LEFTRAIL, number = 1):
- self._init_ctrls(parent, controler)
- self.Type = type
- if type == LEFTRAIL:
- self.radioButton1.SetValue(True)
- elif type == RIGHTRAIL:
- self.radioButton2.SetValue(True)
- self.PinNumber.SetValue(number)
-
- self.PowerRailMinSize = (0, 0)
- self.PowerRail = None
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def SetMinSize(self, size):
- self.PowerRailMinSize = size
- self.RefreshPreview()
-
- def GetValues(self):
- values = {}
- values["type"] = self.Type
- values["number"] = self.PinNumber.GetValue()
- values["width"], values["height"] = self.PowerRail.GetSize()
- return values
-
- def OnTypeChanged(self, event):
- if self.radioButton1.GetValue():
- self.Type = LEFTRAIL
- elif self.radioButton2.GetValue():
- self.Type = RIGHTRAIL
- self.RefreshPreview()
- event.Skip()
-
- def OnPinNumberChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- self.PowerRail = LD_PowerRail(self.Preview, self.Type, connectors = [True for i in xrange(self.PinNumber.GetValue())])
- min_width, min_height = 2, LD_LINE_SIZE * self.PinNumber.GetValue()
- width, height = max(min_width, self.PowerRailMinSize[0]), max(min_height, self.PowerRailMinSize[1])
- self.PowerRail.SetSize(width, height)
- clientsize = self.Preview.GetClientSize()
- self.PowerRail.SetPosition((clientsize.width - width) / 2, (clientsize.height - height) / 2)
- self.PowerRail.Draw(dc)
-
- def OnPaint(self, event):
- self.RefreshPreview()
- event.Skip()
-
-
-#-------------------------------------------------------------------------------
-# Edit Step Content Dialog
-#-------------------------------------------------------------------------------
-
-[ID_STEPCONTENTDIALOG, ID_STEPCONTENTDIALOGSPACER,
- ID_STEPCONTENTDIALOGNAME, ID_STEPCONTENTDIALOGPREVIEW,
- ID_STEPCONTENTDIALOGCHECKBOX1, ID_STEPCONTENTDIALOGCHECKBOX2,
- ID_STEPCONTENTDIALOGCHECKBOX3, ID_STEPCONTENTDIALOGSTATICTEXT1,
- ID_STEPCONTENTDIALOGSTATICTEXT2, ID_STEPCONTENTDIALOGSTATICTEXT3,
-] = [wx.NewId() for _init_ctrls in range(10)]
-
-class StepContentDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.StepName, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.checkBox1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.checkBox2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.checkBox3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
-
- def _init_coll_LeftGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(6)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=7, vgap=5)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
- self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, ctrler):
- wx.Dialog.__init__(self, id=ID_STEPCONTENTDIALOG,
- name='StepContentDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(400, 250), style=wx.DEFAULT_DIALOG_STYLE,
- title=_('Edit Step'))
- self.SetClientSize(wx.Size(400, 250))
-
- self.staticText1 = wx.StaticText(id=ID_STEPCONTENTDIALOGSTATICTEXT1,
- label=_('Name:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText2 = wx.StaticText(id=ID_STEPCONTENTDIALOGSTATICTEXT2,
- label=_('Connectors:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText3 = wx.StaticText(id=ID_STEPCONTENTDIALOGSTATICTEXT3,
- label=_('Preview:'), name='staticText4', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.StepName = wx.TextCtrl(id=ID_STEPCONTENTDIALOGNAME,
- name='Name', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_STEPCONTENTDIALOGNAME)
-
- self.checkBox1 = wx.CheckBox(id=ID_STEPCONTENTDIALOGCHECKBOX1,
- label=_("Input"), name='checkBox1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_STEPCONTENTDIALOGCHECKBOX1)
-
- self.checkBox2 = wx.CheckBox(id=ID_STEPCONTENTDIALOGCHECKBOX2,
- label=_("Output"), name='checkBox2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_STEPCONTENTDIALOGCHECKBOX2)
-
- self.checkBox3 = wx.CheckBox(id=ID_STEPCONTENTDIALOGCHECKBOX3,
- label=_("Action"), name='checkBox3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_STEPCONTENTDIALOGCHECKBOX3)
-
- self.Spacer = wx.Panel(id=ID_STEPCONTENTDIALOGSPACER,
- name='Spacer', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
- self.Preview = wx.Panel(id=ID_STEPCONTENTDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "RefreshStepModel", lambda x:None)
- setattr(self.Preview, "GetScaling", lambda:None)
- setattr(self.Preview, "IsOfType", ctrler.IsOfType)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
- if wx.VERSION >= (2, 5, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler, initial = False):
- self._init_ctrls(parent, controler)
- self.Step = None
- self.Initial = initial
- self.MinStepSize = None
-
- self.PouNames = []
- self.Variables = []
- self.StepNames = []
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def OnOK(self, event):
- step_name = self.StepName.GetValue()
- if step_name == "":
- message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif not TestIdentifier(step_name):
- message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in IEC_KEYWORDS:
- message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in self.PouNames:
- message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in self.Variables:
- message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in self.StepNames:
- message = wx.MessageDialog(self, _("\"%s\" step already exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- else:
- self.EndModal(wx.ID_OK)
-
- def SetMinStepSize(self, size):
- self.MinStepSize = size
-
- def SetPouNames(self, pou_names):
- self.PouNames = [pou_name.upper() for pou_name in pou_names]
-
- def SetVariables(self, 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]
-
- def SetValues(self, values):
- value_name = values.get("name", None)
- if value_name:
- self.StepName.SetValue(value_name)
- else:
- self.StepName.SetValue("")
- self.checkBox1.SetValue(values.get("input", False))
- self.checkBox2.SetValue(values.get("output", False))
- self.checkBox3.SetValue(values.get("action", False))
- self.RefreshPreview()
-
- def GetValues(self):
- values = {}
- values["name"] = self.StepName.GetValue()
- values["input"] = self.checkBox1.IsChecked()
- values["output"] = self.checkBox2.IsChecked()
- values["action"] = self.checkBox3.IsChecked()
- values["width"], values["height"] = self.Step.GetSize()
- return values
-
- def OnConnectorsChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def OnNameChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- self.Step = SFC_Step(self.Preview, self.StepName.GetValue(), self.Initial)
- if self.checkBox1.IsChecked():
- self.Step.AddInput()
- else:
- self.Step.RemoveInput()
- if self.checkBox2.IsChecked():
- self.Step.AddOutput()
- else:
- self.Step.RemoveOutput()
- if self.checkBox3.IsChecked():
- self.Step.AddAction()
- else:
- self.Step.RemoveAction()
- width, height = self.MinStepSize
- min_width, min_height = self.Step.GetMinSize()
- width, height = max(min_width, width), max(min_height, height)
- self.Step.SetSize(width, height)
- clientsize = self.Preview.GetClientSize()
- x = (clientsize.width - width) / 2
- y = (clientsize.height - height) / 2
- self.Step.SetPosition(x, y)
- self.Step.Draw(dc)
-
- def OnPaint(self, event):
- self.RefreshPreview()
- event.Skip()
-
-#-------------------------------------------------------------------------------
-# Edit Transition Content Dialog
-#-------------------------------------------------------------------------------
-
-[ID_TRANSITIONCONTENTDIALOG, ID_TRANSITIONCONTENTDIALOGSPACER,
- ID_TRANSITIONCONTENTDIALOGREFERENCE, ID_TRANSITIONCONTENTDIALOGINLINE,
- ID_TRANSITIONCONTENTDIALOGPRIORITY, ID_TRANSITIONCONTENTDIALOGPREVIEW,
- ID_TRANSITIONCONTENTDIALOGRADIOBUTTON1, ID_TRANSITIONCONTENTDIALOGRADIOBUTTON2,
- ID_TRANSITIONCONTENTDIALOGRADIOBUTTON3, ID_TRANSITIONCONTENTDIALOGSTATICTEXT1,
- ID_TRANSITIONCONTENTDIALOGSTATICTEXT2, ID_TRANSITIONCONTENTDIALOGSTATICTEXT3,
-] = [wx.NewId() for _init_ctrls in range(12)]
-
-class TransitionContentDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Reference, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Inline, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Priority, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
-
- def _init_coll_LeftGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(6)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=9, vgap=5)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
- self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, ctrler):
- wx.Dialog.__init__(self, id=ID_TRANSITIONCONTENTDIALOG,
- name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(350, 300), style=wx.DEFAULT_DIALOG_STYLE,
- title=_('Edit transition'))
- self.SetClientSize(wx.Size(350, 300))
-
- self.staticText1 = wx.StaticText(id=ID_TRANSITIONCONTENTDIALOGSTATICTEXT1,
- label=_('Type:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText2 = wx.StaticText(id=ID_TRANSITIONCONTENTDIALOGSTATICTEXT2,
- label=_('Preview:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.staticText3 = wx.StaticText(id=ID_TRANSITIONCONTENTDIALOGSTATICTEXT3,
- label=_('Priority:'), name='staticText3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.radioButton1 = wx.RadioButton(id=ID_TRANSITIONCONTENTDIALOGRADIOBUTTON1,
- label=_('Reference'), name='radioButton1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_TRANSITIONCONTENTDIALOGRADIOBUTTON1)
- self.radioButton1.SetValue(True)
-
- self.Reference = wx.ComboBox(id=ID_TRANSITIONCONTENTDIALOGREFERENCE,
- name='Reference', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 28), style=wx.CB_READONLY)
- self.Bind(wx.EVT_COMBOBOX, self.OnReferenceChanged, id=ID_TRANSITIONCONTENTDIALOGREFERENCE)
-
- self.radioButton2 = wx.RadioButton(id=ID_TRANSITIONCONTENTDIALOGRADIOBUTTON2,
- label=_('Inline'), name='radioButton2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_TRANSITIONCONTENTDIALOGRADIOBUTTON2)
- self.radioButton2.SetValue(False)
-
- self.Inline = wx.TextCtrl(id=ID_TRANSITIONCONTENTDIALOGINLINE,
- name='Inline', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_TEXT, self.OnInlineChanged, id=ID_TRANSITIONCONTENTDIALOGINLINE)
- self.Inline.Enable(False)
-
- self.radioButton3 = wx.RadioButton(id=ID_TRANSITIONCONTENTDIALOGRADIOBUTTON3,
- label=_('Connection'), name='radioButton3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_TRANSITIONCONTENTDIALOGRADIOBUTTON3)
- self.radioButton3.SetValue(False)
- if not self.Connection:
- self.radioButton3.Hide()
-
- self.Priority = wx.SpinCtrl(id=ID_TRANSITIONCONTENTDIALOGPRIORITY,
- name='Priority', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
- self.Bind(wx.EVT_TEXT, self.OnPriorityChanged, id=ID_TRANSITIONCONTENTDIALOGPRIORITY)
-
- self.Preview = wx.Panel(id=ID_TRANSITIONCONTENTDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "RefreshTransitionModel", lambda x:None)
- setattr(self.Preview, "GetScaling", lambda:None)
- setattr(self.Preview, "IsOfType", ctrler.IsOfType)
-
- self.Spacer = wx.Panel(id=ID_TRANSITIONCONTENTDIALOGSPACER,
- name='Spacer', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
- if wx.VERSION >= (2, 5, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler, connection):
- self.Connection = connection
- self._init_ctrls(parent, controler)
- self.Transition = None
- self.MinTransitionSize = None
-
- self.Element = SFC_Transition(self.Preview)
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def SetElementSize(self, size):
- min_width, min_height = self.Element.GetMinSize()
- width, height = max(min_width, size[0]), max(min_height, size[1])
- self.Element.SetSize(width, height)
-
- def OnOK(self, event):
- error = []
- if self.radioButton1.GetValue() and self.Reference.GetStringSelection() == "":
- error.append(_("Reference"))
- if self.radioButton2.GetValue() and self.Inline.GetValue() == "":
- error.append(_("Inline"))
- 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 OnTypeChanged(self, event):
- if self.radioButton1.GetValue():
- self.Element.SetType("reference", self.Reference.GetStringSelection())
- self.Reference.Enable(True)
- self.Inline.Enable(False)
- elif self.radioButton2.GetValue():
- self.Element.SetType("inline", self.Inline.GetValue())
- self.Reference.Enable(False)
- self.Inline.Enable(True)
- else:
- self.Element.SetType("connection")
- self.Reference.Enable(False)
- self.Inline.Enable(False)
- self.RefreshPreview()
- event.Skip()
-
- def OnReferenceChanged(self, event):
- self.Element.SetType("reference", self.Reference.GetStringSelection())
- self.RefreshPreview()
- event.Skip()
-
- def OnInlineChanged(self, event):
- self.Element.SetType("inline", self.Inline.GetValue())
- self.RefreshPreview()
- event.Skip()
-
- def OnPriorityChanged(self, event):
- self.Element.SetPriority(int(self.Priority.GetValue()))
- self.RefreshPreview()
- event.Skip()
-
- def SetTransitions(self, transitions):
- self.Reference.Append("")
- for transition in transitions:
- self.Reference.Append(transition)
-
- def SetValues(self, values):
- if values["type"] == "reference":
- self.radioButton1.SetValue(True)
- self.radioButton2.SetValue(False)
- self.radioButton3.SetValue(False)
- self.Reference.Enable(True)
- self.Inline.Enable(False)
- self.Reference.SetStringSelection(values["value"])
- self.Element.SetType("reference", values["value"])
- elif values["type"] == "inline":
- self.radioButton1.SetValue(False)
- self.radioButton2.SetValue(True)
- self.radioButton3.SetValue(False)
- self.Reference.Enable(False)
- self.Inline.Enable(True)
- self.Inline.SetValue(values["value"])
- self.Element.SetType("inline", values["value"])
- elif values["type"] == "connection" and self.Connection:
- self.radioButton1.SetValue(False)
- self.radioButton2.SetValue(False)
- self.radioButton3.SetValue(True)
- self.Reference.Enable(False)
- self.Inline.Enable(False)
- self.Element.SetType("connection")
- self.Priority.SetValue(values["priority"])
- self.Element.SetPriority(values["priority"])
- self.RefreshPreview()
-
- def GetValues(self):
- values = {"priority" : int(self.Priority.GetValue())}
- if self.radioButton1.GetValue():
- values["type"] = "reference"
- values["value"] = self.Reference.GetStringSelection()
- elif self.radioButton2.GetValue():
- values["type"] = "inline"
- values["value"] = self.Inline.GetValue()
- else:
- values["type"] = "connection"
- values["value"] = None
- return values
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- clientsize = self.Preview.GetClientSize()
- posx, posy = self.Element.GetPosition()
- rect = self.Element.GetBoundingBox()
- diffx, diffy = posx - rect.x, posy - rect.y
- self.Element.SetPosition((clientsize.width - rect.width) / 2 + diffx, (clientsize.height - rect.height) / 2 + diffy)
- self.Element.Draw(dc)
-
- def OnPaint(self, event):
- self.RefreshPreview()
- event.Skip()
-
-#-------------------------------------------------------------------------------
-# Create New Divergence Dialog
-#-------------------------------------------------------------------------------
-
-[ID_DIVERGENCECREATEDIALOG, ID_DIVERGENCECREATEDIALOGSPACER,
- ID_DIVERGENCECREATEDIALOGRADIOBUTTON1, ID_DIVERGENCECREATEDIALOGRADIOBUTTON2,
- ID_DIVERGENCECREATEDIALOGRADIOBUTTON3, ID_DIVERGENCECREATEDIALOGRADIOBUTTON4,
- ID_DIVERGENCECREATEDIALOGSEQUENCES, ID_DIVERGENCECREATEDIALOGPREVIEW,
- ID_DIVERGENCECREATEDIALOGSTATICTEXT1, ID_DIVERGENCECREATEDIALOGSTATICTEXT2,
- ID_DIVERGENCECREATEDIALOGSTATICTEXT3,
-] = [wx.NewId() for _init_ctrls in range(11)]
-
-class DivergenceCreateDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_MainSizer_Items(self, parent):
- parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
- parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
-
- def _init_coll_LeftGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.radioButton4, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Sequences, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
-
- def _init_coll_LeftGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(7)
-
- def _init_coll_RightGridSizer_Items(self, parent):
- parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
-
- def _init_coll_RightGridSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
- self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
- self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=8, vgap=5)
- self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_MainSizer_Items(self.MainSizer)
- self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
- self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
- self._init_coll_RightGridSizer_Items(self.RightGridSizer)
- self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt, ctrler):
- wx.Dialog.__init__(self, id=ID_DIVERGENCECREATEDIALOG,
- name='DivergencePropertiesDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(500, 300), style=wx.DEFAULT_DIALOG_STYLE,
- title=_('Create a new divergence or convergence'))
- self.SetClientSize(wx.Size(500, 300))
-
- self.staticText1 = wx.StaticText(id=ID_DIVERGENCECREATEDIALOGSTATICTEXT1,
- label=_('Type:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.radioButton1 = wx.RadioButton(id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON1,
- label=_('Selection Divergence'), name='radioButton1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON1)
- self.radioButton1.SetValue(True)
-
- self.radioButton2 = wx.RadioButton(id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON2,
- label=_('Selection Convergence'), name='radioButton2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON2)
- self.radioButton2.SetValue(False)
-
- self.radioButton3 = wx.RadioButton(id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON3,
- label=_('Simultaneous Divergence'), name='radioButton3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON3)
- self.radioButton3.SetValue(False)
-
- self.radioButton4 = wx.RadioButton(id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON4,
- label=_('Simultaneous Convergence'), name='radioButton4', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_DIVERGENCECREATEDIALOGRADIOBUTTON4)
- self.radioButton4.SetValue(False)
-
- self.staticText2 = wx.StaticText(id=ID_DIVERGENCECREATEDIALOGSTATICTEXT2,
- label=_('Number of sequences:'), name='staticText2', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.Sequences = wx.SpinCtrl(id=ID_DIVERGENCECREATEDIALOGSEQUENCES,
- name='Sequences', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 24), style=0, min=2, max=20)
- self.Bind(wx.EVT_SPINCTRL, self.OnSequencesChanged, id=ID_DIVERGENCECREATEDIALOGSEQUENCES)
-
- self.staticText3 = wx.StaticText(id=ID_DIVERGENCECREATEDIALOGSTATICTEXT3,
- label=_('Preview:'), name='staticText3', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.Preview = wx.Panel(id=ID_DIVERGENCECREATEDIALOGPREVIEW,
- name='Preview', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
- self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
- setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
- setattr(self.Preview, "IsOfType", ctrler.IsOfType)
-
- self.Spacer = wx.Panel(id=ID_TRANSITIONCONTENTDIALOGSPACER,
- name='Spacer', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
-
- if wx.VERSION >= (2, 5, 0):
- self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
- else:
- wx.EVT_PAINT(self.Preview, self.OnPaint)
-
- self._init_sizers()
-
- def __init__(self, parent, controler):
- self._init_ctrls(parent, controler)
-
- self.Divergence = None
- self.MinSize = (0, 0)
-
- def SetPreviewFont(self, font):
- self.Preview.SetFont(font)
-
- def GetValues(self):
- values = {}
- if self.radioButton1.GetValue():
- values["type"] = SELECTION_DIVERGENCE
- elif self.radioButton2.GetValue():
- values["type"] = SELECTION_CONVERGENCE
- elif self.radioButton3.GetValue():
- values["type"] = SIMULTANEOUS_DIVERGENCE
- else:
- values["type"] = SIMULTANEOUS_CONVERGENCE
- values["number"] = self.Sequences.GetValue()
- return values
-
- def SetMinSize(self, size):
- self.MinSize = size
-
- def OnTypeChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def OnSequencesChanged(self, event):
- self.RefreshPreview()
- event.Skip()
-
- def RefreshPreview(self):
- dc = wx.ClientDC(self.Preview)
- dc.SetFont(self.Preview.GetFont())
- dc.Clear()
- if self.radioButton1.GetValue():
- self.Divergence = SFC_Divergence(self.Preview, SELECTION_DIVERGENCE, self.Sequences.GetValue())
- elif self.radioButton2.GetValue():
- self.Divergence = SFC_Divergence(self.Preview, SELECTION_CONVERGENCE, self.Sequences.GetValue())
- elif self.radioButton3.GetValue():
- self.Divergence = SFC_Divergence(self.Preview, SIMULTANEOUS_DIVERGENCE, self.Sequences.GetValue())
- else:
- self.Divergence = SFC_Divergence(self.Preview, SIMULTANEOUS_CONVERGENCE, self.Sequences.GetValue())
- width, height = self.Divergence.GetSize()
- min_width, min_height = max(width, self.MinSize[0]), max(height, self.MinSize[1])
- self.Divergence.SetSize(min_width, min_height)
- clientsize = self.Preview.GetClientSize()
- x = (clientsize.width - min_width) / 2
- y = (clientsize.height - min_height) / 2
- self.Divergence.SetPosition(x, y)
- self.Divergence.Draw(dc)
-
- def OnPaint(self, event):
- self.RefreshPreview()
- event.Skip()
-
-
-#-------------------------------------------------------------------------------
-# Action Block Dialog
-#-------------------------------------------------------------------------------
-
-def GetActionTableColnames():
- _ = lambda x: x
- return [_("Qualifier"), _("Duration"), _("Type"), _("Value"), _("Indicator")]
-
-def GetTypeList():
- _ = lambda x: x
- return [_("Action"), _("Variable"), _("Inline")]
-
-class ActionTable(wx.grid.PyGridTableBase):
-
- """
- A custom wx.Grid Table using user supplied data
- """
- def __init__(self, parent, data, colnames):
- # The base class must be initialized *first*
- wx.grid.PyGridTableBase.__init__(self)
- self.data = data
- self.colnames = colnames
- self.Parent = parent
- # XXX
- # we need to store the row length and collength to
- # see if the table has changed size
- self._rows = self.GetNumberRows()
- self._cols = self.GetNumberCols()
-
- def GetNumberCols(self):
- return len(self.colnames)
-
- def GetNumberRows(self):
- return len(self.data)
-
- def GetColLabelValue(self, col, translate=True):
- if col < len(self.colnames):
- colname = self.colnames[col]
- if translate:
- return _(colname)
- return colname
-
- def GetRowLabelValues(self, row, translate=True):
- return row
-
- def GetValue(self, row, col):
- if row < self.GetNumberRows():
- colname = self.GetColLabelValue(col, False)
- name = str(self.data[row].get(colname, ""))
- if colname == "Type":
- return _(name)
- 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, False)
- if colname == "Type":
- value = self.Parent.TranslateType[value]
- self.data[row][colname] = value
-
- def ResetView(self, grid):
- """
- (wx.Grid) -> Reset the grid view. Call this to
- update the grid if rows and columns have been added or deleted
- """
- grid.BeginBatch()
- for current, new, delmsg, addmsg in [
- (self._rows, self.GetNumberRows(), wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED),
- (self._cols, self.GetNumberCols(), wx.grid.GRIDTABLE_NOTIFY_COLS_DELETED, wx.grid.GRIDTABLE_NOTIFY_COLS_APPENDED),
- ]:
- if new < current:
- msg = wx.grid.GridTableMessage(self,delmsg,new,current-new)
- grid.ProcessTableMessage(msg)
- elif new > current:
- msg = wx.grid.GridTableMessage(self,addmsg,new-current)
- grid.ProcessTableMessage(msg)
- self.UpdateValues(grid)
- grid.EndBatch()
-
- self._rows = self.GetNumberRows()
- self._cols = self.GetNumberCols()
- # update the column rendering scheme
- self._updateColAttrs(grid)
-
- # update the scrollbars and the displayed part of the grid
- grid.AdjustScrollbars()
- grid.ForceRefresh()
-
- def UpdateValues(self, grid):
- """Update all displayed values"""
- # This sends an event to the grid table to update all of the values
- msg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
- grid.ProcessTableMessage(msg)
-
- def _updateColAttrs(self, grid):
- """
- wx.Grid -> update the column attributes to add the
- appropriate renderer given the column name.
-
- Otherwise default to the default renderer.
- """
-
- for row in range(self.GetNumberRows()):
- for col in range(self.GetNumberCols()):
- editor = None
- renderer = None
- readonly = False
- colname = self.GetColLabelValue(col, False)
- if colname == "Qualifier":
- editor = wx.grid.GridCellChoiceEditor()
- editor.SetParameters(self.Parent.QualifierList)
- if colname == "Duration":
- editor = wx.grid.GridCellTextEditor()
- renderer = wx.grid.GridCellStringRenderer()
- if self.Parent.DurationList[self.data[row]["Qualifier"]]:
- readonly = False
- else:
- readonly = True
- self.data[row]["Duration"] = ""
- elif colname == "Type":
- editor = wx.grid.GridCellChoiceEditor()
- editor.SetParameters(self.Parent.TypeList)
- elif colname == "Value":
- type = self.data[row]["Type"]
- if type == "Action":
- editor = wx.grid.GridCellChoiceEditor()
- editor.SetParameters(self.Parent.ActionList)
- elif type == "Variable":
- editor = wx.grid.GridCellChoiceEditor()
- editor.SetParameters(self.Parent.VariableList)
- elif type == "Inline":
- editor = wx.grid.GridCellTextEditor()
- renderer = wx.grid.GridCellStringRenderer()
- elif colname == "Indicator":
- editor = wx.grid.GridCellChoiceEditor()
- editor.SetParameters(self.Parent.VariableList)
-
- grid.SetCellEditor(row, col, editor)
- grid.SetCellRenderer(row, col, renderer)
- grid.SetReadOnly(row, col, readonly)
-
- grid.SetCellBackgroundColour(row, col, wx.WHITE)
-
- def SetData(self, data):
- self.data = data
-
- def GetData(self):
- return self.data
-
- def GetCurrentIndex(self):
- return self.CurrentIndex
-
- def SetCurrentIndex(self, index):
- self.CurrentIndex = index
-
- def AppendRow(self, row_content):
- self.data.append(row_content)
-
- def RemoveRow(self, row_index):
- self.data.pop(row_index)
-
- def MoveRow(self, row_index, move, grid):
- new_index = max(0, min(row_index + move, len(self.data) - 1))
- if new_index != row_index:
- self.data.insert(new_index, self.data.pop(row_index))
- grid.SetGridCursor(new_index, grid.GetGridCursorCol())
-
- def Empty(self):
- self.data = []
- self.editors = []
-
-[ID_ACTIONBLOCKDIALOG, ID_ACTIONBLOCKDIALOGVARIABLESGRID,
- ID_ACTIONBLOCKDIALOGSTATICTEXT1, ID_ACTIONBLOCKDIALOGADDBUTTON,
- ID_ACTIONBLOCKDIALOGDELETEBUTTON, ID_ACTIONBLOCKDIALOGUPBUTTON,
- ID_ACTIONBLOCKDIALOGDOWNBUTTON,
-] = [wx.NewId() for _init_ctrls in range(7)]
-
-class ActionBlockDialog(wx.Dialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
- def _init_coll_flexGridSizer1_Items(self, parent):
- parent.AddSizer(self.TopSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.GridButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.LEFT|wx.RIGHT)
- parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
- def _init_coll_flexGridSizer1_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(0)
-
- def _init_coll_TopSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
- parent.AddWindow(self.ActionsGrid, 0, border=0, flag=wx.GROW)
-
- def _init_coll_TopSizer_Growables(self, parent):
- parent.AddGrowableCol(0)
- parent.AddGrowableRow(1)
-
- def _init_coll_GridButtonSizer_Items(self, parent):
- parent.AddWindow(self.AddButton, 0, border=10, flag=wx.GROW|wx.LEFT)
- parent.AddWindow(self.DeleteButton, 0, border=10, flag=wx.GROW|wx.LEFT)
- parent.AddWindow(self.UpButton, 0, border=10, flag=wx.GROW|wx.LEFT)
- parent.AddWindow(self.DownButton, 0, border=10, flag=wx.GROW|wx.LEFT)
-
- def _init_sizers(self):
- self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
- self.TopSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
- self.GridButtonSizer = wx.BoxSizer(wx.HORIZONTAL)
-
- self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
- self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
- self._init_coll_TopSizer_Items(self.TopSizer)
- self._init_coll_TopSizer_Growables(self.TopSizer)
- self._init_coll_GridButtonSizer_Items(self.GridButtonSizer)
-
- self.SetSizer(self.flexGridSizer1)
-
- def _init_ctrls(self, prnt):
- wx.Dialog.__init__(self, id=ID_ACTIONBLOCKDIALOG,
- name='ActionBlockDialog', parent=prnt, pos=wx.Point(376, 223),
- size=wx.Size(500, 300), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
- title=_('Edit action block properties'))
- self.SetClientSize(wx.Size(500, 300))
-
- self.staticText1 = wx.StaticText(id=ID_ACTIONBLOCKDIALOGSTATICTEXT1,
- label=_('Actions:'), name='staticText1', parent=self,
- pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-
- self.ActionsGrid = wx.grid.Grid(id=ID_ACTIONBLOCKDIALOGVARIABLESGRID,
- name='ActionsGrid', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.VSCROLL)
- self.ActionsGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
- 'Sans'))
- self.ActionsGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
- False, 'Sans'))
- self.ActionsGrid.DisableDragGridSize()
- self.ActionsGrid.EnableScrolling(False, True)
- self.ActionsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnActionsGridCellChange)
-
- self.AddButton = wx.Button(id=ID_ACTIONBLOCKDIALOGADDBUTTON, label=_('Add'),
- name='AddButton', parent=self, pos=wx.Point(0, 0),
- size=wx.DefaultSize, style=0)
- self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_ACTIONBLOCKDIALOGADDBUTTON)
-
- self.DeleteButton = wx.Button(id=ID_ACTIONBLOCKDIALOGDELETEBUTTON, label=_('Delete'),
- name='DeleteButton', parent=self, pos=wx.Point(0, 0),
- size=wx.DefaultSize, style=0)
- self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_ACTIONBLOCKDIALOGDELETEBUTTON)
-
- self.UpButton = wx.Button(id=ID_ACTIONBLOCKDIALOGUPBUTTON, label='^',
- name='UpButton', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(32, 32), style=0)
- self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_ACTIONBLOCKDIALOGUPBUTTON)
-
- self.DownButton = wx.Button(id=ID_ACTIONBLOCKDIALOGDOWNBUTTON, label='v',
- name='DownButton', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(32, 32), style=0)
- self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_ACTIONBLOCKDIALOGDOWNBUTTON)
-
- self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
- if wx.VERSION >= (2, 5, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
-
- self._init_sizers()
-
- def __init__(self, parent):
- self._init_ctrls(parent)
-
- self.DefaultValue = {"Qualifier" : "N", "Duration" : "", "Type" : "Action", "Value" : "", "Indicator" : ""}
- self.Table = ActionTable(self, [], GetActionTableColnames())
- typelist = GetTypeList()
- self.TypeList = ",".join(map(_,typelist))
- self.TranslateType = dict([(_(value), value) for value in typelist])
- self.ColSizes = [60, 90, 80, 110, 80]
- self.ColAlignements = [wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
-
- self.ActionsGrid.SetTable(self.Table)
- self.ActionsGrid.SetRowLabelSize(0)
-
- for col in range(self.Table.GetNumberCols()):
- attr = wx.grid.GridCellAttr()
- attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
- self.ActionsGrid.SetColAttr(col, attr)
- self.ActionsGrid.SetColMinimalWidth(col, self.ColSizes[col])
- self.ActionsGrid.AutoSizeColumn(col, False)
-
- self.Table.ResetView(self.ActionsGrid)
-
- def OnOK(self, event):
- self.ActionsGrid.SetGridCursor(0, 0)
- self.EndModal(wx.ID_OK)
-
- def OnAddButton(self, event):
- self.Table.AppendRow(self.DefaultValue.copy())
- self.Table.ResetView(self.ActionsGrid)
- event.Skip()
-
- def OnDeleteButton(self, event):
- row = self.ActionsGrid.GetGridCursorRow()
- self.Table.RemoveRow(row)
- self.Table.ResetView(self.ActionsGrid)
- event.Skip()
-
- def OnUpButton(self, event):
- row = self.ActionsGrid.GetGridCursorRow()
- self.Table.MoveRow(row, -1, self.ActionsGrid)
- self.Table.ResetView(self.ActionsGrid)
- event.Skip()
-
- def OnDownButton(self, event):
- row = self.ActionsGrid.GetGridCursorRow()
- self.Table.MoveRow(row, 1, self.ActionsGrid)
- self.Table.ResetView(self.ActionsGrid)
- event.Skip()
-
- def OnActionsGridCellChange(self, event):
- self.Table.ResetView(self.ActionsGrid)
- event.Skip()
-
- def SetQualifierList(self, list):
- self.QualifierList = "," + ",".join(list)
- self.DurationList = list
-
- def SetVariableList(self, list):
- self.VariableList = "," + ",".join([variable["Name"] for variable in list])
-
- def SetActionList(self, list):
- self.ActionList = "," + ",".join(list)
-
- def SetValues(self, actions):
- for action in actions:
- row = {"Qualifier" : action["qualifier"], "Value" : action["value"]}
- if action["type"] == "reference":
- if action["value"] in self.ActionList:
- row["Type"] = "Action"
- elif action["value"] in self.VariableList:
- row["Type"] = "Variable"
- else:
- row["Type"] = "Inline"
- else:
- row["Type"] = "Inline"
- if "duration" in action:
- row["Duration"] = action["duration"]
- else:
- row["Duration"] = ""
- if "indicator" in action:
- row["Indicator"] = action["indicator"]
- else:
- row["Indicator"] = ""
- self.Table.AppendRow(row)
- self.Table.ResetView(self.ActionsGrid)
-
- def GetValues(self):
- values = []
- for data in self.Table.GetData():
- action = {"qualifier" : data["Qualifier"], "value" : data["Value"]}
- if data["Type"] in ["Action", "Variable"]:
- action["type"] = "reference"
- else:
- action["type"] = "inline"
- if data["Duration"] != "":
- action["duration"] = data["Duration"]
- if data["Indicator"] != "":
- action["indicator"] = data["Indicator"]
- values.append(action)
- return values
-
-
-#-------------------------------------------------------------------------------
-# Edit Step Name Dialog
-#-------------------------------------------------------------------------------
-
-class StepNameDialog(wx.TextEntryDialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
-
- def __init__(self, parent, message, caption = "Please enter text", defaultValue = "",
- style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
- wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
-
- self.PouNames = []
- self.Variables = []
- self.StepNames = []
- if wx.VERSION >= (2, 8, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton().GetId())
- elif wx.VERSION >= (2, 6, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
-
- def OnOK(self, event):
- step_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
- if step_name == "":
- message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif not TestIdentifier(step_name):
- message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in IEC_KEYWORDS:
- message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in self.PouNames:
- message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in self.Variables:
- message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in self.StepNames:
- message = wx.MessageDialog(self, _("\"%s\" step already exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- else:
- self.EndModal(wx.ID_OK)
-
- def SetPouNames(self, pou_names):
- self.PouNames = [pou_name.upper() for pou_name in pou_names]
-
- def SetVariables(self, 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]
-
- def GetValue(self):
- return self.GetSizer().GetItem(1).GetWindow().GetValue()
-
-#-------------------------------------------------------------------------------
-# POU Name Dialog
-#-------------------------------------------------------------------------------
-
-class PouNameDialog(wx.TextEntryDialog):
-
- if wx.VERSION < (2, 6, 0):
- def Bind(self, event, function, id = None):
- if id is not None:
- event(self, id, function)
- else:
- event(self, function)
-
-
- def __init__(self, parent, message, caption = "Please enter text", defaultValue = "",
- style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
- wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
-
- self.PouNames = []
- if wx.VERSION >= (2, 8, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton().GetId())
- elif wx.VERSION >= (2, 6, 0):
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
- else:
- self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
-
- def OnOK(self, event):
- step_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
- if step_name == "":
- message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif not TestIdentifier(step_name):
- message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in IEC_KEYWORDS:
- message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- elif step_name.upper() in self.PouNames:
- message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
- message.ShowModal()
- message.Destroy()
- else:
- self.EndModal(wx.ID_OK)
-
- def SetPouNames(self, pou_names):
- self.PouNames = [pou_name.upper() for pou_name in pou_names]
-
- def GetValue(self):
- return self.GetSizer().GetItem(1).GetWindow().GetValue()
--- a/SFCViewer.py Tue Sep 15 15:02:23 2009 +0200
+++ b/SFCViewer.py Wed Sep 16 12:00:58 2009 +0200
@@ -359,7 +359,7 @@
#-------------------------------------------------------------------------------
def AddInitialStep(self, pos):
- dialog = StepNameDialog(self.ParentWindow, _("Please enter step name"), _("Add a new initial step"), "", wx.OK|wx.CANCEL)
+ 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.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
@@ -381,7 +381,7 @@
def AddStep(self):
if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, SFC_Step):
- dialog = StepNameDialog(self.ParentWindow, _("Add a new step"), _("Please enter step name"), "", wx.OK|wx.CANCEL)
+ 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.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
@@ -464,7 +464,7 @@
def AddDivergence(self):
if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, Graphic_Group) or isinstance(self.SelectedElement, SFC_Step):
- dialog = DivergenceCreateDialog(self.ParentWindow)
+ dialog = SFCDivergenceDialog(self.ParentWindow)
dialog.SetPreviewFont(self.GetFont())
if dialog.ShowModal() == wx.ID_OK:
value = dialog.GetValues()
@@ -723,7 +723,7 @@
if self.GetDrawingMode() == FREEDRAWING_MODE:
Viewer.EditStepContent(self, step)
else:
- dialog = StepNameDialog(self.ParentWindow, _("Edit step name"), _("Please enter step name"), step.GetName(), wx.OK|wx.CANCEL)
+ 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.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
--- a/Viewer.py Tue Sep 15 15:02:23 2009 +0200
+++ b/Viewer.py Wed Sep 16 12:00:58 2009 +0200
@@ -33,7 +33,8 @@
from plcopen.structures import *
from PLCControler import ITEM_POU
-from Dialogs import *
+from dialogs import *
+from graphics import *
from types import TupleType
@@ -1712,7 +1713,7 @@
return width, height
def AddNewBlock(self, bbox):
- dialog = BlockPropertiesDialog(self.ParentWindow, self.Controler)
+ dialog = FBDBlockDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName, self.Debug))
dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
@@ -1742,9 +1743,9 @@
def AddNewVariable(self, bbox):
words = self.TagName.split("::")
if words[0] == "T":
- dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler, words[2])
+ dialog = FBDVariableDialog(self.ParentWindow, self.Controler, words[2])
else:
- dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
+ dialog = FBDVariableDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetMinVariableSize((bbox.width, bbox.height))
varlist = []
@@ -1773,7 +1774,7 @@
dialog.Destroy()
def AddNewConnection(self, bbox):
- dialog = ConnectionPropertiesDialog(self.ParentWindow, self.Controler)
+ dialog = ConnectionDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
dialog.SetPouElementNames(self.Controler.GetEditedElementVariables(self.TagName, self.Debug))
@@ -1891,7 +1892,7 @@
dialog.Destroy()
def AddNewStep(self, bbox, initial = False):
- dialog = StepContentDialog(self.ParentWindow, self.Controler, initial)
+ dialog = SFCStepDialog(self.ParentWindow, self.Controler, initial)
dialog.SetPreviewFont(self.GetFont())
dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
@@ -1926,7 +1927,7 @@
dialog.Destroy()
def AddNewTransition(self, bbox):
- dialog = TransitionContentDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
+ dialog = SFCTransitionDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
dialog.SetPreviewFont(self.GetFont())
dialog.SetTransitions(self.Controler.GetEditedElementTransitions(self.TagName, self.Debug))
if dialog.ShowModal() == wx.ID_OK:
@@ -1946,7 +1947,7 @@
dialog.Destroy()
def AddNewDivergence(self, bbox):
- dialog = DivergenceCreateDialog(self.ParentWindow, self.Controler)
+ dialog = SFCDivergenceDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetMinSize((bbox.width, bbox.height))
if dialog.ShowModal() == wx.ID_OK:
@@ -2013,7 +2014,7 @@
#-------------------------------------------------------------------------------
def EditBlockContent(self, block):
- dialog = BlockPropertiesDialog(self.ParentWindow, self.Controler)
+ dialog = FBDBlockDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName, self.Debug))
dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
@@ -2055,9 +2056,9 @@
def EditVariableContent(self, variable):
words = self.TagName.split("::")
if words[0] == "T":
- dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler, words[2])
+ dialog = FBDVariableDialog(self.ParentWindow, self.Controler, words[2])
else:
- dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
+ dialog = FBDVariableDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetMinVariableSize(variable.GetSize())
varlist = []
@@ -2095,7 +2096,7 @@
dialog.Destroy()
def EditConnectionContent(self, connection):
- dialog = ConnectionPropertiesDialog(self.ParentWindow, self.Controler)
+ dialog = ConnectionDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
dialog.SetPouElementNames(self.Controler.GetEditedElementVariables(self.TagName, self.Debug))
@@ -2201,7 +2202,7 @@
dialog.Destroy()
def EditStepContent(self, step):
- dialog = StepContentDialog(self.ParentWindow, self.Controler, step.GetInitial())
+ dialog = SFCStepDialog(self.ParentWindow, self.Controler, step.GetInitial())
dialog.SetPreviewFont(self.GetFont())
dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
@@ -2238,7 +2239,7 @@
step.Refresh(rect)
def EditTransitionContent(self, transition):
- dialog = TransitionContentDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
+ dialog = SFCTransitionDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
dialog.SetPreviewFont(self.GetFont())
dialog.SetTransitions(self.Controler.GetEditedElementTransitions(self.TagName, self.Debug))
dialog.SetValues({"type":transition.GetType(),"value":transition.GetCondition(), "priority":transition.GetPriority()})
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/ActionBlockDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,402 @@
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+import wx.grid
+
+#-------------------------------------------------------------------------------
+# Action Block Dialog
+#-------------------------------------------------------------------------------
+
+def GetActionTableColnames():
+ _ = lambda x: x
+ return [_("Qualifier"), _("Duration"), _("Type"), _("Value"), _("Indicator")]
+
+def GetTypeList():
+ _ = lambda x: x
+ return [_("Action"), _("Variable"), _("Inline")]
+
+class ActionTable(wx.grid.PyGridTableBase):
+
+ """
+ A custom wx.Grid Table using user supplied data
+ """
+ def __init__(self, parent, data, colnames):
+ # The base class must be initialized *first*
+ wx.grid.PyGridTableBase.__init__(self)
+ self.data = data
+ self.colnames = colnames
+ self.Parent = parent
+ # XXX
+ # we need to store the row length and collength to
+ # see if the table has changed size
+ self._rows = self.GetNumberRows()
+ self._cols = self.GetNumberCols()
+
+ def GetNumberCols(self):
+ return len(self.colnames)
+
+ def GetNumberRows(self):
+ return len(self.data)
+
+ def GetColLabelValue(self, col, translate=True):
+ if col < len(self.colnames):
+ colname = self.colnames[col]
+ if translate:
+ return _(colname)
+ return colname
+
+ def GetRowLabelValues(self, row, translate=True):
+ return row
+
+ def GetValue(self, row, col):
+ if row < self.GetNumberRows():
+ colname = self.GetColLabelValue(col, False)
+ name = str(self.data[row].get(colname, ""))
+ if colname == "Type":
+ return _(name)
+ 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, False)
+ if colname == "Type":
+ value = self.Parent.TranslateType[value]
+ self.data[row][colname] = value
+
+ def ResetView(self, grid):
+ """
+ (wx.Grid) -> Reset the grid view. Call this to
+ update the grid if rows and columns have been added or deleted
+ """
+ grid.BeginBatch()
+ for current, new, delmsg, addmsg in [
+ (self._rows, self.GetNumberRows(), wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED),
+ (self._cols, self.GetNumberCols(), wx.grid.GRIDTABLE_NOTIFY_COLS_DELETED, wx.grid.GRIDTABLE_NOTIFY_COLS_APPENDED),
+ ]:
+ if new < current:
+ msg = wx.grid.GridTableMessage(self,delmsg,new,current-new)
+ grid.ProcessTableMessage(msg)
+ elif new > current:
+ msg = wx.grid.GridTableMessage(self,addmsg,new-current)
+ grid.ProcessTableMessage(msg)
+ self.UpdateValues(grid)
+ grid.EndBatch()
+
+ self._rows = self.GetNumberRows()
+ self._cols = self.GetNumberCols()
+ # update the column rendering scheme
+ self._updateColAttrs(grid)
+
+ # update the scrollbars and the displayed part of the grid
+ grid.AdjustScrollbars()
+ grid.ForceRefresh()
+
+ def UpdateValues(self, grid):
+ """Update all displayed values"""
+ # This sends an event to the grid table to update all of the values
+ msg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
+ grid.ProcessTableMessage(msg)
+
+ def _updateColAttrs(self, grid):
+ """
+ wx.Grid -> update the column attributes to add the
+ appropriate renderer given the column name.
+
+ Otherwise default to the default renderer.
+ """
+
+ for row in range(self.GetNumberRows()):
+ for col in range(self.GetNumberCols()):
+ editor = None
+ renderer = None
+ readonly = False
+ colname = self.GetColLabelValue(col, False)
+ if colname == "Qualifier":
+ editor = wx.grid.GridCellChoiceEditor()
+ editor.SetParameters(self.Parent.QualifierList)
+ if colname == "Duration":
+ editor = wx.grid.GridCellTextEditor()
+ renderer = wx.grid.GridCellStringRenderer()
+ if self.Parent.DurationList[self.data[row]["Qualifier"]]:
+ readonly = False
+ else:
+ readonly = True
+ self.data[row]["Duration"] = ""
+ elif colname == "Type":
+ editor = wx.grid.GridCellChoiceEditor()
+ editor.SetParameters(self.Parent.TypeList)
+ elif colname == "Value":
+ type = self.data[row]["Type"]
+ if type == "Action":
+ editor = wx.grid.GridCellChoiceEditor()
+ editor.SetParameters(self.Parent.ActionList)
+ elif type == "Variable":
+ editor = wx.grid.GridCellChoiceEditor()
+ editor.SetParameters(self.Parent.VariableList)
+ elif type == "Inline":
+ editor = wx.grid.GridCellTextEditor()
+ renderer = wx.grid.GridCellStringRenderer()
+ elif colname == "Indicator":
+ editor = wx.grid.GridCellChoiceEditor()
+ editor.SetParameters(self.Parent.VariableList)
+
+ grid.SetCellEditor(row, col, editor)
+ grid.SetCellRenderer(row, col, renderer)
+ grid.SetReadOnly(row, col, readonly)
+
+ grid.SetCellBackgroundColour(row, col, wx.WHITE)
+
+ def SetData(self, data):
+ self.data = data
+
+ def GetData(self):
+ return self.data
+
+ def GetCurrentIndex(self):
+ return self.CurrentIndex
+
+ def SetCurrentIndex(self, index):
+ self.CurrentIndex = index
+
+ def AppendRow(self, row_content):
+ self.data.append(row_content)
+
+ def RemoveRow(self, row_index):
+ self.data.pop(row_index)
+
+ def MoveRow(self, row_index, move, grid):
+ new_index = max(0, min(row_index + move, len(self.data) - 1))
+ if new_index != row_index:
+ self.data.insert(new_index, self.data.pop(row_index))
+ grid.SetGridCursor(new_index, grid.GetGridCursorCol())
+
+ def Empty(self):
+ self.data = []
+ self.editors = []
+
+[ID_ACTIONBLOCKDIALOG, ID_ACTIONBLOCKDIALOGVARIABLESGRID,
+ ID_ACTIONBLOCKDIALOGSTATICTEXT1, ID_ACTIONBLOCKDIALOGADDBUTTON,
+ ID_ACTIONBLOCKDIALOGDELETEBUTTON, ID_ACTIONBLOCKDIALOGUPBUTTON,
+ ID_ACTIONBLOCKDIALOGDOWNBUTTON,
+] = [wx.NewId() for _init_ctrls in range(7)]
+
+class ActionBlockDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.TopSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.GridButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_TopSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.ActionsGrid, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_TopSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_coll_GridButtonSizer_Items(self, parent):
+ parent.AddWindow(self.AddButton, 0, border=10, flag=wx.GROW|wx.LEFT)
+ parent.AddWindow(self.DeleteButton, 0, border=10, flag=wx.GROW|wx.LEFT)
+ parent.AddWindow(self.UpButton, 0, border=10, flag=wx.GROW|wx.LEFT)
+ parent.AddWindow(self.DownButton, 0, border=10, flag=wx.GROW|wx.LEFT)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
+ self.TopSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+ self.GridButtonSizer = wx.BoxSizer(wx.HORIZONTAL)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_TopSizer_Items(self.TopSizer)
+ self._init_coll_TopSizer_Growables(self.TopSizer)
+ self._init_coll_GridButtonSizer_Items(self.GridButtonSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt):
+ wx.Dialog.__init__(self, id=ID_ACTIONBLOCKDIALOG,
+ name='ActionBlockDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(500, 300), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
+ title=_('Edit action block properties'))
+ self.SetClientSize(wx.Size(500, 300))
+
+ self.staticText1 = wx.StaticText(id=ID_ACTIONBLOCKDIALOGSTATICTEXT1,
+ label=_('Actions:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.ActionsGrid = wx.grid.Grid(id=ID_ACTIONBLOCKDIALOGVARIABLESGRID,
+ name='ActionsGrid', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.VSCROLL)
+ self.ActionsGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
+ 'Sans'))
+ self.ActionsGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
+ False, 'Sans'))
+ self.ActionsGrid.DisableDragGridSize()
+ self.ActionsGrid.EnableScrolling(False, True)
+ self.ActionsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnActionsGridCellChange)
+
+ self.AddButton = wx.Button(id=ID_ACTIONBLOCKDIALOGADDBUTTON, label=_('Add'),
+ name='AddButton', parent=self, pos=wx.Point(0, 0),
+ size=wx.DefaultSize, style=0)
+ self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_ACTIONBLOCKDIALOGADDBUTTON)
+
+ self.DeleteButton = wx.Button(id=ID_ACTIONBLOCKDIALOGDELETEBUTTON, label=_('Delete'),
+ name='DeleteButton', parent=self, pos=wx.Point(0, 0),
+ size=wx.DefaultSize, style=0)
+ self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_ACTIONBLOCKDIALOGDELETEBUTTON)
+
+ self.UpButton = wx.Button(id=ID_ACTIONBLOCKDIALOGUPBUTTON, label='^',
+ name='UpButton', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(32, 32), style=0)
+ self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_ACTIONBLOCKDIALOGUPBUTTON)
+
+ self.DownButton = wx.Button(id=ID_ACTIONBLOCKDIALOGDOWNBUTTON, label='v',
+ name='DownButton', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(32, 32), style=0)
+ self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_ACTIONBLOCKDIALOGDOWNBUTTON)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+ if wx.VERSION >= (2, 5, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+
+ self._init_sizers()
+
+ def __init__(self, parent):
+ self._init_ctrls(parent)
+
+ self.DefaultValue = {"Qualifier" : "N", "Duration" : "", "Type" : "Action", "Value" : "", "Indicator" : ""}
+ self.Table = ActionTable(self, [], GetActionTableColnames())
+ typelist = GetTypeList()
+ self.TypeList = ",".join(map(_,typelist))
+ self.TranslateType = dict([(_(value), value) for value in typelist])
+ self.ColSizes = [60, 90, 80, 110, 80]
+ self.ColAlignements = [wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
+
+ self.ActionsGrid.SetTable(self.Table)
+ self.ActionsGrid.SetRowLabelSize(0)
+
+ for col in range(self.Table.GetNumberCols()):
+ attr = wx.grid.GridCellAttr()
+ attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
+ self.ActionsGrid.SetColAttr(col, attr)
+ self.ActionsGrid.SetColMinimalWidth(col, self.ColSizes[col])
+ self.ActionsGrid.AutoSizeColumn(col, False)
+
+ self.Table.ResetView(self.ActionsGrid)
+
+ def OnOK(self, event):
+ self.ActionsGrid.SetGridCursor(0, 0)
+ self.EndModal(wx.ID_OK)
+
+ def OnAddButton(self, event):
+ self.Table.AppendRow(self.DefaultValue.copy())
+ self.Table.ResetView(self.ActionsGrid)
+ event.Skip()
+
+ def OnDeleteButton(self, event):
+ row = self.ActionsGrid.GetGridCursorRow()
+ self.Table.RemoveRow(row)
+ self.Table.ResetView(self.ActionsGrid)
+ event.Skip()
+
+ def OnUpButton(self, event):
+ row = self.ActionsGrid.GetGridCursorRow()
+ self.Table.MoveRow(row, -1, self.ActionsGrid)
+ self.Table.ResetView(self.ActionsGrid)
+ event.Skip()
+
+ def OnDownButton(self, event):
+ row = self.ActionsGrid.GetGridCursorRow()
+ self.Table.MoveRow(row, 1, self.ActionsGrid)
+ self.Table.ResetView(self.ActionsGrid)
+ event.Skip()
+
+ def OnActionsGridCellChange(self, event):
+ self.Table.ResetView(self.ActionsGrid)
+ event.Skip()
+
+ def SetQualifierList(self, list):
+ self.QualifierList = "," + ",".join(list)
+ self.DurationList = list
+
+ def SetVariableList(self, list):
+ self.VariableList = "," + ",".join([variable["Name"] for variable in list])
+
+ def SetActionList(self, list):
+ self.ActionList = "," + ",".join(list)
+
+ def SetValues(self, actions):
+ for action in actions:
+ row = {"Qualifier" : action["qualifier"], "Value" : action["value"]}
+ if action["type"] == "reference":
+ if action["value"] in self.ActionList:
+ row["Type"] = "Action"
+ elif action["value"] in self.VariableList:
+ row["Type"] = "Variable"
+ else:
+ row["Type"] = "Inline"
+ else:
+ row["Type"] = "Inline"
+ if "duration" in action:
+ row["Duration"] = action["duration"]
+ else:
+ row["Duration"] = ""
+ if "indicator" in action:
+ row["Indicator"] = action["indicator"]
+ else:
+ row["Indicator"] = ""
+ self.Table.AppendRow(row)
+ self.Table.ResetView(self.ActionsGrid)
+
+ def GetValues(self):
+ values = []
+ for data in self.Table.GetData():
+ action = {"qualifier" : data["Qualifier"], "value" : data["Value"]}
+ if data["Type"] in ["Action", "Variable"]:
+ action["type"] = "reference"
+ else:
+ action["type"] = "inline"
+ if data["Duration"] != "":
+ action["duration"] = data["Duration"]
+ if data["Indicator"] != "":
+ action["indicator"] = data["Indicator"]
+ values.append(action)
+ return values
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/ConnectionDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,249 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+#-------------------------------------------------------------------------------
+# Create New Connection Dialog
+#-------------------------------------------------------------------------------
+
+[ID_CONNECTIONDIALOG, ID_CONNECTIONDIALOGSPACER,
+ ID_CONNECTIONDIALOGNAME, ID_CONNECTIONDIALOGRADIOBUTTON1,
+ ID_CONNECTIONDIALOGRADIOBUTTON2, ID_CONNECTIONDIALOGPREVIEW,
+ ID_CONNECTIONDIALOGSTATICTEXT1, ID_CONNECTIONDIALOGSTATICTEXT2,
+ ID_CONNECTIONDIALOGSTATICTEXT3,
+] = [wx.NewId() for _init_ctrls in range(9)]
+
+class ConnectionDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.ConnectionName, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_LeftGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(5)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=5)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+ self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt, ctrler):
+ wx.Dialog.__init__(self, id=ID_CONNECTIONDIALOG,
+ name='ConnectionDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(350, 220), style=wx.DEFAULT_DIALOG_STYLE,
+ title=_('Connection Properties'))
+ self.SetClientSize(wx.Size(350, 220))
+
+ self.staticText1 = wx.StaticText(id=ID_CONNECTIONDIALOGSTATICTEXT1,
+ label=_('Type:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText2 = wx.StaticText(id=ID_CONNECTIONDIALOGSTATICTEXT2,
+ label=_('Name:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText3 = wx.StaticText(id=ID_CONNECTIONDIALOGSTATICTEXT3,
+ label=_('Preview:'), name='staticText3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.radioButton1 = wx.RadioButton(id=ID_CONNECTIONDIALOGRADIOBUTTON1,
+ label=_('Connector'), name='radioButton1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_CONNECTIONDIALOGRADIOBUTTON1)
+ self.radioButton1.SetValue(True)
+
+ self.radioButton2 = wx.RadioButton(id=ID_CONNECTIONDIALOGRADIOBUTTON2,
+ label=_('Continuation'), name='radioButton2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_CONNECTIONDIALOGRADIOBUTTON2)
+ self.radioButton2.SetValue(False)
+
+ self.ConnectionName = wx.TextCtrl(id=ID_CONNECTIONDIALOGNAME,
+ name='Name', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_CONNECTIONDIALOGNAME)
+
+ self.Preview = wx.Panel(id=ID_CONNECTIONDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "GetScaling", lambda:None)
+ setattr(self.Preview, "IsOfType", ctrler.IsOfType)
+
+ self.Spacer = wx.Panel(id=ID_CONNECTIONDIALOGSPACER,
+ name='Spacer', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+ if wx.VERSION >= (2, 5, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler):
+ self._init_ctrls(parent, controler)
+ self.Connection = None
+ self.MinConnectionSize = None
+
+ self.PouNames = []
+ self.PouElementNames = []
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def SetMinConnectionSize(self, size):
+ self.MinConnectionSize = size
+
+ def SetValues(self, values):
+ for name, value in values.items():
+ if name == "type":
+ if value == CONNECTOR:
+ self.radioButton1.SetValue(True)
+ elif value == CONTINUATION:
+ self.radioButton2.SetValue(True)
+ elif name == "name":
+ self.ConnectionName.SetValue(value)
+ self.RefreshPreview()
+
+ def GetValues(self):
+ values = {}
+ if self.radioButton1.GetValue():
+ values["type"] = CONNECTOR
+ else:
+ values["type"] = CONTINUATION
+ values["name"] = self.ConnectionName.GetValue()
+ values["width"], values["height"] = self.Connection.GetSize()
+ return values
+
+ def SetPouNames(self, pou_names):
+ self.PouNames = [pou_name.upper() for pou_name in pou_names]
+
+ def SetPouElementNames(self, element_names):
+ self.PouElementNames = [element_name.upper() for element_name in element_names]
+
+ def OnOK(self, event):
+ connection_name = self.ConnectionName.GetValue()
+ if connection_name == "":
+ message = wx.MessageDialog(self, _("Form isn't complete. Name must be filled!"), _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif not TestIdentifier(connection_name):
+ message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif connection_name.upper() in IEC_KEYWORDS:
+ message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif connection_name.upper() in self.PouNames:
+ message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif connection_name.upper() in self.PouElementNames:
+ message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%connection_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ else:
+ self.EndModal(wx.ID_OK)
+
+ def OnTypeChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnNameChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ if self.radioButton1.GetValue():
+ self.Connection = FBD_Connector(self.Preview, CONNECTOR, self.ConnectionName.GetValue())
+ else:
+ self.Connection = FBD_Connector(self.Preview, CONTINUATION, self.ConnectionName.GetValue())
+ width, height = self.MinConnectionSize
+ min_width, min_height = self.Connection.GetMinSize()
+ width, height = max(min_width, width), max(min_height, height)
+ self.Connection.SetSize(width, height)
+ clientsize = self.Preview.GetClientSize()
+ x = (clientsize.width - width) / 2
+ y = (clientsize.height - height) / 2
+ self.Connection.SetPosition(x, y)
+ self.Connection.Draw(dc)
+
+ def OnPaint(self, event):
+ self.RefreshPreview()
+ event.Skip()
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/FBDBlockDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,410 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+#-------------------------------------------------------------------------------
+# Create New Block Dialog
+#-------------------------------------------------------------------------------
+
+[ID_FBDBLOCKDIALOG, ID_FBDBLOCKDIALOGNAME,
+ ID_FBDBLOCKDIALOGTYPETREE, ID_FBDBLOCKDIALOGTYPEDESC,
+ ID_FBDBLOCKDIALOGINPUTS, ID_FBDBLOCKDIALOGPREVIEW,
+ ID_FBDBLOCKDIALOGEXECUTIONORDER, ID_FBDBLOCKDIALOGEXECUTIONCONTROL,
+ ID_FBDBLOCKDIALOGSTATICTEXT1, ID_FBDBLOCKDIALOGSTATICTEXT2,
+ ID_FBDBLOCKDIALOGSTATICTEXT3, ID_FBDBLOCKDIALOGSTATICTEXT4,
+ ID_FBDBLOCKDIALOGSTATICTEXT5, ID_FBDBLOCKDIALOGSTATICTEXT6,
+] = [wx.NewId() for _init_ctrls in range(14)]
+
+[CATEGORY, BLOCK] = range(2)
+
+class FBDBlockDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.LeftBoxSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftBoxSizer_Items(self, parent):
+ parent.AddWindow(self.TypeTree, 3, border=5, flag=wx.GROW|wx.BOTTOM)
+ parent.AddWindow(self.TypeDesc, 1, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddSizer(self.RightUpGridSizer, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText6, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(2)
+
+ def _init_coll_RightUpGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+ parent.AddWindow(self.BlockName, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText3, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+ parent.AddWindow(self.Inputs, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText4, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+ parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText5, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+ parent.AddWindow(self.ExecutionControl, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightUpGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftBoxSizer = wx.StaticBoxSizer(self.staticbox1, wx.VERTICAL)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
+ self.RightUpGridSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=4, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_LeftBoxSizer_Items(self.LeftBoxSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+ self._init_coll_RightUpGridSizer_Items(self.RightUpGridSizer)
+ self._init_coll_RightUpGridSizer_Growables(self.RightUpGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt):
+ wx.Dialog.__init__(self, id=ID_FBDBLOCKDIALOG,
+ name='FBDBlockDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(600, 400), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
+ title=_('Block Properties'))
+ self.SetClientSize(wx.Size(600, 400))
+
+ self.staticbox1 = wx.StaticBox(id=ID_FBDBLOCKDIALOGSTATICTEXT1,
+ label=_('Type:'), name='staticBox1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
+
+ self.staticText2 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT2,
+ label=_('Name:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
+ self.staticText3 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT2,
+ label=_('Inputs:'), name='staticText4', parent=self,
+ pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
+ self.staticText4 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT4,
+ label=_('Execution Order:'), name='staticText4', parent=self,
+ pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
+ self.staticText5 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT5,
+ label=_('Execution Control:'), name='staticText5', parent=self,
+ pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
+ self.staticText6 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT6,
+ label=_('Preview:'), name='staticText6', parent=self,
+ pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
+ if wx.Platform == '__WXMSW__':
+ treestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
+ else:
+ treestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
+ self.TypeTree = wx.TreeCtrl(id=ID_FBDBLOCKDIALOGTYPETREE,
+ name='TypeTree', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=treestyle)
+ self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypeTreeItemSelected,
+ id=ID_FBDBLOCKDIALOGTYPETREE)
+
+ self.TypeDesc = wx.TextCtrl(id=ID_FBDBLOCKDIALOGTYPEDESC,
+ name='TypeDesc', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TE_READONLY|wx.TE_MULTILINE)
+
+ self.BlockName = wx.TextCtrl(id=ID_FBDBLOCKDIALOGNAME, value='',
+ name='BlockName', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_FBDBLOCKDIALOGNAME)
+
+ self.Inputs = wx.SpinCtrl(id=ID_FBDBLOCKDIALOGINPUTS,
+ name='Inputs', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=2, max=20)
+ self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, id=ID_FBDBLOCKDIALOGINPUTS)
+
+ self.ExecutionOrder = wx.SpinCtrl(id=ID_FBDBLOCKDIALOGEXECUTIONORDER,
+ name='ExecutionOrder', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
+ self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, id=ID_FBDBLOCKDIALOGEXECUTIONORDER)
+
+ self.ExecutionControl = wx.CheckBox(id=ID_FBDBLOCKDIALOGEXECUTIONCONTROL,
+ name='ExecutionControl', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, id=ID_FBDBLOCKDIALOGEXECUTIONCONTROL)
+
+ self.Preview = wx.Panel(id=ID_FBDBLOCKDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "GetScaling", lambda:None)
+ setattr(self.Preview, "GetBlockType", self.Controler.GetBlockType)
+ setattr(self.Preview, "IsOfType", self.Controler.IsOfType)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+ if wx.VERSION >= (2, 5, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler):
+ self.Controler = controler
+ self._init_ctrls(parent)
+ self.BlockName.SetValue("")
+ self.BlockName.Enable(False)
+ self.Inputs.Enable(False)
+ self.Block = None
+ self.MinBlockSize = None
+ self.First = True
+
+ self.PouNames = []
+ self.PouElementNames = []
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def FindTreeItem(self, root, name, inputs = None):
+ if root.IsOk():
+ pydata = self.TypeTree.GetPyData(root)
+ type_inputs = pydata.get("inputs", None)
+ type_extension = pydata.get("extension", None)
+ if inputs is not None and type_inputs is not None:
+ if type_extension is not None:
+ same_inputs = type_inputs == inputs[:type_extension]
+ else:
+ same_inputs = type_inputs == inputs
+ else:
+ same_inputs = True
+ if self.TypeTree.GetItemText(root) == name and same_inputs:
+ return root
+ else:
+ if wx.VERSION < (2, 6, 0):
+ item, root_cookie = self.TypeTree.GetFirstChild(root, 0)
+ else:
+ item, root_cookie = self.TypeTree.GetFirstChild(root)
+ while item.IsOk():
+ result = self.FindTreeItem(item, name, inputs)
+ if result:
+ return result
+ item, root_cookie = self.TypeTree.GetNextChild(root, root_cookie)
+ return None
+
+ def OnOK(self, event):
+ selected = self.TypeTree.GetSelection()
+ block_name = self.BlockName.GetValue()
+ name_enabled = self.BlockName.IsEnabled()
+ if not selected.IsOk() or self.TypeTree.GetItemParent(selected) == self.TypeTree.GetRootItem() or selected == self.TypeTree.GetRootItem():
+ message = wx.MessageDialog(self, _("Form isn't complete. Valid block type must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif name_enabled and block_name == "":
+ message = wx.MessageDialog(self, _("Form isn't complete. Name must be filled!"), _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif name_enabled and not TestIdentifier(block_name):
+ message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif name_enabled and block_name.upper() in IEC_KEYWORDS:
+ message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif name_enabled and block_name.upper() in self.PouNames:
+ message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif name_enabled and block_name.upper() in self.PouElementNames:
+ message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ else:
+ self.EndModal(wx.ID_OK)
+
+ def SetBlockList(self, blocktypes):
+ if wx.Platform == '__WXMSW__':
+ root = self.TypeTree.AddRoot(_("Block Types"))
+ else:
+ root = self.TypeTree.AddRoot("")
+ self.TypeTree.SetPyData(root, {"type" : CATEGORY})
+ for category in blocktypes:
+ category_name = category["name"]
+ category_item = self.TypeTree.AppendItem(root, _(category_name))
+ self.TypeTree.SetPyData(category_item, {"type" : CATEGORY})
+ for blocktype in category["list"]:
+ blocktype_item = self.TypeTree.AppendItem(category_item, blocktype["name"])
+ block_data = {"type" : BLOCK,
+ "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]]),
+ "extension" : None}
+ if blocktype["extensible"]:
+ block_data["extension"] = len(blocktype["inputs"])
+ self.TypeTree.SetPyData(blocktype_item, block_data)
+ if wx.Platform == '__WXMSW__':
+ self.TypeTree.Expand(root)
+
+ def SetMinBlockSize(self, size):
+ self.MinBlockSize = size
+
+ def SetPouNames(self, pou_names):
+ self.PouNames = [pou_name.upper() for pou_name in pou_names]
+
+ def SetPouElementNames(self, element_names):
+ self.PouElementNames = [element_name.upper() for element_name in element_names]
+
+ def SetValues(self, values):
+ blocktype = values.get("type", None)
+ if blocktype is not None:
+ inputs = values.get("inputs", None)
+ item = self.FindTreeItem(self.TypeTree.GetRootItem(), blocktype, inputs)
+ if item:
+ self.TypeTree.SelectItem(item)
+ for name, value in values.items():
+ if name == "name":
+ self.BlockName.SetValue(value)
+ elif name == "extension":
+ self.Inputs.SetValue(value)
+ elif name == "executionOrder":
+ self.ExecutionOrder.SetValue(value)
+ elif name == "executionControl":
+ self.ExecutionControl.SetValue(value)
+ self.RefreshPreview()
+
+ def GetValues(self):
+ values = {}
+ item = self.TypeTree.GetSelection()
+ values["type"] = self.TypeTree.GetItemText(item)
+ values["inputs"] = self.TypeTree.GetPyData(item)["inputs"]
+ if self.BlockName.GetValue() != "":
+ values["name"] = self.BlockName.GetValue()
+ values["width"], values["height"] = self.Block.GetSize()
+ values["extension"] = self.Inputs.GetValue()
+ values["executionOrder"] = self.ExecutionOrder.GetValue()
+ values["executionControl"] = self.ExecutionControl.GetValue()
+ return values
+
+ def OnTypeTreeItemSelected(self, event):
+ self.BlockName.SetValue("")
+ selected = event.GetItem()
+ pydata = self.TypeTree.GetPyData(selected)
+ if pydata["type"] != CATEGORY:
+ blocktype = self.Controler.GetBlockType(self.TypeTree.GetItemText(selected), pydata["inputs"])
+ if blocktype:
+ self.Inputs.SetValue(len(blocktype["inputs"]))
+ self.Inputs.Enable(blocktype["extensible"])
+ self.BlockName.Enable(blocktype["type"] != "function")
+ comment = blocktype["comment"]
+ self.TypeDesc.SetValue(_(comment) + blocktype.get("usage", ""))
+ wx.CallAfter(self.RefreshPreview)
+ else:
+ self.BlockName.Enable(False)
+ self.Inputs.Enable(False)
+ self.Inputs.SetValue(2)
+ self.TypeDesc.SetValue("")
+ wx.CallAfter(self.ErasePreview)
+ else:
+ self.BlockName.Enable(False)
+ self.Inputs.Enable(False)
+ self.Inputs.SetValue(2)
+ self.TypeDesc.SetValue("")
+ wx.CallAfter(self.ErasePreview)
+ event.Skip()
+
+ def OnNameChanged(self, event):
+ if self.BlockName.IsEnabled():
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnInputsChanged(self, event):
+ if self.Inputs.IsEnabled():
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnExecutionOrderChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnExecutionControlChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def ErasePreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.Clear()
+ self.Block = None
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ item = self.TypeTree.GetSelection()
+ if item.IsOk():
+ pydata = self.TypeTree.GetPyData(item)
+ if pydata["type"] == CATEGORY:
+ self.Block = None
+ else:
+ blocktype = self.TypeTree.GetItemText(item)
+ if blocktype:
+ self.Block = FBD_Block(self.Preview, blocktype,
+ self.BlockName.GetValue(),
+ extension = self.Inputs.GetValue(),
+ inputs = pydata["inputs"],
+ executionControl = self.ExecutionControl.GetValue(),
+ executionOrder = self.ExecutionOrder.GetValue())
+ width, height = self.MinBlockSize
+ min_width, min_height = self.Block.GetMinSize()
+ width, height = max(min_width, width), max(min_height, height)
+ self.Block.SetSize(width, height)
+ clientsize = self.Preview.GetClientSize()
+ x = (clientsize.width - width) / 2
+ y = (clientsize.height - height) / 2
+ self.Block.SetPosition(x, y)
+ self.Block.Draw(dc)
+ else:
+ self.Block = None
+
+ def OnPaint(self, event):
+ if self.Block is not None:
+ self.RefreshPreview()
+ event.Skip()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/FBDVariableDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,326 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+#-------------------------------------------------------------------------------
+# Create New Variable Dialog
+#-------------------------------------------------------------------------------
+
+[ID_FBDVARIABLEDIALOG, ID_FBDVARIABLEDIALOGSPACER,
+ ID_FBDVARIABLEDIALOGNAME, ID_FBDVARIABLEDIALOGCLASS,
+ ID_FBDVARIABLEDIALOGPREVIEW, ID_FBDVARIABLEDIALOGEXPRESSION,
+ ID_FBDVARIABLEDIALOGEXECUTIONORDER, ID_FBDVARIABLEDIALOGSTATICTEXT1,
+ ID_FBDVARIABLEDIALOGSTATICTEXT2, ID_FBDVARIABLEDIALOGSTATICTEXT3,
+ ID_FBDVARIABLEDIALOGSTATICTEXT4, ID_FBDVARIABLEDIALOGSTATICTEXT5
+] = [wx.NewId() for _init_ctrls in range(12)]
+
+VARIABLE_CLASSES_DICT = {INPUT : _("Input"),
+ INOUT : _("InOut"),
+ OUTPUT : _("Output")}
+VARIABLE_CLASSES_DICT_REVERSE = dict([(value, key) for key, value in VARIABLE_CLASSES_DICT.iteritems()])
+
+class FBDVariableDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.TopSizer, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText5, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_MainSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(2)
+
+ def _init_coll_TopSizer_Items(self, parent):
+ parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Class, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Expression, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_LeftGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(2)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText4, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.VariableName, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
+ self.TopSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=7, vgap=5)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_MainSizer_Growables(self.MainSizer)
+ self._init_coll_TopSizer_Items(self.TopSizer)
+ self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+ self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt, ctrler):
+ wx.Dialog.__init__(self, id=ID_FBDVARIABLEDIALOG,
+ name='FBDVariableDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(400, 380), style=wx.DEFAULT_DIALOG_STYLE,
+ title=_('Variable Properties'))
+ self.SetClientSize(wx.Size(400, 380))
+
+ self.staticText1 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT1,
+ label=_('Class:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText2 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT2,
+ label=_('Expression:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText3 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT3,
+ label=_('Execution Order:'), name='staticText3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText4 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT4,
+ label=_('Name:'), name='staticText4', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText5 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT5,
+ label=_('Preview:'), name='staticText5', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.Class = wx.ComboBox(id=ID_FBDVARIABLEDIALOGCLASS,
+ name='Class', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 28), style=wx.CB_READONLY)
+ self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, id=ID_FBDVARIABLEDIALOGCLASS)
+
+ self.VariableName = wx.ListBox(id=ID_FBDVARIABLEDIALOGNAME,
+ name='Name', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 90), style=wx.LB_SINGLE|wx.LB_SORT)
+ self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, id=ID_FBDVARIABLEDIALOGNAME)
+
+ self.Expression = wx.TextCtrl(id=ID_FBDVARIABLEDIALOGEXPRESSION,
+ name='Expression', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, id=ID_FBDVARIABLEDIALOGEXPRESSION)
+
+ self.ExecutionOrder = wx.SpinCtrl(id=ID_FBDVARIABLEDIALOGEXECUTIONORDER,
+ name='ExecutionOrder', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
+ self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, id=ID_FBDVARIABLEDIALOGEXECUTIONORDER)
+
+ self.Spacer = wx.Panel(id=ID_FBDVARIABLEDIALOGSPACER,
+ name='Spacer', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+ self.Preview = wx.Panel(id=ID_FBDVARIABLEDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "GetScaling", lambda:None)
+ setattr(self.Preview, "IsOfType", ctrler.IsOfType)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+ if wx.VERSION >= (2, 5, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler, transition = ""):
+ self._init_ctrls(parent, controler)
+ self.Transition = transition
+ self.Variable = None
+ self.VarList = []
+ self.MinVariableSize = None
+
+ for choice in VARIABLE_CLASSES_DICT.itervalues():
+ self.Class.Append(choice)
+ self.Class.SetStringSelection(VARIABLE_CLASSES_DICT[INPUT])
+
+ self.RefreshNameList()
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def RefreshNameList(self):
+ selected = self.VariableName.GetStringSelection()
+ var_class = VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()]
+ self.VariableName.Clear()
+ self.VariableName.Append("")
+ for name, var_type, value_type in self.VarList:
+ if var_type != "Input" or var_class == INPUT:
+ self.VariableName.Append(name)
+ if selected != "" and self.VariableName.FindString(selected) != wx.NOT_FOUND:
+ self.VariableName.SetStringSelection(selected)
+ self.Expression.Enable(False)
+ else:
+ self.VariableName.SetStringSelection("")
+ self.Expression.Enable(var_class == INPUT)
+ self.VariableName.Enable(self.VariableName.GetCount() > 0)
+
+ def SetMinVariableSize(self, size):
+ self.MinVariableSize = size
+
+ def SetVariables(self, vars):
+ self.VarList = vars
+ self.RefreshNameList()
+
+ def SetValues(self, values):
+ value_type = values.get("type", None)
+ value_name = values.get("name", None)
+ if value_type:
+ self.Class.SetStringSelection(VARIABLE_CLASSES_DICT[value_type])
+ self.RefreshNameList()
+ if value_name:
+ if self.VariableName.FindString(value_name) != wx.NOT_FOUND:
+ self.VariableName.SetStringSelection(value_name)
+ self.Expression.Enable(False)
+ else:
+ self.Expression.SetValue(value_name)
+ self.VariableName.Enable(False)
+ if "executionOrder" in values:
+ self.ExecutionOrder.SetValue(values["executionOrder"])
+ self.RefreshPreview()
+
+ def GetValues(self):
+ values = {}
+ values["type"] = VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()]
+ expression = self.Expression.GetValue()
+ if self.Expression.IsEnabled() and expression != "":
+ values["name"] = expression
+ else:
+ values["name"] = self.VariableName.GetStringSelection()
+ values["value_type"] = None
+ for var_name, var_type, value_type in self.VarList:
+ if var_name == values["name"]:
+ values["value_type"] = value_type
+ values["width"], values["height"] = self.Variable.GetSize()
+ values["executionOrder"] = self.ExecutionOrder.GetValue()
+ return values
+
+ def OnOK(self, event):
+ expression = self.Expression.GetValue()
+ if self.Expression.IsEnabled():
+ value = expression
+ else:
+ value = self.VariableName.GetStringSelection()
+ if value == "":
+ message = wx.MessageDialog(self, _("At least a variable or an expression must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ 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()
+ else:
+ self.EndModal(wx.ID_OK)
+
+ def OnClassChanged(self, event):
+ self.RefreshNameList()
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnNameChanged(self, event):
+ if self.VariableName.GetStringSelection() != "":
+ self.Expression.Enable(False)
+ elif VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()] == INPUT:
+ self.Expression.Enable(True)
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnExpressionChanged(self, event):
+ if self.Expression.GetValue() != "":
+ self.VariableName.Enable(False)
+ else:
+ self.VariableName.Enable(True)
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnExecutionOrderChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ expression = self.Expression.GetValue()
+ if self.Expression.IsEnabled() and expression != "":
+ name = expression
+ else:
+ name = self.VariableName.GetStringSelection()
+ type = ""
+ for var_name, var_type, value_type in self.VarList:
+ if var_name == name:
+ type = value_type
+ classtype = VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()]
+ self.Variable = FBD_Variable(self.Preview, classtype, name, type, executionOrder = self.ExecutionOrder.GetValue())
+ width, height = self.MinVariableSize
+ min_width, min_height = self.Variable.GetMinSize()
+ width, height = max(min_width, width), max(min_height, height)
+ self.Variable.SetSize(width, height)
+ clientsize = self.Preview.GetClientSize()
+ x = (clientsize.width - width) / 2
+ y = (clientsize.height - height) / 2
+ self.Variable.SetPosition(x, y)
+ self.Variable.Draw(dc)
+
+ def OnPaint(self, event):
+ self.RefreshPreview()
+ event.Skip()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/LDElementDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,290 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+#-------------------------------------------------------------------------------
+# Edit Ladder Element Properties Dialog
+#-------------------------------------------------------------------------------
+
+
+[ID_LDELEMENTDIALOG, ID_LDELEMENTDIALOGSPACER,
+ ID_LDELEMENTDIALOGNAME, ID_LDELEMENTDIALOGRADIOBUTTON1,
+ ID_LDELEMENTDIALOGRADIOBUTTON2, ID_LDELEMENTDIALOGRADIOBUTTON3,
+ ID_LDELEMENTDIALOGRADIOBUTTON4, ID_LDELEMENTDIALOGRADIOBUTTON5,
+ ID_LDELEMENTDIALOGRADIOBUTTON6, ID_LDELEMENTDIALOGPREVIEW,
+ ID_LDELEMENTDIALOGSTATICTEXT1, ID_LDELEMENTDIALOGSTATICTEXT2,
+ ID_LDELEMENTDIALOGSTATICTEXT3,
+] = [wx.NewId() for _init_ctrls in range(13)]
+
+class LDElementDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddSizer(self.RadioButtonSizer, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.ElementName, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_LeftGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(7)
+
+ def _init_coll_RadioButtonSizer_Items(self, parent):
+ parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton4, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton5, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton6, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=5)
+ self.RadioButtonSizer = wx.BoxSizer(wx.VERTICAL)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+ self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+ self._init_coll_RadioButtonSizer_Items(self.RadioButtonSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt, ctrler, title, extra_size = 0):
+ wx.Dialog.__init__(self, id=ID_LDELEMENTDIALOG,
+ name='LDElementDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(350, 260 + extra_size), style=wx.DEFAULT_DIALOG_STYLE,
+ title=title)
+ self.SetClientSize(wx.Size(350, 260 + extra_size))
+
+ self.staticText1 = wx.StaticText(id=ID_LDELEMENTDIALOGSTATICTEXT1,
+ label=_('Modifier:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText2 = wx.StaticText(id=ID_LDELEMENTDIALOGSTATICTEXT2,
+ label=_('Name:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText3 = wx.StaticText(id=ID_LDELEMENTDIALOGSTATICTEXT3,
+ label=_('Preview:'), name='staticText3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.radioButton1 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON1,
+ label=_("Normal"), name='radioButton1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON1)
+ self.radioButton1.SetValue(True)
+
+ self.radioButton2 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON2,
+ label=_("Negated"), name='radioButton2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON2)
+
+ self.radioButton3 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON3,
+ label=_("Set"), name='radioButton3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON3)
+
+ self.radioButton4 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON4,
+ label=_("Reset"), name='radioButton4', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON4)
+
+ self.radioButton5 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON5,
+ label=_("Rising Edge"), name='radioButton5', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON5)
+
+ self.radioButton6 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON6,
+ label=_("Falling Edge"), name='radioButton6', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON6)
+
+ self.ElementName = wx.ComboBox(id=ID_LDELEMENTDIALOGNAME,
+ name='Name', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 28), style=wx.CB_READONLY)
+ self.Bind(wx.EVT_COMBOBOX, self.OnNameChanged, id=ID_LDELEMENTDIALOGNAME)
+
+ self.Preview = wx.Panel(id=ID_LDELEMENTDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "GetScaling", lambda:None)
+ setattr(self.Preview, "IsOfType", ctrler.IsOfType)
+
+ self.Spacer = wx.Panel(id=ID_LDELEMENTDIALOGSPACER,
+ name='Spacer', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+
+ if wx.VERSION >= (2, 5, 0):
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler, type):
+ self.Type = type
+ if type == "contact":
+ self._init_ctrls(parent, controler, _("Edit Contact Values"))
+ self.Element = LD_Contact(self.Preview, CONTACT_NORMAL, "")
+ self.radioButton3.Hide()
+ self.radioButton4.Hide()
+ elif type == "coil":
+ self._init_ctrls(parent, controler, _("Edit Coil Values"), 50)
+ self.Element = LD_Coil(self.Preview, COIL_NORMAL, "")
+
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def SetElementSize(self, size):
+ min_width, min_height = self.Element.GetMinSize()
+ width, height = max(min_width, size[0]), max(min_height, size[1])
+ self.Element.SetSize(width, height)
+
+ def SetVariables(self, vars):
+ self.ElementName.Clear()
+ for name in vars:
+ self.ElementName.Append(name)
+ self.ElementName.Enable(self.ElementName.GetCount() > 0)
+
+ def SetValues(self, values):
+ for name, value in values.items():
+ if name == "name":
+ self.Element.SetName(value)
+ self.ElementName.SetStringSelection(value)
+ elif name == "type":
+ self.Element.SetType(value)
+ if self.Type == "contact":
+ if value == CONTACT_NORMAL:
+ self.radioButton1.SetValue(True)
+ elif value == CONTACT_REVERSE:
+ self.radioButton2.SetValue(True)
+ elif value == CONTACT_RISING:
+ self.radioButton5.SetValue(True)
+ elif value == CONTACT_FALLING:
+ self.radioButton6.SetValue(True)
+ elif self.Type == "coil":
+ if value == COIL_NORMAL:
+ self.radioButton1.SetValue(True)
+ elif value == COIL_REVERSE:
+ self.radioButton2.SetValue(True)
+ elif value == COIL_SET:
+ self.radioButton3.SetValue(True)
+ elif value == COIL_RESET:
+ self.radioButton4.SetValue(True)
+ elif value == COIL_RISING:
+ self.radioButton5.SetValue(True)
+ elif value == COIL_FALLING:
+ self.radioButton6.SetValue(True)
+
+ def GetValues(self):
+ values = {}
+ values["name"] = self.Element.GetName()
+ values["type"] = self.Element.GetType()
+ values["width"], values["height"] = self.Element.GetSize()
+ return values
+
+ def OnTypeChanged(self, event):
+ if self.Type == "contact":
+ if self.radioButton1.GetValue():
+ self.Element.SetType(CONTACT_NORMAL)
+ elif self.radioButton2.GetValue():
+ self.Element.SetType(CONTACT_REVERSE)
+ elif self.radioButton5.GetValue():
+ self.Element.SetType(CONTACT_RISING)
+ elif self.radioButton6.GetValue():
+ self.Element.SetType(CONTACT_FALLING)
+ elif self.Type == "coil":
+ if self.radioButton1.GetValue():
+ self.Element.SetType(COIL_NORMAL)
+ elif self.radioButton2.GetValue():
+ self.Element.SetType(COIL_REVERSE)
+ elif self.radioButton3.GetValue():
+ self.Element.SetType(COIL_SET)
+ elif self.radioButton4.GetValue():
+ self.Element.SetType(COIL_RESET)
+ elif self.radioButton5.GetValue():
+ self.Element.SetType(COIL_RISING)
+ elif self.radioButton6.GetValue():
+ self.Element.SetType(COIL_FALLING)
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnNameChanged(self, event):
+ self.Element.SetName(self.ElementName.GetStringSelection())
+ self.RefreshPreview()
+ event.Skip()
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ clientsize = self.Preview.GetClientSize()
+ width, height = self.Element.GetSize()
+ self.Element.SetPosition((clientsize.width - width) / 2, (clientsize.height - height) / 2)
+ self.Element.Draw(dc)
+
+ def OnPaint(self, event):
+ self.RefreshPreview()
+ event.Skip()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/LDPowerRailDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,206 @@
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+
+#-------------------------------------------------------------------------------
+# Edit Ladder Power Rail Properties Dialog
+#-------------------------------------------------------------------------------
+
+
+[ID_LDPOWERRAILDIALOG, ID_LDPOWERRAILDIALOGSPACER,
+ ID_LDPOWERRAILDIALOGTYPE, ID_LDPOWERRAILDIALOGRADIOBUTTON1,
+ ID_LDPOWERRAILDIALOGRADIOBUTTON2, ID_LDPOWERRAILDIALOGPREVIEW,
+ ID_LDPOWERRAILDIALOGSTATICTEXT1, ID_LDPOWERRAILDIALOGSTATICTEXT2,
+ ID_LDPOWERRAILDIALOGSTATICTEXT3, ID_LDPOWERRAILDIALOGPINNUMBER,
+] = [wx.NewId() for _init_ctrls in range(10)]
+
+class LDPowerRailDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.PinNumber, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_LeftGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(5)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=5)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+ self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt, ctrler):
+ wx.Dialog.__init__(self, id=ID_LDPOWERRAILDIALOG,
+ name='PowerRailDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(350, 260), style=wx.DEFAULT_DIALOG_STYLE,
+ title=_('Power Rail Properties'))
+ self.SetClientSize(wx.Size(350, 260))
+
+ self.staticText1 = wx.StaticText(id=ID_LDPOWERRAILDIALOGSTATICTEXT1,
+ label=_('Type:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText2 = wx.StaticText(id=ID_LDPOWERRAILDIALOGSTATICTEXT2,
+ label=_('Pin number:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText3 = wx.StaticText(id=ID_LDPOWERRAILDIALOGSTATICTEXT3,
+ label=_('Preview:'), name='staticText3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.radioButton1 = wx.RadioButton(id=ID_LDPOWERRAILDIALOGRADIOBUTTON1,
+ label=_('Left PowerRail'), name='radioButton1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDPOWERRAILDIALOGRADIOBUTTON1)
+ self.radioButton1.SetValue(True)
+
+ self.radioButton2 = wx.RadioButton(id=ID_LDPOWERRAILDIALOGRADIOBUTTON2,
+ label=_('Right PowerRail'), name='radioButton2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDPOWERRAILDIALOGRADIOBUTTON2)
+
+ self.PinNumber = wx.SpinCtrl(id=ID_LDPOWERRAILDIALOGPINNUMBER,
+ name='PinNumber', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=1, max=50)
+ self.Bind(wx.EVT_SPINCTRL, self.OnPinNumberChanged, id=ID_LDPOWERRAILDIALOGPINNUMBER)
+
+ self.Preview = wx.Panel(id=ID_LDPOWERRAILDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "GetScaling", lambda:None)
+ setattr(self.Preview, "IsOfType", ctrler.IsOfType)
+
+ self.Spacer = wx.Panel(id=ID_LDELEMENTDIALOGSPACER,
+ name='Spacer', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+
+ if wx.VERSION >= (2, 5, 0):
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler, type = LEFTRAIL, number = 1):
+ self._init_ctrls(parent, controler)
+ self.Type = type
+ if type == LEFTRAIL:
+ self.radioButton1.SetValue(True)
+ elif type == RIGHTRAIL:
+ self.radioButton2.SetValue(True)
+ self.PinNumber.SetValue(number)
+
+ self.PowerRailMinSize = (0, 0)
+ self.PowerRail = None
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def SetMinSize(self, size):
+ self.PowerRailMinSize = size
+ self.RefreshPreview()
+
+ def GetValues(self):
+ values = {}
+ values["type"] = self.Type
+ values["number"] = self.PinNumber.GetValue()
+ values["width"], values["height"] = self.PowerRail.GetSize()
+ return values
+
+ def OnTypeChanged(self, event):
+ if self.radioButton1.GetValue():
+ self.Type = LEFTRAIL
+ elif self.radioButton2.GetValue():
+ self.Type = RIGHTRAIL
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnPinNumberChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ self.PowerRail = LD_PowerRail(self.Preview, self.Type, connectors = [True for i in xrange(self.PinNumber.GetValue())])
+ min_width, min_height = 2, LD_LINE_SIZE * self.PinNumber.GetValue()
+ width, height = max(min_width, self.PowerRailMinSize[0]), max(min_height, self.PowerRailMinSize[1])
+ self.PowerRail.SetSize(width, height)
+ clientsize = self.Preview.GetClientSize()
+ self.PowerRail.SetPosition((clientsize.width - width) / 2, (clientsize.height - height) / 2)
+ self.PowerRail.Draw(dc)
+
+ def OnPaint(self, event):
+ self.RefreshPreview()
+ event.Skip()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/PouNameDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+#-------------------------------------------------------------------------------
+# POU Name Dialog
+#-------------------------------------------------------------------------------
+
+class PouNameDialog(wx.TextEntryDialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+
+ def __init__(self, parent, message, caption = "Please enter text", defaultValue = "",
+ style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
+ wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
+
+ self.PouNames = []
+ if wx.VERSION >= (2, 8, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton().GetId())
+ elif wx.VERSION >= (2, 6, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+
+ def OnOK(self, event):
+ step_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
+ if step_name == "":
+ message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif not TestIdentifier(step_name):
+ message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in IEC_KEYWORDS:
+ message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in self.PouNames:
+ message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ else:
+ self.EndModal(wx.ID_OK)
+
+ def SetPouNames(self, pou_names):
+ self.PouNames = [pou_name.upper() for pou_name in pou_names]
+
+ def GetValue(self):
+ return self.GetSizer().GetItem(1).GetWindow().GetValue()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/SFCDivergenceDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,223 @@
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+#-------------------------------------------------------------------------------
+# Create New Divergence Dialog
+#-------------------------------------------------------------------------------
+
+[ID_SFCDIVERGENCEDIALOG, ID_SFCDIVERGENCEDIALOGSPACER,
+ ID_SFCDIVERGENCEDIALOGRADIOBUTTON1, ID_SFCDIVERGENCEDIALOGRADIOBUTTON2,
+ ID_SFCDIVERGENCEDIALOGRADIOBUTTON3, ID_SFCDIVERGENCEDIALOGRADIOBUTTON4,
+ ID_SFCDIVERGENCEDIALOGSEQUENCES, ID_SFCDIVERGENCEDIALOGPREVIEW,
+ ID_SFCDIVERGENCEDIALOGSTATICTEXT1, ID_SFCDIVERGENCEDIALOGSTATICTEXT2,
+ ID_SFCDIVERGENCEDIALOGSTATICTEXT3,
+] = [wx.NewId() for _init_ctrls in range(11)]
+
+class SFCDivergenceDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton4, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Sequences, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_LeftGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(7)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=8, vgap=5)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+ self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt, ctrler):
+ wx.Dialog.__init__(self, id=ID_SFCDIVERGENCEDIALOG,
+ name='SFCDivergenceDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(500, 300), style=wx.DEFAULT_DIALOG_STYLE,
+ title=_('Create a new divergence or convergence'))
+ self.SetClientSize(wx.Size(500, 300))
+
+ self.staticText1 = wx.StaticText(id=ID_SFCDIVERGENCEDIALOGSTATICTEXT1,
+ label=_('Type:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.radioButton1 = wx.RadioButton(id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON1,
+ label=_('Selection Divergence'), name='radioButton1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON1)
+ self.radioButton1.SetValue(True)
+
+ self.radioButton2 = wx.RadioButton(id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON2,
+ label=_('Selection Convergence'), name='radioButton2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON2)
+ self.radioButton2.SetValue(False)
+
+ self.radioButton3 = wx.RadioButton(id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON3,
+ label=_('Simultaneous Divergence'), name='radioButton3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON3)
+ self.radioButton3.SetValue(False)
+
+ self.radioButton4 = wx.RadioButton(id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON4,
+ label=_('Simultaneous Convergence'), name='radioButton4', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCDIVERGENCEDIALOGRADIOBUTTON4)
+ self.radioButton4.SetValue(False)
+
+ self.staticText2 = wx.StaticText(id=ID_SFCDIVERGENCEDIALOGSTATICTEXT2,
+ label=_('Number of sequences:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.Sequences = wx.SpinCtrl(id=ID_SFCDIVERGENCEDIALOGSEQUENCES,
+ name='Sequences', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=0, min=2, max=20)
+ self.Bind(wx.EVT_SPINCTRL, self.OnSequencesChanged, id=ID_SFCDIVERGENCEDIALOGSEQUENCES)
+
+ self.staticText3 = wx.StaticText(id=ID_SFCDIVERGENCEDIALOGSTATICTEXT3,
+ label=_('Preview:'), name='staticText3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.Preview = wx.Panel(id=ID_SFCDIVERGENCEDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "IsOfType", ctrler.IsOfType)
+
+ self.Spacer = wx.Panel(id=ID_TRANSITIONCONTENTDIALOGSPACER,
+ name='Spacer', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+
+ if wx.VERSION >= (2, 5, 0):
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler):
+ self._init_ctrls(parent, controler)
+
+ self.Divergence = None
+ self.MinSize = (0, 0)
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def GetValues(self):
+ values = {}
+ if self.radioButton1.GetValue():
+ values["type"] = SELECTION_DIVERGENCE
+ elif self.radioButton2.GetValue():
+ values["type"] = SELECTION_CONVERGENCE
+ elif self.radioButton3.GetValue():
+ values["type"] = SIMULTANEOUS_DIVERGENCE
+ else:
+ values["type"] = SIMULTANEOUS_CONVERGENCE
+ values["number"] = self.Sequences.GetValue()
+ return values
+
+ def SetMinSize(self, size):
+ self.MinSize = size
+
+ def OnTypeChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnSequencesChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ if self.radioButton1.GetValue():
+ self.Divergence = SFC_Divergence(self.Preview, SELECTION_DIVERGENCE, self.Sequences.GetValue())
+ elif self.radioButton2.GetValue():
+ self.Divergence = SFC_Divergence(self.Preview, SELECTION_CONVERGENCE, self.Sequences.GetValue())
+ elif self.radioButton3.GetValue():
+ self.Divergence = SFC_Divergence(self.Preview, SIMULTANEOUS_DIVERGENCE, self.Sequences.GetValue())
+ else:
+ self.Divergence = SFC_Divergence(self.Preview, SIMULTANEOUS_CONVERGENCE, self.Sequences.GetValue())
+ width, height = self.Divergence.GetSize()
+ min_width, min_height = max(width, self.MinSize[0]), max(height, self.MinSize[1])
+ self.Divergence.SetSize(min_width, min_height)
+ clientsize = self.Preview.GetClientSize()
+ x = (clientsize.width - min_width) / 2
+ y = (clientsize.height - min_height) / 2
+ self.Divergence.SetPosition(x, y)
+ self.Divergence.Draw(dc)
+
+ def OnPaint(self, event):
+ self.RefreshPreview()
+ event.Skip()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/SFCStepDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,270 @@
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+#-------------------------------------------------------------------------------
+# Edit Step Content Dialog
+#-------------------------------------------------------------------------------
+
+[ID_SFCSTEPDIALOG, ID_SFCSTEPDIALOGSPACER,
+ ID_SFCSTEPDIALOGNAME, ID_SFCSTEPDIALOGPREVIEW,
+ ID_SFCSTEPDIALOGCHECKBOX1, ID_SFCSTEPDIALOGCHECKBOX2,
+ ID_SFCSTEPDIALOGCHECKBOX3, ID_SFCSTEPDIALOGSTATICTEXT1,
+ ID_SFCSTEPDIALOGSTATICTEXT2, ID_SFCSTEPDIALOGSTATICTEXT3,
+] = [wx.NewId() for _init_ctrls in range(10)]
+
+class SFCStepDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.StepName, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.checkBox1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.checkBox2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.checkBox3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_LeftGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(6)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=7, vgap=5)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+ self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt, ctrler):
+ wx.Dialog.__init__(self, id=ID_SFCSTEPDIALOG,
+ name='SFCStepDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(400, 250), style=wx.DEFAULT_DIALOG_STYLE,
+ title=_('Edit Step'))
+ self.SetClientSize(wx.Size(400, 250))
+
+ self.staticText1 = wx.StaticText(id=ID_SFCSTEPDIALOGSTATICTEXT1,
+ label=_('Name:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText2 = wx.StaticText(id=ID_SFCSTEPDIALOGSTATICTEXT2,
+ label=_('Connectors:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText3 = wx.StaticText(id=ID_SFCSTEPDIALOGSTATICTEXT3,
+ label=_('Preview:'), name='staticText4', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.StepName = wx.TextCtrl(id=ID_SFCSTEPDIALOGNAME,
+ name='Name', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_SFCSTEPDIALOGNAME)
+
+ self.checkBox1 = wx.CheckBox(id=ID_SFCSTEPDIALOGCHECKBOX1,
+ label=_("Input"), name='checkBox1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_SFCSTEPDIALOGCHECKBOX1)
+
+ self.checkBox2 = wx.CheckBox(id=ID_SFCSTEPDIALOGCHECKBOX2,
+ label=_("Output"), name='checkBox2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_SFCSTEPDIALOGCHECKBOX2)
+
+ self.checkBox3 = wx.CheckBox(id=ID_SFCSTEPDIALOGCHECKBOX3,
+ label=_("Action"), name='checkBox3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_SFCSTEPDIALOGCHECKBOX3)
+
+ self.Spacer = wx.Panel(id=ID_SFCSTEPDIALOGSPACER,
+ name='Spacer', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+ self.Preview = wx.Panel(id=ID_SFCSTEPDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "RefreshStepModel", lambda x:None)
+ setattr(self.Preview, "GetScaling", lambda:None)
+ setattr(self.Preview, "IsOfType", ctrler.IsOfType)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+ if wx.VERSION >= (2, 5, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler, initial = False):
+ self._init_ctrls(parent, controler)
+ self.Step = None
+ self.Initial = initial
+ self.MinStepSize = None
+
+ self.PouNames = []
+ self.Variables = []
+ self.StepNames = []
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def OnOK(self, event):
+ step_name = self.StepName.GetValue()
+ if step_name == "":
+ message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif not TestIdentifier(step_name):
+ message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in IEC_KEYWORDS:
+ message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in self.PouNames:
+ message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in self.Variables:
+ message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in self.StepNames:
+ message = wx.MessageDialog(self, _("\"%s\" step already exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ else:
+ self.EndModal(wx.ID_OK)
+
+ def SetMinStepSize(self, size):
+ self.MinStepSize = size
+
+ def SetPouNames(self, pou_names):
+ self.PouNames = [pou_name.upper() for pou_name in pou_names]
+
+ def SetVariables(self, 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]
+
+ def SetValues(self, values):
+ value_name = values.get("name", None)
+ if value_name:
+ self.StepName.SetValue(value_name)
+ else:
+ self.StepName.SetValue("")
+ self.checkBox1.SetValue(values.get("input", False))
+ self.checkBox2.SetValue(values.get("output", False))
+ self.checkBox3.SetValue(values.get("action", False))
+ self.RefreshPreview()
+
+ def GetValues(self):
+ values = {}
+ values["name"] = self.StepName.GetValue()
+ values["input"] = self.checkBox1.IsChecked()
+ values["output"] = self.checkBox2.IsChecked()
+ values["action"] = self.checkBox3.IsChecked()
+ values["width"], values["height"] = self.Step.GetSize()
+ return values
+
+ def OnConnectorsChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnNameChanged(self, event):
+ self.RefreshPreview()
+ event.Skip()
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ self.Step = SFC_Step(self.Preview, self.StepName.GetValue(), self.Initial)
+ if self.checkBox1.IsChecked():
+ self.Step.AddInput()
+ else:
+ self.Step.RemoveInput()
+ if self.checkBox2.IsChecked():
+ self.Step.AddOutput()
+ else:
+ self.Step.RemoveOutput()
+ if self.checkBox3.IsChecked():
+ self.Step.AddAction()
+ else:
+ self.Step.RemoveAction()
+ width, height = self.MinStepSize
+ min_width, min_height = self.Step.GetMinSize()
+ width, height = max(min_width, width), max(min_height, height)
+ self.Step.SetSize(width, height)
+ clientsize = self.Preview.GetClientSize()
+ x = (clientsize.width - width) / 2
+ y = (clientsize.height - height) / 2
+ self.Step.SetPosition(x, y)
+ self.Step.Draw(dc)
+
+ def OnPaint(self, event):
+ self.RefreshPreview()
+ event.Skip()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/SFCStepNameDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+#-------------------------------------------------------------------------------
+# Edit Step Name Dialog
+#-------------------------------------------------------------------------------
+
+class SFCStepNameDialog(wx.TextEntryDialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+
+ def __init__(self, parent, message, caption = "Please enter text", defaultValue = "",
+ style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
+ wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
+
+ self.PouNames = []
+ self.Variables = []
+ self.StepNames = []
+ if wx.VERSION >= (2, 8, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton().GetId())
+ elif wx.VERSION >= (2, 6, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+
+ def OnOK(self, event):
+ step_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
+ if step_name == "":
+ message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif not TestIdentifier(step_name):
+ message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in IEC_KEYWORDS:
+ message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in self.PouNames:
+ message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in self.Variables:
+ message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ elif step_name.upper() in self.StepNames:
+ message = wx.MessageDialog(self, _("\"%s\" step already exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()
+ else:
+ self.EndModal(wx.ID_OK)
+
+ def SetPouNames(self, pou_names):
+ self.PouNames = [pou_name.upper() for pou_name in pou_names]
+
+ def SetVariables(self, 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]
+
+ def GetValue(self):
+ return self.GetSizer().GetItem(1).GetWindow().GetValue()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/SFCTransitionDialog.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,305 @@
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import wx
+
+from graphics import *
+
+#-------------------------------------------------------------------------------
+# Edit Transition Content Dialog
+#-------------------------------------------------------------------------------
+
+[ID_SFCTRANSITIONDIALOG, ID_SFCTRANSITIONDIALOGSPACER,
+ ID_SFCTRANSITIONDIALOGREFERENCE, ID_SFCTRANSITIONDIALOGINLINE,
+ ID_SFCTRANSITIONDIALOGPRIORITY, ID_SFCTRANSITIONDIALOGPREVIEW,
+ ID_SFCTRANSITIONDIALOGRADIOBUTTON1, ID_SFCTRANSITIONDIALOGRADIOBUTTON2,
+ ID_SFCTRANSITIONDIALOGRADIOBUTTON3, ID_SFCTRANSITIONDIALOGSTATICTEXT1,
+ ID_SFCTRANSITIONDIALOGSTATICTEXT2, ID_SFCTRANSITIONDIALOGSTATICTEXT3,
+] = [wx.NewId() for _init_ctrls in range(12)]
+
+class SFCTransitionDialog(wx.Dialog):
+
+ if wx.VERSION < (2, 6, 0):
+ def Bind(self, event, function, id = None):
+ if id is not None:
+ event(self, id, function)
+ else:
+ event(self, function)
+
+ def _init_coll_flexGridSizer1_Items(self, parent):
+ parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+ parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+
+ def _init_coll_flexGridSizer1_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(0)
+
+ def _init_coll_MainSizer_Items(self, parent):
+ parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
+ parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
+
+ def _init_coll_LeftGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Reference, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Inline, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Priority, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_LeftGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(6)
+
+ def _init_coll_RightGridSizer_Items(self, parent):
+ parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
+ parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
+
+ def _init_coll_RightGridSizer_Growables(self, parent):
+ parent.AddGrowableCol(0)
+ parent.AddGrowableRow(1)
+
+ def _init_sizers(self):
+ self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+ self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=9, vgap=5)
+ self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+
+ self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
+ self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+ self._init_coll_MainSizer_Items(self.MainSizer)
+ self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+ self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+ self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+ self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+
+ self.SetSizer(self.flexGridSizer1)
+
+ def _init_ctrls(self, prnt, ctrler):
+ wx.Dialog.__init__(self, id=ID_SFCTRANSITIONDIALOG,
+ name='SFCTransitionDialog', parent=prnt, pos=wx.Point(376, 223),
+ size=wx.Size(350, 300), style=wx.DEFAULT_DIALOG_STYLE,
+ title=_('Edit transition'))
+ self.SetClientSize(wx.Size(350, 300))
+
+ self.staticText1 = wx.StaticText(id=ID_SFCTRANSITIONDIALOGSTATICTEXT1,
+ label=_('Type:'), name='staticText1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText2 = wx.StaticText(id=ID_SFCTRANSITIONDIALOGSTATICTEXT2,
+ label=_('Preview:'), name='staticText2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.staticText3 = wx.StaticText(id=ID_SFCTRANSITIONDIALOGSTATICTEXT3,
+ label=_('Priority:'), name='staticText3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+ self.radioButton1 = wx.RadioButton(id=ID_SFCTRANSITIONDIALOGRADIOBUTTON1,
+ label=_('Reference'), name='radioButton1', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCTRANSITIONDIALOGRADIOBUTTON1)
+ self.radioButton1.SetValue(True)
+
+ self.Reference = wx.ComboBox(id=ID_SFCTRANSITIONDIALOGREFERENCE,
+ name='Reference', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 28), style=wx.CB_READONLY)
+ self.Bind(wx.EVT_COMBOBOX, self.OnReferenceChanged, id=ID_SFCTRANSITIONDIALOGREFERENCE)
+
+ self.radioButton2 = wx.RadioButton(id=ID_SFCTRANSITIONDIALOGRADIOBUTTON2,
+ label=_('Inline'), name='radioButton2', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCTRANSITIONDIALOGRADIOBUTTON2)
+ self.radioButton2.SetValue(False)
+
+ self.Inline = wx.TextCtrl(id=ID_SFCTRANSITIONDIALOGINLINE,
+ name='Inline', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_TEXT, self.OnInlineChanged, id=ID_SFCTRANSITIONDIALOGINLINE)
+ self.Inline.Enable(False)
+
+ self.radioButton3 = wx.RadioButton(id=ID_SFCTRANSITIONDIALOGRADIOBUTTON3,
+ label=_('Connection'), name='radioButton3', parent=self,
+ pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
+ self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCTRANSITIONDIALOGRADIOBUTTON3)
+ self.radioButton3.SetValue(False)
+ if not self.Connection:
+ self.radioButton3.Hide()
+
+ self.Priority = wx.SpinCtrl(id=ID_SFCTRANSITIONDIALOGPRIORITY,
+ name='Priority', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
+ self.Bind(wx.EVT_TEXT, self.OnPriorityChanged, id=ID_SFCTRANSITIONDIALOGPRIORITY)
+
+ self.Preview = wx.Panel(id=ID_SFCTRANSITIONDIALOGPREVIEW,
+ name='Preview', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+ self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
+ setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
+ setattr(self.Preview, "RefreshTransitionModel", lambda x:None)
+ setattr(self.Preview, "GetScaling", lambda:None)
+ setattr(self.Preview, "IsOfType", ctrler.IsOfType)
+
+ self.Spacer = wx.Panel(id=ID_SFCTRANSITIONDIALOGSPACER,
+ name='Spacer', parent=self, pos=wx.Point(0, 0),
+ size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+ self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+ if wx.VERSION >= (2, 5, 0):
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
+ self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
+ else:
+ self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+ wx.EVT_PAINT(self.Preview, self.OnPaint)
+
+ self._init_sizers()
+
+ def __init__(self, parent, controler, connection):
+ self.Connection = connection
+ self._init_ctrls(parent, controler)
+ self.Transition = None
+ self.MinTransitionSize = None
+
+ self.Element = SFC_Transition(self.Preview)
+
+ def SetPreviewFont(self, font):
+ self.Preview.SetFont(font)
+
+ def SetElementSize(self, size):
+ min_width, min_height = self.Element.GetMinSize()
+ width, height = max(min_width, size[0]), max(min_height, size[1])
+ self.Element.SetSize(width, height)
+
+ def OnOK(self, event):
+ error = []
+ if self.radioButton1.GetValue() and self.Reference.GetStringSelection() == "":
+ error.append(_("Reference"))
+ if self.radioButton2.GetValue() and self.Inline.GetValue() == "":
+ error.append(_("Inline"))
+ 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 OnTypeChanged(self, event):
+ if self.radioButton1.GetValue():
+ self.Element.SetType("reference", self.Reference.GetStringSelection())
+ self.Reference.Enable(True)
+ self.Inline.Enable(False)
+ elif self.radioButton2.GetValue():
+ self.Element.SetType("inline", self.Inline.GetValue())
+ self.Reference.Enable(False)
+ self.Inline.Enable(True)
+ else:
+ self.Element.SetType("connection")
+ self.Reference.Enable(False)
+ self.Inline.Enable(False)
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnReferenceChanged(self, event):
+ self.Element.SetType("reference", self.Reference.GetStringSelection())
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnInlineChanged(self, event):
+ self.Element.SetType("inline", self.Inline.GetValue())
+ self.RefreshPreview()
+ event.Skip()
+
+ def OnPriorityChanged(self, event):
+ self.Element.SetPriority(int(self.Priority.GetValue()))
+ self.RefreshPreview()
+ event.Skip()
+
+ def SetTransitions(self, transitions):
+ self.Reference.Append("")
+ for transition in transitions:
+ self.Reference.Append(transition)
+
+ def SetValues(self, values):
+ if values["type"] == "reference":
+ self.radioButton1.SetValue(True)
+ self.radioButton2.SetValue(False)
+ self.radioButton3.SetValue(False)
+ self.Reference.Enable(True)
+ self.Inline.Enable(False)
+ self.Reference.SetStringSelection(values["value"])
+ self.Element.SetType("reference", values["value"])
+ elif values["type"] == "inline":
+ self.radioButton1.SetValue(False)
+ self.radioButton2.SetValue(True)
+ self.radioButton3.SetValue(False)
+ self.Reference.Enable(False)
+ self.Inline.Enable(True)
+ self.Inline.SetValue(values["value"])
+ self.Element.SetType("inline", values["value"])
+ elif values["type"] == "connection" and self.Connection:
+ self.radioButton1.SetValue(False)
+ self.radioButton2.SetValue(False)
+ self.radioButton3.SetValue(True)
+ self.Reference.Enable(False)
+ self.Inline.Enable(False)
+ self.Element.SetType("connection")
+ self.Priority.SetValue(values["priority"])
+ self.Element.SetPriority(values["priority"])
+ self.RefreshPreview()
+
+ def GetValues(self):
+ values = {"priority" : int(self.Priority.GetValue())}
+ if self.radioButton1.GetValue():
+ values["type"] = "reference"
+ values["value"] = self.Reference.GetStringSelection()
+ elif self.radioButton2.GetValue():
+ values["type"] = "inline"
+ values["value"] = self.Inline.GetValue()
+ else:
+ values["type"] = "connection"
+ values["value"] = None
+ return values
+
+ def RefreshPreview(self):
+ dc = wx.ClientDC(self.Preview)
+ dc.SetFont(self.Preview.GetFont())
+ dc.Clear()
+ clientsize = self.Preview.GetClientSize()
+ posx, posy = self.Element.GetPosition()
+ rect = self.Element.GetBoundingBox()
+ diffx, diffy = posx - rect.x, posy - rect.y
+ self.Element.SetPosition((clientsize.width - rect.width) / 2 + diffx, (clientsize.height - rect.height) / 2 + diffy)
+ self.Element.Draw(dc)
+
+ def OnPaint(self, event):
+ self.RefreshPreview()
+ event.Skip()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/__init__.py Wed Sep 16 12:00:58 2009 +0200
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard.
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Package initialization
+
+from ConnectionDialog import ConnectionDialog
+from ActionBlockDialog import ActionBlockDialog
+from FBDBlockDialog import FBDBlockDialog, CATEGORY, BLOCK
+from FBDVariableDialog import FBDVariableDialog
+from LDElementDialog import LDElementDialog
+from LDPowerRailDialog import LDPowerRailDialog
+from SFCStepDialog import SFCStepDialog
+from SFCStepNameDialog import SFCStepNameDialog
+from SFCTransitionDialog import SFCTransitionDialog
+from SFCDivergenceDialog import SFCDivergenceDialog
--- a/i18n/app.fil Tue Sep 15 15:02:23 2009 +0200
+++ b/i18n/app.fil Wed Sep 16 12:00:58 2009 +0200
@@ -7,6 +7,17 @@
../SFCViewer.py
../LDViewer.py
../GraphicViewer.py
+../dialogs/ActionBlockDialog.py
+../dialogs/ConnectionDialog.py
+../dialogs/FBDBlockDialog.py
+../dialogs/FBDVariableDialog.py
+../dialogs/LDElementDialog.py
+../dialogs/LDPowerRailDialog.py
+../dialogs/PouNameDialog.py
+../dialogs/SFCDivergenceDialog.py
+../dialogs/SFCStepDialog.py
+../dialogs/SFCStepNameDialog.py
+../dialogs/SFCTransitionDialog.py
../Dialogs.py
../DataTypeEditor.py
../plcopen/iec_std.csv