def runGUI(): """Go into interactive mode""" egg = pf.cfg.get('gui/easter_egg',None) pf.debug('EGG: %s' % str(egg)) if egg: pf.debug('EGG') if type(egg) is str: pye = egg.endswith('pye') egg = file(egg).read() else: pye = True egg = ''.join(egg) draw.playScript(egg,pye=True) pf.interactive = True pf.debug("Start main loop") #utils.procInfo('runGUI') #from multiprocessing import Process #p = Process(target=pf.app.exec_) #p.start() #res = p.join() res = pf.app.exec_() pf.debug("Exit main loop with value %s" % res) return res
def runGUI(): """Go into interactive mode""" egg = pf.cfg.get('gui/easter_egg',None) pf.debug('EGG: %s' % str(egg),pf.DEBUG.INFO) if egg: pf.debug('EGG') if type(egg) is str: pye = egg.endswith('pye') egg = open(egg).read() else: pye = True egg = ''.join(egg) draw.playScript(egg,pye=True) if os.path.isdir(pf.cfg['workdir']): # Make the workdir the current dir os.chdir(pf.cfg['workdir']) pf.debug("Setting workdir to %s" % pf.cfg['workdir'],pf.DEBUG.INFO) else: # Save the current dir as workdir prefMenu.updateSettings({'workdir':os.getcwd(),'_save_':True}) pf.interactive = True pf.debug("Start main loop",pf.DEBUG.INFO) #utils.procInfo('runGUI') #from multiprocessing import Process #p = Process(target=pf.app.exec_) #p.start() #res = p.join() res = pf.app.exec_() pf.debug("Exit main loop with value %s" % res,pf.DEBUG.INFO) return res
def runGUI(): """Go into interactive mode""" egg = pf.cfg.get('gui/easter_egg',None) pf.debug('EGG: %s' % str(egg)) if egg: pf.debug('EGG') if type(egg) is str: pye = egg.endswith('pye') egg = file(egg).read() else: pye = True egg = ''.join(egg) draw.playScript(egg,pye=True) if os.path.isdir(pf.cfg['workdir']): # Make the workdir the current dir os.chdir(pf.cfg['workdir']) pf.debug("Setting workdir to %s" % pf.cfg['workdir']) else: # Save the current dir as workdir prefMenu.updateSettings({'workdir':os.getcwd(),'Save changes':True}) pf.interactive = True pf.debug("Start main loop") #utils.procInfo('runGUI') #from multiprocessing import Process #p = Process(target=pf.app.exec_) #p.start() #res = p.join() res = pf.app.exec_() pf.debug("Exit main loop with value %s" % res) return res
def runApp(args): """Create and run the qt application.""" GD.app = QtGui.QApplication(args) QtCore.QObject.connect(GD.app,QtCore.SIGNAL("lastWindowClosed()"),GD.app,QtCore.SLOT("quit()")) QtCore.QObject.connect(GD.app,QtCore.SIGNAL("aboutToQuit()"),quit) # Set some globals GD.image_formats_qt = map(str,QtGui.QImageWriter.supportedImageFormats()) GD.image_formats_qtr = map(str,QtGui.QImageReader.supportedImageFormats()) if GD.cfg.get('imagesfromeps',False): GD.image_formats_qt = [] if GD.options.debug: print "Qt image types for saving: ",GD.image_formats_qt print "Qt image types for input: ",GD.image_formats_qtr print "gl2ps image types:",GD.image_formats_gl2ps print "image types converted from EPS:",GD.image_formats_fromeps # Load the splash image splash = None if os.path.exists(GD.cfg['gui/splash']): GD.debug('Loading splash %s' % GD.cfg['gui/splash']) splashimage = QtGui.QPixmap(GD.cfg['gui/splash']) splash = QtGui.QSplashScreen(splashimage) splash.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) splash.setFont(QtGui.QFont("Helvetica",24)) splash.showMessage(GD.Version,QtCore.Qt.AlignHCenter,QtCore.Qt.red) splash.show() # create GUI, show it, run it viewport.setOpenGLFormat() dri = viewport.opengl_format.directRendering() windowname = GD.Version count = 0 while windowExists(windowname): if count > 255: print "Can not open the main window --- bailing out" return 1 count += 1 windowname = '%s (%s)' % (GD.Version,count) if count > 0: warning = """ Another instance of pyFormex is already running on this screen. This may be a leftover from a previously crashed program. In that case you should bail out now and first kill the crashed program. On the other hand, if you really want to run another pyFormex in parallel, you can just continue now. """ actions = ['Really Continue','Bail out and fix the problem'] if dri: answer = draw.ask(warning,actions) if not dri: warning += """ I have detected that the Direct Rendering Infrastructure is not activated on your system. Continuing with a second instance of pyFormex may crash you XWindow system. You should seriously consider to bail out now!!! """ answer = draw.warning(warning,actions) if answer != 'Really Continue': return 1 GD.gui = GUI(windowname, GD.cfg.get('gui/size',(800,600)), GD.cfg.get('gui/pos',(0,0)), GD.cfg.get('gui/bdsize',(800,600)) ) # set the appearence GD.gui.setStyle(GD.cfg.get('gui/style','Plastique')) font = GD.cfg.get('gui/font',None) if font: GD.gui.setFont(font) else: fontfamily = GD.cfg.get('gui/fontfamily',None) if fontfamily: GD.gui.setFontFamily(fontfamily) fontsize = GD.cfg.get('gui/fontsize',None) if fontsize: GD.gui.setFontSize(fontsize) GD.gui.viewports.changeLayout(1) GD.gui.viewports.setCurrent(0) GD.board = GD.gui.board GD.board.write("""%s (C) B. Verhegghe pyFormex comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See Help->License or the file COPYING for details. """ % GD.Version) GD.gui.show() GD.debug("Using window name %s" % GD.gui.windowTitle()) # Create additional menus (put them in a list to save) # History Menu history = GD.cfg.get('history',None) if type(history) == list: GD.gui.history = scriptsMenu.ScriptsMenu('History',files=history,max=20) if GD.cfg.get('gui/history_in_main_menu',False): before = GD.gui.menu.item('help').menuAction() GD.gui.menu.insertMenu(before,GD.gui.history) else: filemenu = GD.gui.menu.item('file') before = filemenu.item('---1') filemenu.insertMenu(before,GD.gui.history) # Create a menu with pyFormex examples # and insert it before the help menu menus = [] scriptdirs = GD.cfg['scriptdirs'] knownscriptdirs = { 'examples': GD.cfg['examplesdir'] } if GD.cfg.get('gui/separate_script_dirs',False): # This will create separate menus for all scriptdirs pass else: # The default is to collect all scriptdirs in a single main menu if len(scriptdirs) > 1: scriptsmenu = widgets.Menu('Scripts',GD.gui.menu) before = GD.gui.menu.item('help').menuAction() GD.gui.menu.insertMenu(before,scriptsmenu) before = None else: scriptsmenu = GD.gui.menu before = scriptsmenu.itemAction('help') for title,dirname in scriptdirs: GD.debug("Loading script dir %s" % dirname) if not dirname: dirname = knownscriptdirs[title.lower()] if os.path.exists(dirname): m = scriptsMenu.ScriptsMenu(title,dirname,autoplay=True) scriptsmenu.insert_menu(m,before) menus.append(m) # Needed to keep m linked to a name, # else the menu is destroyed! # Set interaction functions GD.message = draw.message GD.warning = draw.warning draw.reset() # Load plugins, ignore if not found import plugins for p in GD.cfg.get('gui/plugins',[]): try: m = getattr(plugins,p) if hasattr(m,'show_menu'): m.show_menu() except: GD.debug('ERROR while loading plugin %s' % p) GD.gui.setBusy(False) GD.gui.update() # remove the splash window if splash is not None: splash.finish(GD.gui) # Add the autorun script to the remaining args if GD.gui.easter_egg: draw.playScript(utils.mergeme(*GD.gui.easter_egg)) ar = GD.cfg.get('autorun','') if ar: if type(ar) == str: ar = [ar] args = ar + args # remaining args are interpreted as scripts for arg in args: if os.path.exists(arg): draw.play(arg) GD.gui.setBusy(False) GD.gui.update() if os.path.isdir(GD.cfg['workdir']): # Make the workdir the current dir os.chdir(GD.cfg['workdir']) else: # Save the current dir as workdir GD.cfg['workdir'] = os.getcwd() GD.app_started = True GD.app.exec_() # Cleanup draw.drawrelease() GD.gui.setBusy(False) # store the history and main window size/pos GD.cfg['history'] = GD.gui.history.files # Sometimes, a negative value is stored, making restart partially obscured x,y = Pos(GD.gui) if x < 0: x = 0 if y < 0: y = 0 GD.cfg.update({'size':Size(GD.gui), 'pos':(x,y), 'bdsize':Size(GD.gui.board), },name='gui') return 0
def runApp(args): """Create and run the qt application.""" # # FIX FOR A BUG IN NUMPY (It's always sane anyway) # import locale GD.debug("LC_NUMERIC = %s" % locale.setlocale(locale.LC_NUMERIC)) # GD.app = QtGui.QApplication(args) # GD.debug("LC_NUMERIC = %s" % locale.setlocale(locale.LC_NUMERIC)) locale.setlocale(locale.LC_NUMERIC, 'C') GD.debug("LC_NUMERIC = %s" % locale.setlocale(locale.LC_NUMERIC)) # # # QtCore.QObject.connect(GD.app,QtCore.SIGNAL("lastWindowClosed()"),GD.app,QtCore.SLOT("quit()")) QtCore.QObject.connect(GD.app,QtCore.SIGNAL("aboutToQuit()"),quit) # Load the splash image splash = None if os.path.exists(GD.cfg['gui/splash']): GD.debug('Loading splash %s' % GD.cfg['gui/splash']) splashimage = QtGui.QPixmap(GD.cfg['gui/splash']) splash = QtGui.QSplashScreen(splashimage) splash.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) splash.setFont(QtGui.QFont("Helvetica",24)) splash.showMessage(GD.Version,QtCore.Qt.AlignHCenter,QtCore.Qt.red) splash.show() # create GUI, show it, run it viewport.setOpenGLFormat() dri = viewport.opengl_format.directRendering() windowname = GD.Version count = 0 while windowExists(windowname): if count > 255: print "Can not open the main window --- bailing out" return 1 count += 1 windowname = '%s (%s)' % (GD.Version,count) if count > 0: warning = """ Another instance of pyFormex is already running on this screen. This may be a leftover from a previously crashed program. In that case you should bail out now and first kill the crashed program. On the other hand, if you really want to run another pyFormex in parallel, you can just continue now. """ actions = ['Really Continue','Bail out and fix the problem'] if dri: answer = draw.ask(warning,actions) if not dri: warning += """ I have detected that the Direct Rendering Infrastructure is not activated on your system. Continuing with a second instance of pyFormex may crash you XWindow system. You should seriously consider to bail out now!!! """ answer = draw.warning(warning,actions) if answer != 'Really Continue': return 1 GD.gui = GUI(windowname, GD.cfg.get('gui/size',(800,600)), GD.cfg.get('gui/pos',(0,0)), GD.cfg.get('gui/bdsize',(800,600)) ) # set the appearence GD.gui.setStyle(GD.cfg.get('gui/style','Plastique')) font = GD.cfg.get('gui/font',None) if font: GD.gui.setFont(font) else: fontfamily = GD.cfg.get('gui/fontfamily',None) if fontfamily: GD.gui.setFontFamily(fontfamily) fontsize = GD.cfg.get('gui/fontsize',None) if fontsize: GD.gui.setFontSize(fontsize) GD.gui.viewports.changeLayout(1) GD.gui.viewports.setCurrent(0) GD.board = GD.gui.board GD.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. """ % GD.Version) GD.gui.show() GD.debug("Using window name %s" % GD.gui.windowTitle()) # Create additional menus (put them in a list to save) # History Menu history = GD.cfg.get('history',None) if type(history) == list: GD.gui.history = scriptsMenu.ScriptsMenu('History',files=history,max=20) if GD.cfg.get('gui/history_in_main_menu',False): before = GD.gui.menu.item('help').menuAction() GD.gui.menu.insertMenu(before,GD.gui.history) else: filemenu = GD.gui.menu.item('file') before = filemenu.item('---1') filemenu.insertMenu(before,GD.gui.history) # Script menu scriptmenu = createScriptMenu() # Set interaction functions GD.message = draw.message GD.warning = draw.warning draw.reset() # Load plugins, ignore if not found import plugins for p in GD.cfg.get('gui/plugins',[]): try: m = getattr(plugins,p) if hasattr(m,'show_menu'): m.show_menu() except: GD.debug('ERROR while loading plugin %s' % p) GD.gui.setBusy(False) GD.gui.update() GD.gui.addStatusBarButtons() # remove the splash window if splash is not None: splash.finish(GD.gui) GD.gui.setBusy(False) GD.gui.update() if os.path.isdir(GD.cfg['workdir']): # Make the workdir the current dir os.chdir(GD.cfg['workdir']) else: # Save the current dir as workdir GD.cfg['workdir'] = os.getcwd() GD.app_started = True if GD.gui.easter_egg: draw.playScript(utils.mergeme(*GD.gui.easter_egg)) # remaining args are interpreted as scripts and their parameters script.runApp(args) # Go into interactive mode GD.debug("Start main loop") GD.app.exec_() GD.debug("Exit main loop") return 0
def createProject(create=True,compression=0,addGlobals=None,makeDefault=True): """Open a file selection dialog and let the user select a project. The default will let the user create new project files as well as open existing ones. Use create=False or the convenience function openProject to only accept existing project files. If a compression level (1..9) is given, the contents will be compressed, resulting in much smaller project files at the cost of Only one pyFormex project can be open at any time. The open project owns all the global data created and exported by any script. If makeDefault is True, an already open project will be closed and the opened project becomes the current project. If makeDefault is False, the project data are imported into GD.PF and the current project does not change. This means that if a project was open, the imported data will be added to it. If addGlobals is None, the user is asked whether the current globals should be added to the project. Set True or False to force or reject the adding without asking. """ global the_project # ask filename from user if the_project is None: cur = GD.cfg.get('workdir','.') else: if makeDefault: options = ['Cancel','Close without saving','Save and Close'] ans = draw.ask("Another project is still open. Shall I close it first?", options) if ans == 'Cancel': return if ans == options[2]: the_project.save() cur = the_project.filename typ = utils.fileDescription(['pyf','all']) res = widgets.ProjectSelection(cur,typ,exist=not create).getResult() if res is None: # user canceled return fn = res.fn if not fn.endswith('.pyf'): fn += '.pyf' legacy = res.leg ignoresig = res.sig compression = res.cpr #print(fn,legacy,compression) if create and os.path.exists(fn): res = draw.ask("The project file '%s' already exists\nShall I delete the contents or add to it?" % fn,['Delete','Add','Cancel']) if res == 'Cancel': return if res == 'Add': create = False GD.message("Opening project %s" % fn) if GD.PF: GD.message("Exported symbols: %s" % GD.PF.keys()) if addGlobals is None: res = draw.ask("pyFormex already contains exported symbols.\nShall I delete them or add them to your project?",['Delete','Add','Cancel']) if res == 'Cancel': # ESCAPE FROM CREATING THE PROJECT return addGlobals = res == 'Add' # OK, we have all data, now create/open the project updateSettings({'workdir':os.path.dirname(fn)},save=True) sig = GD.Version[:GD.Version.rfind('-')] if ignoresig: sig = '' proj = _open_project(fn,create,sig,compression,legacy) GD.message("Project contents: %s" % proj.keys()) if hasattr(proj,'_autoscript_'): _ignore = "Ignore it!" _show = "Show it" _edit = "Load it in the editor" _exec = "Execute it" res = draw.ask("There is an autoscript stored inside the project.\nIf you received this project file from an untrusted source, you should probably not execute it.",[_ignore,_show,_edit,_exec]) if res == _show: res = draw.showText(proj._autoscript_)#,actions=[_ignore,_edit,_show]) return if res == _exec: draw.playScript(proj._autoscript_) elif res == _edit: fn = "_autoscript_.py" draw.checkWorkdir() f = file(fn,'w') f.write(proj._autoscript_) f.close() openScript(fn) editScript(fn) if hasattr(proj,'autofile') and draw.ack("The project has an autofile attribute: %s\nShall I execute this script?" % proj.autofile): processArgs([proj.autofile]) if makeDefault: the_project = proj if GD.PF and addGlobals: the_project.update(GD.PF) GD.PF = the_project GD.GUI.setcurproj(fn) else: # Just import the data into current project GD.PF.update(proj) GD.message("Exported symbols: %s" % GD.PF.keys())
def setProject(proj): """Make the specified project the current project. proj is an open project. If a filename, the project file is opened. .. note: The remainder is obsolete The user is asked for a Project file name and the access modalities. Depending on the results of the dialog: - either an new project is create or an old is opened, - the old data may be discarded, added to the current pyFormex globals, or replace them - the opened Project may become the current Project, or its data are just imported in the current Project. The default will let the user create new project files as well as open existing ones. Use create=False or the convenience function openProject to only accept existing project files. If a compression level (1..9) is given, the contents will be compressed, resulting in much smaller project files at the cost of Only one pyFormex project can be open at any time. The open project owns all the global data created and exported by any script. If makeDefault is True, an already open project will be closed and the opened project becomes the current project. If makeDefault is False, the project data are imported into pf.PF and the current project does not change. This means that if a project was open, the imported data will be added to it. If addGlobals is None, the user is asked whether the current globals should be added to the project. Set True or False to force or reject the adding without asking. """ pf.message("Setting current project to %s" % proj.filename) pf.message("Project contents: %s" % utils.sortedKeys(proj)) keep = {} if pf.PF: pf.message("Current pyFormex globals: %s" % utils.sortedKeys(pf.PF)) _delete = "Delete" _add = "Keep non existing" _overwrite = "Keep all (overwrite project)" res = draw.ask("What shall I do with the current pyFormex globals?",[_delete,_add,_overwrite]) if res == _add: keep = utils.removeDict(pf.PF,proj) elif res == _overwrite: keep = pf.PF pf.PF = proj if keep: pf.PF.update(keep) if pf.PF.filename: updateSettings({ 'curproj':pf.PF.filename, 'workdir':os.path.dirname(pf.PF.filename), },save=True) pf.GUI.setcurproj(pf.PF.filename) if hasattr(proj,'_autoscript_'): _ignore = "Ignore it!" _show = "Show it" _edit = "Load it in the editor" _exec = "Execute it" res = draw.ask("There is an autoscript stored inside the project.\nIf you received this project file from an untrusted source, you should probably not execute it.",[_ignore,_show,_edit,_exec]) if res == _show: res = draw.showText(proj._autoscript_)#,actions=[_ignore,_edit,_show]) return if res == _exec: draw.playScript(proj._autoscript_) elif res == _edit: fn = "_autoscript_.py" draw.checkWorkdir() f = open(fn,'w') f.write(proj._autoscript_) f.close() openScript(fn) editApp(fn) if hasattr(proj,'autofile') and draw.ack("The project has an autofile attribute: %s\nShall I execute this script?" % proj.autofile): draw.processArgs([proj.autofile]) listProject()
def setProject(proj): """Make the specified project the current project. proj is an open project. If a filename, the project file is opened. .. note: The remainder is obsolete The user is asked for a Project file name and the access modalities. Depending on the results of the dialog: - either an new project is create or an old is opened, - the old data may be discarded, added to the current pyFormex globals, or replace them - the opened Project may become the current Project, or its data are just imported in the current Project. The default will let the user create new project files as well as open existing ones. Use create=False or the convenience function openProject to only accept existing project files. If a compression level (1..9) is given, the contents will be compressed, resulting in much smaller project files at the cost of Only one pyFormex project can be open at any time. The open project owns all the global data created and exported by any script. If makeDefault is True, an already open project will be closed and the opened project becomes the current project. If makeDefault is False, the project data are imported into pf.PF and the current project does not change. This means that if a project was open, the imported data will be added to it. If addGlobals is None, the user is asked whether the current globals should be added to the project. Set True or False to force or reject the adding without asking. """ pf.message("Setting current project to %s" % proj.filename) pf.message("Project contents: %s" % utils.sortedKeys(proj)) keep = {} if pf.PF: pf.message("Current pyFormex globals: %s" % utils.sortedKeys(pf.PF)) _delete = "Delete" _add = "Keep non existing" _overwrite = "Keep all (overwrite project)" res = draw.ask("What shall I do with the current pyFormex globals?", [_delete, _add, _overwrite]) if res == _add: keep = utils.removeDict(pf.PF, proj) elif res == _overwrite: keep = pf.PF pf.PF = proj if keep: pf.PF.update(keep) if pf.PF.filename: updateSettings( { 'curproj': pf.PF.filename, 'workdir': os.path.dirname(pf.PF.filename), }, save=True) pf.GUI.setcurproj(pf.PF.filename) if hasattr(proj, '_autoscript_'): _ignore = "Ignore it!" _show = "Show it" _edit = "Load it in the editor" _exec = "Execute it" res = draw.ask( "There is an autoscript stored inside the project.\nIf you received this project file from an untrusted source, you should probably not execute it.", [_ignore, _show, _edit, _exec]) if res == _show: res = draw.showText( proj._autoscript_) #,actions=[_ignore,_edit,_show]) return if res == _exec: draw.playScript(proj._autoscript_) elif res == _edit: fn = "_autoscript_.py" draw.checkWorkdir() f = open(fn, 'w') f.write(proj._autoscript_) f.close() openScript(fn) editApp(fn) if hasattr(proj, 'autofile') and draw.ack( "The project has an autofile attribute: %s\nShall I execute this script?" % proj.autofile): draw.processArgs([proj.autofile]) listProject()