import netgen from . import libngguipy from . import libngpy def StartGUI(): from tkinter import Tk from netgen import config import sys, os try: # the GUI tries to load ngsolve.tcl (which loads ngsolve shared libraries) # BUT might fail to load dependencies (like mkl), these are handled by the # ngsolve __init__.py script, so import ngsolve from python already here import ngsolve except: pass global win win = Tk() win.tk.eval('lappend ::auto_path ' + netgen._netgen_lib_dir) win.tk.eval('lappend ::auto_path ' + netgen._netgen_bin_dir) # load with absolute path to avoid issues on MacOS win.tk.eval('load "'+netgen._netgen_lib_dir.replace('\\','/')+'/libnggui[info sharedlibextension]" gui') if config.is_python_package and 'darwin' in sys.platform: # libngsolve and other libraries are installed into netgen python dir to keep relative installation paths, but tcl won't find them there automatically netgen_dir = os.path.abspath(os.path.dirname(netgen.__file__)) win.tk.eval(f'set netgen_library_dir {netgen_dir}') win.tk.eval( netgen.libngpy._meshing._ngscript) try: from IPython import get_ipython ipython = get_ipython() ipython.magic('gui tk') except: pass def _Redraw(*args, **kwargs): if libngpy._meshing._Redraw(*args, **kwargs): import netgen import tkinter cnt = 0 while(win.tk.dooneevent(tkinter._tkinter.DONT_WAIT) and cnt < 100): cnt += 1 netgen._Redraw = _Redraw _Redraw(blocking=True) if not netgen.libngpy._meshing._netgen_executable_started: import os if not "NETGEN_DOCUMENTATION_RST_FORMAT" in os.environ: StartGUI() def Snapshot(w,h, filename=None): netgen.Redraw(blocking=True) import numpy image = netgen.libngguipy.Snapshot(w, h) image = numpy.array(image, dtype=numpy.uint8).reshape(h, w, 3) image = image[::-1,:,:] if filename: import PIL.Image im = PIL.Image.fromarray(image) im.save(filename) return image