Skip to content

Commit 593c23f

Browse files
authored
Merge pull request #42 from pshriwise/package_and_test
Packaging and test framework
2 parents 374f38d + 84d1a7e commit 593c23f

22 files changed

Lines changed: 224 additions & 84 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
*~
22
__pycache__
3+
plot_settings.pkl

openmc_plotter/__init__.py

Whitespace-only changes.

openmc_plotter/__main__.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#!/usr/bin/env python3
2+
3+
from pathlib import Path
4+
from threading import Thread
5+
import signal
6+
import sys
7+
8+
from PySide2 import QtCore, QtGui
9+
from PySide2.QtWidgets import QApplication, QSplashScreen
10+
11+
from .main_window import MainWindow, _openmcReload
12+
13+
def main():
14+
path_icon = str(Path(__file__).parent.parent / 'assets/openmc_logo.png')
15+
path_splash = str(Path(__file__).parent.parent / 'assets/splash.png')
16+
17+
app = QApplication(sys.argv)
18+
app.setOrganizationName("OpenMC")
19+
app.setOrganizationDomain("openmc.org")
20+
app.setApplicationName("OpenMC Plot Explorer")
21+
app.setWindowIcon(QtGui.QIcon(path_icon))
22+
app.setAttribute(QtCore.Qt.AA_DontShowIconsInMenus, True)
23+
24+
splash_pix = QtGui.QPixmap(path_splash)
25+
splash = QSplashScreen(splash_pix, QtCore.Qt.WindowStaysOnTopHint)
26+
splash.setMask(splash_pix.mask())
27+
splash.show()
28+
app.processEvents()
29+
splash.setMask(splash_pix.mask())
30+
splash.showMessage("Loading Model...",
31+
QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
32+
app.processEvents()
33+
# load OpenMC model on another thread
34+
loader_thread = Thread(target=_openmcReload)
35+
loader_thread.start()
36+
# while thread is working, process app events
37+
while loader_thread.is_alive():
38+
app.processEvents()
39+
40+
splash.clearMessage()
41+
splash.showMessage("Starting GUI...",
42+
QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
43+
app.processEvents()
44+
45+
font_metric = QtGui.QFontMetrics(app.font())
46+
screen_size = app.primaryScreen().size()
47+
mainWindow = MainWindow(font_metric, screen_size)
48+
# connect splashscreen to main window, close when main window opens
49+
mainWindow.loadGui()
50+
mainWindow.show()
51+
splash.close()
52+
53+
# connect interrupt signal to close call
54+
signal.signal(signal.SIGINT, lambda *args: mainWindow.close())
55+
# create timer that interrupts the Qt event loop
56+
# to check for a signal
57+
timer = QtCore.QTimer()
58+
timer.start(500)
59+
timer.timeout.connect(lambda: None)
60+
61+
sys.exit(app.exec_())
62+
63+
if __name__ == '__main__':
64+
main()

docks.py renamed to openmc_plotter/docks.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
import numpy as np
1313
import openmc
1414

15-
from custom_widgets import HorizontalLine, Expander
16-
from scientific_spin_box import ScientificDoubleSpinBox
17-
from plotmodel import (_SCORE_UNITS, _TALLY_VALUES,
18-
_REACTION_UNITS, _SPATIAL_FILTERS)
15+
from .custom_widgets import HorizontalLine, Expander
16+
from .scientific_spin_box import ScientificDoubleSpinBox
17+
from .plotmodel import (_SCORE_UNITS, _TALLY_VALUES,
18+
_REACTION_UNITS, _SPATIAL_FILTERS)
1919

2020

2121
class PlotterDock(QDockWidget):
Lines changed: 17 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
1-
#!/usr/bin/env python3
2-
31
import copy
42
from functools import partial
53
import os
6-
from pathlib import Path
74
import pickle
8-
import signal
9-
import sys
105
from threading import Thread
116

127
from PySide2 import QtCore, QtGui
138
from PySide2.QtGui import QKeyEvent
149
from PySide2.QtWidgets import (QApplication, QLabel, QSizePolicy, QMainWindow,
15-
QScrollArea, QMessageBox, QAction,
16-
QFileDialog, QColorDialog, QInputDialog,
17-
QSplashScreen, QWidget, QGestureEvent)
10+
QScrollArea, QMessageBox, QAction, QFileDialog,
11+
QColorDialog, QInputDialog, QWidget,
12+
QGestureEvent)
13+
1814
import openmc
1915
import openmc.lib
2016

@@ -24,11 +20,11 @@
2420
except ImportError:
2521
_HAVE_VTK = False
2622

27-
from plotmodel import PlotModel, DomainTableModel
28-
from plotgui import PlotImage, ColorDialog
29-
from docks import DomainDock, TallyDock
30-
from overlays import ShortcutsOverlay
31-
from tools import ExportDataDialog
23+
from .plotmodel import PlotModel, DomainTableModel
24+
from .plotgui import PlotImage, ColorDialog
25+
from .docks import DomainDock, TallyDock
26+
from .overlays import ShortcutsOverlay
27+
from .tools import ExportDataDialog
3228

3329

3430
def _openmcReload():
@@ -41,9 +37,11 @@ def _openmcReload():
4137

4238

4339
class MainWindow(QMainWindow):
44-
def __init__(self):
40+
def __init__(self, font=QtGui.QFontMetrics(QtGui.QFont()), screen_size=QtCore.QSize()):
4541
super().__init__()
4642

43+
self.screen = screen_size
44+
self.font_metric = font
4745
self.setWindowTitle('OpenMC Plot Explorer')
4846

4947
def loadGui(self):
@@ -68,24 +66,23 @@ def loadGui(self):
6866
self.plotIm = PlotImage(self.model, self.frame, self)
6967
self.frame.setWidget(self.plotIm)
7068

71-
font_metric = QtGui.QFontMetricsF(app.font())
7269
# Dock
73-
self.dock = DomainDock(self.model, font_metric, self)
70+
self.dock = DomainDock(self.model, self.font_metric, self)
7471
self.dock.setObjectName("Domain Options Dock")
7572
self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dock)
7673

