Salome HOME
Copyright update 2020
[samples/pylight.git] / src / PYLIGHTGUI / PYLIGHTGUI.py
index 3ce7f0a15b87d350ff4cbbcefb28688aff75c259..1ea21577fa63a6894515d953f36abd6986fce138 100644 (file)
@@ -1,9 +1,9 @@
-# Copyright (C) 2009-2013  OPEN CASCADE
+# Copyright (C) 2009-2020  OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 # License as published by the Free Software Foundation; either
-# version 2.1 of the License.
+# version 2.1 of the License, or (at your option) any later version.
 #
 # This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 import traceback
 from SalomePyQt import *
 import PYLIGHT_DataModel
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from qtsalome import *
 import libSALOME_Swig
 
 import os
+import os.path as osp
 import libSalomePy
 import vtk
 
@@ -41,10 +41,14 @@ sg = libSALOME_Swig.SALOMEGUI_Swig()
 # Used to store actions, menus, toolbars, etc...
 ################################################
 
+# data model
+__data_model__ = None
+
 class GUIcontext:
 
     # constructor
     def __init__( self ):
+        global __data_model__
         # Load File action
         sgPyQt.createAction(dict_actions["loadfile"], "Load text File", "Load text file")
         # Save File action
@@ -88,8 +92,10 @@ class GUIcontext:
         sgPyQt.createMenu( dict_actions["eraseLine"],   menuPyLight, 10 );
 
         # Create DataModel
-        self.DM = PYLIGHT_DataModel.PYLIGHT_DataModel()
-
+        if __data_model__ is None:
+            __data_model__ = PYLIGHT_DataModel.PYLIGHT_DataModel()
+            pass
+            
         pass # def __init__( self )
 
     pass # class GUIcontext
@@ -98,12 +104,6 @@ class GUIcontext:
 # Global variables and functions
 ################################################
 
-###
-# get active study ID
-###
-def _getStudyId():
-    return sgPyQt.getStudyId()
-
 # verbosity level
 __verbose__ = None
 
@@ -121,81 +121,49 @@ def verbose():
         pass
     return __verbose__
 
-# study-to-context map
-__study2context__   = {}
-# current context
-__current_context__ = None
-
-###
-# get current GUI context
-###
-def _getContext():
-    global __current_context__
-    return __current_context__
-
-###
-# set and return current GUI context
-# study ID is passed as parameter
-###
-def _setContext( studyID ):
-    global __study2context__, __current_context__
-    if not __study2context__.has_key(studyID):
-        __study2context__[studyID] = GUIcontext()
-        pass
-    __current_context__ = __study2context__[studyID]
-    return __current_context__
-
 ################################################
 
 # Create actions and menus
 def initialize():
-    if verbose(): print "PYLIGHTGUI::initialize()"
+    GUIcontext()
+    if verbose(): print("PYLIGHTGUI::initialize()")
     return
 
 # called when module is activated
 # returns True if activating is successfull and False otherwise
 def activate():
-    if verbose() : print "PYLIGHTGUI.activate() : study : %d" % _getStudyId()
-    ctx = _setContext( _getStudyId() )
+    if verbose() : print("PYLIGHTGUI.activate()")
     return True
 
 # called when module is deactivated
 def deactivate():
-    if verbose() : print "PYLIGHTGUI.deactivate() : study : %d" % _getStudyId()
-    pass
-
-# called when active study is changed
-# active study ID is passed as parameter
-def activeStudyChanged( studyID ):
-    if verbose() : print "PYLIGHTGUI.activeStudyChanged(): study : %d" % studyID
-    ctx = _setContext( _getStudyId() )
+    if verbose() : print("PYLIGHTGUI.deactivate()")
     pass
 
 # Process GUI action
 def OnGUIEvent(commandID):
-    if verbose() : print "PYLIGHTGUI::OnGUIEvent : commandID = %d" % commandID
-    if dict_command.has_key( commandID ):
+    if verbose() : print("PYLIGHTGUI::OnGUIEvent : commandID = %d" % commandID)
+    if commandID in dict_command:
         try:
             dict_command[commandID]()
         except:
             traceback.print_exc()
     else:
-       if verbose() : print "The command is not implemented: %d" % commandID
+       if verbose() : print("The command is not implemented: %d" % commandID)
     pass
 
 # Customize popup menu
 def createPopupMenu(popup, context):
-    if verbose() : print "PYLIGHTGUI.createPopupMenu(): context = %s" % context
+    global __data_model__
+    if verbose() : print("PYLIGHTGUI.createPopupMenu(): context = %s" % context)
 
     if context != 'ObjectBrowser':
         return
     
-    studyId = _getStudyId()
-    ctx = _setContext( studyId )
     selcount = sg.SelectedCount()
     if selcount == 1:
         entry = sg.getSelected( 0 )
