From 5c0a0efe14accf540e0cbf6c2039ab0e006bbf0c Mon Sep 17 00:00:00 2001 From: Romain Boman <r.boman@uliege.be> Date: Sun, 29 May 2022 16:25:31 +0200 Subject: [PATCH] add basic GUI --- cxxfem/_src/femi.i | 2 + cxxfem/src/femSolver.cpp | 2 +- cxxfem/tests/beam3d.py | 26 ++++---- cxxfem/utils.py | 11 ++-- fossil.png | Bin 0 -> 27689 bytes fossils.py | 124 ++++++++++++++++++++++++++++++++------- fossils.ui | 86 +++++++++++++++++++++++++++ gen_ui.py | 65 ++++++++++++++++++++ ui_fossils.py | 55 +++++++++++++++++ 9 files changed, 331 insertions(+), 40 deletions(-) create mode 100644 fossil.png create mode 100644 fossils.ui create mode 100644 gen_ui.py create mode 100644 ui_fossils.py diff --git a/cxxfem/_src/femi.i b/cxxfem/_src/femi.i index 4cf5658..1cfe5ad 100644 --- a/cxxfem/_src/femi.i +++ b/cxxfem/_src/femi.i @@ -19,6 +19,7 @@ threads="1" #include "femExtractor.h" #include "wCppBuf2Py.h" +#include "OpenMP.h" #include <string> // #include <sstream> @@ -77,6 +78,7 @@ namespace std { %warnfilter(401); //Nothing known about base class 'std::basic_streambuf< char >' %include "wCppBuf2Py.h" %warnfilter(+401); +%include "OpenMP.h" // ----------- FEM CLASSES --------------- %include "fem.h" diff --git a/cxxfem/src/femSolver.cpp b/cxxfem/src/femSolver.cpp index 065bc22..57f33c6 100644 --- a/cxxfem/src/femSolver.cpp +++ b/cxxfem/src/femSolver.cpp @@ -33,7 +33,7 @@ Solver::Solver(Problem &_pbl) : pbl(_pbl), bcs.add("FREE"); bcs.add("PRESCRIBED"); - // std::cout << "#threads = " << OpenMP::get_max_threads() << '\n'; + std::cout << "#threads = " << OpenMP::get_max_threads() << '\n'; } Solver::~Solver() diff --git a/cxxfem/tests/beam3d.py b/cxxfem/tests/beam3d.py index d6de2a7..6e8f6f1 100644 --- a/cxxfem/tests/beam3d.py +++ b/cxxfem/tests/beam3d.py @@ -9,25 +9,25 @@ fem.debug_level(0) if __name__ == "__main__": # fine mesh - # pars = { - # "Lx": 5.0, # width - # "Ly": 1.0, # depth - # "Lz": 1.0, # height/thickness - # "nx": 60, - # "ny": 30, - # "nz": 30 - # } - - # same as python pars = { "Lx": 5.0, # width "Ly": 1.0, # depth "Lz": 1.0, # height/thickness - "nx": 15, - "ny": 2, - "nz": 10 + "nx": 60, + "ny": 30, + "nz": 30 } + # same as python + # pars = { + # "Lx": 5.0, # width + # "Ly": 1.0, # depth + # "Lz": 1.0, # height/thickness + # "nx": 15, + # "ny": 2, + # "nz": 10 + # } + # mono-element for debug # pars = { # "Lx": 5.0, # width diff --git a/cxxfem/utils.py b/cxxfem/utils.py index c3ab0dd..00a2ae1 100644 --- a/cxxfem/utils.py +++ b/cxxfem/utils.py @@ -37,13 +37,16 @@ def parseargs(): """ parses command line arguments """ + import os import argparse parser = argparse.ArgumentParser() - parser.add_argument( - "-v", "--verb", help="increase output verbosity", action="count", default=0) + # parser.add_argument( + # "-v", "--verb", help="increase output verbosity", action="count", default=0) parser.add_argument( "--nogui", help="disable any graphical output", action="store_true") - parser.add_argument("-k", help="nb of threads", type=int, default=1) - parser.add_argument('file', help='python files') + parser.add_argument( + "--post", help="display existing results", action="store_true") + parser.add_argument("-k", help="nb of threads", type=int, default=os.cpu_count()) + parser.add_argument('file', help='python file', type=str, nargs='?') args = parser.parse_args() return args diff --git a/fossil.png b/fossil.png new file mode 100644 index 0000000000000000000000000000000000000000..768b48306290e3d19f175a79776389b746d82c97 GIT binary patch literal 27689 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 DjbE}Q literal 0 HcmV?d00001 diff --git a/fossils.py b/fossils.py index 3b0546f..dda22a3 100644 --- a/fossils.py +++ b/fossils.py @@ -2,9 +2,8 @@ # -*- coding: utf-8 -*- # runs a test as if it was installed -import os -import platform - +# import os +# import platform # if 'Windows' in platform.uname(): # # remove tbb from the PATH # # otherwise: "Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll" @@ -14,6 +13,56 @@ import platform # for p in corr_path: # print(p) +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from ui_fossils import Ui_Form + +class Window(QWidget, Ui_Form): + """Minimal GUI asking for a file and running it + """ + def __init__(self, parent=None): + super(Window, self).__init__(parent) + self.setupUi(self) + + # read Qt settings for the application + settings = QSettings() + # self.restoreGeometry(settings.value("Geometry", self.saveGeometry())) + self.inpFileLineEdit.setText(settings.value("inpFile", "")) + + self.action = 'cancelled' + + iconfile = os.path.join('fossil.png') + self.setWindowIcon(QIcon(iconfile)) + + def on_runPushButton_pressed(self): + # print("runPushButton...") + self.action = 'run' + self.close() + + def on_viewPushButton_pressed(self): + # print("viewPushButton...") + self.action = 'post' + self.close() + + def on_inpFilePushButton_pressed(self): + # print("inpFilePushButton...") + fname = QFileDialog.getOpenFileName( + None, 'Select input file', '', filter='Python File (*.py)') + # print(fname) + pyfile = fname[0] + if pyfile: + self.inpFileLineEdit.setText(QDir.toNativeSeparators(pyfile)) + + def closeEvent(self, event): + """save settings to registry and quit + """ + settings = QSettings() + # settings.setValue("Geometry", QVariant(self.saveGeometry())) + settings.setValue("inpfile", QVariant(self.inpFileLineEdit.text())) + event.accept() + + if __name__ == "__main__": import sys @@ -39,6 +88,18 @@ if __name__ == "__main__": args = cxxfem.parseargs() # set number of threads from the "-k" argument os.environ['OMP_NUM_THREADS'] = str(args.k) + cxxfem.set_num_threads(args.k) + + # try: + # ncpus1 = int(os.environ['NUMBER_OF_PROCESSORS']) + # print(f'{ncpus1} CPUs detected') + # import multiprocessing + # ncpus2 = multiprocessing.cpu_count() + # print(f'{ncpus2} CPUs detected') + # ncpus3 = os.cpu_count() + # print(f'{ncpus3} CPUs detected') + # except: + # pass # display env variables try: @@ -46,22 +107,41 @@ if __name__ == "__main__": except: print(f"OMP_NUM_THREADS=[not set]") - # run test file - testname = os.path.abspath(args.file) - testname = os.path.normcase(testname) # F:/ => f:/ on Windows - # create workspace - common = os.path.commonprefix((testname, thisdir + os.sep)) - resdir = testname[len(common):].replace(os.sep, "_") - resdir, ext = os.path.splitext(resdir) - wdir = os.path.join('workspace', resdir) - print('workspace=', wdir) - if not os.path.isdir(wdir): - os.makedirs(wdir) - os.chdir(wdir) - - tee = cxxfem.Tee('stdout.txt') # split streams - - if ext == '.py': - # run python script - __file__ = testname - exec(open(testname, encoding='utf-8').read()) + + # ask for a file if not given + if not args.file: + app = QApplication(sys.argv) + app.setOrganizationName("ULiege") + app.setApplicationName("fossils") + win = Window() + win.setWindowTitle("Fossils") + win.show() + app.lastWindowClosed.connect(app.quit) + app.exec_() + action = win.action + testname = win.inpFileLineEdit.text() + else: + action = 'run' + testname = os.path.abspath(args.file) + + print(f'action={action}') + if action=='run': + testname = os.path.normcase(testname) # F:/ => f:/ on Windows + print(f'testname = {testname}') + + # create workspace + common = os.path.commonprefix((testname, thisdir + os.sep)) + resdir = testname[len(common):].replace(os.sep, "_") + resdir, ext = os.path.splitext(resdir) + wdir = os.path.join('workspace', resdir) + print('workspace=', wdir) + if not os.path.isdir(wdir): + os.makedirs(wdir) + os.chdir(wdir) + + tee = cxxfem.Tee('stdout.txt') # split streams + + if ext == '.py': + # run python script + __file__ = testname + exec(open(testname, encoding='utf-8').read()) diff --git a/fossils.ui b/fossils.ui new file mode 100644 index 0000000..6d8ab5a --- /dev/null +++ b/fossils.ui @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>546</width> + <height>104</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="inpFilelabel"> + <property name="text"> + <string>input file</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="inpFileLineEdit"/> + </item> + <item> + <widget class="QPushButton" name="inpFilePushButton"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="runPushButton"> + <property name="text"> + <string>Run</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="viewPushButton"> + <property name="text"> + <string>View</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/gen_ui.py b/gen_ui.py new file mode 100644 index 0000000..4f71975 --- /dev/null +++ b/gen_ui.py @@ -0,0 +1,65 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Execute "pyuic". +# Ask for the location of it if not found. +# Store result in QSettings + +import sys +import subprocess +import os +import platform +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +def tryEXE(exe): + try: + print("dry run of '%s'..." % exe, end=' ') + with open(os.devnull, 'w') as FNULL: + subprocess.call([exe], stdout=FNULL, stderr=subprocess.STDOUT) + print("OK!") + return exe + except OSError: + print("failure!") + return "" + +def askUser(): + app = QApplication(sys.argv) + ext = '.*' if 'Windows' in platform.uname() else '' + fname = QFileDialog.getOpenFileName( + None, 'Select pyuic5', '', filter='Executable (pyuic5%s)' % ext) + exe = fname[0] + if not exe: + print('cancelled by user') + sys.exit(1) + print("user selected '%s'" % exe) + return exe + +if __name__ == "__main__": + + exe = 'pyuic5' + if tryEXE(exe): # try exe + pass + else: + # read settings + settings = QSettings("rboman", "progs") + #settings.remove("pyuic5") # clear stored value + exe = settings.value("pyuic5", "") + print("using value stored in settings: '%s'" % exe) + + if exe and tryEXE(exe): + pass + else: + exe = askUser() + if tryEXE(exe): + settings = QSettings("rboman", "progs") + settings.setValue("pyuic5", QVariant(exe)) + else: + raise Exception("'%s' does not work!" % exe) + + # run cmd + cmd = [exe, 'fossils.ui', '-o', 'ui_fossils.py'] + print("=> running", ' '.join(cmd)) + iop = subprocess.call(cmd) + print('iop =', iop) diff --git a/ui_fossils.py b/ui_fossils.py new file mode 100644 index 0000000..8df8ef6 --- /dev/null +++ b/ui_fossils.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'fossils.ui' +# +# Created by: PyQt5 UI code generator 5.15.2 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(546, 104) + self.verticalLayout = QtWidgets.QVBoxLayout(Form) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.inpFilelabel = QtWidgets.QLabel(Form) + self.inpFilelabel.setObjectName("inpFilelabel") + self.horizontalLayout.addWidget(self.inpFilelabel) + self.inpFileLineEdit = QtWidgets.QLineEdit(Form) + self.inpFileLineEdit.setObjectName("inpFileLineEdit") + self.horizontalLayout.addWidget(self.inpFileLineEdit) + self.inpFilePushButton = QtWidgets.QPushButton(Form) + self.inpFilePushButton.setObjectName("inpFilePushButton") + self.horizontalLayout.addWidget(self.inpFilePushButton) + self.verticalLayout.addLayout(self.horizontalLayout) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_2.addItem(spacerItem) + self.runPushButton = QtWidgets.QPushButton(Form) + self.runPushButton.setObjectName("runPushButton") + self.horizontalLayout_2.addWidget(self.runPushButton) + self.viewPushButton = QtWidgets.QPushButton(Form) + self.viewPushButton.setObjectName("viewPushButton") + self.horizontalLayout_2.addWidget(self.viewPushButton) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_2.addItem(spacerItem1) + self.verticalLayout.addLayout(self.horizontalLayout_2) + + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + self.inpFilelabel.setText(_translate("Form", "input file")) + self.inpFilePushButton.setText(_translate("Form", "...")) + self.runPushButton.setText(_translate("Form", "Run")) + self.viewPushButton.setText(_translate("Form", "View")) -- GitLab