svghmi/svghmi.py
branchsvghmi
changeset 3170 aaa203270ab0
parent 3167 001f63ff3aaa
child 3176 81136a097012
equal deleted inserted replaced
3169:91207ee5b6af 3170:aaa203270ab0
   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()
       
   440 
       
   441 class SVGHMI(object):
   433 class SVGHMI(object):
   442     XSD = """<?xml version="1.0" encoding="utf-8" ?>
   434     XSD = """<?xml version="1.0" encoding="utf-8" ?>
   443     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   435     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   444       <xsd:element name="SVGHMI">
   436       <xsd:element name="SVGHMI">
   445         <xsd:complexType>
   437         <xsd:complexType>
   504                             self._getPOTpath())
   496                             self._getPOTpath())
   505             # XXX TODO copy .PO files
   497             # XXX TODO copy .PO files
   506         return True
   498         return True
   507 
   499 
   508     def GetSVGGeometry(self):
   500     def GetSVGGeometry(self):
   509         t = time.time()
   501         self.ProgressStart("inkscape", "collecting SVG geometry (Inkscape)")
   510         # invoke inskscape -S, csv-parse output, produce elements
   502         # invoke inskscape -S, csv-parse output, produce elements
   511         InkscapeGeomColumns = ["Id", "x", "y", "w", "h"]
   503         InkscapeGeomColumns = ["Id", "x", "y", "w", "h"]
   512 
   504 
   513         inkpath = get_inkscape_path()
   505         inkpath = get_inkscape_path()
   514 
   506 
   529             attrs = dict(
   521             attrs = dict(
   530                 zip(InkscapeGeomColumns, line.strip().split(',')))
   522                 zip(InkscapeGeomColumns, line.strip().split(',')))
   531 
   523 
   532             res.append(etree.Element("bbox", **attrs))
   524             res.append(etree.Element("bbox", **attrs))
   533 
   525 
   534         self.GetCTRoot().logger.write("    Start collecting SVG geometry (Inkscape)\n")
   526         self.ProgressEnd("inkscape")
   535         self.GetCTRoot().logger.write("    Finished collecting SVG geometry (Inkscape) in %.3fs\n"%(time.time()-t))
       
   536         return res
   527         return res
   537 
   528 
   538     def GetHMITree(self):
   529     def GetHMITree(self):
   539         global hmi_tree_root
   530         global hmi_tree_root
   540         t = time.time()
   531         self.ProgressStart("hmitree", "getting HMI tree")
   541         res = [hmi_tree_root.etree(add_hash=True)]
   532         res = [hmi_tree_root.etree(add_hash=True)]
   542         self.GetCTRoot().logger.write("    Start getting HMI tree\n")
   533         self.ProgressEnd("hmitree")
   543         self.GetCTRoot().logger.write("    Fnished getting HMI tree in %.3fs\n"%(time.time()-t))
       
   544         return res
   534         return res
   545 
   535 
   546     def GetTranslations(self, _context, msgs):
   536     def GetTranslations(self, _context, msgs):
   547         t = time.time()
   537         self.ProgressStart("i18n", "getting Translations")
   548         messages = EtreeToMessages(msgs)
   538         messages = EtreeToMessages(msgs)
   549 
   539 
   550         if len(messages) == 0:
   540         if len(messages) == 0:
       
   541             self.ProgressEnd("i18n")
   551             return
   542             return
   552 
   543 
   553         SaveCatalog(self._getPOTpath(), messages)
   544         SaveCatalog(self._getPOTpath(), messages)
   554 
   545 
   555         translations = ReadTranslations(self.CTNPath())
   546         translations = ReadTranslations(self.CTNPath())
   557         langs,translated_messages = MatchTranslations(translations, messages, 
   548         langs,translated_messages = MatchTranslations(translations, messages, 
   558             errcallback=self.GetCTRoot().logger.write_warning)
   549             errcallback=self.GetCTRoot().logger.write_warning)
   559 
   550 
   560         ret = TranslationToEtree(langs,translated_messages)
   551         ret = TranslationToEtree(langs,translated_messages)
   561 
   552 
   562         self.GetCTRoot().logger.write("    Start getting Translations\n")
   553         self.ProgressEnd("i18n")
   563         self.GetCTRoot().logger.write("    Finished getting Translations in %.3fs\n"%(time.time()-t))
       
   564 
   554 
   565         return ret
   555         return ret
   566 
   556 
   567     times = {}
   557     times_msgs = {}
   568 
   558     indent = 1
   569     def ProgressStart(self, _context, *args):
   559     def ProgressStart(self, k, m):
   570         k,m,t = _ProgressArgs(args)
   560         self.times_msgs[k] = (time.time(), m)
   571         self.times[k] = t
   561         self.GetCTRoot().logger.write("    "*self.indent + "Start %s...\n"%m)
   572         # self.GetCTRoot().logger.write("  Start %s: %.3f\n"%(m, t - self.transform_begin))
   562         self.indent = self.indent + 1
   573         self.GetCTRoot().logger.write("    Start %s\n"%m)
   563 
   574 
   564     def ProgressEnd(self, k):
   575     def ProgressEnd(self, _context, *args):
   565         t = time.time()
   576         k,m,t = _ProgressArgs(args)
   566         oldt, m = self.times_msgs[k]
   577         self.GetCTRoot().logger.write("    Finished %s in %.3f\n"%(m, t - self.times[k]))
   567         self.indent = self.indent - 1
   578         self.times[k] = t
   568         self.GetCTRoot().logger.write("    "*self.indent + "... finished in %.3fs\n"%(t - oldt))
   579 
   569 
   580     def CTNGenerate_C(self, buildpath, locations):
   570     def CTNGenerate_C(self, buildpath, locations):
   581 
   571 
   582         location_str = "_".join(map(str, self.GetCurrentLocation()))
   572         location_str = "_".join(map(str, self.GetCurrentLocation()))
   583         view_name = self.BaseParams.getName()
   573         view_name = self.BaseParams.getName()
   598             # TODO : move to __init__
   588             # TODO : move to __init__
   599             transform = XSLTransform(os.path.join(ScriptDirectory, "gen_index_xhtml.xslt"),
   589             transform = XSLTransform(os.path.join(ScriptDirectory, "gen_index_xhtml.xslt"),
   600                           [("GetSVGGeometry", lambda *_ignored:self.GetSVGGeometry()),
   590                           [("GetSVGGeometry", lambda *_ignored:self.GetSVGGeometry()),
   601                            ("GetHMITree", lambda *_ignored:self.GetHMITree()),
   591                            ("GetHMITree", lambda *_ignored:self.GetHMITree()),
   602                            ("GetTranslations", self.GetTranslations),
   592                            ("GetTranslations", self.GetTranslations),
   603                            ("ProgressStart", self.ProgressStart),
   593                            ("ProgressStart", lambda _ign,k,m:self.ProgressStart(str(k),str(m))),
   604                            ("ProgressEnd", self.ProgressEnd)])
   594                            ("ProgressEnd", lambda _ign,k:self.ProgressEnd(str(k)))])
   605 
   595 
   606             t = time.time()
   596             self.ProgressStart("svg", "source SVG parsing")
   607 
   597 
   608             # load svg as a DOM with Etree
   598             # load svg as a DOM with Etree
   609             svgdom = etree.parse(svgfile)
   599             svgdom = etree.parse(svgfile)
   610 
   600 
   611             self.GetCTRoot().logger.write("    Source SVG parsing: %.3f\n"%(time.time()-t))
   601             self.ProgressEnd("svg")
   612 
   602 
   613             # call xslt transform on Inkscape's SVG to generate XHTML
   603             # call xslt transform on Inkscape's SVG to generate XHTML
   614             try: 
   604             try: 
   615                 self.transform_begin = time.time()
   605                 self.ProgressStart("xslt", "XSLT transform")
   616                 result = transform.transform(svgdom)  # , profile_run=True)
   606                 result = transform.transform(svgdom)  # , profile_run=True)
   617                 self.GetCTRoot().logger.write("    XSLT transform: %.3f\n"%(time.time()-self.transform_begin))
   607                 self.ProgressEnd("xslt")
   618             except XSLTApplyError as e:
   608             except XSLTApplyError as e:
   619                 self.FatalError("SVGHMI " + view_name  + ": " + e.message)
   609                 self.FatalError("SVGHMI " + view_name  + ": " + e.message)
   620             finally:
   610             finally:
   621                 for entry in transform.get_error_log():
   611                 for entry in transform.get_error_log():
   622                     message = "SVGHMI: "+ entry.message + "\n" 
   612                     message = "SVGHMI: "+ entry.message + "\n"