def init_display(backend_str=None, size=(1024, 768)): global display, add_menu, add_function_to_menu, start_display, app, win, USED_BACKEND if not backend_str: USED_BACKEND = get_backend() elif backend_str in ['wx', 'qt-pyside', 'qt-pyqt4']: USED_BACKEND = backend_str else: raise ValueError( "You should pass either 'wx','qt' or 'tkinter' to the init_display function." ) sys.exit(1) # wxPython based simple GUI if USED_BACKEND == 'wx': try: import wx except: raise ImportError("Please install wxPython.") from wxDisplay import wxViewer3d class AppFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__( self, parent, -1, "Siconos mechanisms visualization based on pythonOCC-%s 3d viewer ('wx' backend)" % VERSION, style=wx.DEFAULT_FRAME_STYLE, size=size) self.canva = wxViewer3d(self) self.menuBar = wx.MenuBar() self._menus = {} self._menu_methods = {} def add_menu(self, menu_name): _menu = wx.Menu() self.menuBar.Append(_menu, "&" + menu_name) self.SetMenuBar(self.menuBar) self._menus[menu_name] = _menu def add_function_to_menu(self, menu_name, _callable): # point on curve _id = wx.NewId() assert callable( _callable), 'the function supplied is not callable' try: self._menus[menu_name].Append( _id, _callable.__name__.replace('_', ' ').lower()) except KeyError: raise ValueError('the menu item %s does not exist' % menu_name) self.Bind(wx.EVT_MENU, _callable, id=_id) app = wx.PySimpleApp() win = AppFrame(None) win.Show(True) wx.SafeYield() win.canva.InitDriver() app.SetTopWindow(win) display = win.canva._display def add_menu(*args, **kwargs): win.add_menu(*args, **kwargs) def add_function_to_menu(*args, **kwargs): win.add_function_to_menu(*args, **kwargs) def start_display(): app.MainLoop() # Qt based simple GUI elif 'qt' in USED_BACKEND: from OCC.Display.qtDisplay import qtViewer3d, get_qt_modules QtCore, QtGui, QtOpenGL = get_qt_modules() class MainWindow(QtGui.QMainWindow): def __init__(self, *args): QtGui.QMainWindow.__init__(self, *args) self.canva = qtViewer3d(self) self.setWindowTitle( "Siconos mechanisms visualization based on pythonOCC-%s 3d viewer ('%s' backend)" % (VERSION, USED_BACKEND)) self.resize(size[0], size[1]) self.setCentralWidget(self.canva) if not sys.platform == 'darwin': self.menu_bar = self.menuBar() else: # create a parentless menubar # see: http://stackoverflow.com/questions/11375176/qmenubar-and-qmenu-doesnt-show-in-mac-os-x?lq=1 # noticeable is that the menu ( alas ) is created in the topleft of the screen, just # next to the apple icon # still does ugly things like showing the "Python" menu in bold self.menu_bar = QtGui.QMenuBar() self._menus = {} self._menu_methods = {} # place the window in the center of the screen, at half the screen size self.centerOnScreen() def centerOnScreen(self): '''Centers the window on the screen.''' resolution = QtGui.QDesktopWidget().screenGeometry() self.move( (resolution.width() / 2) - (self.frameSize().width() / 2), (resolution.height() / 2) - (self.frameSize().height() / 2)) def add_menu(self, menu_name): _menu = self.menu_bar.addMenu("&" + menu_name) self._menus[menu_name] = _menu def add_function_to_menu(self, menu_name, _callable): assert callable( _callable), 'the function supplied is not callable' try: _action = QtGui.QAction( _callable.__name__.replace('_', ' ').lower(), self) # if not, the "exit" action is now shown... _action.setMenuRole(QtGui.QAction.NoRole) self.connect(_action, QtCore.SIGNAL("triggered()"), _callable) self._menus[menu_name].addAction(_action) except KeyError: raise ValueError('the menu item %s does not exist' % menu_name) # following couple of lines is a twek to enable ipython --gui='qt' app = QtGui.QApplication.instance( ) # checks if QApplication already exists if not app: # create QApplication if it doesnt exist app = QtGui.QApplication(sys.argv) win = MainWindow() win.show() win.canva.InitDriver() display = win.canva._display if sys.platform != "linux2": display.EnableAntiAliasing() # background gradient display.set_bg_gradient_color(206, 215, 222, 128, 128, 128) # display black trihedron display.display_trihedron() def add_menu(*args, **kwargs): win.add_menu(*args, **kwargs) def add_function_to_menu(*args, **kwargs): win.add_function_to_menu(*args, **kwargs) def start_display(): win.raise_() # make the application float to the top app.exec_() return display, start_display, add_menu, add_function_to_menu, win, app
.. OpenGL overpainting example:: https://github.com/Werkov/PyQt4/blob/master/examples/opengl/overpainting.py """ from __future__ import print_function import random import sys from OCC.Display.qtDisplay import qtViewer3d, get_qt_modules # pyqt4 only from PyQt4 import Qt QtCore, QtGui, QtOpenGL = get_qt_modules() try: from OpenGL.GL import (glViewport, glMatrixMode, glOrtho, glLoadIdentity, GL_PROJECTION, GL_MODELVIEW) except ImportError: msg = "for this example, the OpenGL module is required" \ "why not run \"pip install PyOpenGL\"\?" sys.exit(status=1) # -------------------------------------------------------------------------- # these are names of actions that invoke the OpenGL viewport to be redrawn # such actions need to be invoked through the GLWidget.update method, which # in turn invoked the GLWidget.paintEvent method # this way, all command that redraw the viewport are invoked synchronously # --------------------------------------------------------------------------
def init_display(backend_str=None, size=(1024, 768)): global display, add_menu, add_function_to_menu, start_display, app, win, USED_BACKEND if not backend_str: USED_BACKEND = get_backend() elif backend_str in ['wx', 'qt-pyside', 'qt-pyqt4']: USED_BACKEND = backend_str else: raise ValueError("You should pass either 'wx','qt' or 'tkinter' to the init_display function.") sys.exit(1) # wxPython based simple GUI if USED_BACKEND == 'wx': try: import wx except: raise ImportError("Please install wxPython.") from wxDisplay import wxViewer3d class AppFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, -1, "Siconos mechanisms visualization based on pythonOCC-%s 3d viewer ('wx' backend)" % VERSION, style=wx.DEFAULT_FRAME_STYLE, size=size) self.canva = wxViewer3d(self) self.menuBar = wx.MenuBar() self._menus = {} self._menu_methods = {} def add_menu(self, menu_name): _menu = wx.Menu() self.menuBar.Append(_menu, "&"+menu_name) self.SetMenuBar(self.menuBar) self._menus[menu_name] = _menu def add_function_to_menu(self, menu_name, _callable): # point on curve _id = wx.NewId() assert callable(_callable), 'the function supplied is not callable' try: self._menus[menu_name].Append(_id, _callable.__name__.replace('_', ' ').lower()) except KeyError: raise ValueError('the menu item %s does not exist' % menu_name) self.Bind(wx.EVT_MENU, _callable, id=_id) app = wx.PySimpleApp() win = AppFrame(None) win.Show(True) wx.SafeYield() win.canva.InitDriver() app.SetTopWindow(win) display = win.canva._display def add_menu(*args, **kwargs): win.add_menu(*args, **kwargs) def add_function_to_menu(*args, **kwargs): win.add_function_to_menu(*args, **kwargs) def start_display(): app.MainLoop() # Qt based simple GUI elif 'qt' in USED_BACKEND: from OCC.Display.qtDisplay import qtViewer3d, get_qt_modules QtCore, QtGui, QtOpenGL = get_qt_modules() class MainWindow(QtGui.QMainWindow): def __init__(self, *args): QtGui.QMainWindow.__init__(self, *args) self.canva = qtViewer3d(self) self.setWindowTitle("Siconos mechanisms visualization based on pythonOCC-%s 3d viewer ('%s' backend)" % (VERSION, USED_BACKEND)) self.resize(size[0], size[1]) self.setCentralWidget(self.canva) if not sys.platform == 'darwin': self.menu_bar = self.menuBar() else: # create a parentless menubar # see: http://stackoverflow.com/questions/11375176/qmenubar-and-qmenu-doesnt-show-in-mac-os-x?lq=1 # noticeable is that the menu ( alas ) is created in the topleft of the screen, just # next to the apple icon # still does ugly things like showing the "Python" menu in bold self.menu_bar = QtGui.QMenuBar() self._menus = {} self._menu_methods = {} # place the window in the center of the screen, at half the screen size self.centerOnScreen() def centerOnScreen(self): '''Centers the window on the screen.''' resolution = QtGui.QDesktopWidget().screenGeometry() self.move((resolution.width() / 2) - (self.frameSize().width() / 2), (resolution.height() / 2) - (self.frameSize().height() / 2)) def add_menu(self, menu_name): _menu = self.menu_bar.addMenu("&"+menu_name) self._menus[menu_name] = _menu def add_function_to_menu(self, menu_name, _callable): assert callable(_callable), 'the function supplied is not callable' try: _action = QtGui.QAction(_callable.__name__.replace('_', ' ').lower(), self) # if not, the "exit" action is now shown... _action.setMenuRole(QtGui.QAction.NoRole) self.connect(_action, QtCore.SIGNAL("triggered()"), _callable) self._menus[menu_name].addAction(_action) except KeyError: raise ValueError('the menu item %s does not exist' % menu_name) # following couple of lines is a twek to enable ipython --gui='qt' app = QtGui.QApplication.instance() # checks if QApplication already exists if not app: # create QApplication if it doesnt exist app = QtGui.QApplication(sys.argv) win = MainWindow() win.show() win.canva.InitDriver() display = win.canva._display if sys.platform != "linux2": display.EnableAntiAliasing() # background gradient display.set_bg_gradient_color(206, 215, 222, 128, 128, 128) # display black trihedron display.display_trihedron() def add_menu(*args, **kwargs): win.add_menu(*args, **kwargs) def add_function_to_menu(*args, **kwargs): win.add_function_to_menu(*args, **kwargs) def start_display(): win.raise_() # make the application float to the top app.exec_() return display, start_display, add_menu, add_function_to_menu, win, app