X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPYLIGHTGUI%2FPYLIGHTGUI.py;h=1ea21577fa63a6894515d953f36abd6986fce138;hb=3b39ffa7392b7122a5d5710a91c08d94a9a7359a;hp=b824781b7bc7d837d50efc846b6c4a6efede5a33;hpb=074529f8acdd1fbbb43bdf2721322e56c6637725;p=samples%2Fpylight.git diff --git a/src/PYLIGHTGUI/PYLIGHTGUI.py b/src/PYLIGHTGUI/PYLIGHTGUI.py index b824781..1ea2157 100644 --- a/src/PYLIGHTGUI/PYLIGHTGUI.py +++ b/src/PYLIGHTGUI/PYLIGHTGUI.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009-2014 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 @@ -23,11 +23,11 @@ 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