Skip to content

Commit

Permalink
enh: simplify preprocessing
Browse files Browse the repository at this point in the history
  • Loading branch information
paulmueller committed Aug 6, 2021
1 parent aca9bcb commit 7638b1b
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 171 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
0.9.5
- enh: restructure preprocessing tab and avoid situations where
preprocessing dependencies are not met
- setup: bump nanite from 2.0.0 to 2.0.1 (improved preprocessing)
0.9.4
- enh: only show exact sneddon model "sneddon_spher" in developer
mode to avoid confusion
Expand Down
100 changes: 55 additions & 45 deletions pyjibe/fd/tab_preprocess.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pkg_resources

import nanite.preproc as npreproc
from nanite.preproc import IndentationPreprocessor
from PyQt5 import uic, QtCore, QtWidgets


Expand All @@ -13,17 +13,22 @@ def __init__(self, *args, **kwargs):

# Setup everything necessary for the preprocessing tab:
# Get list of preprocessing methods
premem = npreproc.IndentationPreprocessor.available()
premem = IndentationPreprocessor.available()

for p in premem:
item = QtWidgets.QListWidgetItem()
item.setText(p)
self.list_preproc_available.addItem(item)

self.list_preproc_available.currentItemChanged.connect(
lambda: self.update_displayed_docstring("available"))
self.list_preproc_applied.currentItemChanged.connect(
lambda: self.update_displayed_docstring("applied"))
self._map_widgets_to_preproc_ids = {}
for pid in premem:
pwidget = QtWidgets.QCheckBox(
text=IndentationPreprocessor.get_name(pid),
parent=self)
meth = IndentationPreprocessor.get_func(pid)
pwidget.setToolTip(meth.__doc__)
self._map_widgets_to_preproc_ids[pwidget] = pid
self.layout_preproc_area.addWidget(pwidget)
pwidget.stateChanged.connect(self.check_selection)
spacer_item = QtWidgets.QSpacerItem(20, 0,
QtWidgets.QSizePolicy.Minimum,
QtWidgets.QSizePolicy.Expanding)
self.layout_preproc_area.addItem(spacer_item)

# Add recommended item (see `self.preproc_set_preset`)
self.cb_preproc_presel.addItem("Recommended")
Expand All @@ -33,51 +38,56 @@ def __init__(self, *args, **kwargs):
# Apply recommended defaults
self.cb_preproc_presel.setCurrentIndex(1)

@QtCore.pyqtSlot(int)
def check_selection(self, state):
"""If the user selects an item, make sure requirements are checked"""
sender = self.sender()
if sender in self._map_widgets_to_preproc_ids:
pid = self._map_widgets_to_preproc_ids[sender]
if state == 2:
# Enable all steps that this step here requires
req_stps = IndentationPreprocessor.get_require_steps(pid)
if req_stps:
for pwid in self._map_widgets_to_preproc_ids:
if self._map_widgets_to_preproc_ids[pwid] in req_stps:
pwid.setChecked(True)
if state == 0:
# Disable all steps that depend on this one
for dwid in self._map_widgets_to_preproc_ids:
did = self._map_widgets_to_preproc_ids[dwid]
req_stps = IndentationPreprocessor.get_require_steps(did)
if req_stps and pid in req_stps:
dwid.setChecked(False)

def fit_apply_preprocessing(self, fdist):
"""Apply the preprocessing steps if required"""
# Note: Preprocessing is cached once in `fdist`.
# Thus calling this method a second time without any
# change in the GUI is free.
num = self.list_preproc_applied.count()
preprocessing = []
for ii in range(num):
item = self.list_preproc_applied.item(ii)
preprocessing.append(item.text())
identifiers = []
for pwidget in self._map_widgets_to_preproc_ids:
pid = self._map_widgets_to_preproc_ids[pwidget]
if pwidget.isChecked():
identifiers.append(pid)
# Make sure the order is correct
identifiers = IndentationPreprocessor.autosort(identifiers)
# Perform preprocessing
fdist.apply_preprocessing(preprocessing)
fdist.apply_preprocessing(identifiers)

@QtCore.pyqtSlot()
def on_preset_changed(self):
"""Update preselection"""
text = self.cb_preproc_presel.currentText()
self.list_preproc_applied.clear()
if text == "None":
pass
used_methods = []
elif text == "Recommended":
recommended_methods = ["compute_tip_position",
"correct_force_offset",
"correct_tip_offset",
"correct_split_approach_retract"]
for m in recommended_methods:
item = QtWidgets.QListWidgetItem()
item.setText(m)
self.list_preproc_applied.addItem(item)

def update_displayed_docstring(self, source):
"""Update the description box with the method doc string
used_methods = ["compute_tip_position",
"correct_force_offset",
"correct_tip_offset",
"correct_split_approach_retract"]
else:
raise ValueError(f"Unknown text '{text}'!")

Writes text to `self.text_preprocessing` according to the
method selected in `self.list_preproc_available` or
`self.list_preproc_applied`.
"""
if source == "available":
thelist = self.list_preproc_available
elif source == "applied":
thelist = self.list_preproc_applied
item = thelist.currentItem()
if item is None:
return
method_name = item.text()
method = getattr(npreproc.IndentationPreprocessor, method_name)
doc = method.__doc__.replace(" ", "").strip()
self.text_preprocessing.setPlainText(doc)
for pwidget in self._map_widgets_to_preproc_ids:
pid = self._map_widgets_to_preproc_ids[pwidget]
pwidget.setChecked(pid in used_methods)
129 changes: 4 additions & 125 deletions pyjibe/fd/tab_preprocess.ui
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,6 @@
<property name="bottomMargin">
<number>7</number>
</property>
<item>
<widget class="QPushButton" name="btn_clear_preproc">
<property name="text">
<string>Clear Preprocessing</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<property name="sizeConstraint">
Expand Down Expand Up @@ -108,111 +101,14 @@
</layout>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Available (drag from here):</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="list_preproc_available">
<widget class="QWidget" name="widget_preproc_area" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>75</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>120</height>
</size>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>Description:</string>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="text_preprocessing">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>100</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>900</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="plainText">
<string>Click on a method above or below to view its description here.</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>Applied (drop here):</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="list_preproc_applied">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>75</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>120</height>
</size>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
<layout class="QVBoxLayout" name="layout_preproc_area"/>
</widget>
</item>
</layout>
Expand All @@ -222,22 +118,5 @@
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>btn_clear_preproc</sender>
<signal>clicked()</signal>
<receiver>list_preproc_applied</receiver>
<slot>clear()</slot>
<hints>
<hint type="sourcelabel">
<x>268</x>
<y>28</y>
</hint>
<hint type="destinationlabel">
<x>268</x>
<y>504</y>
</hint>
</hints>
</connection>
</connections>
<connections/>
</ui>
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
description=description,
long_description=open('README.rst').read() if exists('README.rst') else '',
install_requires=["afmformats>=0.16.0",
"nanite>=2.0.0",
"nanite>=2.0.1",
"matplotlib>=3", # NavigationToolbar2QT mod
"pyqt5"],
python_requires='>=3.6, <4',
Expand Down

0 comments on commit 7638b1b

Please sign in to comment.