svghmi/svghmi.py
branchsvghmi
changeset 3165 2db69e2c5673
parent 3160 cecfd6bb4593
child 3167 001f63ff3aaa
equal deleted inserted replaced
3164:ea4a61b4a325 3165:2db69e2c5673
   428 
   428 
   429     def CreateHMITreeView(self, parent):
   429     def CreateHMITreeView(self, parent):
   430         #self.HMITreeView = HMITreeView(self)
   430         #self.HMITreeView = HMITreeView(self)
   431         return HMITreeSelector(parent)
   431         return HMITreeSelector(parent)
   432 
   432 
       
   433 def _ProgressArgs(args):
       
   434     if len(args) == 2:
       
   435         key, message = args
       
   436     else:
       
   437         key, = args
       
   438         message = key
       
   439     return str(key), str(message), time.time()
   433 
   440 
   434 class SVGHMI(object):
   441 class SVGHMI(object):
   435     XSD = """<?xml version="1.0" encoding="utf-8" ?>
   442     XSD = """<?xml version="1.0" encoding="utf-8" ?>
   436     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   443     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   437       <xsd:element name="SVGHMI">
   444       <xsd:element name="SVGHMI">
   497                             self._getPOTpath())
   504                             self._getPOTpath())
   498             # XXX TODO copy .PO files
   505             # XXX TODO copy .PO files
   499         return True
   506         return True
   500 
   507 
   501     def GetSVGGeometry(self):
   508     def GetSVGGeometry(self):
       
   509         t = time.time()
   502         # invoke inskscape -S, csv-parse output, produce elements
   510         # invoke inskscape -S, csv-parse output, produce elements
   503         InkscapeGeomColumns = ["Id", "x", "y", "w", "h"]
   511         InkscapeGeomColumns = ["Id", "x", "y", "w", "h"]
   504 
   512 
   505         inkpath = get_inkscape_path()
   513         inkpath = get_inkscape_path()
   506 
   514 
   521             attrs = dict(
   529             attrs = dict(
   522                 zip(InkscapeGeomColumns, line.strip().split(',')))
   530                 zip(InkscapeGeomColumns, line.strip().split(',')))
   523 
   531 
   524             res.append(etree.Element("bbox", **attrs))
   532             res.append(etree.Element("bbox", **attrs))
   525 
   533 
       
   534         self.GetCTRoot().logger.write("    Start collecting SVG geometry (Inkscape)\n")
       
   535         self.GetCTRoot().logger.write("    Finished collecting SVG geometry (Inkscape) in %.3fs\n"%(time.time()-t))
   526         return res
   536         return res
   527 
   537 
   528     def GetHMITree(self):
   538     def GetHMITree(self):
   529         global hmi_tree_root
   539         global hmi_tree_root
       
   540         t = time.time()
   530         res = [hmi_tree_root.etree(add_hash=True)]
   541         res = [hmi_tree_root.etree(add_hash=True)]
       
   542         self.GetCTRoot().logger.write("    Start getting HMI tree\n")
       
   543         self.GetCTRoot().logger.write("    Fnished getting HMI tree in %.3fs\n"%(time.time()-t))
   531         return res
   544         return res
   532 
   545 
   533     def GetTranslations(self, _context, msgs):
   546     def GetTranslations(self, _context, msgs):
       
   547         t = time.time()
   534         messages = EtreeToMessages(msgs)
   548         messages = EtreeToMessages(msgs)
   535 
   549 
   536         if len(messages) == 0:
   550         if len(messages) == 0:
   537             return
   551             return
   538 
   552 
   541         translations = ReadTranslations(self.CTNPath())
   555         translations = ReadTranslations(self.CTNPath())
   542             
   556             
   543         langs,translated_messages = MatchTranslations(translations, messages, 
   557         langs,translated_messages = MatchTranslations(translations, messages, 
   544             errcallback=self.GetCTRoot().logger.write_warning)
   558             errcallback=self.GetCTRoot().logger.write_warning)
   545 
   559 
   546         return TranslationToEtree(langs,translated_messages)
   560         ret = TranslationToEtree(langs,translated_messages)
       
   561 
       
   562         self.GetCTRoot().logger.write("    Start getting Translations\n")
       
   563         self.GetCTRoot().logger.write("    Finished getting Translations in %.3fs\n"%(time.time()-t))
       
   564 
       
   565         return ret
   547 
   566 
   548     times = {}
   567     times = {}
   549     def ProgressStart(self, _context, message):
   568 
   550         t = time.time()
   569     def ProgressStart(self, _context, *args):
   551         s = str(message)
   570         k,m,t = _ProgressArgs(args)
   552         self.times[s] = t
   571         self.times[k] = t
   553 
   572         # self.GetCTRoot().logger.write("  Start %s: %.3f\n"%(m, t - self.transform_begin))
   554     def ProgressEnd(self, _context, message):
   573         self.GetCTRoot().logger.write("    Start %s\n"%m)
   555         t = time.time()
   574 
   556         s = str(message)
   575     def ProgressEnd(self, _context, *args):
   557         self.GetCTRoot().logger.write("  %s: %.3f\n"%(message, t - self.times[s]))
   576         k,m,t = _ProgressArgs(args)
   558         self.times[s] = t
   577         self.times[k] = t
       
   578         self.GetCTRoot().logger.write("    Finished %s in %.3f\n"%(m, t - self.times[k]))
   559 
   579 
   560     def CTNGenerate_C(self, buildpath, locations):
   580     def CTNGenerate_C(self, buildpath, locations):
   561 
   581 
   562         location_str = "_".join(map(str, self.GetCurrentLocation()))
   582         location_str = "_".join(map(str, self.GetCurrentLocation()))
   563         view_name = self.BaseParams.getName()
   583         view_name = self.BaseParams.getName()
   581                            ("GetHMITree", lambda *_ignored:self.GetHMITree()),
   601                            ("GetHMITree", lambda *_ignored:self.GetHMITree()),
   582                            ("GetTranslations", self.GetTranslations),
   602                            ("GetTranslations", self.GetTranslations),
   583                            ("ProgressStart", self.ProgressStart),
   603                            ("ProgressStart", self.ProgressStart),
   584                            ("ProgressEnd", self.ProgressEnd)])
   604                            ("ProgressEnd", self.ProgressEnd)])
   585 
   605 
   586 
       
   587             t = time.time()
   606             t = time.time()
   588 
   607 
   589             # load svg as a DOM with Etree
   608             # load svg as a DOM with Etree
   590             svgdom = etree.parse(svgfile)
   609             svgdom = etree.parse(svgfile)
   591 
   610 
   592             self.GetCTRoot().logger.write("  Source SVG parsing: %.3f\n"%(time.time()-t))
   611             self.GetCTRoot().logger.write("    Source SVG parsing: %.3f\n"%(time.time()-t))
   593 
   612 
   594             # call xslt transform on Inkscape's SVG to generate XHTML
   613             # call xslt transform on Inkscape's SVG to generate XHTML
   595             try: 
   614             try: 
   596                 result = transform.transform(svgdom)
   615                 self.transform_begin = time.time()
       
   616                 result = transform.transform(svgdom)  # , profile_run=True)
       
   617                 self.GetCTRoot().logger.write("    XSLT transform: %.3f\n"%(time.time()-self.transform_begin))
   597             except XSLTApplyError as e:
   618             except XSLTApplyError as e:
   598                 self.FatalError("SVGHMI " + view_name  + ": " + e.message)
   619                 self.FatalError("SVGHMI " + view_name  + ": " + e.message)
   599             finally:
   620             finally:
   600                 for entry in transform.get_error_log():
   621                 for entry in transform.get_error_log():
   601                     message = "SVGHMI: "+ entry.message + "\n" 
   622                     message = "SVGHMI: "+ entry.message + "\n" 
   602                     self.GetCTRoot().logger.write_warning(message)
   623                     self.GetCTRoot().logger.write_warning(message)
   603 
   624 
   604             result.write(target_file, encoding="utf-8")
   625             result.write(target_file, encoding="utf-8")
   605             # print(str(result))
   626             # print(str(result))
   606             # print(transform.xslt.error_log)
   627             # print(transform.xslt.error_log)
       
   628             # print(etree.tostring(result.xslt_profile,pretty_print=True))
   607 
   629 
   608             # TODO
   630             # TODO
   609             #   - Errors on HMI semantics
   631             #   - Errors on HMI semantics
   610             #   - ... maybe something to have a global view of what is declared in SVG.
   632             #   - ... maybe something to have a global view of what is declared in SVG.
   611 
   633