--- a/ProjectController.py Wed Nov 22 19:47:08 2023 +0100
+++ b/ProjectController.py Wed Nov 22 19:48:55 2023 +0100
@@ -72,22 +72,22 @@
def ExtractChildrenTypesFromCatalog(catalog):
- for n, d, _h, c in catalog:
- if isinstance(c, list):
- children_types.extend(ExtractChildrenTypesFromCatalog(c))
+ for name, displayname, _helpstr, moduleclassname in catalog: + if isinstance(moduleclassname, list): + children_types.extend(ExtractChildrenTypesFromCatalog(moduleclassname)) - children_types.append((n, GetClassImporter(c), d))
+ children_types.append((name, GetClassImporter(moduleclassname), displayname)) def ExtractMenuItemsFromCatalog(catalog):
- for n, d, h, c in catalog:
- if isinstance(c, list):
- children = ExtractMenuItemsFromCatalog(c)
+ for name, displayname, helpstr, moduleclassname in catalog: + if isinstance(moduleclassname, list): + children = ExtractMenuItemsFromCatalog(moduleclassname) - menu_items.append((n, d, h, children))
+ menu_items.append((name, displayname, helpstr, children)) @@ -203,7 +203,7 @@
""" + "\n".join(['<xsd:attribute name=' +
'"Enable_' + libname + '_Library" ' +
'type="xsd:boolean" use="optional" default="' +
- ('true' if default else 'false') + '"/>'
+ ('false' if type(default)==str or default==False else 'true') + '"/>' for libname, _lib, default in features.libraries]) + """
</xsd:element>""") if len(features.libraries) > 0 else '') + """
@@ -282,7 +282,8 @@
- for libname, clsname, lib_enabled in features.libraries:
+ for libname, clsname, default in features.libraries: + lib_enabled = False if type(default)==str else default if self.BeremizRoot.Libraries is not None:
enable_attr = getattr(self.BeremizRoot.Libraries,
"Enable_" + libname + "_Library")
@@ -294,6 +295,33 @@
TypeStack.append(Lib.GetTypes())
self.Libraries.append(Lib)
+ def CTNAddChild(self, CTNName, CTNType, IEC_Channel=0): + Project controller applies libraries requirements when adding new CTN + res = ConfigTreeNode.CTNAddChild(self, CTNName, CTNType, IEC_Channel) + # find library associated with new CTN, if any + associated_lib = {default:libname + for libname, _clsname, default + in features.libraries}.get(CTNType, None) + # if any, then enable it if it wasn't and inform user + if associated_lib is not None: + # FIXME: This should be done with GetParamsAttribute + # but it fails with missing optional attributes + attrname = "Enable_" + associated_lib + "_Library" + libobj = self.BeremizRoot.Libraries + lib_enabled = False if libobj is None else getattr(libobj, attrname) + # use SetParamsAttribute to trigger reload of libs + self.SetParamsAttribute("BeremizRoot.Libraries.Enable_" + associated_lib + "_Library", True) + msg = _("Enabled {a1} library, required by {a2} extension\n").format( + a1=associated_lib, a2=CTNType) + self.GetCTRoot().logger.write(msg) def SetAppFrame(self, frame, logger):
--- a/features.py Wed Nov 22 19:47:08 2023 +0100
+++ b/features.py Wed Nov 22 19:48:55 2023 +0100
@@ -12,7 +12,7 @@
('Native', 'NativeLib.NativeLibrary', True),
('Python', 'py_ext.PythonLibrary', True),
# FIXME ('Etherlab', 'etherlab.EthercatMaster.EtherlabLibrary', False),
- ('SVGHMI', 'svghmi.SVGHMILibrary', False)]
+ ('SVGHMI', 'svghmi.SVGHMILibrary', 'svghmi')] ('opcua', _('OPC-UA client'), _('Map OPC-UA server as located variables'), 'opc_ua.OPCUAClient'),