# HG changeset patch # User Edouard Tisserant # Date 1573810454 -3600 # Node ID d813ecfe8941d8c7879bda87c74c432c3b016f07 # Parent 77b2a3757e66020639a0db3d2f62c90502d3e548 SVGHMI: Added simple HMI Tree View. diff -r 77b2a3757e66 -r d813ecfe8941 svghmi/svghmi.py --- a/svghmi/svghmi.py Thu Nov 14 08:46:32 2019 +0100 +++ b/svghmi/svghmi.py Fri Nov 15 10:34:14 2019 +0100 @@ -12,17 +12,23 @@ from itertools import izip, imap from pprint import pprint, pformat import hashlib +import weakref import wx +import wx.dataview as dv + +from lxml import etree +from lxml.etree import XSLTApplyError import util.paths as paths from POULibrary import POULibrary from docutil import open_svg, get_inkscape_path -from lxml import etree from util.ProcessLogger import ProcessLogger from runtime.typemapping import DebugTypesSize import targets +from editors.ConfTreeNodeEditor import ConfTreeNodeEditor +from XSLTransform import XSLTransform HMI_TYPES_DESC = { "HMI_NODE":{}, @@ -33,8 +39,6 @@ HMI_TYPES = HMI_TYPES_DESC.keys() -from XSLTransform import XSLTransform -from lxml.etree import XSLTApplyError ScriptDirectory = paths.AbsDir(__file__) @@ -127,12 +131,14 @@ hmi_tree_root = None +hmi_tree_updated = None + class SVGHMILibrary(POULibrary): def GetLibraryPath(self): return paths.AbsNeighbourFile(__file__, "pous.xml") def Generate_C(self, buildpath, varlist, IECCFLAGS): - global hmi_tree_root, hmi_tree_unique_id + global hmi_tree_root, hmi_tree_updated, hmi_tree_unique_id """ PLC Instance Tree: @@ -194,6 +200,9 @@ new_node = HMITreeNode(path, name, derived, v["type"], v["vartype"], **kwargs) hmi_tree_root.place_node(new_node) + if hmi_tree_updated is not None: + hmi_tree_updated() + variable_decl_array = [] extern_variables_declarations = [] buf_index = 0 @@ -262,6 +271,69 @@ return ((["svghmi"], [(gen_svghmi_c_path, IECCFLAGS)], True), "", ("runtime_svghmi0.py", open(runtimefile_path, "rb"))) + +class SVGHMIEditor(ConfTreeNodeEditor): + CONFNODEEDITOR_TABS = [ + (_("HMI Tree"), "CreateHMITreeView")] + + def SVGHMIEditorUpdater(self): + selfref = weakref.ref(self) + def SVGHMIEditorUpdate(): + o = selfref() + if o is not None: + wx.CallAfter(o.MakeTree) + return SVGHMIEditorUpdate + + def CreateHMITreeView(self, parent): + global hmi_tree_updated + + dvtc = dv.DataViewTreeCtrl(parent) + isz = (16,16) + self.ImageList = il = wx.ImageList(*isz) + self.fldridx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_FOLDER, wx.ART_OTHER, isz)) + self.fldropenidx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_FOLDER_OPEN, wx.ART_OTHER, isz)) + self.fileidx = il.AddIcon(wx.ArtProvider.GetIcon(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz)) + dvtc.SetImageList(il) + + + self.HMITreeView = dvtc + hmi_tree_updated = self.SVGHMIEditorUpdater() + self.MakeTree() + return self.HMITreeView + + def _recurseTree(self, current_hmitree_root, current_dvtc_root): + dvtc = self.HMITreeView + for c in current_hmitree_root.children: + if hasattr(c, "children"): + display_name = ('{} (class={})'.format(c.name, c.hmiclass)) \ + if c.hmiclass is not None else c.name + dvtc_child = dvtc.AppendContainer( + current_dvtc_root, display_name, + self.fldridx, self.fldropenidx) + + self._recurseTree(c,dvtc_child) + else: + display_name = '{} {}'.format(c.nodetype[4:], c.name) + dvtc.AppendContainer( + current_dvtc_root, display_name, + self.fileidx, self.fileidx) + + def MakeTree(self): + global hmi_tree_root + + dvtc = self.HMITreeView + + dvtc.Freeze() + dvtc.DeleteAllItems() + + root_display_name = _("Please build to see HMI Tree") if hmi_tree_root is None else "HMI" + root = dvtc.AppendContainer(dv.NullDataViewItem, + root_display_name, + self.fldridx, self.fldropenidx) + if hmi_tree_root is not None: + self._recurseTree(hmi_tree_root, root) + dvtc.Thaw() + class SVGHMI(object): XSD = """ @@ -274,7 +346,8 @@ """ - # TODO : add comma separated supported language list + + EditorType = SVGHMIEditor ConfNodeMethods = [ { diff -r 77b2a3757e66 -r d813ecfe8941 tests/svghmi/plc.xml --- a/tests/svghmi/plc.xml Thu Nov 14 08:46:32 2019 +0100 +++ b/tests/svghmi/plc.xml Fri Nov 15 10:34:14 2019 +0100 @@ -1,7 +1,7 @@ - + @@ -30,11 +30,6 @@ - - - - - @@ -62,24 +57,6 @@ TargetPressure - - - - - - - - - - - - - - - - - -