# HG changeset patch # User lbessard # Date 1221717955 -7200 # Node ID 047e36c63736d5a2b2b8a064aefc5802bd17df52 # Parent 5b18d98aa4f9d74cc17be2b015ed7a9c6ad5a04b Adding support for copying a POU inside a same project diff -r 5b18d98aa4f9 -r 047e36c63736 Dialogs.py --- a/Dialogs.py Wed Sep 17 17:59:53 2008 +0200 +++ b/Dialogs.py Thu Sep 18 08:05:55 2008 +0200 @@ -2478,3 +2478,56 @@ 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() \ No newline at end of file diff -r 5b18d98aa4f9 -r 047e36c63736 PLCControler.py --- a/PLCControler.py Wed Sep 17 17:59:53 2008 +0200 +++ b/PLCControler.py Thu Sep 18 08:05:55 2008 +0200 @@ -560,6 +560,15 @@ self.SetPouInterfaceReturnType(pou_name, "BOOL") self.BufferProject() + def ProjectCreatePouFrom(self, name, from_name): + if self.Project is not None: + pou = self.Project.getpou(from_name) + if pou is not None: + new_pou = self.Copy(pou) + new_pou.setname(name) + self.Project.insertpou(-1, new_pou) + self.BufferProject() + # Remove a Pou from project def ProjectRemovePou(self, pou_name): if self.Project is not None: @@ -2576,7 +2585,7 @@ extras = {"xmlns" : "http://www.plcopen.org/xml/tc6.xsd", "xmlns:xhtml" : "http://www.w3.org/1999/xhtml", "xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance", - "xsi:schemaLocation" : "http://www.plcopen.org/xml/tc6.xsd http://www.plcopen.org/xml/tc6.xsd"} + "xsi:schemaLocation" : "http://www.plcopen.org/xml/tc6.xsd"} text += self.Project.generateXMLText("project", 0, extras) if filepath: diff -r 5b18d98aa4f9 -r 047e36c63736 PLCOpenEditor.py --- a/PLCOpenEditor.py Wed Sep 17 17:59:53 2008 +0200 +++ b/PLCOpenEditor.py Thu Sep 18 08:05:55 2008 +0200 @@ -1611,6 +1611,9 @@ self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id) menu.AppendSeparator() new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Create a new POU from") + self.Bind(wx.EVT_MENU, self.OnCreatePouFromMenu, id=new_id) + new_id = wx.NewId() AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete") self.Bind(wx.EVT_MENU, self.OnRemovePouMenu, id=new_id) self.PopupMenu(menu) @@ -2187,6 +2190,20 @@ # Remove Project Elements Functions #------------------------------------------------------------------------------- + def OnCreatePouFromMenu(self, event): + selected = self.TypesTree.GetSelection() + if self.TypesTree.GetPyData(selected) == ITEM_POU: + dialog = PouNameDialog(self, "Please enter POU name", "Create a new POU from", "", wx.OK|wx.CANCEL) + dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) + if dialog.ShowModal() == wx.ID_OK: + self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected)) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshTypesTree() + self.RefreshLibraryTree() + self.RefreshToolBar() + event.Skip() + def OnRemoveDataTypeMenu(self, event): selected = self.TypesTree.GetSelection() if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE: diff -r 5b18d98aa4f9 -r 047e36c63736 SFCViewer.py --- a/SFCViewer.py Wed Sep 17 17:59:53 2008 +0200 +++ b/SFCViewer.py Thu Sep 18 08:05:55 2008 +0200 @@ -355,7 +355,7 @@ #------------------------------------------------------------------------------- def AddInitialStep(self, pos): - dialog = StepNameDialog(self.ParentWindow, "Add a new initial step", "Please enter step name", "", wx.OK|wx.CANCEL) + dialog = StepNameDialog(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)])