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 |