Beremiz.py
changeset 20 d3cb5020997b
parent 19 73257cea38bd
child 21 bded6d31365c
--- a/Beremiz.py	Tue Sep 04 17:16:42 2007 +0200
+++ b/Beremiz.py	Tue Sep 04 17:58:29 2007 +0200
@@ -26,22 +26,10 @@
 
 import wx
 
-from time import localtime
-from datetime import datetime
 import types
 
 import os, re, platform, sys, time, traceback, getopt, commands
-base_folder = os.path.split(sys.path[0])[0]
-sys.path.append(os.path.join(base_folder, "plcopeneditor"))
-sys.path.append(os.path.join(base_folder, "CanFestival-3", "objdictgen"))
-sys.path.append(os.path.join(base_folder, "wxsvg", "svgui", "defeditor"))
-
-iec2cc_path = os.path.join(base_folder, "matiec", "iec2cc")
-ieclib_path = os.path.join(base_folder, "matiec", "lib")
-
-from PLCOpenEditor import PLCOpenEditor, ProjectDialog
-from TextViewer import TextViewer
-from plcopen.structures import IEC_KEYWORDS#, AddPlugin
+
 from plugger import PluginsRoot
 
 class LogPseudoFile:
@@ -80,6 +68,41 @@
     def isatty(self):
         return false
 
