diff options
Diffstat (limited to 'Connections/Shear/Finplate/exampleSimpleGUI.py')
-rw-r--r-- | Connections/Shear/Finplate/exampleSimpleGUI.py | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/Connections/Shear/Finplate/exampleSimpleGUI.py b/Connections/Shear/Finplate/exampleSimpleGUI.py new file mode 100644 index 0000000..8134a01 --- /dev/null +++ b/Connections/Shear/Finplate/exampleSimpleGUI.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python + +##Copyright 2009-2014 Thomas Paviot (tpaviot@gmail.com) +## +##This file is part of pythonOCC. +## +##pythonOCC 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 3 of the License, or +##(at your option) any later version. +## +##pythonOCC is distributed in the hope that it will be useful, +##but WITHOUT ANY WARRANTY; without even the implied warranty of +##MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +##GNU Lesser General Public License for more details. +## +##You should have received a copy of the GNU Lesser General Public License +##along with pythonOCC. If not, see <http://www.gnu.org/licenses/>. + +import sys +from OCC import VERSION, Quantity +from OCC.Graphic3d import * +from OCC.V3d import V3d_ORTHOGRAPHIC, V3d_WIREFRAME, V3d_PERSPECTIVE +from OCC.Quantity import Quantity_Color, Quantity_TOC_RGB + + +def get_backend(): + """ + loads a backend + backends are loaded in order of preference + since python comes with Tk included, but that PySide or PyQt4 + is much preferred + """ + try: + from PySide import QtCore, QtGui + return 'pyside' + except: + pass + try: + from PyQt4 import QtCore, QtGui + return 'pyqt4' + except: + pass + # Check wxPython + try: + import wx + return 'wx' + except: + raise ImportError("No compliant GUI library found. You must have either PySide, PyQt4 or wxPython installed.") + sys.exit(1) + + +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', 'pyside', '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, "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 + if USED_BACKEND in ['pyqt4', 'pyside']: + if USED_BACKEND == 'pyqt4': + from PyQt4 import QtCore, QtGui, QtOpenGL + from OCC.Display.pyqt4Display import qtViewer3d + elif USED_BACKEND == 'pyside': + from PySide import QtCore, QtGui, QtOpenGL + from OCC.Display.pysideDisplay import qtViewer3d + + class MainWindow(QtGui.QMainWindow): + def __init__(self, *args): + QtGui.QMainWindow.__init__(self, *args) + self.canva = qtViewer3d(self) + self.setWindowTitle("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.set_bg_gradient_color(23,1,32,23,1,32) + #display.View.SetVisualization(V3d_ORTHOGRAPHIC) + + # display black trihedron + display.display_trihedron() + display.View.SetProj(1, 1, 1) + + 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 + +if __name__ == '__main__': + display, start_display, add_menu, add_function_to_menu = init_display() + from OCC.BRepPrimAPI import BRepPrimAPI_MakeSphere, BRepPrimAPI_MakeBox + #print(display.Viewer.TypeOfView) + + def sphere(event=None): + display.DisplayShape(BRepPrimAPI_MakeSphere(100).Shape(), update=True) + + def cube(event=None): + display.DisplayShape(BRepPrimAPI_MakeBox(1, 1, 5).Shape(), material= Graphic3d_NOM_ALUMINIUM, update=True) + #display.Viewer.SetDefaultTypeOfView(V3d_ORTHOGRAPHIC) + + #aColor1 = Quantity_Color(float(255)/255., + # float(0)/255., + # float(0)/255., Quantity_TOC_RGB) + + #display.Viewer.SetDefaultBackgroundColor(aColor1) + + #display.SetModeShaded() + #display.View_Top() + + def exit(event=None): + sys.exit() + + add_menu('primitives') + add_function_to_menu('primitives', sphere) + add_function_to_menu('primitives', cube) + add_function_to_menu('primitives', exit) + cube() + start_display() |