Adding support for copying a POU inside a same project
authorlbessard
Thu, 18 Sep 2008 08:05:55 +0200
changeset 274 047e36c63736
parent 273 5b18d98aa4f9
child 275 acf474a94136
Adding support for copying a POU inside a same project
Dialogs.py
PLCControler.py
PLCOpenEditor.py
SFCViewer.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
--- 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)])