+    def LogCommand(self, Command, sz_limit = 100):
+
+        import os, popen2, fcntl, select, signal
+        
+        child = popen2.Popen3(Command, 1) # capture stdout and stderr from command
+        child.tochild.close()             # don't need to talk to child
+        outfile = child.fromchild 
+        outfd = outfile.fileno()
+        errfile = child.childerr
+        errfd = errfile.fileno()
+        outdata = errdata = ''
+        outeof = erreof = 0
+        outlen = errlen = 0
+        while 1:
+            ready = select.select([outfd,errfd],[],[]) # wait for input
+            if outfd in ready[0]:
+                outchunk = outfile.readline()
+                if outchunk == '': outeof = 1 
+                else : outlen += 1
+                outdata += outchunk
+                self.write(outchunk)
+            if errfd in ready[0]:
+                errchunk = errfile.readline()
+                if errchunk == '': erreof = 1 
+                else : errlen += 1
+                errdata += errchunk
+                self.write_warning(errchunk)
+            if outeof and erreof : break
+            if errlen > sz_limit or outlen > sz_limit : 
+                os.kill(child.pid, signal.SIGTERM)
+                self.write_error("Output size reached limit -- killed\n")
+                break
+        err = child.wait()
+        return (err, outdata, errdata)
+
 [ID_BEREMIZ, ID_BEREMIZMAINSPLITTER, 
  ID_BEREMIZSECONDSPLITTER, ID_BEREMIZLEFTPANEL, 
  ID_BEREMIZPARAMSPANEL, ID_BEREMIZLOGCONSOLE, 
@@ -299,14 +322,12 @@
         
         self.Log = LogPseudoFile(self.LogConsole)
         
-        self.PluginRoot = PluginsRoot()
+        self.PluginRoot = PluginsRoot(self)
         
         if projectOpen:
             self.PluginRoot.LoadProject(projectOpen)
             self.RefreshPluginTree()
         
-        self.PLCEditor = None
-        
         self.RefreshPluginParams()
         self.RefreshButtons()
         self.RefreshMainMenu()
@@ -588,123 +609,6 @@
                     textctrl.SetValue(str(element_infos["value"]))
             first = False
     
-    def UpdateAttributesTreeParts(self, tree, new_tree):
-        tree_leafs = [(element_infos["name"], element_infos["type"]) for element_infos in tree["children"]]
-        new_tree_leafs = [(element_infos["name"], element_infos["type"]) for element_infos in new_tree["children"]]
-        if tree_leafs != new_tree_leafs:
-            tree["children"] = new_tree["children"]
-            for child in tree["children"]:
-                self.PrepareAttributesTree(child)
-        else:
-            for idx, new_element_infos in enumerate(new_tree["children"]):
-                tree["children"][idx]["value"] = new_element_infos["value"]
-                if len(new_element_infos["children"]) > 0:
-                    self.UpdateAttributesTreeParts(tree["children"][idx], new_element_infos)
-    
-    def PrepareAttributesTree(self, tree):
-        if len(tree["children"]) > 0:
-            tree["open"] = False
-            for child in tree["children"]:
-                self.PrepareAttributesTree(child)
-    
-    def GenerateTable(self, data, tree, path, indent):
-        if path:
-            tree_path = "%s.%s"%(path, tree["name"])
-            infos = {"Attribute" : "   " * indent + tree["name"], "Value" : tree["value"], "Type" : tree["type"], "Open" : "", "Path" : tree_path}
-            data.append(infos)
-            indent += 1
-        else:
-            tree_path = tree["name"]
-        if len(tree["children"]) > 0:
-            if tree["open"] or not path:
-                if path:
-                    infos["Open"] = "v"
-                for child in tree["children"]:
-                    self.GenerateTable(data, child, tree_path, indent)
-            elif path:
-                infos["Open"] = ">"
-    
-    def RefreshAttributesGrid(self):
-        plugin = self.GetSelectedPlugin()
-        if not plugin:
-            self.AttributesTree = []
-            self.Table.Empty()
-        else:
-            new_params = plugin.GetParamsAttributes()
-            for idx, child in enumerate(new_params):
-                if len(self.AttributesTree) > idx:
-                    if self.AttributesTree[idx]["name"] == child["name"]:
-                        self.UpdateAttributesTreeParts(self.AttributesTree[idx], child)
-                    else:
-                        self.AttributesTree[idx] = child
-                        self.PrepareAttributesTree(child)
-                else:
-                    self.AttributesTree.append(child)
-                    self.PrepareAttributesTree(child)
-            while len(self.AttributesTree) > len(new_params):
-                self.AttributesTree.pop(-1)
-            data = []
-            for child in self.AttributesTree:
-                self.GenerateTable(data, child, None, 0)
-            self.Table.SetData(data)
-        self.Table.ResetView(self.AttributesGrid)
-    
-    def OpenClose(self, tree, path):
-        parts = path.split(".", 1)
-        for child in tree["children"]:
-            if child["name"] == parts[0]:
-                if len(parts) > 1:
-                    return self.OpenClose(child, parts[1])
-                elif len(child["children"]) > 0:
-                    child["open"] = not child["open"]
-                    return True
-        return False
-    
-    def OpenCloseAttribute(self):
-        if self.AttributesGrid.GetGridCursorCol() == 0:
-            row = self.AttributesGrid.GetGridCursorRow()
-            path = self.Table.GetValueByName(row, "Path")
-            parts = path.split(".", 1)
-            for child in self.AttributesTree:
-                if child["name"] == parts[0] and len(parts) > 1:
-                    result = self.OpenClose(child, parts[1])
-                    if result:
-                        self.RefreshAttributesGrid()
-    
-    def OnParamsEnableChanged(self, event):
-        plugin = self.GetSelectedPlugin()
-        if plugin and plugin != self.PluginRoot:
-            plugin.BaseParams.setEnabled(event.Checked())
-        event.Skip()
-    
-    def OnParamsIECChannelChanged(self, event):
-        plugin = self.GetSelectedPlugin()
-        if plugin and plugin != self.PluginRoot:
-            plugin.BaseParams.setIEC_Channel(self.ParamsIECChannel.GetValue())
-        event.Skip()
-    
-    def OnParamsTargetTypeChanged(self, event):
-        plugin = self.GetSelectedPlugin()
-        if plugin and plugin == self.PluginRoot:
-            self.PluginRoot.ChangeTargetType(self.ParamsTargetType.GetStringSelection())
-            self.RefreshAttributesGrid()
-        event.Skip()
-    
-    def OnAttributesGridCellChange(self, event):
-        row = event.GetRow()
-        plugin = self.GetSelectedPlugin()
-        if plugin:
-            path = self.Table.GetValueByName(row, "Path")
-            value = self.Table.GetValueByName(row, "Value")
-            plugin.SetParamsAttribute(path, value)
-            print plugin.GetParamsAttributes(path)
-            self.RefreshAttributesGrid()
-        event.Skip()
-    
-    def OnAttributesGridCellLeftClick(self, event):
-        wx.CallAfter(self.OpenCloseAttribute)
-        event.Skip()
-    
     def OnNewProjectMenu(self, event):
         defaultpath = self.PluginRoot.GetProjectPath()
         if defaultpath == "":
@@ -713,25 +617,20 @@
         if dialog.ShowModal() == wx.ID_OK:
             projectpath = dialog.GetPath()
             dialog.Destroy()
-            if os.path.isdir(projectpath) and len(os.listdir(projectpath)) == 0:
-                dialog = ProjectDialog(self)
-                if dialog.ShowModal() == wx.ID_OK:
-                    values = dialog.GetValues()
-                    values["creationDateTime"] = datetime(*localtime()[:6])
-                    self.PluginRoot.NewProject(projectpath, values)
-                    self.RefreshPluginTree()
-                    self.RefreshButtons()
-                    self.RefreshMainMenu()
-                dialog.Destroy()
+            res = self.PluginRoot.NewProject(projectpath)
+            if not res :
+                self.RefreshPluginTree()
+                self.RefreshButtons()
+                self.RefreshMainMenu()
             else:
-                message = wx.MessageDialog(self, "Folder choosen isn't empty. You can't use it for a new project!", "ERROR", wx.OK|wx.ICON_ERROR)
+                message = wx.MessageDialog(self, res, "ERROR", wx.OK|wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
         event.Skip()
     
     def OnOpenProjectMenu(self, event):
         defaultpath = self.PluginRoot.GetProjectPath()
-        if defaultpath == "":
+        if not defaultpath:
             defaultpath = os.getcwd()
         dialog = wx.DirDialog(self , "Choose a project", defaultpath, wx.DD_NEW_DIR_BUTTON)
         if dialog.ShowModal() == wx.ID_OK:
@@ -785,7 +684,7 @@
         event.Skip()
 
     def OnBuildMenu(self, event):
-        self.BuildAutom()
+        #self.BuildAutom()
         event.Skip()
 
     def OnSimulateMenu(self, event):
@@ -828,50 +727,6 @@
     
     def DeletePlugin(self):
         pass
-    
-    def EditPLC(self):
-        if not self.PLCEditor:
-            self.PLCEditor = PLCOpenEditor(self, self.PluginRoot.PLCManager)
-            self.PLCEditor.RefreshProjectTree()
-            self.PLCEditor.RefreshFileMenu()
-            self.PLCEditor.RefreshEditMenu()
-            self.PLCEditor.RefreshToolBar()
-            self.PLCEditor.Show()
-
-    def LogCommand(self, Command, sz_limit = 100):
-
-        import os, popen2, fcntl, select, signal
-        
-        child = popen2.Popen3(Command, 1) # capture stdout and stderr from command
-        child.tochild.close()             # don't need to talk to child
-        outfile = child.fromchild 
-        outfd = outfile.fileno()
-        errfile = child.childerr
-        errfd = errfile.fileno()
-        outdata = errdata = ''
-        outeof = erreof = 0
-        outlen = errlen = 0
-        while 1:
-            ready = select.select([outfd,errfd],[],[]) # wait for input
-            if outfd in ready[0]:
-                outchunk = outfile.readline()
-                if outchunk == '': outeof = 1 
-                else : outlen += 1
-                outdata += outchunk
-                self.Log.write(outchunk)
-            if errfd in ready[0]:
-                errchunk = errfile.readline()
-                if errchunk == '': erreof = 1 
-                else : errlen += 1
-                errdata += errchunk
-                self.Log.write_warning(errchunk)
-            if outeof and erreof : break
-            if errlen > sz_limit or outlen > sz_limit : 
-                os.kill(child.pid, signal.SIGTERM)
-                self.Log.write_error("Output size reached limit -- killed\n")
-                break
-        err = child.wait()
-        return (err, outdata, errdata)
 
 #-------------------------------------------------------------------------------
 #                             Add Bus Dialog