--- 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
--- 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:
--- 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:
--- 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)])