-        obj = ctx.DM.getObject(entry)
+        obj = __data_model__.getObject(entry)
         if obj is not None:
             if obj.getText() != "\n":
                 # Line is selected
@@ -219,57 +187,64 @@ def createPopupMenu(popup, context):
     pass
 
 # For saving data in the study
-def saveFiles(prefix):
-    if verbose(): print "PYLIGHTGUI::saveFile()"
-    ctx = _setContext( _getStudyId() )
-    postfix = "PYLIGHT.txt"
-    filename = prefix+postfix
-    ctx.DM.saveFile(QString(filename))
-    return postfix
+def saveFiles(directory, url):
+    global __data_model__
+    if verbose(): print("PYLIGHTGUI::saveFile()")
+    filename = osp.join(directory, osp.splitext(osp.basename(url))[0]) + "_PYLIGHT.txt"
+    __data_model__.saveFile(filename)
+    return osp.basename(filename)
 
 # For restore data from the study
-def openFiles(filelist):
-    if verbose(): print "PYLIGHTGUI::openFile()"
-    ctx = _setContext( _getStudyId() )
-    filename =  filelist[0]
-    filename.append(filelist[1])
-    ctx.DM.loadFile(filename)
+def openFiles(filelist, url):
+    global __data_model__
+    if verbose(): print("PYLIGHTGUI::openFile()")
+    filename = os.path.join(*filelist)
+    __data_model__.loadFile(filename)
     return True
 
 # Loading a text file
 def loadfile():
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     aFilter = "Text files (*.txt)"
     filename = QFileDialog.getOpenFileName(sgPyQt.getDesktop(), "Open text file", "", aFilter, "Choose a text file to open")
-    if filename.isEmpty():
+
+    if isinstance(filename,tuple) and len(filename) >=2:
+       filename = filename[0]
+
+    if len(filename) == 0:
         return
     
     if os.access(str(filename),os.R_OK):
-        ctx.DM.loadFile(filename)
+        __data_model__.loadFile(filename)
     else:
         QMessageBox.warning(sgPyQt.getDesktop(),
                             "Error!",
-                            QString("Can not read file:\n%1").arg(filename))
+                            "Can not read file:\n%s"%(filename))
         pass
-    sg.updateObjBrowser(True)
+    sg.updateObjBrowser()
     pass
 
 # Saving a text file
 def savefile():
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     aFilter = "Text files (*.txt)"
     filename = QFileDialog.getSaveFileName(sgPyQt.getDesktop(),"Save text file", "", aFilter, "Choose a text file to save")
-    if filename.contains(".txt") == 0:
-        filename.append(".txt")
+
+    if isinstance(filename,tuple) and len(filename) >=2:
+        filename = filename[0]
+
+    if filename.endswith(".txt") == 0:
+        filename+=".txt"
         pass
+
     fn = filename
     # Get directory name and check access
-    if os.access(str(fn.left(fn.lastIndexOf("/"))), os.W_OK):
-        ctx.DM.saveFile(filename)
+    if os.access(str(fn[:fn.rindex(osp.sep)]), os.W_OK):
+        __data_model__.saveFile(filename)
     else:
         QMessageBox.warning(sgPyQt.getDesktop(),
                             "Error!",
-                            QString("Can not save file:\n%1").arg(filename))
+                            "Can not save file:\n%s"%(filename))
         pass
     pass
 
