From 28f7674e42ca08674c15e6d8db550aa42d358d58 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 15 Jun 2019 14:47:46 -0500 Subject: [PATCH 1/9] Adding overlap check box --- plotgui.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plotgui.py b/plotgui.py index bb57ce6..23cd82c 100644 --- a/plotgui.py +++ b/plotgui.py @@ -498,6 +498,9 @@ def __init__(self, model, FM, parent=None): self.createOptionsBox() self.createResolutionBox() + + + # Create submit button self.applyButton = QPushButton("Apply Changes") # Mac bug fix @@ -610,6 +613,10 @@ def createOptionsBox(self): self.colorOptionsButton.setMinimumHeight(self.FM.height() * 1.6) self.colorOptionsButton.clicked.connect(self.mw.showColorDialog) + # Overlap plotting + self.overlapCheck = QCheckBox('', self) +# self.overlapCheck.stateChanged.connect(lambda: pass) + # Options Form Layout self.opLayout = QFormLayout() self.opLayout.addRow('Width:', self.widthBox) @@ -617,6 +624,7 @@ def createOptionsBox(self): self.opLayout.addRow('Basis:', self.basisBox) self.opLayout.addRow('Color By:', self.colorbyBox) self.opLayout.addRow('Plot alpha:', self.plotAlphaBox) + self.opLayout.addRow('Show Overlaps', self.overlapCheck) self.opLayout.addRow(self.colorOptionsButton) self.opLayout.setLabelAlignment(QtCore.Qt.AlignLeft) self.opLayout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) From a2935fa5395d9b7ed9e7dcdeb0ff512f7ef181a2 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 16 Jun 2019 23:07:06 -0500 Subject: [PATCH 2/9] Overlaps working. Need to add color. --- openmc-plotter | 6 ++++++ plotgui.py | 21 +++++++++++++++------ plotmodel.py | 6 ++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/openmc-plotter b/openmc-plotter index 75a37b9..5c463fd 100755 --- a/openmc-plotter +++ b/openmc-plotter @@ -512,6 +512,12 @@ class MainWindow(QMainWindow): if apply: self.applyChanges() + def toggleOverlaps(self, state, apply=False): + self.model.activeView.color_overlaps = bool(state) + self.colorDialog.updateOverlap() + if apply: + self.applyChanges() + def editColorMap(self, colormap_name, property_type, apply=False): self.model.activeView.colormaps[property_type] = colormap_name self.plotIm.updateColorMap(colormap_name, property_type) diff --git a/plotgui.py b/plotgui.py index 23cd82c..4804e31 100644 --- a/plotgui.py +++ b/plotgui.py @@ -613,10 +613,6 @@ def createOptionsBox(self): self.colorOptionsButton.setMinimumHeight(self.FM.height() * 1.6) self.colorOptionsButton.clicked.connect(self.mw.showColorDialog) - # Overlap plotting - self.overlapCheck = QCheckBox('', self) -# self.overlapCheck.stateChanged.connect(lambda: pass) - # Options Form Layout self.opLayout = QFormLayout() self.opLayout.addRow('Width:', self.widthBox) @@ -624,7 +620,6 @@ def createOptionsBox(self): self.opLayout.addRow('Basis:', self.basisBox) self.opLayout.addRow('Color By:', self.colorbyBox) self.opLayout.addRow('Plot alpha:', self.plotAlphaBox) - self.opLayout.addRow('Show Overlaps', self.overlapCheck) self.opLayout.addRow(self.colorOptionsButton) self.opLayout.setLabelAlignment(QtCore.Qt.AlignLeft) self.opLayout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) @@ -820,6 +815,11 @@ def createGeneralTab(self): self.colorbyBox.addItem("temperature") self.colorbyBox.addItem("density") + # Overlap plotting + self.overlapCheck = QCheckBox('', self) + overlap_connector = partial(self.mw.toggleOverlaps) + self.overlapCheck.stateChanged.connect(overlap_connector) + self.colorbyBox.currentTextChanged[str].connect(self.mw.editColorBy) formLayout = QFormLayout() @@ -837,6 +837,7 @@ def createGeneralTab(self): formLayout.addRow(HorizontalLine()) formLayout.addRow('Background Color: ', self.bgButton) formLayout.addRow('Color Plot By:', self.colorbyBox) + formLayout.addRow('Show Overlaps', self.overlapCheck) generalLayout = QHBoxLayout() innerWidget = QWidget() @@ -1050,8 +1051,16 @@ def updateBackgroundColor(self): self.bgButton.setStyleSheet("border-radius: 8px;" "background-color: rgb%s" % (str(color))) + def updateOverlap(self): + colorby = self.model.activeView.colorby + overlap_val = self.model.activeView.color_overlaps + if colorby in ('cell', 'material'): + self.overlapCheck.setChecked(overlap_val) + def updateColorBy(self): - self.colorbyBox.setCurrentText(self.model.activeView.colorby) + colorby = self.model.activeView.colorby + self.colorbyBox.setCurrentText(colorby) + self.overlapCheck.setEnabled(colorby in ("cell", "material")) def updateDomainTabs(self): self.cellTable.setModel(self.mw.cellsModel) diff --git a/plotmodel.py b/plotmodel.py index 8e74901..1484028 100644 --- a/plotmodel.py +++ b/plotmodel.py @@ -21,6 +21,7 @@ _VOID_REGION = -1 _NOT_FOUND = -2 +_OVERLAP = -3 _MODEL_PROPERTIES = ('temperature', 'density') _PROPERTY_INDICES = {'temperature': 0, 'density': 1} @@ -130,6 +131,9 @@ def makePlot(self): cv = self.currentView = copy.deepcopy(self.activeView) ids = capi_plot.id_map(cv) + + + print("Creating property map") props = capi_plot.property_map(cv) # empty image data image = np.ones((cv.v_res, cv.h_res, 3), dtype=int) @@ -157,6 +161,8 @@ def makePlot(self): for id in unique_ids: if id == _NOT_FOUND: image[self.ids == id] = cv.plotBackground + elif id == _OVERLAP: + image[self.ids == id] = (255, 0, 0) else: image[self.ids == id] = domain[str(id)].color From c80027205c39d68935a5d22df7eba5ee8d23f967 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 17 Jun 2019 09:42:34 -0500 Subject: [PATCH 3/9] Making sure overlap checkbox is up-to-date based on last settings. Setting mouse-over appropriately for overlap regions. --- plotgui.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plotgui.py b/plotgui.py index 4804e31..378fb66 100644 --- a/plotgui.py +++ b/plotgui.py @@ -5,7 +5,7 @@ from plot_colors import rgb_normalize, invert_rgb from plotmodel import DomainDelegate -from plotmodel import _NOT_FOUND, _VOID_REGION, _MODEL_PROPERTIES +from plotmodel import _NOT_FOUND, _VOID_REGION, _OVERLAP, _MODEL_PROPERTIES from PySide2 import QtCore, QtGui from PySide2.QtWidgets import (QWidget, QPushButton, QHBoxLayout, QVBoxLayout, @@ -198,6 +198,8 @@ def mouseMoveEvent(self, event): if id == str(_VOID_REGION): domainInfo = ("VOID") + elif id == str(_OVERLAP): + domainInfo = ("OVERLAP") elif id != str(_NOT_FOUND) and domain[id].name: domainInfo = ("{} {}: \"{}\"\t Density: {} g/cc\t" "Temperature: {} K".format(domain_kind, @@ -993,6 +995,7 @@ def updateDialogValues(self): self.updateBackgroundColor() self.updateColorBy() self.updateDomainTabs() + self.updateOverlap() def updateMasking(self): masking = self.model.activeView.masking From d07561794e23993e36af10afee7a4bfc1df45603 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 17 Jun 2019 10:16:05 -0500 Subject: [PATCH 4/9] Integrating overlap coloring into the plotter menus. --- openmc-plotter | 22 ++++++++++++++++++++++ overlays.py | 1 + plotgui.py | 39 ++++++++++++++++++++++++++++++++------- plotmodel.py | 10 ++++++---- 4 files changed, 61 insertions(+), 11 deletions(-) diff --git a/openmc-plotter b/openmc-plotter index 5c463fd..a437f94 100755 --- a/openmc-plotter +++ b/openmc-plotter @@ -290,6 +290,16 @@ class MainWindow(QMainWindow): self.highlightingAct.toggled.connect(highlight_connector) self.editMenu.addAction(self.highlightingAct) + self.overlapAct = QAction('Enable Overlap Coloring', self) + self.overlapAct.setShortcut('Ctrl+P') + self.overlapAct.setCheckable(True) + self.overlapAct.setToolTip('Toggle overlapping regions') + self.overlapAct.setStatusTip('Toggle display of overlapping ' + 'regions when enabled') + overlap_connector = partial(self.toggleOverlaps, apply=True) + self.overlapAct.toggled.connect(overlap_connector) + self.editMenu.addAction(self.overlapAct) + # View Menu self.dockAction = QAction('Hide &Dock', self) self.dockAction.setShortcut("Ctrl+D") @@ -678,6 +688,18 @@ class MainWindow(QMainWindow): def editSeed(self, value): self.model.activeView.highlightSeed = value + def editOverlapColor(self, apply=False): + current_color = self.model.activeView.overlap_color + dlg = QColorDialog(self) + dlg.setCurrentColor(QtGui.QColor.fromRgb(*current_color)) + if dlg.exec_(): + new_color = dlg.currentColor().getRgb()[:3] + self.model.activeView.overlap_color = new_color + self.colorDialog.updateOverlapColor() + + if apply: + self.applyChanges() + def editBackgroundColor(self, apply=False): current_color = self.model.activeView.plotBackground dlg = QColorDialog(self) diff --git a/overlays.py b/overlays.py index b4e1864..e3199d6 100644 --- a/overlays.py +++ b/overlays.py @@ -27,6 +27,7 @@ class ShortcutsOverlay(QWidget): ("Zoom", "Shift+Scroll"), ("Toggle Masking", c_key + "+M"), ("Toggle Highlighting", c_key + "+L"), + ("Toggle Overlap Coloring", c_key + "+P"), ("Set XY Basis", "Alt+X"), ("Set YZ Basis", "Alt+Y"), ("Set XZ Basis", "Alt+Z"), diff --git a/plotgui.py b/plotgui.py index 378fb66..6757dab 100644 --- a/plotgui.py +++ b/plotgui.py @@ -287,7 +287,8 @@ def contextMenuEvent(self, event): self.menu.addAction(self.mw.redoAction) self.menu.addSeparator() - if id != str(_NOT_FOUND) and cv.colorby not in _MODEL_PROPERTIES: + if int(id) not in (_NOT_FOUND, _OVERLAP) and \ + cv.colorby not in _MODEL_PROPERTIES: # Domain ID if domain[id].name: @@ -334,11 +335,18 @@ def contextMenuEvent(self, event): if cv.colorby not in _MODEL_PROPERTIES: self.menu.addSeparator() - bgColorAction = self.menu.addAction('Edit Background Color...') - bgColorAction.setToolTip('Edit background color') - bgColorAction.setStatusTip('Edit plot background color') - connector = partial(self.mw.editBackgroundColor, apply=True) - bgColorAction.triggered.connect(connector) + if int(id) == _NOT_FOUND: + bgColorAction = self.menu.addAction('Edit Background Color...') + bgColorAction.setToolTip('Edit background color') + bgColorAction.setStatusTip('Edit plot background color') + connector = partial(self.mw.editBackgroundColor, apply=True) + bgColorAction.triggered.connect(connector) + elif int(id) == _OVERLAP: + olapColorAction = self.menu.addAction('Edit Overlap Color...') + olapColorAction.setToolTip('Edit overlap color') + olapColorAction.setStatusTip('Edit plot overlap color') + connector = partial(self.mw.editOverlapColor, apply=True) + olapColorAction.triggered.connect(connector) self.menu.addSeparator() self.menu.addAction(self.mw.saveImageAction) @@ -351,11 +359,13 @@ def contextMenuEvent(self, event): if domain_kind.lower() not in ('density', 'temperature'): self.menu.addAction(self.mw.maskingAction) self.menu.addAction(self.mw.highlightingAct) + self.menu.addAction(self.mw.overlapAct) self.menu.addSeparator() self.menu.addAction(self.mw.dockAction) self.mw.maskingAction.setChecked(cv.masking) self.mw.highlightingAct.setChecked(cv.highlighting) + self.mw.overlapAct.setChecked(cv.color_overlaps) if self.mw.dock.isVisible(): self.mw.dockAction.setText('Hide &Dock') @@ -822,6 +832,12 @@ def createGeneralTab(self): overlap_connector = partial(self.mw.toggleOverlaps) self.overlapCheck.stateChanged.connect(overlap_connector) + self.overlapColorButton = QPushButton() + self.overlapColorButton.setCursor(QtCore.Qt.PointingHandCursor) + self.overlapColorButton.setFixedWidth(self.FM.width("XXXXXXXXXX")) + self.overlapColorButton.setFixedHeight(self.FM.height() * 1.5) + self.overlapColorButton.clicked.connect(self.mw.editOverlapColor) + self.colorbyBox.currentTextChanged[str].connect(self.mw.editColorBy) formLayout = QFormLayout() @@ -838,8 +854,11 @@ def createGeneralTab(self): formLayout.addRow('Highlight Seed:', self.seedBox) formLayout.addRow(HorizontalLine()) formLayout.addRow('Background Color: ', self.bgButton) - formLayout.addRow('Color Plot By:', self.colorbyBox) + formLayout.addRow(HorizontalLine()) formLayout.addRow('Show Overlaps', self.overlapCheck) + formLayout.addRow('OVerlap Color', self.overlapColorButton) + formLayout.addRow(HorizontalLine()) + formLayout.addRow('Color Plot By:', self.colorbyBox) generalLayout = QHBoxLayout() innerWidget = QWidget() @@ -996,6 +1015,7 @@ def updateDialogValues(self): self.updateColorBy() self.updateDomainTabs() self.updateOverlap() + self.updateOverlapColor() def updateMasking(self): masking = self.model.activeView.masking @@ -1054,6 +1074,11 @@ def updateBackgroundColor(self): self.bgButton.setStyleSheet("border-radius: 8px;" "background-color: rgb%s" % (str(color))) + def updateOverlapColor(self): + color = self.model.activeView.overlap_color + self.overlapColorButton.setStyleSheet("border-radius: 8px;" + "background-color: rgb%s" % (str(color))) + def updateOverlap(self): colorby = self.model.activeView.colorby overlap_val = self.model.activeView.color_overlaps diff --git a/plotmodel.py b/plotmodel.py index 1484028..70fc4a9 100644 --- a/plotmodel.py +++ b/plotmodel.py @@ -131,9 +131,6 @@ def makePlot(self): cv = self.currentView = copy.deepcopy(self.activeView) ids = capi_plot.id_map(cv) - - - print("Creating property map") props = capi_plot.property_map(cv) # empty image data image = np.ones((cv.v_res, cv.h_res, 3), dtype=int) @@ -162,7 +159,7 @@ def makePlot(self): if id == _NOT_FOUND: image[self.ids == id] = cv.plotBackground elif id == _OVERLAP: - image[self.ids == id] = (255, 0, 0) + image[self.ids == id] = cv.overlap_color else: image[self.ids == id] = domain[str(id)].color @@ -259,6 +256,10 @@ class PlotView(_PlotBase): is active plotBackground : 3-tuple of int RGB color to apply to plot background + color_overlaps : bool + Indicator of whether or not overlaps will be shown + overlap_color : 3-tuple of int + RGB color to apply for cell overlap regions cells : Dict of DomainView instances Dictionary of cell view settings by ID materials : Dict of DomainView instances @@ -291,6 +292,7 @@ def __init__(self, origin, width, height): self.highlightAlpha = 0.5 self.highlightSeed = 1 self.plotBackground = (50, 50, 50) + self.overlap_color = (255, 0 , 0) self.plotAlpha = 1.0 From 0adc7a81218fdba2cb6e3ca0c57e86905151f3ed Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 17 Jun 2019 10:23:40 -0500 Subject: [PATCH 5/9] Cleaning up plot menus/actions a bit. --- openmc-plotter | 2 -- plotgui.py | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/openmc-plotter b/openmc-plotter index a437f94..fe06d4e 100755 --- a/openmc-plotter +++ b/openmc-plotter @@ -450,8 +450,6 @@ class MainWindow(QMainWindow): message = 'Error loading plot settings. Incompatible model.' self.statusBar().showMessage(message, 5000) - return super().event(event) - def applyChanges(self): if self.model.activeView != self.model.currentView: self.statusBar().showMessage('Generating Plot...') diff --git a/plotgui.py b/plotgui.py index 6757dab..9dc74c5 100644 --- a/plotgui.py +++ b/plotgui.py @@ -855,8 +855,8 @@ def createGeneralTab(self): formLayout.addRow(HorizontalLine()) formLayout.addRow('Background Color: ', self.bgButton) formLayout.addRow(HorizontalLine()) - formLayout.addRow('Show Overlaps', self.overlapCheck) - formLayout.addRow('OVerlap Color', self.overlapColorButton) + formLayout.addRow('Show Overlaps:', self.overlapCheck) + formLayout.addRow('OVerlap Color:', self.overlapColorButton) formLayout.addRow(HorizontalLine()) formLayout.addRow('Color Plot By:', self.colorbyBox) From 118038a4f625788e3de4862b07e60d628e00099f Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 17 Jun 2019 11:19:33 -0500 Subject: [PATCH 6/9] Adding notes about overlap coloring to the README. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 6981bdb..6f4d47e 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ Press `?` to view a variety of keyboard shortcuts. - Edit→Color By→Material : Change plot settings to be colored by material, apply changes, and reload plot. - Edit→Enable Masking : Enable/Disable masking, apply changes, and reload plot. - Edit→Enable Highlighting : Enable/Disable highlighting, apply changes, and reload plot. + - Edit→Enable Overlap Coloring : Enable/Disable display of geometry overlaps, apply changes, and reload plot. - View→Hide[Show] Dock : Hide/Show Dock. - View→Zoom... : Open dialog to input new zoom value. @@ -92,6 +93,8 @@ Press `?` to view a variety of keyboard shortcuts. - Edit Background Color... : Select a new color for plot background, apply changes, and reload plot image. See menu bar for other context menu options. + - Right-Click on plot overlap region → activate context menu: + - Edit Overlap Color... : Select a new color for overlap regions, apply changes, and reload plot image. - Right-click on plot cell/material : Activate context menu: - Displays cell/material ID and name (if defined). @@ -99,6 +102,7 @@ Press `?` to view a variety of keyboard shortcuts. - Mask Cell/Material : Mask/Unmask selected cell/material, apply changes, and reload plot image. - Highlight Cell/Material : Highlight/Unhighlight selected cell/material, apply changes, and reload plot image. + See menu bar for other context menu options. ## Color Options Dialog @@ -113,6 +117,8 @@ Press `?` to view a variety of keyboard shortcuts. - Highlight Alpha : Set alpha transparency level of non-highlighted color overlay. - Highlight Seed : Select seed for randomized colorization of cells/materials when highlighting is enabled. - Background Color : Select color of plot background for active plot. + - Show Overlaps : Display overlap regions on the plot. + - Overlap Color : Customize the displayed color of overlap regions. - Color Plot By : Select how the active plot is to be colored. ### Cells/Materials Tabs: From 4088aeb27205f37ad7a8df865d28edc849474a01 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 17 Jun 2019 11:22:01 -0500 Subject: [PATCH 7/9] Removing some whitespace. --- plotgui.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plotgui.py b/plotgui.py index 9dc74c5..f24f121 100644 --- a/plotgui.py +++ b/plotgui.py @@ -510,9 +510,6 @@ def __init__(self, model, FM, parent=None): self.createOptionsBox() self.createResolutionBox() - - - # Create submit button self.applyButton = QPushButton("Apply Changes") # Mac bug fix From b04451729c3821abd6df323f2e904c77b6b7e691 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 17 Jun 2019 14:24:51 -0500 Subject: [PATCH 8/9] Ignore plot_settings file if it is out of date. --- openmc-plotter | 8 ++++++++ plotmodel.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/openmc-plotter b/openmc-plotter index fe06d4e..7f2a4e6 100755 --- a/openmc-plotter +++ b/openmc-plotter @@ -794,6 +794,14 @@ class MainWindow(QMainWindow): with open('plot_settings.pkl', 'rb') as file: model = pickle.load(file) + # do not replace model if the version is out of date + if model.version != self.model.version: + print("WARNING: previous plot settings are for a different " + "version of the GUI. They will be ignored.") + wrn_msg = "Existing version: {}, Current GUI version: {}" + print(wrn_msg.format(model.version, self.model.version)) + return + self.model.currentView = model.currentView self.model.activeView = copy.deepcopy(model.currentView) self.model.previousViews = model.previousViews diff --git a/plotmodel.py b/plotmodel.py index 70fc4a9..7a9ea3c 100644 --- a/plotmodel.py +++ b/plotmodel.py @@ -17,7 +17,7 @@ ID, NAME, COLOR, COLORLABEL, MASK, HIGHLIGHT = tuple(range(0, 6)) -__VERSION__ = "0.1.0" +__VERSION__ = "0.1.1" _VOID_REGION = -1 _NOT_FOUND = -2 From d7969cc063ae23c6b1e2eec430ff53e3bde980f5 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 17 Jun 2019 14:34:56 -0500 Subject: [PATCH 9/9] Formatting update at suggestion of @paulromano. --- plotmodel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotmodel.py b/plotmodel.py index 7a9ea3c..4ac1476 100644 --- a/plotmodel.py +++ b/plotmodel.py @@ -292,7 +292,7 @@ def __init__(self, origin, width, height): self.highlightAlpha = 0.5 self.highlightSeed = 1 self.plotBackground = (50, 50, 50) - self.overlap_color = (255, 0 , 0) + self.overlap_color = (255, 0, 0) self.plotAlpha = 1.0