# HG changeset patch # User lbessard # Date 1193759588 -3600 # Node ID 0c53d6a36013fdce458289b76fd42095b7eb3634 # Parent bbe0697cf1ea124699cf770e50064ed63a69b456 Add support for defining execution order in FBD networks (related ST code not generated yet) diff -r bbe0697cf1ea -r 0c53d6a36013 Dialogs.py --- a/Dialogs.py Fri Oct 26 17:04:18 2007 +0200 +++ b/Dialogs.py Tue Oct 30 16:53:08 2007 +0100 @@ -34,9 +34,10 @@ [ID_BLOCKPROPERTIESDIALOG, ID_BLOCKPROPERTIESDIALOGNAME, ID_BLOCKPROPERTIESDIALOGTYPETREE, ID_BLOCKPROPERTIESDIALOGTYPEDESC, ID_BLOCKPROPERTIESDIALOGINPUTS, ID_BLOCKPROPERTIESDIALOGPREVIEW, - ID_BLOCKPROPERTIESDIALOGSTATICTEXT1, ID_BLOCKPROPERTIESDIALOGSTATICTEXT2, - ID_BLOCKPROPERTIESDIALOGSTATICTEXT3, ID_BLOCKPROPERTIESDIALOGSTATICTEXT4, -] = [wx.NewId() for _init_ctrls in range(10)] + ID_BLOCKPROPERTIESDIALOGEXECUTIONORDER, ID_BLOCKPROPERTIESDIALOGSTATICTEXT1, + ID_BLOCKPROPERTIESDIALOGSTATICTEXT2, ID_BLOCKPROPERTIESDIALOGSTATICTEXT3, + ID_BLOCKPROPERTIESDIALOGSTATICTEXT4, ID_BLOCKPROPERTIESDIALOGSTATICTEXT5, +] = [wx.NewId() for _init_ctrls in range(12)] [CATEGORY, BLOCK] = range(2) @@ -67,7 +68,7 @@ def _init_coll_RightGridSizer_Items(self, parent): parent.AddSizer(self.RightUpGridSizer, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText4, 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_RightGridSizer_Growables(self, parent): @@ -75,17 +76,19 @@ parent.AddGrowableRow(2) def _init_coll_RightUpGridSizer_Items(self, parent): - parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW|wx.ALIGN_BOTTOM) - parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW|wx.ALIGN_BOTTOM) + parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.BlockName, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText3, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.Inputs, 0, border=0, flag=wx.GROW) - + parent.AddWindow(self.staticText4, 0, border=4, flag=wx.GROW|wx.TOP) + parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW) + 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.GridSizer(cols=2, hgap=5, rows=2, vgap=5) + self.RightUpGridSizer = wx.GridSizer(cols=2, hgap=5, rows=3, vgap=5) self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) @@ -100,9 +103,9 @@ 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, 360), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER, + size=wx.Size(600, 380), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER, title='Block Properties') - self.SetClientSize(wx.Size(600, 360)) + self.SetClientSize(wx.Size(600, 380)) self.staticbox1 = wx.StaticBox(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT1, label='Type:', name='staticBox1', parent=self, @@ -117,7 +120,11 @@ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0) self.staticText4 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT4, - label='Preview:', name='staticText4', parent=self, + label='Execution Order:', name='staticText4', parent=self, + pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0) + + self.staticText5 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT5, + label='Preview:', name='staticText5', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0) if wx.Platform == '__WXMSW__': @@ -144,6 +151,11 @@ 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.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) @@ -262,6 +274,8 @@ self.BlockName.SetValue(value) elif name == "extension": self.Inputs.SetValue(value) + elif name == "executionOrder": + self.ExecutionOrder.SetValue(value) self.RefreshPreview() def GetValues(self): @@ -273,6 +287,7 @@ values["name"] = self.BlockName.GetValue() values["width"], values["height"] = self.Block.GetSize() values["extension"] = self.Inputs.GetValue() + values["executionOrder"] = self.ExecutionOrder.GetValue() return values def OnTypeTreeItemSelected(self, event): @@ -311,6 +326,10 @@ self.RefreshPreview() event.Skip() + def OnExecutionOrderChanged(self, event): + self.RefreshPreview() + event.Skip() + def ErasePreview(self): dc = wx.ClientDC(self.Preview) dc.Clear() @@ -327,7 +346,7 @@ 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"]) + self.Block = FBD_Block(self.Preview, blocktype, self.BlockName.GetValue(), extension = self.Inputs.GetValue(), inputs = pydata["inputs"], 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) @@ -352,9 +371,10 @@ [ID_VARIABLEPROPERTIESDIALOG, ID_VARIABLEPROPERTIESDIALOGSPACER, ID_VARIABLEPROPERTIESDIALOGNAME, ID_VARIABLEPROPERTIESDIALOGCLASS, ID_VARIABLEPROPERTIESDIALOGPREVIEW, ID_VARIABLEPROPERTIESDIALOGEXPRESSION, - ID_VARIABLEPROPERTIESDIALOGSTATICTEXT1, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT2, - ID_VARIABLEPROPERTIESDIALOGSTATICTEXT3, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT4, -] = [wx.NewId() for _init_ctrls in range(10)] + ID_VARIABLEPROPERTIESDIALOGEXECUTIONORDER, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT1, + ID_VARIABLEPROPERTIESDIALOGSTATICTEXT2, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT3, + ID_VARIABLEPROPERTIESDIALOGSTATICTEXT4, ID_VARIABLEPROPERTIESDIALOGSTATICTEXT5 +] = [wx.NewId() for _init_ctrls in range(12)] class VariablePropertiesDialog(wx.Dialog): @@ -389,16 +409,18 @@ 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.Spacer, 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.staticText3, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText5, 0, border=0, flag=wx.GROW) parent.AddWindow(self.VariableName, 0, border=0, flag=wx.GROW) def _init_coll_RightGridSizer_Growables(self, parent): @@ -409,7 +431,7 @@ 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=5, vgap=5) + 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) @@ -440,11 +462,15 @@ pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0) self.staticText3 = wx.StaticText(id=ID_VARIABLEPROPERTIESDIALOGSTATICTEXT3, - label='Name:', name='staticText3', parent=self, + 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='Preview:', name='staticText4', parent=self, + 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.Choice(id=ID_VARIABLEPROPERTIESDIALOGCLASS, @@ -462,6 +488,11 @@ 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) @@ -536,6 +567,8 @@ else: self.Expression.SetValue(value_name) self.VariableName.Enable(False) + if "executionOrder" in values: + self.ExecutionOrder.SetValue(values["executionOrder"]) self.RefreshPreview() def GetValues(self): @@ -557,6 +590,7 @@ 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 OnClassChanged(self, event): @@ -584,6 +618,10 @@ self.RefreshPreview() event.Skip() + def OnExecutionOrderChanged(self, event): + self.RefreshPreview() + event.Skip() + def RefreshPreview(self): dc = wx.ClientDC(self.Preview) dc.Clear() @@ -598,11 +636,11 @@ type = value_type classtype = self.Class.GetStringSelection() if classtype == "Input": - self.Variable = FBD_Variable(self.Preview, INPUT, name, type) + self.Variable = FBD_Variable(self.Preview, INPUT, name, type, executionOrder = self.ExecutionOrder.GetValue()) elif classtype == "Output": - self.Variable = FBD_Variable(self.Preview, OUTPUT, name, type) + self.Variable = FBD_Variable(self.Preview, OUTPUT, name, type, executionOrder = self.ExecutionOrder.GetValue()) elif classtype == "InOut": - self.Variable = FBD_Variable(self.Preview, INOUT, name, type) + self.Variable = FBD_Variable(self.Preview, INOUT, 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) diff -r bbe0697cf1ea -r 0c53d6a36013 PLCControler.py --- a/PLCControler.py Fri Oct 26 17:04:18 2007 +0200 +++ b/PLCControler.py Tue Oct 30 16:53:08 2007 +0100 @@ -1233,6 +1233,11 @@ if isinstance(instance, plcopen.block): infos["name"] = instance.getInstanceName() infos["type"] = instance.getTypeName() + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["connectors"] = {"inputs":[],"outputs":[]} for variable in instance.inputVariables.getVariable(): connector = {} @@ -1258,6 +1263,11 @@ infos["name"] = instance.getExpression() infos["value_type"] = self.GetCurrentPouVarValueType(infos["name"]) infos["type"] = "input" + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["connector"] = {} infos["connector"]["position"] = instance.connectionPointOut.getRelPosition() infos["connector"]["negated"] = instance.getNegated() @@ -1266,6 +1276,11 @@ infos["name"] = instance.getExpression() infos["value_type"] = self.GetCurrentPouVarValueType(infos["name"]) infos["type"] = "output" + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["connector"] = {} infos["connector"]["position"] = instance.connectionPointIn.getRelPosition() infos["connector"]["negated"] = instance.getNegated() @@ -1280,6 +1295,11 @@ infos["name"] = instance.getExpression() infos["value_type"] = self.GetCurrentPouVarValueType(infos["name"]) infos["type"] = "inout" + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["connectors"] = {"input":{},"output":{}} infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition() infos["connectors"]["output"]["negated"] = instance.getNegatedOut() @@ -1297,12 +1317,22 @@ infos["name"] = instance.getName() infos["value_type"] = self.GetCurrentPouVarValueType(infos["name"]) infos["type"] = "continuation" + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["connector"] = {} infos["connector"]["position"] = instance.connectionPointOut.getRelPosition() elif isinstance(instance, plcopen.connector): infos["name"] = instance.getName() infos["value_type"] = self.GetCurrentPouVarValueType(infos["name"]) infos["type"] = "connection" + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["connector"] = {} infos["connector"]["position"] = instance.connectionPointIn.getRelPosition() infos["connector"]["links"] = [] @@ -1333,8 +1363,13 @@ connector["links"].append(dic) infos["connectors"].append(connector) elif isinstance(instance, plcopen.contact): + infos["name"] = instance.getVariable() infos["type"] = "contact" - infos["name"] = instance.getVariable() + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["negated"] = instance.getNegated() infos["edge"] = instance.getContactEdge() infos["connectors"] = {"input":{},"output":{}} @@ -1347,8 +1382,13 @@ infos["connectors"]["input"]["links"].append(dic) infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition() elif isinstance(instance, plcopen.coil): + infos["name"] = instance.getVariable() infos["type"] = "coil" - infos["name"] = instance.getVariable() + executionOrder = instance.getExecutionOrderId() + if executionOrder is not None: + infos["executionOrder"] = executionOrder + else: + infos["executionOrder"] = 0 infos["negated"] = instance.getNegated() infos["storage"] = instance.getCoilStorage() infos["connectors"] = {"input":{},"output":{}} @@ -1361,8 +1401,8 @@ infos["connectors"]["input"]["links"].append(dic) infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition() elif isinstance(instance, plcopen.step): + infos["name"] = instance.getName() infos["type"] = "step" - infos["name"] = instance.getName() infos["initial"] = instance.getInitialStep() infos["connectors"] = {} if instance.connectionPointIn: @@ -1470,6 +1510,12 @@ return infos return False + def ClearCurrentExecutionOrder(self): + self.GetCurrentElementEditing().resetExecutionOrder() + + def ResetCurrentExecutionOrder(self): + self.GetCurrentElementEditing().compileExecutionOrder() + # Return the variable type of the given pou def GetCurrentPouVarValueType(self, varname): current_name = self.ElementsOpened[self.CurrentElementEditing] @@ -1533,6 +1579,8 @@ block.setInstanceName(value) elif param == "type": block.setTypeName(value) + elif param == "executionOrder" and block.getExecutionOrderId() != value: + self.GetCurrentElementEditing().setElementExecutionOrder(block, value) elif param == "height": block.setHeight(value) elif param == "width": @@ -1586,6 +1634,8 @@ for param, value in infos.items(): if param == "name": variable.setExpression(value) + elif param == "executionOrder" and variable.getExecutionOrderId() != value: + self.GetCurrentElementEditing().setElementExecutionOrder(variable, value) elif param == "height": variable.setHeight(value) elif param == "width": diff -r bbe0697cf1ea -r 0c53d6a36013 PLCOpenEditor.py --- a/PLCOpenEditor.py Fri Oct 26 17:04:18 2007 +0200 +++ b/PLCOpenEditor.py Tue Oct 30 16:53:08 2007 +0100 @@ -365,7 +365,7 @@ if wx.Platform != '__WXMSW__': self.TreeImageList = wx.ImageList(16, 16) for language in LANGUAGES: - self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images','%s.png'%language))) + self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%language))) self.ProjectTree.AssignImageList(self.TreeImageList) if self.ModeSolo: @@ -814,11 +814,12 @@ message = "\"%s\" is a keyword. It can't be used!"%new_name else: item = event.GetItem() + old_name = self.ProjectTree.GetItemText(item) itemtype = self.ProjectTree.GetPyData(item) if itemtype == ITEM_PROJECT: self.Controler.SetProjectProperties(name = new_name) elif itemtype == ITEM_POU: - if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: + if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]: message = "\"%s\" pou already exists!"%new_name abort = True elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]: @@ -827,7 +828,6 @@ abort = True messageDialog.Destroy() if not abort: - old_name = self.ProjectTree.GetItemText(item) self.Controler.ChangePouName(old_name, new_name) self.RefreshEditorNames(itemtype, old_name, new_name) self.RefreshTabsOpenedTitles() @@ -840,10 +840,9 @@ pou_name = self.ProjectTree.GetItemText(parent) if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: message = "A pou with \"%s\" as name exists!"%new_name - elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name)]: + elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: message = "A variable with \"%s\" as name already exists in this pou!"%new_name else: - old_name = self.ProjectTree.GetItemText(item) self.Controler.ChangePouTransitionName(pou_name, old_name, new_name) self.RefreshEditorNames(itemtype, old_name, new_name) self.RefreshTabsOpenedTitles() @@ -856,15 +855,14 @@ pou_name = self.ProjectTree.GetItemText(parent) if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: message = "A pou with \"%s\" as name exists!"%new_name - elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name)]: + elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: message = "A variable with \"%s\" as name already exists in this pou!"%new_name else: - old_name = self.ProjectTree.GetItemText(item) self.Controler.ChangePouActionName(pou_name, old_name, new_name) self.RefreshEditorNames(itemtype, old_name, new_name) self.RefreshTabsOpenedTitles() elif itemtype == ITEM_CONFIGURATION: - if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]: + if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]: message = "\"%s\" config already exists!"%new_name abort = True elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: @@ -878,7 +876,6 @@ abort = True messageDialog.Destroy() if not abort: - old_name = self.ProjectTree.GetItemText(item) self.Controler.ChangeConfigurationName(old_name, new_name) self.RefreshEditorNames(itemtype, old_name, new_name) self.RefreshTabsOpenedTitles() @@ -903,7 +900,6 @@ abort = True messageDialog.Destroy() if not abort: - old_name = self.ProjectTree.GetItemText(item) self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name) self.RefreshEditorNames(itemtype, old_name, new_name) self.RefreshTabsOpenedTitles() @@ -918,7 +914,8 @@ else: wx.CallAfter(self.RefreshProjectTree) window = self.TabsOpened.GetCurrentPage() - window.RefreshView() + if window: + window.RefreshView() event.Skip() def OnProjectTreeItemBeginEdit(self, event): @@ -1381,19 +1378,19 @@ parent.AddGrowableRow(0) def _init_coll_MainSizer_Items(self, parent): - parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.ProjectName, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.CompanyName, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText3, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.CompanyURL, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText4, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText4, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.ProductName, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText5, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText5, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.ProductVersion, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText6, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText6, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.ProductRelease, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText7, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText7, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.ContentDescription, 0, border=0, flag=wx.GROW) def _init_coll_MainSizer_Growables(self, parent): @@ -1564,11 +1561,11 @@ parent.AddGrowableRow(0) def _init_coll_MainSizer_Items(self, parent): - parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.PouName, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.PouType, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText3, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) def _init_coll_MainSizer_Growables(self, parent): @@ -1736,9 +1733,9 @@ parent.AddGrowableRow(0) def _init_coll_MainSizer_Items(self, parent): - parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.TransitionName, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) def _init_coll_MainSizer_Growables(self, parent): @@ -1875,9 +1872,9 @@ parent.AddGrowableRow(0) def _init_coll_MainSizer_Items(self, parent): - parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.ActionName, 0, border=0, flag=wx.GROW) - parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) def _init_coll_MainSizer_Growables(self, parent): diff -r bbe0697cf1ea -r 0c53d6a36013 Viewer.py --- a/Viewer.py Fri Oct 26 17:04:18 2007 +0200 +++ b/Viewer.py Tue Oct 30 16:53:08 2007 +0100 @@ -49,7 +49,8 @@ ID_FBDVIEWERCONTEXTUALMENUITEMS5, ID_FBDVIEWERCONTEXTUALMENUITEMS6, ID_FBDVIEWERCONTEXTUALMENUITEMS8, ID_FBDVIEWERCONTEXTUALMENUITEMS9, ID_FBDVIEWERCONTEXTUALMENUITEMS11, ID_FBDVIEWERCONTEXTUALMENUITEMS12, -] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(10)] + ID_FBDVIEWERCONTEXTUALMENUITEMS14, ID_FBDVIEWERCONTEXTUALMENUITEMS15, +] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(12)] class ViewerDropTarget(wx.TextDropTarget): @@ -155,8 +156,13 @@ kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch') parent.AppendSeparator() AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11, + kind=wx.ITEM_NORMAL, text=u'Clear Execution Order') + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12, + kind=wx.ITEM_NORMAL, text=u'Reset Execution Order') + parent.AppendSeparator() + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS14, kind=wx.ITEM_NORMAL, text=u'Edit Block') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS15, kind=wx.ITEM_NORMAL, text=u'Delete') # Link menu event to corresponding called functions self.Bind(wx.EVT_MENU, self.OnNoModifierMenu, @@ -175,10 +181,14 @@ id=ID_FBDVIEWERCONTEXTUALMENUITEMS8) self.Bind(wx.EVT_MENU, self.OnDeleteBranchMenu, id=ID_FBDVIEWERCONTEXTUALMENUITEMS9) + self.Bind(wx.EVT_MENU, self.OnClearExecutionOrderMenu, + id=ID_FBDVIEWERCONTEXTUALMENUITEMS11) + self.Bind(wx.EVT_MENU, self.OnResetExecutionOrderMenu, + id=ID_FBDVIEWERCONTEXTUALMENUITEMS12) self.Bind(wx.EVT_MENU, self.OnEditBlockMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS11) + id=ID_FBDVIEWERCONTEXTUALMENUITEMS14) self.Bind(wx.EVT_MENU, self.OnDeleteMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS12) + id=ID_FBDVIEWERCONTEXTUALMENUITEMS15) # Create and initialize Contextual Menu def _init_menus(self): @@ -388,7 +398,7 @@ ids.append(instance["id"]) self.current_id = max(self.current_id, instance["id"]) if instance["type"] == "input": - variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"]) + variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"]) variable.SetPosition(instance["x"], instance["y"]) variable.SetSize(instance["width"], instance["height"]) self.AddBlock(variable) @@ -399,7 +409,7 @@ if instance["connector"]["edge"]: connectors["output"].SetEdge(instance["connector"]["edge"]) elif instance["type"] == "output": - variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"]) + variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"]) variable.SetPosition(instance["x"], instance["y"]) variable.SetSize(instance["width"], instance["height"]) self.AddBlock(variable) @@ -411,7 +421,7 @@ connectors["input"].SetEdge(instance["connector"]["edge"]) self.CreateWires(connectors["input"], instance["connector"]["links"], ids) elif instance["type"] == "inout": - variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"]) + variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"]) variable.SetPosition(instance["x"], instance["y"]) variable.SetSize(instance["width"], instance["height"]) self.AddBlock(variable) @@ -599,9 +609,9 @@ else: connectors["outputs"].append((output["name"], None, "none")) if instance["name"] != None: - block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors) - else: - block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors) + block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors, executionOrder=instance["executionOrder"]) + else: + block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors, executionOrder=instance["executionOrder"]) block.SetPosition(instance["x"], instance["y"]) block.SetSize(instance["width"], instance["height"]) self.AddBlock(block) @@ -698,65 +708,69 @@ def PopupBlockMenu(self, connector = None): if connector is not None and connector.IsCompatible("BOOL"): type = self.Controler.GetCurrentElementEditingType() - self.ContextualMenu.FindItemByPosition(0).Enable(True) - self.ContextualMenu.FindItemByPosition(1).Enable(True) - self.ContextualMenu.FindItemByPosition(2).Enable(type != "function") - self.ContextualMenu.FindItemByPosition(3).Enable(type != "function") + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, type != "function") + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, type != "function") else: - self.ContextualMenu.FindItemByPosition(0).Enable(False) - self.ContextualMenu.FindItemByPosition(1).Enable(False) - self.ContextualMenu.FindItemByPosition(2).Enable(False) - self.ContextualMenu.FindItemByPosition(3).Enable(False) - self.ContextualMenu.FindItemByPosition(5).Enable(False) - self.ContextualMenu.FindItemByPosition(6).Enable(False) - self.ContextualMenu.FindItemByPosition(8).Enable(False) - self.ContextualMenu.FindItemByPosition(9).Enable(False) - self.ContextualMenu.FindItemByPosition(11).Enable(self.SelectedElement.GetType() in self.Controler.GetProjectPouNames()) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames()) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True) if connector: if connector.IsNegated(): - self.ContextualMenu.FindItemByPosition(1).Check(True) + self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True) elif connector.GetEdge() == "rising": - self.ContextualMenu.FindItemByPosition(2).Check(True) + self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS2, True) elif connector.GetEdge() == "falling": - self.ContextualMenu.FindItemByPosition(3).Check(True) - else: - self.ContextualMenu.FindItemByPosition(0).Check(True) + self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS3, True) + else: + self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True) self.PopupMenu(self.ContextualMenu) def PopupWireMenu(self): - self.ContextualMenu.FindItemByPosition(0).Enable(False) - self.ContextualMenu.FindItemByPosition(1).Enable(False) - self.ContextualMenu.FindItemByPosition(2).Enable(False) - self.ContextualMenu.FindItemByPosition(3).Enable(False) - self.ContextualMenu.FindItemByPosition(5).Enable(True) - self.ContextualMenu.FindItemByPosition(6).Enable(True) - self.ContextualMenu.FindItemByPosition(8).Enable(False) - self.ContextualMenu.FindItemByPosition(9).Enable(False) - self.ContextualMenu.FindItemByPosition(11).Enable(False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, True) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, True) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True) self.PopupMenu(self.ContextualMenu) def PopupDivergenceMenu(self, connector): - self.ContextualMenu.FindItemByPosition(0).Enable(False) - self.ContextualMenu.FindItemByPosition(1).Enable(False) - self.ContextualMenu.FindItemByPosition(2).Enable(False) - self.ContextualMenu.FindItemByPosition(3).Enable(False) - self.ContextualMenu.FindItemByPosition(5).Enable(False) - self.ContextualMenu.FindItemByPosition(6).Enable(False) - self.ContextualMenu.FindItemByPosition(8).Enable(True) - self.ContextualMenu.FindItemByPosition(9).Enable(connector) - self.ContextualMenu.FindItemByPosition(11).Enable(False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, True) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, connector) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True) self.PopupMenu(self.ContextualMenu) - def PopupDefaultMenu(self): - self.ContextualMenu.FindItemByPosition(0).Enable(False) - self.ContextualMenu.FindItemByPosition(1).Enable(False) - self.ContextualMenu.FindItemByPosition(2).Enable(False) - self.ContextualMenu.FindItemByPosition(3).Enable(False) - self.ContextualMenu.FindItemByPosition(5).Enable(False) - self.ContextualMenu.FindItemByPosition(6).Enable(False) - self.ContextualMenu.FindItemByPosition(8).Enable(False) - self.ContextualMenu.FindItemByPosition(9).Enable(False) - self.ContextualMenu.FindItemByPosition(11).Enable(False) + def PopupDefaultMenu(self, block = True): + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False) + self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, block) self.PopupMenu(self.ContextualMenu) #------------------------------------------------------------------------------- @@ -821,6 +835,16 @@ self.RefreshBuffer() event.Skip() + def OnClearExecutionOrderMenu(self, event): + self.Controler.ClearCurrentExecutionOrder() + self.RefreshBuffer() + self.RefreshView() + + def OnResetExecutionOrderMenu(self, event): + self.Controler.ResetCurrentExecutionOrder() + self.RefreshBuffer() + self.RefreshView() + #------------------------------------------------------------------------------- # Mouse event functions #------------------------------------------------------------------------------- @@ -962,6 +986,8 @@ wx.CallAfter(self.SetCursor, wx.NullCursor) self.ReleaseMouse() self.Refresh(False) + else: + self.PopupDefaultMenu(False) event.Skip() def OnViewerLeftDClick(self, event): @@ -1361,18 +1387,24 @@ dialog = BlockPropertiesDialog(self.ParentWindow) dialog.SetBlockList(self.Controler.GetBlockTypes()) dialog.SetPouNames(self.Controler.GetProjectPouNames()) - dialog.SetPouElementNames(self.Controler.GetCurrentElementEditingVariables()) + variable_names = self.Controler.GetCurrentElementEditingVariables() + if block.GetName() != "": + variable_names.remove(block.GetName()) + dialog.SetPouElementNames(variable_names) dialog.SetMinBlockSize(block.GetSize()) - values = {"name" : block.GetName(), "type" : block.GetType(), "inputs" : block.GetInputTypes()} - values["extension"] = block.GetExtension() - dialog.SetValues(values) - if dialog.ShowModal() == wx.ID_OK: - values = dialog.GetValues() - if "name" in values: - block.SetName(values["name"]) - block.SetSize(values["width"], values["height"]) - block.SetType(values["type"], values["extension"]) + old_values = {"name" : block.GetName(), "type" : block.GetType(), "inputs" : block.GetInputTypes(), + "executionOrder" : block.GetExecutionOrder(), "extension" : block.GetExtension()} + dialog.SetValues(old_values) + if dialog.ShowModal() == wx.ID_OK: + new_values = dialog.GetValues() + if "name" in new_values: + block.SetName(new_values["name"]) + block.SetSize(new_values["width"], new_values["height"]) + block.SetType(new_values["type"], new_values["extension"]) + block.SetExecutionOrder(new_values["executionOrder"]) self.RefreshBlockModel(block) + if old_values["executionOrder"] != new_values["executionOrder"]: + self.RefreshView() self.RefreshBuffer() self.RefreshScrollBars() self.ParentWindow.RefreshEditor() @@ -1392,19 +1424,22 @@ if returntype: varlist.append((self.Controler.GetCurrentElementEditingName(), "Output", returntype)) dialog.SetVariables(varlist) - values = {"name" : variable.GetName(), "type" : variable.GetType()} - dialog.SetValues(values) - if dialog.ShowModal() == wx.ID_OK: - old_type = variable.GetType() - values = dialog.GetValues() - variable.SetName(values["name"]) - variable.SetType(values["type"], values["value_type"]) - variable.SetSize(values["width"], values["height"]) - if old_type != values["type"]: + old_values = {"name" : variable.GetName(), "type" : variable.GetType(), + "executionOrder" : variable.GetExecutionOrder()} + dialog.SetValues(old_values) + if dialog.ShowModal() == wx.ID_OK: + new_values = dialog.GetValues() + variable.SetName(new_values["name"]) + variable.SetType(new_values["type"], new_values["value_type"]) + variable.SetSize(new_values["width"], new_values["height"]) + variable.SetExecutionOrder(new_values["executionOrder"]) + if old_values["type"] != new_values["type"]: id = variable.GetId() self.Controler.RemoveCurrentElementEditingInstance(id) - self.Controler.AddCurrentElementEditingVariable(id, values["type"]) + self.Controler.AddCurrentElementEditingVariable(id, new_values["type"]) self.RefreshVariableModel(variable) + if old_values["executionOrder"] != new_values["executionOrder"]: + self.RefreshView() self.RefreshBuffer() self.RefreshScrollBars() self.Refresh(False) @@ -1600,6 +1635,7 @@ infos = {} infos["type"] = block.GetType() infos["name"] = block.GetName() + infos["executionOrder"] = block.GetExecutionOrder() infos["x"], infos["y"] = block.GetPosition() infos["width"], infos["height"] = block.GetSize() infos["connectors"] = block.GetConnectors() @@ -1609,6 +1645,7 @@ variableid = variable.GetId() infos = {} infos["name"] = variable.GetName() + infos["executionOrder"] = variable.GetExecutionOrder() infos["x"], infos["y"] = variable.GetPosition() infos["width"], infos["height"] = variable.GetSize() infos["connectors"] = variable.GetConnectors() @@ -1618,6 +1655,7 @@ connectionid = connection.GetId() infos = {} infos["name"] = connection.GetName() + infos["executionOrder"] = connection.GetExecutionOrder() infos["x"], infos["y"] = connection.GetPosition() infos["width"], infos["height"] = connection.GetSize() infos["connector"] = connection.GetConnector() diff -r bbe0697cf1ea -r 0c53d6a36013 graphics/FBD_Objects.py --- a/graphics/FBD_Objects.py Fri Oct 26 17:04:18 2007 +0200 +++ b/graphics/FBD_Objects.py Tue Oct 30 16:53:08 2007 +0100 @@ -39,15 +39,15 @@ class FBD_Block(Graphic_Element): # Create a new block - def __init__(self, parent, type, name, id = None, extension = 0, inputs = None, connectors = {}): + def __init__(self, parent, type, name, id = None, extension = 0, inputs = None, connectors = {}, executionOrder = 0): Graphic_Element.__init__(self, parent) self.Type = None self.Extension = None - self.Name = name self.Id = id + self.SetName(name) + self.SetExecutionOrder(executionOrder) self.Inputs = [] self.Outputs = [] - self.RefreshNameSize() self.Colour = wx.BLACK self.Pen = wx.BLACK_PEN self.SetType(type, extension, inputs, connectors) @@ -83,6 +83,11 @@ dc = wx.ClientDC(self.Parent) self.NameSize = dc.GetTextExtent(self.Name) + # Refresh the size of text for execution order + def RefreshExecutionOrderSize(self): + dc = wx.ClientDC(self.Parent) + self.ExecutionOrderSize = dc.GetTextExtent(str(self.ExecutionOrder)) + # Refresh the block bounding box def RefreshBoundingBox(self): # Calculate the size of the name outside the block @@ -96,6 +101,10 @@ else: bbx_y = self.Pos.y bbx_height = self.Size[1] + if self.ExecutionOrder != 0: + bbx_x = min(bbx_x, self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0]) + bbx_width = max(bbx_width, bbx_width + self.Pos.x + self.ExecutionOrderSize[0] - bbx_x - self.Size[0]) + bbx_height = bbx_height + (self.ExecutionOrderSize[1] + 2) self.BoundingBox = wx.Rect(bbx_x, bbx_y, bbx_width + 1, bbx_height + 1) # Refresh the positions of the block connectors @@ -260,6 +269,15 @@ def GetExtension(self): return self.Extension + # Changes the execution order + def SetExecutionOrder(self, executionOrder): + self.ExecutionOrder = executionOrder + self.RefreshExecutionOrderSize() + + # Returs the execution order + def GetExecutionOrder(self): + return self.ExecutionOrder + # Refresh the block minimum size def RefreshMinSize(self): # Calculate the inputs maximum width @@ -335,6 +353,10 @@ input.Draw(dc) for output in self.Outputs: output.Draw(dc) + if self.ExecutionOrder != 0: + # Draw block execution order + dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0], + self.Pos.y + self.Size[1] + 2) Graphic_Element.Draw(self, dc) dc.SetTextForeground(wx.BLACK) @@ -350,15 +372,15 @@ class FBD_Variable(Graphic_Element): # Create a new variable - def __init__(self, parent, type, name, value_type, id = None): + def __init__(self, parent, type, name, value_type, id = None, executionOrder = 0): Graphic_Element.__init__(self, parent) self.Type = None self.ValueType = None - self.Name = name self.Id = id + self.SetName(name) + self.SetExecutionOrder(executionOrder) self.Input = None self.Output = None - self.RefreshNameSize() self.SetType(type, value_type) # Make a clone of this FBD_Variable @@ -392,6 +414,11 @@ dc = wx.ClientDC(self.Parent) self.NameSize = dc.GetTextExtent(self.Name) + # Refresh the size of text for execution order + def RefreshExecutionOrderSize(self): + dc = wx.ClientDC(self.Parent) + self.ExecutionOrderSize = dc.GetTextExtent(str(self.ExecutionOrder)) + # Refresh the variable bounding box def RefreshBoundingBox(self): if self.Type in (OUTPUT, INOUT): @@ -402,7 +429,12 @@ bbx_width = self.Size[0] + 2 * CONNECTOR_SIZE else: bbx_width = self.Size[0] + CONNECTOR_SIZE - self.BoundingBox = wx.Rect(bbx_x, self.Pos.y, bbx_width + 1, self.Size[1] + 1) + bbx_height = self.Size[1] + if self.ExecutionOrder != 0: + bbx_x = min(bbx_x, self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0]) + bbx_width = max(bbx_width, bbx_width + self.Pos.x + self.ExecutionOrderSize[0] - bbx_x - self.Size[0]) + bbx_height = bbx_height + (self.ExecutionOrderSize[1] + 2) + self.BoundingBox = wx.Rect(bbx_x, self.Pos.y, bbx_width + 1, bbx_height + 1) # Refresh the position of the variable connector def RefreshConnectors(self): @@ -492,6 +524,15 @@ def GetName(self): return self.Name + # Changes the execution order + def SetExecutionOrder(self, executionOrder): + self.ExecutionOrder = executionOrder + self.RefreshExecutionOrderSize() + + # Returs the execution order + def GetExecutionOrder(self): + return self.ExecutionOrder + # Returns the variable minimum size def GetMinSize(self): return self.NameSize[0] + 10, self.NameSize[1] + 10 @@ -528,6 +569,10 @@ self.Input.Draw(dc) if self.Output: self.Output.Draw(dc) + if self.ExecutionOrder != 0: + # Draw variable execution order + dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - self.ExecutionOrderSize[0], + self.Pos.y + self.Size[1] + 2) Graphic_Element.Draw(self, dc) @@ -545,8 +590,8 @@ def __init__(self, parent, type, name, id = None): Graphic_Element.__init__(self, parent) self.Type = type - self.Name = name self.Id = id + self.SetName(name) self.Pos = wx.Point(0, 0) self.Size = wx.Size(0, 0) # Create an input or output connector according to connection type @@ -682,7 +727,7 @@ self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2) dc.DrawLine(self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2, self.Pos.x + self.Size[0] - arrowsize, self.Pos.y + self.Size[1]) - # Draw variable name + # Draw connection name dc.DrawText(self.Name, self.Pos.x + (self.Size[0] - self.NameSize[0]) / 2, self.Pos.y + (self.Size[1] - self.NameSize[1]) / 2) # Draw connector diff -r bbe0697cf1ea -r 0c53d6a36013 plcopen/plcopen.py --- a/plcopen/plcopen.py Fri Oct 26 17:04:18 2007 +0200 +++ b/plcopen/plcopen.py Tue Oct 30 16:53:08 2007 +0100 @@ -349,6 +349,15 @@ def getBodyType(self): return self.body.getContent()["name"] +def resetExecutionOrder(self): + self.body.resetExecutionOrder() + +def compileExecutionOrder(self): + self.body.compileExecutionOrder() + +def setElementExecutionOrder(self, instance, new_executionOrder): + self.body.setElementExecutionOrder(instance, new_executionOrder) + def addInstance(self, name, instance): self.body.appendContentInstance(name, instance) @@ -378,6 +387,9 @@ if cls: setattr(cls, "setBodyType", setBodyType) setattr(cls, "getBodyType", getBodyType) + setattr(cls, "resetExecutionOrder", resetExecutionOrder) + setattr(cls, "compileExecutionOrder", compileExecutionOrder) + setattr(cls, "setElementExecutionOrder", setElementExecutionOrder) setattr(cls, "addInstance", addInstance) setattr(cls, "getInstances", getInstances) setattr(cls, "getInstance", getInstance) @@ -556,6 +568,9 @@ if cls: setattr(cls, "setBodyType", setBodyType) setattr(cls, "getBodyType", getBodyType) + setattr(cls, "resetExecutionOrder", resetExecutionOrder) + setattr(cls, "compileExecutionOrder", compileExecutionOrder) + setattr(cls, "setElementExecutionOrder", setElementExecutionOrder) setattr(cls, "addInstance", addInstance) setattr(cls, "getInstances", getInstances) setattr(cls, "getInstance", getInstance) @@ -581,6 +596,9 @@ if cls: setattr(cls, "setBodyType", setBodyType) setattr(cls, "getBodyType", getBodyType) + setattr(cls, "resetExecutionOrder", resetExecutionOrder) + setattr(cls, "compileExecutionOrder", compileExecutionOrder) + setattr(cls, "setElementExecutionOrder", setElementExecutionOrder) setattr(cls, "addInstance", addInstance) setattr(cls, "getInstances", getInstances) setattr(cls, "getInstance", getInstance) @@ -604,6 +622,77 @@ cls = PLCOpenClasses.get("body", None) if cls: + cls.currentExecutionOrderId = 0 + + def resetCurrentExecutionOrderId(self): + self.currentExecutionOrderId = 0 + setattr(cls, "resetCurrentExecutionOrderId", resetCurrentExecutionOrderId) + + def getNewExecutionOrderId(self): + self.currentExecutionOrderId += 1 + return self.currentExecutionOrderId + setattr(cls, "getNewExecutionOrderId", getNewExecutionOrderId) + + def resetExecutionOrder(self): + if self.content["name"] == "FBD": + for element in self.content["value"].getContent(): + if not isinstance(element["value"], (PLCOpenClasses.get("comment", None), PLCOpenClasses.get("connector", None), PLCOpenClasses.get("continuation", None))): + element["value"].setExecutionOrderId(0) + else: + raise TypeError, "Can only generate execution order on FBD networks!" + setattr(cls, "resetExecutionOrder", resetExecutionOrder) + + def compileExecutionOrder(self): + if self.content["name"] == "FBD": + self.resetExecutionOrder() + self.resetCurrentExecutionOrderId() + for element in self.content["value"].getContent(): + if isinstance(element["value"], PLCOpenClasses.get("outVariable", None)) and element["value"].getExecutionOrderId() == 0: + connections = element["value"].connectionPointIn.getConnections() + if connections and len(connections) == 1: + self.compileElementExecutionOrder(connections[0]) + element["value"].setExecutionOrderId(self.getNewExecutionOrderId()) + else: + raise TypeError, "Can only generate execution order on FBD networks!" + setattr(cls, "compileExecutionOrder", compileExecutionOrder) + + def compileElementExecutionOrder(self, link): + if self.content["name"] == "FBD": + localid = link.getRefLocalId() + instance = self.getContentInstance(localid) + if isinstance(instance, PLCOpenClasses.get("block", None)) and instance.getExecutionOrderId() == 0: + for variable in instance.inputVariables.getVariable(): + connections = variable.connectionPointIn.getConnections() + if connections and len(connections) == 1: + self.compileElementExecutionOrder(connections[0]) + instance.setExecutionOrderId(self.getNewExecutionOrderId()) + elif isinstance(instance, PLCOpenClasses.get("continuation", None)) and instance.getExecutionOrderId() == 0: + name = instance.getName() + for tmp_instance in self.getContentInstances(): + if isinstance(tmp_instance, PLCOpenClasses.get("connector", None)) and tmp_instance.getName() == name and tmp_instance.getExecutionOrderId() == 0: + connections = tmp_instance.connectionPointIn.getConnections() + if connections and len(connections) == 1: + self.compileElementExecutionOrder(connections[0]) + else: + raise TypeError, "Can only generate execution order on FBD networks!" + setattr(cls, "compileElementExecutionOrder", compileElementExecutionOrder) + + def setElementExecutionOrder(self, instance, new_executionOrder): + if self.content["name"] == "FBD": + old_executionOrder = instance.getExecutionOrderId() + if old_executionOrder is not None and old_executionOrder != 0 and new_executionOrder != 0: + for element in self.content["value"].getContent(): + if element["value"] != instance and not isinstance(element["value"], PLCOpenClasses.get("comment", None)): + element_executionOrder = element["value"].getExecutionOrderId() + if old_executionOrder <= element_executionOrder <= new_executionOrder: + element["value"].setExecutionOrderId(element_executionOrder - 1) + if new_executionOrder <= element_executionOrder <= old_executionOrder: + element["value"].setExecutionOrderId(element_executionOrder + 1) + instance.setExecutionOrderId(new_executionOrder) + else: + raise TypeError, "Can only generate execution order on FBD networks!" + setattr(cls, "setElementExecutionOrder", setElementExecutionOrder) + def appendContentInstance(self, name, instance): if self.content["name"] in ["LD","FBD","SFC"]: self.content["value"].appendContent(name, instance)