def about(): """Display short information about pyFormex.""" draw.showInfo("""%s A tool for generating, manipulating and transforming 3D geometrical models by sequences of mathematical operations. Copyright 2004-2009 Benedict Verhegghe. Distributed under the GNU GPL version 3 or later. """ % GD.Version)
def about(): """Display short information about pyFormex.""" draw.showInfo("""%s A tool for generating and operating on large 3D structures by mathematical transfomations. Copyright 2004-2008 Benedict Verhegghe. Distributed under the GNU GPL v2 or higher. """ % GD.Version)
def install_external(pkgdir,prgname): extdir = os.path.join(pf.cfg['pyformexdir'],'extra',pkgdir) sta,out = utils.runCommand("cd %s; make && gksu make install" % extdir) if sta: info = out else: if utils.hasExternal(prgname,force=True): info = "Succesfully installed %s" % pkgdir else: info ="You should now restart pyFormex!" draw.showInfo(info) return sta
def about(): """Display short information about pyFormex.""" draw.showInfo(""".. %s %s A tool for generating, manipulating and transforming 3D geometrical models by sequences of mathematical operations. %s Distributed under the GNU GPL version 3 or later """ % (pf.Version,'='*len(pf.Version),pf.Copyright))
def about(): """Display short information about pyFormex.""" draw.showInfo(""".. %s %s A tool for generating, manipulating and transforming 3D geometrical models by sequences of mathematical operations. %s Distributed under the GNU GPL version 3 or later """ % (pf.Version, '=' * len(pf.Version), pf.Copyright))
def install_external(pkgdir, prgname): extdir = os.path.join(pf.cfg['pyformexdir'], 'extra', pkgdir) sta, out = utils.runCommand("cd %s; make && gksu make install" % extdir) if sta: info = out else: if utils.hasExternal(prgname, force=True): info = "Succesfully installed %s" % pkgdir else: info = "You should now restart pyFormex!" draw.showInfo(info) return sta
def developers(): """Display the list of developers.""" random.shuffle(_developers) draw.showInfo(""" The following people have contributed to pyFormex. They are listed in random order. %s If you feel that your name was left out in error, please write to [email protected]. """ % '\n'.join(_developers))
def developers(): """Display the list of developers.""" draw.showInfo(""" This is an alphabetic list of the major contributors to pyFormex: Matthieu De Beule Bart Desloovere Peter Mortier Tim Neels Sofie Van Cauter Benedict Verhegghe If you feel that your name was left out in error, please contact us. """)
def cookie(): draw.showInfo(_cookies[0],["OK"]) roll(_cookies)
def startGUI(args): """Create the QT4 application and GUI. A (possibly empty) list of command line options should be provided. QT4 wil remove the recognized QT4 and X11 options. """ # This seems to be the only way to make sure the numeric conversion is # always correct # QtCore.QLocale.setDefault(QtCore.QLocale.c()) # #pf.options.debug = -1 pf.debug("Arguments passed to the QApplication: %s" % args,pf.DEBUG.INFO) pf.app = Application(args) # pf.debug("Arguments left after constructing the QApplication: %s" % args,pf.DEBUG.INFO) pf.debug("Arguments left after constructing the QApplication: %s" % '\n'.join(pf.app.arguments()),pf.DEBUG.INFO) #pf.options.debug = 0 # As far as I have been testing this, the args passed to the Qt application are # NOT acknowledged and neither are they removed!! pf.debug("Setting application attributes",pf.DEBUG.INFO) pf.app.setOrganizationName("pyformex.org") pf.app.setOrganizationDomain("pyformex.org") pf.app.setApplicationName("pyFormex") pf.app.setApplicationVersion(pf.__version__) ## pf.settings = QtCore.QSettings("pyformex.org", "pyFormex") ## pf.settings.setValue("testje","testvalue") # Quit application if last window closed pf.app.lastWindowClosed.connect(pf.app.quit) # Check if we have DRI pf.debug("Setting OpenGL format",pf.DEBUG.OPENGL) dri = hasDRI() # Check for existing pyFormex processes pf.debug("Checking for running pyFormex",pf.DEBUG.INFO) if pf.X11: windowname,running = findOldProcesses() else: windowname,running = "UNKOWN",[] pf.debug("%s,%s" % (windowname,running),pf.DEBUG.INFO) while len(running) > 0: if len(running) >= 16: print("Too many open pyFormex windows --- bailing out") return -1 pids = [ i[2] for i in running if i[2] is not None ] warning = """.. pyFormex is already running on this screen ------------------------------------------ A main pyFormex window already exists on your screen. If you really intended to start another instance of pyFormex, you can just continue now. The window might however be a leftover from a previously crashed pyFormex session, in which case you might not even see the window anymore, nor be able to shut down that running process. In that case, you would better bail out now and try to fix the problem by killing the related process(es). If you think you have already killed those processes, you may check it by rerunning the tests. """ actions = ['Really Continue','Rerun the tests','Bail out and fix the problem'] if pids: warning += """ I have identified the process(es) by their PID as:: %s If you trust me enough, you can also have me kill this processes for you. """ % pids actions[2:2] = ['Kill the running processes'] if dri: answer = draw.ask(warning,actions) else: warning += """ I have detected that the Direct Rendering Infrastructure is not activated on your system. Continuing with a second instance of pyFormex may crash your XWindow system. You should seriously consider to bail out now!!! """ answer = draw.warning(warning,actions) if answer == 'Really Continue': break # OK, Go ahead elif answer == 'Rerun the tests': windowname,running = findOldProcesses() # try again elif answer == 'Kill the running processes': killProcesses(pids) windowname,running = findOldProcesses() # try again else: return -1 # I'm out of here! # Load the splash image pf.debug("Loading the splash image",pf.DEBUG.GUI) splash = None if os.path.exists(pf.cfg['gui/splash']): pf.debug('Loading splash %s' % pf.cfg['gui/splash'],pf.DEBUG.GUI) splashimage = QtGui.QPixmap(pf.cfg['gui/splash']) splash = QtGui.QSplashScreen(splashimage) splash.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint|QtCore.Qt.SplashScreen) splash.setFont(QtGui.QFont("Helvetica",20)) splash.showMessage(pf.Version,QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop,QtCore.Qt.red) splash.show() # create GUI, show it, run it pf.debug("Creating the GUI",pf.DEBUG.GUI) desktop = pf.app.desktop() pf.maxsize = Size(desktop.availableGeometry()) size = pf.cfg.get('gui/size',(800,600)) pos = pf.cfg.get('gui/pos',(0,0)) bdsize = pf.cfg.get('gui/bdsize',(800,600)) size = MinSize(size,pf.maxsize) # Create the GUI pf.GUI = Gui(windowname, pf.cfg.get('gui/size',(800,600)), pf.cfg.get('gui/pos',(0,0)), pf.cfg.get('gui/bdsize',(800,600)), ) # set the appearance pf.debug("Setting Appearence",pf.DEBUG.GUI) pf.GUI.setAppearence() # setup the message board pf.board = pf.GUI.board pf.board.write("""%s (C) Benedict Verhegghe pyFormex comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under the conditions of the GNU General Public License, version 3 or later. See Help->License or the file COPYING for details. """ % pf.fullVersion()) # Set interaction functions def show_warning(message,category,filename,lineno,file=None,line=None): """Replace the default warnings.showwarning We display the warnings using our interactive warning widget. This feature can be turned off by setting cfg['warnings/popup'] = False """ full_message = warnings.formatwarning(message,category,filename,lineno,line) pf.message(full_message) res,check = draw.showMessage(full_message,level='warning',check="Do not show this warning anymore in future sessions") if check[0]: utils.filterWarning(str(message)) utils.saveWarningFilter(str(message)) if pf.cfg['warnings/popup']: warnings.showwarning = show_warning pf.message = draw.message pf.warning = draw.warning pf.error = draw.error # setup the canvas pf.debug("Setting the canvas",pf.DEBUG.GUI) pf.GUI.processEvents() pf.GUI.viewports.changeLayout(1) pf.GUI.viewports.setCurrent(0) #pf.canvas = pf.GUI.viewports.current pf.canvas.setRenderMode(pf.cfg['draw/rendermode']) # # PYSIDE: raises (intercepted) exception on startup # draw.reset() # setup the status bar pf.debug("Setup status bar",pf.DEBUG.GUI) pf.GUI.addInputBox() pf.GUI.toggleInputBox(False) pf.GUI.addCoordsTracker() pf.GUI.toggleCoordsTracker(pf.cfg.get('gui/coordsbox',False)) pf.debug("Using window name %s" % pf.GUI.windowTitle(),pf.DEBUG.GUI) # Script menu pf.GUI.scriptmenu = appMenu.createAppMenu(mode='script',parent=pf.GUI.menu,before='help') # App menu pf.GUI.appmenu = appMenu.createAppMenu(parent=pf.GUI.menu,before='help') # BV: removed, because they are in the script/app menus, # and the file menu is alredy very loaded ## # Link History Menus also in the File menu ## parent = pf.GUI.menu.item('file') ## before = parent.item('---1') ## if pf.GUI.apphistory: ## parent.insert_menu(pf.GUI.apphistory,before) ## if pf.GUI.scripthistory: ## parent.insert_menu(pf.GUI.scripthistory,before) # Create databases createDatabases() # Plugin menus import plugins filemenu = pf.GUI.menu.item('file') pf.gui.plugin_menu = plugins.create_plugin_menu(filemenu,before='---1') # Load configured plugins, ignore if not found plugins.loadConfiguredPlugins() # show current application/file appname = pf.cfg['curfile'] pf.GUI.setcurfile(appname) # Last minute menu modifications can go here # cleanup pf.GUI.setBusy(False) # HERE pf.GUI.addStatusBarButtons() if splash is not None: # remove the splash window splash.finish(pf.GUI) pf.GUI.setBusy(False) # OR HERE pf.debug("Showing the GUI",pf.DEBUG.GUI) pf.GUI.show() # redirect standard output to board # TODO: this should disappear when we have buffered stdout # and moved this up into GUI init pf.GUI.board.redirect(pf.cfg['gui/redirect']) pf.GUI.update() if pf.cfg['gui/fortune']: sta,out = utils.runCommand(pf.cfg['fortune']) if sta == 0: draw.showInfo(out) #pf.app.setQuitOnLastWindowClosed(False) pf.app_started = True pf.GUI.processEvents() # load last project # # TODO if pf.cfg['openlastproj']: fn = pf.cfg['curproj'] if fn: try: proj = fileMenu.readProjectFile(fn) fileMenu.setProject(proj) except: # Avoid crashes from a faulty project file # TODO: should we push this up to fileMenu.readProjectFile ? # pf.message("Could not load the current project %s" % fn) # return 0
def startGUI(args): """Create the QT4 application and GUI. A (possibly empty) list of command line options should be provided. QT4 wil remove the recognized QT4 and X11 options. """ # This seems to be the only way to make sure the numeric conversion is # always correct # QtCore.QLocale.setDefault(QtCore.QLocale.c()) # #pf.options.debug = -1 pf.debug("Arguments passed to the QApplication: %s" % args) pf.app = QtGui.QApplication(args) # pf.debug("Arguments left after constructing the QApplication: %s" % args) pf.debug("Arguments left after constructing the QApplication: %s" % pf.app.arguments().join('\n')) #pf.options.debug = 0 # As far as I have been testing this, the args passed to the Qt application are # NOT acknowledged and neither are they removed!! pf.debug("Setting application attributes") pf.app.setOrganizationName("pyformex.org") pf.app.setOrganizationDomain("pyformex.org") pf.app.setApplicationName("pyFormex") pf.app.setApplicationVersion(pf.__version__) ## pf.settings = QtCore.QSettings("pyformex.org", "pyFormex") ## pf.settings.setValue("testje","testvalue") #QtCore.QObject.connect(pf.app,QtCore.SIGNAL("lastWindowClosed()"),pf.app,QtCore.SLOT("quit()")) QtCore.QObject.connect(pf.app,QtCore.SIGNAL("lastWindowClosed()"),quitGUI) #QtCore.QObject.connect(pf.app,QtCore.SIGNAL("aboutToQuit()"),quitGUI) # Check if we have DRI pf.debug("Setting OpenGL format") viewport.setOpenGLFormat() dri = viewport.opengl_format.directRendering() # Check for existing pyFormex processes pf.debug("Checking for running pyFormex") if pf.X11: windowname,running = findOldProcesses() else: windowname,running = "UNKOWN",[] pf.debug("%s,%s" % (windowname,running)) while len(running) > 0: if len(running) >= 16: print("Too many open pyFormex windows --- bailing out") return -1 pids = [ i[2] for i in running if i[2] is not None ] warning = """.. pyFormex is already running on this screen ------------------------------------------ A main pyFormex window already exists on your screen. If you really intended to start another instance of pyFormex, you can just continue now. The window might however be a leftover from a previously crashed pyFormex session, in which case you might not even see the window anymore, nor be able to shut down that running process. In that case, you would better bail out now and try to fix the problem by killing the related process(es). If you think you have already killed those processes, you may check it by rerunning the tests. """ actions = ['Really Continue','Rerun the tests','Bail out and fix the problem'] if pids: warning += """ I have identified the process(es) by their PID as:: %s If you trust me enough, you can also have me kill this processes for you. """ % pids actions[2:2] = ['Kill the running processes'] if dri: answer = draw.ask(warning,actions) else: warning += """ I have detected that the Direct Rendering Infrastructure is not activated on your system. Continuing with a second instance of pyFormex may crash your XWindow system. You should seriously consider to bail out now!!! """ answer = draw.warning(warning,actions) if answer == 'Really Continue': break # OK, Go ahead elif answer == 'Rerun the tests': windowname,running = findOldProcesses() # try again elif answer == 'Kill the running processes': killProcesses(pids) windowname,running = findOldProcesses() # try again else: return -1 # I'm out of here! # Load the splash image pf.debug("Loading the splash image") splash = None if os.path.exists(pf.cfg['gui/splash']): pf.debug('Loading splash %s' % pf.cfg['gui/splash']) splashimage = QtGui.QPixmap(pf.cfg['gui/splash']) splash = QtGui.QSplashScreen(splashimage) splash.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) splash.setFont(QtGui.QFont("Helvetica",24)) splash.showMessage(pf.Version,QtCore.Qt.AlignHCenter,QtCore.Qt.red) splash.show() # create GUI, show it, run it pf.debug("Creating the GUI") desktop = pf.app.desktop() pf.maxsize = Size(desktop.availableGeometry()) size = pf.cfg.get('gui/size',(800,600)) pos = pf.cfg.get('gui/pos',(0,0)) bdsize = pf.cfg.get('gui/bdsize',(800,600)) size = MinSize(size,pf.maxsize) pf.GUI = Gui(windowname, pf.cfg.get('gui/size',(800,600)), pf.cfg.get('gui/pos',(0,0)), pf.cfg.get('gui/bdsize',(800,600)), ) # set the appearance pf.GUI.setAppearence() # setup the message board pf.board = pf.GUI.board pf.board.write("""%s (Rev. %s) (C) Benedict Verhegghe pyFormex comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under the conditions of the GNU General Public License, version 3 or later. See Help->License or the file COPYING for details. """ % (pf.Version,pf.__revision__)) # Set interaction functions def show_warning(message,category,filename,lineno,file=None,line=None): """Replace the default warnings.showwarning We display the warnings using our interactive warning widget. This feature can be turned off by setting cfg['warnings/popup'] = False """ full_message = warnings.formatwarning(message,category,filename,lineno,line) ## from widgets import simpleInputItem as I ## res = draw.askItems([ ## I('message',message,itemtype='label',text='warning'), ## I('filter',False,text='Suppress this message in future sessions'), ## ],actions=[('OK',)],legacy=False) #print res pf.message(full_message) res,check = draw.showMessage(full_message,level='warning',check="Do not show this warning anymore in future sessions") if check[0]: oldfilters = pf.prefcfg['warnings/filters'] newfilters = oldfilters + [(str(message),)] pf.prefcfg.update({'filters':newfilters},name='warnings') ## def format_warning(message,category,filename,lineno,line=None): ## """Replace the default warnings.formatwarning ## We display the warnings using our interactive warning widget. ## This feature can be turned off by setting ## cfg['nice_warnings'] = False ## """ ## import messages ## message = messages.getMessage(message) ## message = """.. ## pyFormex Warning ## ================ ## %s ## `Called from:` %s `line:` %s ## """ % (message,filename,lineno) ## if line: ## message += "%s\n" % line ## return message ## if pf.cfg['warnings/nice']: ## warnings.formatwarning = format_warning if pf.cfg['warnings/popup']: warnings.showwarning = show_warning pf.message = draw.message pf.warning = draw.warning # setup the canvas pf.GUI.viewports.changeLayout(1) pf.GUI.viewports.setCurrent(0) pf.canvas = pf.GUI.viewports.current draw.reset() # setup the status bar pf.GUI.addInputBox() pf.GUI.toggleInputBox(False) pf.GUI.addCoordsTracker() pf.GUI.toggleCoordsTracker(pf.cfg.get('gui/coordsbox',False)) pf.debug("Using window name %s" % pf.GUI.windowTitle()) # Create additional menus (put them in a list to save) # History Menu pf.GUI.history = scriptMenu.ScriptMenu('History',files=pf.cfg['gui/history'],max=pf.cfg['gui/history_max']) if pf.cfg.get('gui/history_in_main_menu',False): before = pf.GUI.menu.item('help') pf.GUI.menu.insertMenu(before,pf.GUI.history) else: filemenu = pf.GUI.menu.item('file') before = filemenu.item('---1') filemenu.insertMenu(before,pf.GUI.history) # Scripts menu pf.GUI.scriptmenu = scriptMenu.createScriptMenu(pf.GUI.menu,before='help') # Create databases createDatabases() # Plugin menus import plugins filemenu = pf.GUI.menu.item('file') pf.gui.saveobj = plugins.create_plugin_menu(filemenu,before='History') # Load configured plugins, ignore if not found plugins.loadConfiguredPlugins() # Last minute menu modifications can go here # cleanup pf.GUI.setBusy(False) # HERE pf.GUI.addStatusBarButtons() if splash is not None: # remove the splash window splash.finish(pf.GUI) pf.GUI.setBusy(False) # OR HERE pf.debug("Showing the GUI") pf.GUI.show() pf.GUI.update() if pf.cfg['gui/fortune']: sta,out = utils.runCommand(pf.cfg['fortune']) if sta == 0: draw.showInfo(out) warnings.warn('warn_quadratic_drawing') pf.app_started = True pf.GUI.processEvents() return 0
def cookie(): draw.showInfo(_cookies[0], ["OK"]) roll(_cookies)