@@ -277,7 +252,7 @@ def insertLine():
     '''
     Insert new line in the selected paragraph.
     '''
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     #Get result
     res = QInputDialog.getText(sgPyQt.getDesktop(),
                                "Add new line",
@@ -290,20 +265,20 @@ def insertLine():
     # Nb selected objects
     selcount = sg.SelectedCount()
     # Nb object in the Data Model
-    paragrCount = len(ctx.DM.getParagraphs())
+    paragrCount = len(__data_model__.getParagraphs())
 
     # Create first paragraph
     if paragrCount == 0:
-        ctx.DM.createObject()
+        __data_model__.createObject()
         # If line not empty create first line
         if text != "\n":
-            ctx.DM.createObject(text,ctx.DM.getParagraphs()[0])
-        sg.updateObjBrowser(True)
+            __data_model__.createObject(text,__data_model__.getParagraphs()[0])
+        sg.updateObjBrowser()
         return
     # Create paragraph
     if text == "\n":
-        ctx.DM.createObject()
-        sg.updateObjBrowser(True)
+        __data_model__.createObject()
+        sg.updateObjBrowser()
         return
     else:
         if selcount == 0:
@@ -313,12 +288,12 @@ def insertLine():
             return
         if selcount == 1:
             entry = sg.getSelected( 0 )
-            obj = ctx.DM.getObject(entry)
+            obj = __data_model__.getObject(entry)
             if obj is not None:
                 # Create line
                 if(obj.getText() == "\n"):
-                    ctx.DM.createObject(text,entry)
-                    sg.updateObjBrowser(True);
+                    __data_model__.createObject(text,entry)
+                    sg.updateObjBrowser();
                     return
                 else:
                     QMessageBox.warning(sgPyQt.getDesktop(),
@@ -333,11 +308,11 @@ def insertLine():
         
 # Edit selected line
 def editLine():
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     if sg.SelectedCount() == 1:
         entry = sg.getSelected( 0 )
-        obj = ctx.DM.getObject(entry)
-        if(obj.getText() != "\n"):
+        obj = __data_model__.getObject(entry)
+        if(obj is not None and obj.getText() != "\n"):
             #Get text line
             res = QInputDialog.getText(sgPyQt.getDesktop(),
                                        "Edit line",
@@ -357,19 +332,22 @@ def editLine():
         QMessageBox.information(sgPyQt.getDesktop(),
                                 'Info',
                                 'Please, select one line!')
-    sg.updateObjBrowser(True);
+    sg.updateObjBrowser();
     pass
 
 # Remove selected lines
 def removeLine():
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     selcount = sg.SelectedCount()
     onlyLines = True
     lines = []
     while selcount != 0:
         entry = sg.getSelected( selcount - 1)
         #Check what only lines selected
-        if ctx.DM.getObject(entry).getText() == "\n":
+        obj = __data_model__.getObject(entry)
+        if obj is None:
+            continue
+        if obj.getText() == "\n":
             onlyLines = False
             break
         lines.append(entry)
@@ -385,18 +363,18 @@ def removeLine():
                 renderer.RemoveActor(actor)
                 pass
             pass
-        ctx.DM.removeObjects(lines)
-        sg.updateObjBrowser(True)
+        __data_model__.removeObjects(lines)
+        sg.updateObjBrowser()
         pass
     pass
 
 # Remove all lines from all paragraphs
 def clearAll():
-    ctx = _setContext( _getStudyId() )
-    paragraphs = ctx.DM.getParagraphs()
+    global __data_model__
+    paragraphs = __data_model__.getParagraphs()
     for paragr in paragraphs:
         lines = sgPyQt.getChildren(paragr)
-        ctx.DM.removeObjects(lines)
+        __data_model__.removeObjects(lines)
         renderer=libSalomePy.getRenderer()
         for l in lines:
             actor = getActor(l)
@@ -404,16 +382,22 @@ def clearAll():
                 renderer.RemoveActor(actor)
                 pass
             pass
-    sg.updateObjBrowser(True)
+    sg.updateObjBrowser()
     pass
 
 # Display the selected line
 def displayLine():
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     if sg.SelectedCount() != 1:
         return
     entry = sg.getSelected(0)
-    text = ctx.DM.getObject(entry).getText()
+    obj = ctx.DM.getObject(entry)
+    if obj is None:
+        QMessageBox.information(sgPyQt.getDesktop(),
+                                'Info',
+                                'Please, select line!')
+        return
+    text = obj.getText()
     if text == "\n":
         return
     renderer=libSalomePy.getRenderer()
@@ -428,26 +412,32 @@ def displayLine():
     txtPr = vtk.vtkTextProperty()
     txtPr.SetFontSize(30)
     actor.SetTextProperty(txtPr)
-    for act in  dict_actors.values():
+    for act in  list(dict_actors.values()):
         renderer.RemoveActor(act)
     renderer.AddActor(actor)
     pass
 
 # Clear remove all lines under selected paragraph
 def clearParagraph():
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     lines = sgPyQt.getChildren(sg.getSelected(0))
-    ctx.DM.removeObjects(lines)
-    sg.updateObjBrowser(True)
+    __data_model__.removeObjects(lines)
+    sg.updateObjBrowser()
     pass
 
 # Erase the selected line
 def eraseLine():
-    ctx = _setContext( _getStudyId() )
+    global __data_model__
     if sg.SelectedCount() != 1:
         return
     entry = sg.getSelected(0)
-    text = ctx.DM.getObject(entry).getText()
+    obj = __data_model__.getObject(entry)
+    if obj is None:
+        QMessageBox.information(sgPyQt.getDesktop(),
+                                'Info',
+                                'Please, select line!')
+        return
+    text = obj.getText()
     if text == "\n":
         return
     renderer=libSalomePy.getRenderer()
@@ -459,9 +449,8 @@ def eraseLine():
 
 # Return vtkActor by entry
 def getActor(entry):
-    if isinstance(entry,QString):
-        entry = entry.toLatin1().data()
-    if dict_actors.has_key(entry):
+    entry = str(entry)
+    if entry in dict_actors:
         return dict_actors[entry]
     return None