7774
# Tally Dock
78-
self.tallyDock = TallyDock(self.model, font_metric, self)
75+
self.tallyDock = TallyDock(self.model, self.font_metric, self)
7976
self.tallyDock.update()
8077
self.tallyDock.setObjectName("Tally Options Dock")
8178
self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.tallyDock)
8279

8380
# Color DialogtallyDock
84-
self.colorDialog = ColorDialog(self.model, font_metric, self)
81+
self.colorDialog = ColorDialog(self.model, self.font_metric, self)
8582
self.colorDialog.hide()
8683

8784
# Tools
88-
self.exportDataDialog = ExportDataDialog(self.model, font_metric, self)
85+
self.exportDataDialog = ExportDataDialog(self.model, self.font_metric, self)
8986

9087
# Restore Window Settings
9188
self.restoreWindowSettings()
@@ -436,7 +433,6 @@ def updateWindowMenu(self):
436433
self.mainWindowAction.setChecked(self.isActiveWindow())
437434

438435
# Menu and shared methods
439-
440436
def loadModel(self, reload=False):
441437
if reload:
442438
self.resetModels()
@@ -455,7 +451,7 @@ def loadModel(self, reload=False):
455451
loader_thread.start()
456452
while loader_thread.is_alive():
457453
self.statusBar().showMessage("Reloading model...")
458-
app.processEvents()
454+
QApplication.processEvents()
459455

460456
self.plotIm.model = self.model
461457
self.applyChanges()
@@ -1088,7 +1084,6 @@ def updateRelativeBases(self):
10881084
self.zBasis = 3 - (self.xBasis + self.yBasis)
10891085

