7 - ... TODO : document |
7 - ... TODO : document |
8 """ |
8 """ |
9 |
9 |
10 import os,traceback,types |
10 import os,traceback,types |
11 import shutil |
11 import shutil |
12 from xml.dom import minidom |
12 from lxml import etree |
13 |
13 |
14 from xmlclass import GenerateClassesFromXSDstring |
14 from xmlclass import GenerateParserFromXSDstring |
15 from util.misc import GetClassImporter |
15 from util.misc import GetClassImporter |
16 |
16 |
17 from PLCControler import PLCControler, LOCATION_CONFNODE |
17 from PLCControler import PLCControler, LOCATION_CONFNODE |
18 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor |
18 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor |
19 |
19 |
20 _BaseParamsClass = GenerateClassesFromXSDstring("""<?xml version="1.0" encoding="ISO-8859-1" ?> |
20 _BaseParamsParser = GenerateParserFromXSDstring("""<?xml version="1.0" encoding="ISO-8859-1" ?> |
21 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
21 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
22 <xsd:element name="BaseParams"> |
22 <xsd:element name="BaseParams"> |
23 <xsd:complexType> |
23 <xsd:complexType> |
24 <xsd:attribute name="Name" type="xsd:string" use="optional" default="__unnamed__"/> |
24 <xsd:attribute name="Name" type="xsd:string" use="optional" default="__unnamed__"/> |
25 <xsd:attribute name="IEC_Channel" type="xsd:integer" use="required"/> |
25 <xsd:attribute name="IEC_Channel" type="xsd:integer" use="required"/> |
26 <xsd:attribute name="Enabled" type="xsd:boolean" use="optional" default="true"/> |
26 <xsd:attribute name="Enabled" type="xsd:boolean" use="optional" default="true"/> |
27 </xsd:complexType> |
27 </xsd:complexType> |
28 </xsd:element> |
28 </xsd:element> |
29 </xsd:schema>""")["BaseParams"] |
29 </xsd:schema>""") |
30 |
30 |
31 NameTypeSeparator = '@' |
31 NameTypeSeparator = '@' |
32 |
32 |
33 class ConfigTreeNode: |
33 class ConfigTreeNode: |
34 """ |
34 """ |
44 IconPath = None |
44 IconPath = None |
45 |
45 |
46 def _AddParamsMembers(self): |
46 def _AddParamsMembers(self): |
47 self.CTNParams = None |
47 self.CTNParams = None |
48 if self.XSD: |
48 if self.XSD: |
49 self.Classes = GenerateClassesFromXSDstring(self.XSD) |
49 self.Parser = GenerateParserFromXSDstring(self.XSD) |
50 Classes = [(name, XSDclass) for name, XSDclass in self.Classes.items() if XSDclass.IsBaseClass] |
50 obj = self.Parser.CreateRoot() |
51 if len(Classes) == 1: |
51 name = obj.getLocalTag() |
52 name, XSDclass = Classes[0] |
52 self.CTNParams = (name, obj) |
53 obj = XSDclass() |
53 setattr(self, name, obj) |
54 self.CTNParams = (name, obj) |
|
55 setattr(self, name, obj) |
|
56 |
54 |
57 def __init__(self): |
55 def __init__(self): |
58 # Create BaseParam |
56 # Create BaseParam |
59 self.BaseParams = _BaseParamsClass() |
57 self.BaseParams = _BaseParamsParser.CreateRoot() |
60 self.MandatoryParams = ("BaseParams", self.BaseParams) |
58 self.MandatoryParams = ("BaseParams", self.BaseParams) |
61 self._AddParamsMembers() |
59 self._AddParamsMembers() |
62 self.Children = {} |
60 self.Children = {} |
63 self._View = None |
61 self._View = None |
64 # copy ConfNodeMethods so that it can be later customized |
62 # copy ConfNodeMethods so that it can be later customized |
168 os.mkdir(ctnpath) |
166 os.mkdir(ctnpath) |
169 |
167 |
170 # generate XML for base XML parameters controller of the confnode |
168 # generate XML for base XML parameters controller of the confnode |
171 if self.MandatoryParams: |
169 if self.MandatoryParams: |
172 BaseXMLFile = open(self.ConfNodeBaseXmlFilePath(),'w') |
170 BaseXMLFile = open(self.ConfNodeBaseXmlFilePath(),'w') |
173 BaseXMLFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") |
171 BaseXMLFile.write(etree.tostring( |
174 BaseXMLFile.write(self.MandatoryParams[1].generateXMLText(self.MandatoryParams[0], 0).encode("utf-8")) |
172 self.MandatoryParams[1], |
|
173 pretty_print=True, |
|
174 xml_declaration=True, |
|
175 encoding='utf-8')) |
175 BaseXMLFile.close() |
176 BaseXMLFile.close() |
176 |
177 |
177 # generate XML for XML parameters controller of the confnode |
178 # generate XML for XML parameters controller of the confnode |
178 if self.CTNParams: |
179 if self.CTNParams: |
179 XMLFile = open(self.ConfNodeXmlFilePath(),'w') |
180 XMLFile = open(self.ConfNodeXmlFilePath(),'w') |
180 XMLFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") |
181 XMLFile.write(etree.tostring( |
181 XMLFile.write(self.CTNParams[1].generateXMLText(self.CTNParams[0], 0).encode("utf-8")) |
182 self.CTNParams[1], |
|
183 pretty_print=True, |
|
184 xml_declaration=True, |
|
185 encoding='utf-8')) |
182 XMLFile.close() |
186 XMLFile.close() |
183 |
187 |
184 # Call the confnode specific OnCTNSave method |
188 # Call the confnode specific OnCTNSave method |
185 result = self.OnCTNSave(from_project_path) |
189 result = self.OnCTNSave(from_project_path) |
186 if not result: |
190 if not result: |
579 |
583 |
580 # Get the base xml tree |
584 # Get the base xml tree |
581 if self.MandatoryParams: |
585 if self.MandatoryParams: |
582 try: |
586 try: |
583 basexmlfile = open(self.ConfNodeBaseXmlFilePath(CTNName), 'r') |
587 basexmlfile = open(self.ConfNodeBaseXmlFilePath(CTNName), 'r') |
584 basetree = minidom.parse(basexmlfile) |
588 self.BaseParams = etree.fromstring( |
585 self.MandatoryParams[1].loadXMLTree(basetree.childNodes[0]) |
589 basexmlfile.read(), _BaseParamsParser) |
|
590 self.MandatoryParams = ("BaseParams", self.BaseParams) |
586 basexmlfile.close() |
591 basexmlfile.close() |
587 except Exception, exc: |
592 except Exception, exc: |
588 self.GetCTRoot().logger.write_error(_("Couldn't load confnode base parameters %s :\n %s") % (CTNName, unicode(exc))) |
593 self.GetCTRoot().logger.write_error(_("Couldn't load confnode base parameters %s :\n %s") % (CTNName, unicode(exc))) |
589 self.GetCTRoot().logger.write_error(traceback.format_exc()) |
594 self.GetCTRoot().logger.write_error(traceback.format_exc()) |
590 |
595 |
591 # Get the xml tree |
596 # Get the xml tree |
592 if self.CTNParams: |
597 if self.CTNParams: |
593 try: |
598 try: |
594 xmlfile = open(self.ConfNodeXmlFilePath(CTNName), 'r') |
599 xmlfile = open(self.ConfNodeXmlFilePath(CTNName), 'r') |
595 tree = minidom.parse(xmlfile) |
600 obj = etree.fromstring(xmlfile.read(), self.Parser) |
596 self.CTNParams[1].loadXMLTree(tree.childNodes[0]) |
601 name = obj.getLocalTag() |
|
602 setattr(self, name, obj) |
|
603 self.CTNParams = (name, obj) |
597 xmlfile.close() |
604 xmlfile.close() |
598 except Exception, exc: |
605 except Exception, exc: |
599 self.GetCTRoot().logger.write_error(_("Couldn't load confnode parameters %s :\n %s") % (CTNName, unicode(exc))) |
606 self.GetCTRoot().logger.write_error(_("Couldn't load confnode parameters %s :\n %s") % (CTNName, unicode(exc))) |
600 self.GetCTRoot().logger.write_error(traceback.format_exc()) |
607 self.GetCTRoot().logger.write_error(traceback.format_exc()) |
601 |
608 |