Adding support for recursively generate STLibrary and BlockLibrary according to plugin tree
authorlaurent
Wed, 29 Jul 2009 10:30:19 +0200
changeset 363 e0c4d3549369
parent 362 181231bf275f
child 364 27ea6a6747fc
Adding support for recursively generate STLibrary and BlockLibrary according to plugin tree
plugger.py
--- a/plugger.py	Wed Jul 29 10:27:23 2009 +0200
+++ b/plugger.py	Wed Jul 29 10:30:19 2009 +0200
@@ -115,7 +115,10 @@
         return os.path.join(self.PlugPath(PlugName), "plugin.xml")
 
     def PluginLibraryFilePath(self):
-        return os.path.join(os.path.join(os.path.split(__file__)[0], "plugins", self.PlugType, "pous.xml"))
+        return os.path.join(self.PluginPath(), "pous.xml")
+
+    def PluginPath(self):
+        return os.path.join(self.PlugParent.PluginPath(), self.PlugType)
 
     def PlugPath(self,PlugName=None):
         if not PlugName:
@@ -275,12 +278,27 @@
             return [{"name" : "%s POUs" % self.PlugType, "list": self.LibraryControler.Project.GetCustomBlockTypes()}]
         return []
 
+    def ParentsBlockTypesFactory(self):
+        return self.PlugParent.ParentsBlockTypesFactory() + self.BlockTypesFactory()
+
+    def PluginsBlockTypesFactory(self):
+        list = self.BlockTypesFactory()
+        for PlugChild in self.IterChilds():
+            list += PlugChild.PluginsBlockTypesFactory()
+        return list
+
     def STLibraryFactory(self):
         if self.LibraryControler is not None:
             program, errors, warnings = self.LibraryControler.GenerateProgram()
-            return program
+            return program + "\n"
         return ""
 
+    def PluginsSTLibraryFactory(self):
+        program = self.STLibraryFactory()
+        for PlugChild in self.IECSortedChilds():
+            program += PlugChild.PluginsSTLibraryFactory()
+        return program
+        
     def IterChilds(self):
         for PlugType, PluggedChilds in self.PluggedChilds.items():
             for PlugInstance in PluggedChilds:
@@ -541,6 +559,8 @@
         if os.path.isfile(library_path):
             self.LibraryControler = PLCControler()
             self.LibraryControler.OpenXMLFile(library_path)
+            self.LibraryControler.ClearPluginTypes()
+            self.LibraryControler.AddPluginBlockList(self.ParentsBlockTypesFactory())
 
     def LoadXMLParams(self, PlugName = None):
         methode_name = os.path.join(self.PlugPath(PlugName), "methods.py")
@@ -854,18 +874,22 @@
     def RefreshPluginsBlockLists(self):
         if getattr(self, "PluggedChilds", None) is not None:
             self.ClearPluginTypes()
-            self.AddPluginBlockList(self.BlockTypesFactory())
-            for child in self.IterChilds():
-                self.AddPluginBlockList(child.BlockTypesFactory())
+            self.AddPluginBlockList(self.PluginsBlockTypesFactory())
         if self.PLCEditor is not None:
             self.PLCEditor.RefreshEditor()
     
+    def PluginPath(self):
+        return os.path.join(os.path.split(__file__)[0], "plugins")
+    
     def PlugPath(self, PlugName=None):
         return self.ProjectPath
     
     def PluginXmlFilePath(self, PlugName=None):
         return os.path.join(self.PlugPath(PlugName), "beremiz.xml")
 
+    def ParentsBlockTypesFactory(self):
+        return self.BlockTypesFactory()
+
     def _getBuildPath(self):
         if self.BuildPath is None:
             return os.path.join(self.ProjectPath, "build")
@@ -941,13 +965,8 @@
             self.logger.write_error(_("Error in ST/IL/SFC code generator :\n%s\n")%errors[0])
             return False
         plc_file = open(self._getIECcodepath(), "w")
-        if getattr(self, "PluggedChilds", None) is not None:
-            # Add ST Library from plugins
-            plc_file.write(self.STLibraryFactory())
-            plc_file.write("\n")
-            for child in self.IterChilds():
-                plc_file.write(child.STLibraryFactory())
-                plc_file.write("\n")
+        # Add ST Library from plugins
+        plc_file.write(self.PluginsSTLibraryFactory())
         if os.path.isfile(self._getIECrawcodepath()):
             plc_file.write(open(self._getIECrawcodepath(), "r").read())
             plc_file.write("\n")