10901086
def adjustWindow(self):
1091-
self.screen = app.primaryScreen().size()
10921087
self.setMaximumSize(self.screen.width(), self.screen.height())
10931088

10941089
def onRatioChange(self):
@@ -1158,52 +1153,3 @@ def saveSettings(self):
11581153
def exportTallyData(self):
11591154
# show export tool dialog
11601155
self.showExportDialog()
1161-
1162-
if __name__ == '__main__':
1163-
1164-
path_icon = str(Path(__file__).parent / 'assets/openmc_logo.png')
1165-
path_splash = str(Path(__file__).parent / 'assets/splash.png')
1166-
1167-
app = QApplication(sys.argv)
1168-
app.setOrganizationName("OpenMC")
1169-
app.setOrganizationDomain("openmc.org")
1170-
app.setApplicationName("OpenMC Plot Explorer")
1171-
app.setWindowIcon(QtGui.QIcon(path_icon))
1172-
app.setAttribute(QtCore.Qt.AA_DontShowIconsInMenus, True)
1173-
1174-
splash_pix = QtGui.QPixmap(path_splash)
1175-
splash = QSplashScreen(splash_pix, QtCore.Qt.WindowStaysOnTopHint)
1176-
splash.setMask(splash_pix.mask())
1177-
splash.show()
1178-
app.processEvents()
1179-
splash.setMask(splash_pix.mask())
1180-
splash.showMessage("Loading Model...",
1181-
QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
1182-
app.processEvents()
1183-
# load OpenMC model on another thread
1184-
loader_thread = Thread(target=_openmcReload)
1185-
loader_thread.start()
1186-
# while thread is working, process app events
1187-
while loader_thread.is_alive():
1188-
app.processEvents()
1189-
1190-
splash.clearMessage()
1191-
splash.showMessage("Starting GUI...",
1192-
QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
1193-
app.processEvents()
1194-
1195-
mainWindow = MainWindow()
1196-
# connect splashscreen to main window, close when main window opens
1197-
mainWindow.loadGui()
1198-
mainWindow.show()
1199-
splash.close()
1200-
1201-
# connect interrupt signal to close call
1202-
signal.signal(signal.SIGINT, lambda *args: mainWindow.close())
1203-
# create timer that interrupts the Qt event loop
1204-
# to check for a signal
1205-
timer = QtCore.QTimer()
1206-
timer.start(500)
1207-
timer.timeout.connect(lambda: None)
1208-
1209-
sys.exit(app.exec_())
File renamed without changes.

plotgui.py renamed to openmc_plotter/plotgui.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
from matplotlib.colors import SymLogNorm
1414
import numpy as np
1515

16-
from plot_colors import rgb_normalize, invert_rgb
17-
from plotmodel import DomainDelegate
18-
from plotmodel import _NOT_FOUND, _VOID_REGION, _OVERLAP, _MODEL_PROPERTIES
19-
from scientific_spin_box import ScientificDoubleSpinBox
20-
from custom_widgets import HorizontalLine
16+
from .plot_colors import rgb_normalize, invert_rgb
17+
from .plotmodel import DomainDelegate
18+
from .plotmodel import _NOT_FOUND, _VOID_REGION, _OVERLAP, _MODEL_PROPERTIES
19+
from .scientific_spin_box import ScientificDoubleSpinBox
20+
from .custom_widgets import HorizontalLine
2121

2222
if is_pyqt5():
2323
from matplotlib.backends.backend_qt5agg import FigureCanvas

plotmodel.py renamed to openmc_plotter/plotmodel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import openmc.lib
1212
import numpy as np
1313

14-
from statepointmodel import StatePointModel
15-
from plot_colors import random_rgb, reset_seed
14+
from .statepointmodel import StatePointModel
15+
from .plot_colors import random_rgb, reset_seed
1616

1717
ID, NAME, COLOR, COLORLABEL, MASK, HIGHLIGHT = tuple(range(0, 6))
1818

0 commit comments

Comments
 (0)