svgui/svgui.py
author Edouard Tisserant
Fri, 20 Jun 2014 21:36:23 +0200
changeset 1420 71b1545d746f
parent 1061 02f371f3e063
child 1511 91538d0c242c
permissions -rw-r--r--
Enable overloading of task triggerring source cell editor (SINGLE) in resource editor. PLCGenerator now generates MULTI keywork instead of SINGLE when task's activation is surroundes with square brackets
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
1061
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
     8
from py_ext import PythonFileCTNMixin
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
     9
728
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    10
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
    11
    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
    12
        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
    13
1061
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    14
class SVGUI(PythonFileCTNMixin):
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    15
717
1c23952dbde1 refactoring
Edouard Tisserant
parents: 427
diff changeset
    16
    ConfNodeMethods = [
734
5c42cafaee15 Moved LPC sources to a separate project
Edouard Tisserant
parents: 731
diff changeset
    17
        {"bitmap" : "ImportSVG",
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    18
         "name" : _("Import SVG"),
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    19
         "tooltip" : _("Import SVG"),
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    20
         "method" : "_ImportSVG"},
734
5c42cafaee15 Moved LPC sources to a separate project
Edouard Tisserant
parents: 731
diff changeset
    21
        {"bitmap" : "ImportSVG", # should be something different
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    22
         "name" : _("Inkscape"),
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 410
diff changeset
    23
         "tooltip" : _("Create HMI"),
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    24
         "method" : "_StartInkscape"},
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    25
    ]
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    26
717
1c23952dbde1 refactoring
Edouard Tisserant
parents: 427
diff changeset
    27
    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
    28
        return os.path.join(os.path.dirname(__file__))
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    29
1061
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    30
    def _getSVGpath(self, project_path=None):
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    31
        if project_path is None:
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    32
            project_path = self.CTNPath()
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    33
        # define name for SVG file containing gui layout
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    34
        return os.path.join(project_path, "gui.svg")
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    35
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    36
    def _getSVGUIserverpath(self):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    37
        return os.path.join(os.path.dirname(__file__), "svgui_server.py")
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    38
1061
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    39
    def OnCTNSave(self, from_project_path=None):
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    40
        if from_project_path is not None:
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    41
            shutil.copyfile(self._getSVGpath(from_project_path),
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    42
                            self._getSVGpath())
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    43
        return PythonFileCTNMixin.OnCTNSave(self, from_project_path)
02f371f3e063 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 1014
diff changeset
    44
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
    45
    def CTNGenerate_C(self, buildpath, locations):
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    46
        """
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    47
        Return C code generated by iec2c compiler 
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    48
        when _generate_softPLC have been called
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    49
        @param locations: ignored
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    50
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    51
        """
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    52
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    53
        current_location = self.GetCurrentLocation()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    54
        # define a unique name for the generated C file
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    55
        location_str = "_".join(map(lambda x:str(x), current_location))
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    56
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    57
        res = ([], "", False)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    58
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    59
        svgfile=self._getSVGpath()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    60
        if os.path.exists(svgfile):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    61
            res += (("gui.svg", file(svgfile,"rb")),)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    62
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    63
        svguiserverfile = open(self._getSVGUIserverpath(), 'r')
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    64
        svguiservercode = svguiserverfile.read()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    65
        svguiserverfile.close()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    66
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    67
        svguilibpath = os.path.join(self._getBuildPath(), "svguilib.js")
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    68
        svguilibfile = open(svguilibpath, 'w')
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    69
        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
    70
        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
    71
        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
    72
        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
    73
        svguilibfile.write("pyjslib();\nsvguilib();\n")
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    74
        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
    75
        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
    76
        svguilibfile.close()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    77
        jsmodules = {"LiveSVGPage": "svguilib.js"}
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    78
        res += (("svguilib.js", file(svguilibpath,"rb")),)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    79
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    80
        runtimefile_path = os.path.join(buildpath, "runtime_%s.py"%location_str)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    81
        runtimefile = open(runtimefile_path, 'w')
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    82
        runtimefile.write(svguiservercode % {"svgfile" : "gui.svg"})
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    83
        runtimefile.write("""
1014
e2f7d6c95db0 Now python files provided by extentions have init, start, stop and cleanup hooks
Edouard Tisserant
parents: 737
diff changeset
    84
def _runtime_%(location)s_start():
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    85
    website.LoadHMI(%(svgui_class)s, %(jsmodules)s)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    86
    
1014
e2f7d6c95db0 Now python files provided by extentions have init, start, stop and cleanup hooks
Edouard Tisserant
parents: 737
diff changeset
    87
def _runtime_%(location)s_stop():
371
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    88
    website.UnLoadHMI()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    89
    
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    90
""" % {"location": location_str,
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    91
       "svgui_class": "SVGUI_HMI",
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    92
       "jsmodules" : str(jsmodules),
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    93
      })
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    94
        runtimefile.close()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    95
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    96
        res += (("runtime_%s.py"%location_str, file(runtimefile_path,"rb")),)
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    97
        
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    98
        return res
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
    99
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   100
    def _ImportSVG(self):
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   101
        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
   102
        if dialog.ShowModal() == wx.ID_OK:
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   103
            svgpath = dialog.GetPath()
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   104
            if os.path.isfile(svgpath):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   105
                shutil.copy(svgpath, self._getSVGpath())
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   106
            else:
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   107
                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
   108
        dialog.Destroy()  
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   109
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   110
    def _StartInkscape(self):
b7cb57a2da08 Adding new svgui support using twisted website HMI
laurent
parents:
diff changeset
   111
        svgfile = self._getSVGpath()
427
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   112
        open_inkscape = True
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   113
        if not self.GetCTRoot().CheckProjectPathPerm():
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   114
            dialog = wx.MessageDialog(self.GetCTRoot().AppFrame,
427
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   115
                                      _("You don't have write permissions.\nOpen Inkscape anyway ?"),
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   116
                                      _("Open Inkscape"),
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   117
                                      wx.YES_NO|wx.ICON_QUESTION)
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   118
            open_inkscape = dialog.ShowModal() == wx.ID_YES
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   119
            dialog.Destroy()
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   120
        if open_inkscape:
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   121
            if not os.path.isfile(svgfile):
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   122
                svgfile = None
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 421
diff changeset
   123
            open_svg(svgfile)