svgui/svgui.py
author Laurent Bessard
Thu, 15 Nov 2012 23:00:53 +0100
changeset 883 235a9ec83b95
parent 737 7b421e080636
child 1014 e2f7d6c95db0
permissions -rw-r--r--
Adding support for defining specific global variables for ConfTreeNodes
Fix bug when defining function block instances as global variables
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
     1
import wx
407
0bef13d73350 Bug while trying to import SVG file fixed
laurent
parents: 371
diff changeset
     2
import os, sys, shutil
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
     3
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
     4
from pyjs import translate
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
     5
728
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
     6
from POULibrary import POULibrary
737
7b421e080636 fixed typos
Edouard Tisserant
parents: 734
diff changeset
     7
from docutil import open_svg
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
     8
728
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
     9
class SVGUILibrary(POULibrary):
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    10
    def GetLibraryPath(self):
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    11
        return os.path.join(os.path.split(__file__)[0], "pous.xml") 
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    12
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    13
class SVGUI:
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    14
717
1c23952dbde1 refactoring
Edouard Tisserant
parents: 427
diff changeset
    15
    ConfNodeMethods = [
734
5c42cafaee15 Moved LPC sources to a separate project
Edouard Tisserant
parents: 731
diff changeset
    16
        {"bitmap" : "ImportSVG",
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    17
         "name" : _("Import SVG"),
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    18
         "tooltip" : _("Import SVG"),
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    19
         "method" : "_ImportSVG"},
734
5c42cafaee15 Moved LPC sources to a separate project
Edouard Tisserant
parents: 731
diff changeset
    20
        {"bitmap" : "ImportSVG", # should be something different
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    21
         "name" : _("Inkscape"),
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    22
         "tooltip" : _("Create HMI"),
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    23
         "method" : "_StartInkscape"},
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    24
    ]
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    25
717
1c23952dbde1 refactoring
Edouard Tisserant
parents: 427
diff changeset
    26
    def ConfNodePath(self):
728
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    27
        return os.path.join(os.path.dirname(__file__))
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    28
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    29
    def _getSVGpath(self):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    30
        # define name for IEC raw code file
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
    31
        return os.path.join(self.CTNPath(), "gui.svg")
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    32
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    33
    def _getSVGUIserverpath(self):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    34
        return os.path.join(os.path.dirname(__file__), "svgui_server.py")
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    35
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
    36
    def CTNGenerate_C(self, buildpath, locations):
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    37
        """
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    38
        Return C code generated by iec2c compiler 
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    39
        when _generate_softPLC have been called
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    40
        @param locations: ignored
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    41
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    42
        """
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    43
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    44
        current_location = self.GetCurrentLocation()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    45
        # define a unique name for the generated C file
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    46
        location_str = "_".join(map(lambda x:str(x), current_location))
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    47
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    48
        res = ([], "", False)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    49
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    50
        svgfile=self._getSVGpath()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    51
        if os.path.exists(svgfile):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    52
            res += (("gui.svg", file(svgfile,"rb")),)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    53
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    54
        svguiserverfile = open(self._getSVGUIserverpath(), 'r')
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    55
        svguiservercode = svguiserverfile.read()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    56
        svguiserverfile.close()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    57
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    58
        svguilibpath = os.path.join(self._getBuildPath(), "svguilib.js")
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    59
        svguilibfile = open(svguilibpath, 'w')
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    60
        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "sys.py"), "sys"))
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    61
        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "_pyjs.js"), 'r').read())
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    62
        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "pyjslib.py"), "pyjslib"))
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    63
        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "svguilib.py"), "svguilib"))
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    64
        svguilibfile.write("pyjslib();\nsvguilib();\n")
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    65
        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "json.js"), 'r').read())
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    66
        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "livesvg.js"), 'r').read())
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    67
        svguilibfile.close()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    68
        jsmodules = {"LiveSVGPage": "svguilib.js"}
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    69
        res += (("svguilib.js", file(svguilibpath,"rb")),)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    70
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    71
        runtimefile_path = os.path.join(buildpath, "runtime_%s.py"%location_str)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    72
        runtimefile = open(runtimefile_path, 'w')
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    73
        runtimefile.write(svguiservercode % {"svgfile" : "gui.svg"})
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    74
        runtimefile.write("""
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    75
def _runtime_%(location)s_begin():
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    76
    website.LoadHMI(%(svgui_class)s, %(jsmodules)s)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    77
    
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    78
def _runtime_%(location)s_cleanup():
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    79
    website.UnLoadHMI()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    80
    
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    81
""" % {"location": location_str,
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    82
       "svgui_class": "SVGUI_HMI",
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    83
       "jsmodules" : str(jsmodules),
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    84
      })
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    85
        runtimefile.close()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    86
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    87
        res += (("runtime_%s.py"%location_str, file(runtimefile_path,"rb")),)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    88
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    89
        return res
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    90
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    91
    def _ImportSVG(self):
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
    92
        dialog = wx.FileDialog(self.GetCTRoot().AppFrame, _("Choose a SVG file"), os.getcwd(), "",  _("SVG files (*.svg)|*.svg|All files|*.*"), wx.OPEN)
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    93
        if dialog.ShowModal() == wx.ID_OK:
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    94
            svgpath = dialog.GetPath()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    95
            if os.path.isfile(svgpath):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    96
                shutil.copy(svgpath, self._getSVGpath())
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    97
            else:
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
    98
                self.GetCTRoot().logger.write_error(_("No such SVG file: %s\n")%svgpath)
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    99
        dialog.Destroy()  
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   100
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   101
    def _StartInkscape(self):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   102
        svgfile = self._getSVGpath()
427
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   103
        open_inkscape = True
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   104
        if not self.GetCTRoot().CheckProjectPathPerm():
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   105
            dialog = wx.MessageDialog(self.GetCTRoot().AppFrame,
427
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   106
                                      _("You don't have write permissions.\nOpen Inkscape anyway ?"),
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   107
                                      _("Open Inkscape"),
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   108
                                      wx.YES_NO|wx.ICON_QUESTION)
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   109
            open_inkscape = dialog.ShowModal() == wx.ID_YES
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   110
            dialog.Destroy()
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   111
        if open_inkscape:
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   112
            if not os.path.isfile(svgfile):
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   113
                svgfile = None
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   114
            open_svg(svgfile)