42 Commits

Author SHA1 Message Date
d1c2632e81 Merge branch '302-wideline-discontinuous-x' into dev 2024-12-09 14:43:15 +01:00
e19795b51c wide-line spectra handle missing x values better 2024-12-09 12:28:38 +01:00
90084e3481 dev (#297)
All checks were successful
Build AppImage / Explore-Gitea-Actions (push) Successful in 2m35s
this time it will not break!

Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de>
Reviewed-on: #297
2024-11-14 17:20:31 +00:00
9c56171524 Merge branch 'master' into dev 2024-11-14 17:20:04 +00:00
6980df1599 import future for type hints 2024-11-14 18:06:06 +01:00
91b2594b90 Revert "dev (#295)"
All checks were successful
Build AppImage / Explore-Gitea-Actions (push) Successful in 2m17s
This reverts commit 7145f9e3cd.
2024-11-14 12:14:17 +01:00
7145f9e3cd dev (#295)
All checks were successful
Build AppImage / Explore-Gitea-Actions (push) Successful in 2m58s
Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de>
Reviewed-on: #295
2024-11-13 13:02:05 +00:00
f6b7ebec07 selecting x value as label for point selection should work 2024-10-22 18:54:44 +02:00
8d1ccd22fa change ptstab widgets 2024-10-21 19:52:23 +02:00
0b52fef549 additional parameter for weight factor for increase or decrease 2024-10-16 17:32:20 +02:00
b6b98d292a clicking outside axes no longer emits signal 2024-10-13 18:29:04 +02:00
d90959c6b6 fix typo 2024-10-13 17:28:59 +02:00
e459bd5e54 Merge branch 'master' into dev 2024-10-13 17:21:26 +02:00
4108deb69a run scripts
All checks were successful
Build AppImage / Explore-Gitea-Actions (push) Successful in 1m46s
run scripts

Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de>
Reviewed-on: #291
2024-09-29 17:21:40 +00:00
24f20f8850 Merge branch 'master' into dev 2024-09-29 17:21:14 +00:00
fc91bf83fe Merge branch 'script-editor' into dev 2024-09-29 19:19:15 +02:00
86f285fba5 randomize 2024-09-29 19:13:26 +02:00
fa84b0382e select type/generation and sorting enabled did not go well together 2024-09-29 16:03:13 +02:00
4b75aa9267 add disclaimer 2024-09-29 15:50:50 +02:00
f185b24967 fix problem with namespaces 2024-09-29 14:33:28 +02:00
d07b85ae27 mvp for script runner 2024-09-26 18:39:55 +02:00
7ad1e4b843 use of properties did not work properly 2024-09-25 18:09:10 +02:00
ff2ff01da7 update internal fit infos after function removal 2024-09-25 17:21:46 +02:00
d9f1c0b8c2 use correct attribute name 2024-09-25 17:20:20 +02:00
9039c44ce7 Merge remote-tracking branch 'origin/dev' into dev 2024-09-23 16:41:19 +02:00
ac6b734f81 only skip points if wanted 2024-09-23 16:38:28 +02:00
b2a3881fa8 dev (#285)
All checks were successful
Build AppImage / Explore-Gitea-Actions (push) Successful in 1m40s
Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de>
Reviewed-on: #285
2024-09-11 15:33:00 +00:00
9babb73f3a Merge branch 'master' into dev 2024-09-11 15:32:53 +00:00
4f0a7827ba Add standard deviation to averaging methods of pick points 2024-09-11 17:31:58 +02:00
1ab32af333 dev (#284)
Some checks failed
Build AppImage / Explore-Gitea-Actions (push) Has been cancelled
Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de>
Reviewed-on: #284
Co-authored-by: Dominik Demuth <dominik.demuth@pkm.tu-darmstadt.de>
Co-committed-by: Dominik Demuth <dominik.demuth@pkm.tu-darmstadt.de>
2024-09-07 17:25:01 +00:00
05862730a0 Merge branch 'gga_relaxation' into dev 2024-09-07 19:22:05 +02:00
7b61c1244d Merge branch 'master' into dev 2024-07-16 17:00:27 +00:00
e0c287d8a9 plot sub-functions; fixes #282 2024-07-16 18:58:31 +02:00
a8fcd658d9 set fit toolbar a name; fixes #281 2024-07-15 17:42:28 +02:00
dd471ae294 Merge branch 'refs/heads/267-cut-y-range' into dev 2024-06-24 17:55:48 +02:00
ab586ac39a Merge branch 'refs/heads/256-fc-persistence' into dev
# Conflicts:
#	src/gui_qt/main/mainwindow.py
2024-06-24 17:55:13 +02:00
b355aab99d Merge remote-tracking branch 'refs/remotes/origin/255-persisitence-interpolation-dialog' into dev 2024-06-24 17:54:24 +02:00
03cdc225ca add sinc function 2024-06-24 17:53:45 +02:00
e87c6bf2c1 retain settings in interpolation dialog 2024-05-27 18:05:43 +02:00
cc7572fe14 retain settings in FC reader dialog 2024-05-15 17:15:09 +02:00
ef66cf584a increase precision 2024-05-06 18:52:20 +02:00
f0448fac0f cut data at x and y 2024-05-06 18:46:27 +02:00
29 changed files with 942 additions and 600 deletions

View File

@ -360,7 +360,7 @@ class Ui_ascii_reader(object):
self.x_label.setText(_translate("ascii_reader", "x")) self.x_label.setText(_translate("ascii_reader", "x"))
self.dsdfsf.setText(_translate("ascii_reader", "Numerical value")) self.dsdfsf.setText(_translate("ascii_reader", "Numerical value"))
self.label_9.setText(_translate("ascii_reader", "Match index")) self.label_9.setText(_translate("ascii_reader", "Match index"))
self.regex_input.setToolTip(_translate("ascii_reader", "<html><head/><body><p>Token:<br/>[abc]: Matches any of a, b, or c<br/>[a-z]: Matches any digit in the range a-z<br/>\\d: Matches any digit in the range 0-9 (equal to [0-9}</p><p>Quantifiers:<br/>a*: 0 or more of a<br/>a*: 1 or more of a<br/>a?: 0 or 1 of a</p></body></html>")) self.regex_input.setToolTip(_translate("ascii_reader", "<html><head/><body><p>Token:<br/>[abc]: Matches any of a, b, or c<br/>[a-z]: Matches any digit in the range a-z<br/>\\d: Matches any digit in the range 0-9 (equal to [0-9}</p><p>Quantifiers:<br/>a*: 0 or more of a<br/>a+: 1 or more of a<br/>a?: 0 or 1 of a</p></body></html>"))
self.re_button.setText(_translate("ascii_reader", "Regex")) self.re_button.setText(_translate("ascii_reader", "Regex"))
self.custom_button.setText(_translate("ascii_reader", "Custom value")) self.custom_button.setText(_translate("ascii_reader", "Custom value"))
self.label_8.setText(_translate("ascii_reader", "Filename")) self.label_8.setText(_translate("ascii_reader", "Filename"))

View File

@ -372,6 +372,8 @@ class Ui_BaseWindow(object):
self.action_cut_xaxis.setObjectName("action_cut_xaxis") self.action_cut_xaxis.setObjectName("action_cut_xaxis")
self.action_cut_yaxis = QtWidgets.QAction(BaseWindow) self.action_cut_yaxis = QtWidgets.QAction(BaseWindow)
self.action_cut_yaxis.setObjectName("action_cut_yaxis") self.action_cut_yaxis.setObjectName("action_cut_yaxis")
self.actionUse_script = QtWidgets.QAction(BaseWindow)
self.actionUse_script.setObjectName("actionUse_script")
self.menuSave.addAction(self.actionSave) self.menuSave.addAction(self.actionSave)
self.menuSave.addAction(self.actionExportGraphic) self.menuSave.addAction(self.actionExportGraphic)
self.menuSave.addAction(self.action_save_fit_parameter) self.menuSave.addAction(self.action_save_fit_parameter)
@ -399,6 +401,7 @@ class Ui_BaseWindow(object):
self.menuData.addAction(self.menuCut_to_visible_range.menuAction()) self.menuData.addAction(self.menuCut_to_visible_range.menuAction())
self.menuData.addSeparator() self.menuData.addSeparator()
self.menuData.addAction(self.actionChange_datatypes) self.menuData.addAction(self.actionChange_datatypes)
self.menuData.addAction(self.actionUse_script)
self.menuHelp.addAction(self.actionShow_error_log) self.menuHelp.addAction(self.actionShow_error_log)
self.menuHelp.addAction(self.actionUpdate) self.menuHelp.addAction(self.actionUpdate)
self.menuHelp.addAction(self.actionBugs) self.menuHelp.addAction(self.actionBugs)
@ -647,6 +650,7 @@ class Ui_BaseWindow(object):
self.action_cut_xaxis.setToolTip(_translate("BaseWindow", "Remove data points outside visible x range.")) self.action_cut_xaxis.setToolTip(_translate("BaseWindow", "Remove data points outside visible x range."))
self.action_cut_yaxis.setText(_translate("BaseWindow", "y axis")) self.action_cut_yaxis.setText(_translate("BaseWindow", "y axis"))
self.action_cut_yaxis.setToolTip(_translate("BaseWindow", "Remove data points outside visible y range. Uses real part of points.")) self.action_cut_yaxis.setToolTip(_translate("BaseWindow", "Remove data points outside visible y range. Uses real part of points."))
self.actionUse_script.setText(_translate("BaseWindow", "Use script..."))
from ..data.datawidget.datawidget import DataWidget from ..data.datawidget.datawidget import DataWidget
from ..data.integral_widget import IntegralWidget from ..data.integral_widget import IntegralWidget
from ..data.point_select import PointSelectWidget from ..data.point_select import PointSelectWidget

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled2.ui' # Form implementation generated from reading ui file './nmreval/src/resources/_ui/pokeentry.ui'
# #
# Created by: PyQt5 UI code generator 5.15.10 # Created by: PyQt5 UI code generator 5.15.10
# #
@ -21,13 +21,26 @@ class Ui_Form(object):
self.artwork_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.artwork_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.artwork_label.setObjectName("artwork_label") self.artwork_label.setObjectName("artwork_label")
self.verticalLayout_4.addWidget(self.artwork_label) self.verticalLayout_4.addWidget(self.artwork_label)
self.gridLayout = QtWidgets.QGridLayout() self.formLayout = QtWidgets.QFormLayout()
self.gridLayout.setVerticalSpacing(12) self.formLayout.setContentsMargins(3, 3, 3, 3)
self.gridLayout.setObjectName("gridLayout") self.formLayout.setVerticalSpacing(12)
self.formLayout.setObjectName("formLayout")
self.label = QtWidgets.QLabel(Form)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
self.nationaldex_label = QtWidgets.QLabel(Form)
self.nationaldex_label.setObjectName("nationaldex_label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.nationaldex_label)
self.label_1 = QtWidgets.QLabel(Form)
self.label_1.setObjectName("label_1")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_1)
self.species_label = QtWidgets.QLabel(Form)
self.species_label.setObjectName("species_label")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.species_label)
self.label_4 = QtWidgets.QLabel(Form) self.label_4 = QtWidgets.QLabel(Form)
self.label_4.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.label_4.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.label_4.setObjectName("label_4") self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1) self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_4)
self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout_2.setObjectName("verticalLayout_2")
self.type1_label = QtWidgets.QLabel(Form) self.type1_label = QtWidgets.QLabel(Form)
@ -36,24 +49,11 @@ class Ui_Form(object):
self.type2_label = QtWidgets.QLabel(Form) self.type2_label = QtWidgets.QLabel(Form)
self.type2_label.setObjectName("type2_label") self.type2_label.setObjectName("type2_label")
self.verticalLayout_2.addWidget(self.type2_label) self.verticalLayout_2.addWidget(self.type2_label)
self.gridLayout.addLayout(self.verticalLayout_2, 2, 1, 1, 1) self.formLayout.setLayout(2, QtWidgets.QFormLayout.FieldRole, self.verticalLayout_2)
self.label_3 = QtWidgets.QLabel(Form) self.label_5 = QtWidgets.QLabel(Form)
self.label_3.setObjectName("label_3") self.label_5.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.gridLayout.addWidget(self.label_3, 5, 0, 1, 1) self.label_5.setObjectName("label_5")
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_5)
self.gridLayout.addItem(spacerItem, 7, 0, 1, 1)
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 4, 0, 1, 1)
self.height_label = QtWidgets.QLabel(Form)
self.height_label.setObjectName("height_label")
self.gridLayout.addWidget(self.height_label, 4, 1, 1, 1)
self.weight_label = QtWidgets.QLabel(Form)
self.weight_label.setObjectName("weight_label")
self.gridLayout.addWidget(self.weight_label, 5, 1, 1, 1)
self.label_1 = QtWidgets.QLabel(Form)
self.label_1.setObjectName("label_1")
self.gridLayout.addWidget(self.label_1, 1, 0, 1, 1)
self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout") self.verticalLayout.setObjectName("verticalLayout")
self.ability1_label = QtWidgets.QLabel(Form) self.ability1_label = QtWidgets.QLabel(Form)
@ -65,24 +65,23 @@ class Ui_Form(object):
self.ability3_label = QtWidgets.QLabel(Form) self.ability3_label = QtWidgets.QLabel(Form)
self.ability3_label.setObjectName("ability3_label") self.ability3_label.setObjectName("ability3_label")
self.verticalLayout.addWidget(self.ability3_label) self.verticalLayout.addWidget(self.ability3_label)
self.gridLayout.addLayout(self.verticalLayout, 3, 1, 1, 1) self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.verticalLayout)
self.species_label = QtWidgets.QLabel(Form) self.label_2 = QtWidgets.QLabel(Form)
self.species_label.setObjectName("species_label") self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.species_label, 1, 1, 1, 1) self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_2)
self.label_5 = QtWidgets.QLabel(Form) self.height_label = QtWidgets.QLabel(Form)
self.label_5.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.height_label.setObjectName("height_label")
self.label_5.setObjectName("label_5") self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.height_label)
self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1) self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setObjectName("label_3")
self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_3)
self.weight_label = QtWidgets.QLabel(Form)
self.weight_label.setObjectName("weight_label")
self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.weight_label)
self.gender_label = QtWidgets.QLabel(Form) self.gender_label = QtWidgets.QLabel(Form)
self.gender_label.setObjectName("gender_label") self.gender_label.setObjectName("gender_label")
self.gridLayout.addWidget(self.gender_label, 6, 0, 1, 2) self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.gender_label)
self.label = QtWidgets.QLabel(Form) self.verticalLayout_4.addLayout(self.formLayout)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.nationaldex_label = QtWidgets.QLabel(Form)
self.nationaldex_label.setObjectName("nationaldex_label")
self.gridLayout.addWidget(self.nationaldex_label, 0, 1, 1, 1)
self.verticalLayout_4.addLayout(self.gridLayout)
self.groupBox = QtWidgets.QGroupBox(Form) self.groupBox = QtWidgets.QGroupBox(Form)
self.groupBox.setFlat(True) self.groupBox.setFlat(True)
self.groupBox.setObjectName("groupBox") self.groupBox.setObjectName("groupBox")
@ -206,13 +205,21 @@ class Ui_Form(object):
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_2)
self.verticalLayout_3.setContentsMargins(3, 3, 3, 3) self.verticalLayout_3.setContentsMargins(3, 3, 3, 3)
self.verticalLayout_3.setObjectName("verticalLayout_3") self.verticalLayout_3.setObjectName("verticalLayout_3")
self.evolution_bar = QtWidgets.QLabel(self.groupBox_2) self.tableWidget = QtWidgets.QTableWidget(self.groupBox_2)
self.evolution_bar.setFrameShape(QtWidgets.QFrame.NoFrame) self.tableWidget.setStyleSheet("background-color: transparent;")
self.evolution_bar.setFrameShadow(QtWidgets.QFrame.Raised) self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.evolution_bar.setLineWidth(0) self.tableWidget.setShowGrid(False)
self.evolution_bar.setObjectName("evolution_bar") self.tableWidget.setGridStyle(QtCore.Qt.NoPen)
self.verticalLayout_3.addWidget(self.evolution_bar) self.tableWidget.setWordWrap(False)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
self.tableWidget.horizontalHeader().setVisible(False)
self.tableWidget.verticalHeader().setVisible(False)
self.verticalLayout_3.addWidget(self.tableWidget)
self.verticalLayout_4.addWidget(self.groupBox_2) self.verticalLayout_4.addWidget(self.groupBox_2)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem)
self.retranslateUi(Form) self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form) QtCore.QMetaObject.connectSlotsByName(Form)
@ -221,22 +228,22 @@ class Ui_Form(object):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form")) Form.setWindowTitle(_translate("Form", "Form"))
self.artwork_label.setText(_translate("Form", "TextLabel")) self.artwork_label.setText(_translate("Form", "TextLabel"))
self.label.setText(_translate("Form", "National No."))
self.nationaldex_label.setText(_translate("Form", "TextLabel"))
self.label_1.setText(_translate("Form", "Species"))
self.species_label.setText(_translate("Form", "TextLabel"))
self.label_4.setText(_translate("Form", "Type")) self.label_4.setText(_translate("Form", "Type"))
self.type1_label.setText(_translate("Form", "TextLabel")) self.type1_label.setText(_translate("Form", "TextLabel"))
self.type2_label.setText(_translate("Form", "TextLabel")) self.type2_label.setText(_translate("Form", "TextLabel"))
self.label_3.setText(_translate("Form", "Weight")) self.label_5.setText(_translate("Form", "Abilities"))
self.label_2.setText(_translate("Form", "Height"))
self.height_label.setText(_translate("Form", "0.0 m"))
self.weight_label.setText(_translate("Form", "0.0 kg"))
self.label_1.setText(_translate("Form", "Species"))
self.ability1_label.setText(_translate("Form", "TextLabel")) self.ability1_label.setText(_translate("Form", "TextLabel"))
self.ability2_label.setText(_translate("Form", "TextLabel")) self.ability2_label.setText(_translate("Form", "TextLabel"))
self.ability3_label.setText(_translate("Form", "TextLabel")) self.ability3_label.setText(_translate("Form", "TextLabel"))
self.species_label.setText(_translate("Form", "TextLabel")) self.label_2.setText(_translate("Form", "Height"))
self.label_5.setText(_translate("Form", "Abilities")) self.height_label.setText(_translate("Form", "0.0 m"))
self.label_3.setText(_translate("Form", "Weight"))
self.weight_label.setText(_translate("Form", "0.0 kg"))
self.gender_label.setText(_translate("Form", "TextLabel")) self.gender_label.setText(_translate("Form", "TextLabel"))
self.label.setText(_translate("Form", "National No."))
self.nationaldex_label.setText(_translate("Form", "TextLabel"))
self.groupBox.setTitle(_translate("Form", "Stats")) self.groupBox.setTitle(_translate("Form", "Stats"))
self.spec_attack_bar.setFormat(_translate("Form", "%v")) self.spec_attack_bar.setFormat(_translate("Form", "%v"))
self.label_8.setText(_translate("Form", "Special Attack")) self.label_8.setText(_translate("Form", "Special Attack"))
@ -251,4 +258,3 @@ class Ui_Form(object):
self.label_7.setText(_translate("Form", "Attack")) self.label_7.setText(_translate("Form", "Attack"))
self.label_9.setText(_translate("Form", "Defense")) self.label_9.setText(_translate("Form", "Defense"))
self.groupBox_2.setTitle(_translate("Form", "Evolution chain")) self.groupBox_2.setTitle(_translate("Form", "Evolution chain"))
self.evolution_bar.setText(_translate("Form", "TextLabel"))

View File

@ -14,15 +14,29 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):
def setupUi(self, Dialog): def setupUi(self, Dialog):
Dialog.setObjectName("Dialog") Dialog.setObjectName("Dialog")
Dialog.resize(1526, 991) Dialog.resize(1687, 991)
self.gridLayout = QtWidgets.QGridLayout(Dialog) self.gridLayout = QtWidgets.QGridLayout(Dialog)
self.gridLayout.setObjectName("gridLayout") self.gridLayout.setObjectName("gridLayout")
self.comboBox = QtWidgets.QComboBox(Dialog) self.pushButton = QtWidgets.QPushButton(Dialog)
self.comboBox.setObjectName("comboBox") self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.comboBox, 0, 1, 1, 1) self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
self.comboBox_2 = QtWidgets.QComboBox(Dialog) self.comboBox_2 = QtWidgets.QComboBox(Dialog)
self.comboBox_2.setObjectName("comboBox_2") self.comboBox_2.setObjectName("comboBox_2")
self.gridLayout.addWidget(self.comboBox_2, 0, 0, 1, 1) self.gridLayout.addWidget(self.comboBox_2, 0, 0, 1, 1)
self.comboBox = QtWidgets.QComboBox(Dialog)
self.comboBox.setObjectName("comboBox")
self.gridLayout.addWidget(self.comboBox, 0, 1, 1, 1)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem, 0, 4, 1, 1)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.buttonBox.sizePolicy().hasHeightForWidth())
self.buttonBox.setSizePolicy(sizePolicy)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Close)
self.buttonBox.setObjectName("buttonBox")
self.gridLayout.addWidget(self.buttonBox, 0, 3, 1, 1)
self.splitter = QtWidgets.QSplitter(Dialog) self.splitter = QtWidgets.QSplitter(Dialog)
self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter") self.splitter.setObjectName("splitter")
@ -66,12 +80,9 @@ class Ui_Dialog(object):
self.tableWidget_2.horizontalHeader().setStretchLastSection(False) self.tableWidget_2.horizontalHeader().setStretchLastSection(False)
self.tableWidget_2.verticalHeader().setVisible(False) self.tableWidget_2.verticalHeader().setVisible(False)
self.tabWidget = QtWidgets.QTabWidget(self.splitter) self.tabWidget = QtWidgets.QTabWidget(self.splitter)
self.tabWidget.setMinimumSize(QtCore.QSize(418, 0))
self.tabWidget.setObjectName("tabWidget") self.tabWidget.setObjectName("tabWidget")
self.gridLayout.addWidget(self.splitter, 2, 0, 1, 2) self.gridLayout.addWidget(self.splitter, 1, 0, 1, 5)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Close)
self.buttonBox.setObjectName("buttonBox")
self.gridLayout.addWidget(self.buttonBox, 3, 0, 1, 2)
self.retranslateUi(Dialog) self.retranslateUi(Dialog)
self.tabWidget.setCurrentIndex(-1) self.tabWidget.setCurrentIndex(-1)
@ -81,6 +92,7 @@ class Ui_Dialog(object):
def retranslateUi(self, Dialog): def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Gotta catch \'em all!")) Dialog.setWindowTitle(_translate("Dialog", "Gotta catch \'em all!"))
self.pushButton.setText(_translate("Dialog", "Random"))
self.tableWidget_2.setSortingEnabled(True) self.tableWidget_2.setSortingEnabled(True)
item = self.tableWidget_2.horizontalHeaderItem(0) item = self.tableWidget_2.horizontalHeaderItem(0)
item.setText(_translate("Dialog", "#")) item.setText(_translate("Dialog", "#"))

View File

@ -1,10 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'resources/_ui/ptstab.ui' # Form implementation generated from reading ui file 'nmreval/src/resources/_ui/ptstab.ui'
# #
# Created by: PyQt5 UI code generator 5.12.3 # Created by: PyQt5 UI code generator 5.15.10
# #
# WARNING! All changes made in this file will be lost! # 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 from PyQt5 import QtCore, QtGui, QtWidgets
@ -13,29 +14,50 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object): class Ui_Form(object):
def setupUi(self, Form): def setupUi(self, Form):
Form.setObjectName("Form") Form.setObjectName("Form")
Form.resize(316, 747) Form.resize(417, 746)
self.verticalLayout = QtWidgets.QVBoxLayout(Form) self.gridLayout = QtWidgets.QGridLayout(Form)
self.verticalLayout.setContentsMargins(3, 3, 3, 3) self.gridLayout.setObjectName("gridLayout")
self.verticalLayout.setObjectName("verticalLayout") self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 2)
self.peaktable = QtWidgets.QListWidget(Form) self.peaktable = QtWidgets.QListWidget(Form)
self.peaktable.setEditTriggers(QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed) self.peaktable.setEditTriggers(QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed)
self.peaktable.setObjectName("peaktable") self.peaktable.setObjectName("peaktable")
self.verticalLayout.addWidget(self.peaktable) self.gridLayout.addWidget(self.peaktable, 1, 0, 1, 2)
self.groupBox = QtWidgets.QGroupBox(Form) self.special_checkbox = QtWidgets.QCheckBox(Form)
self.groupBox.setObjectName("groupBox") self.special_checkbox.setObjectName("special_checkbox")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox) self.gridLayout.addWidget(self.special_checkbox, 3, 0, 1, 1)
self.horizontalLayout.setContentsMargins(3, 3, 3, 3) self.special_comboBox = QtWidgets.QComboBox(Form)
self.horizontalLayout.setSpacing(3) self.special_comboBox.setEnabled(False)
self.horizontalLayout.setObjectName("horizontalLayout") self.special_comboBox.setObjectName("special_comboBox")
self.left_pt = QtWidgets.QSpinBox(self.groupBox) self.special_comboBox.addItem("")
self.left_pt.setMaximum(999) self.special_comboBox.addItem("")
self.left_pt.setObjectName("left_pt") self.special_comboBox.addItem("")
self.horizontalLayout.addWidget(self.left_pt) self.special_comboBox.addItem("")
self.right_pt = QtWidgets.QSpinBox(self.groupBox) self.gridLayout.addWidget(self.special_comboBox, 3, 1, 1, 1)
self.right_pt.setMaximum(999) spacerItem = QtWidgets.QSpacerItem(20, 30, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
self.right_pt.setObjectName("right_pt") self.gridLayout.addItem(spacerItem, 4, 0, 1, 1)
self.horizontalLayout.addWidget(self.right_pt) self.label_3 = QtWidgets.QLabel(Form)
self.average_combobox = QtWidgets.QComboBox(self.groupBox) self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 5, 0, 1, 1)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.left_limit = QtWidgets.QLineEdit(Form)
self.left_limit.setObjectName("left_limit")
self.horizontalLayout_2.addWidget(self.left_limit)
self.right_limit = QtWidgets.QLineEdit(Form)
self.right_limit.setObjectName("right_limit")
self.horizontalLayout_2.addWidget(self.right_limit)
self.limit_combobox = QtWidgets.QComboBox(Form)
self.limit_combobox.setObjectName("limit_combobox")
self.limit_combobox.addItem("")
self.limit_combobox.addItem("")
self.horizontalLayout_2.addWidget(self.limit_combobox)
self.gridLayout.addLayout(self.horizontalLayout_2, 5, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(Form)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 6, 0, 1, 1)
self.average_combobox = QtWidgets.QComboBox(Form)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
@ -45,89 +67,94 @@ class Ui_Form(object):
self.average_combobox.addItem("") self.average_combobox.addItem("")
self.average_combobox.addItem("") self.average_combobox.addItem("")
self.average_combobox.addItem("") self.average_combobox.addItem("")
self.horizontalLayout.addWidget(self.average_combobox) self.average_combobox.addItem("")
self.verticalLayout.addWidget(self.groupBox) self.gridLayout.addWidget(self.average_combobox, 6, 1, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(Form) self.label_4 = QtWidgets.QLabel(Form)
self.groupBox_2.setCheckable(True) self.label_4.setObjectName("label_4")
self.groupBox_2.setChecked(False) self.gridLayout.addWidget(self.label_4, 7, 0, 1, 1)
self.groupBox_2.setObjectName("groupBox_2") self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.groupBox_2) self.horizontalLayout.setObjectName("horizontalLayout")
self.horizontalLayout_5.setContentsMargins(3, 3, 3, 3) self.xbutton = QtWidgets.QCheckBox(Form)
self.horizontalLayout_5.setSpacing(2)
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.special_comboBox = QtWidgets.QComboBox(self.groupBox_2)
self.special_comboBox.setObjectName("special_comboBox")
self.special_comboBox.addItem("")
self.special_comboBox.addItem("")
self.special_comboBox.addItem("")
self.special_comboBox.addItem("")
self.horizontalLayout_5.addWidget(self.special_comboBox)
self.verticalLayout.addWidget(self.groupBox_2)
self.groupBox_3 = QtWidgets.QGroupBox(Form)
self.groupBox_3.setObjectName("groupBox_3")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox_3)
self.gridLayout.setContentsMargins(3, 3, 3, 3)
self.gridLayout.setSpacing(3)
self.gridLayout.setObjectName("gridLayout")
self.xbutton = QtWidgets.QCheckBox(self.groupBox_3)
self.xbutton.setObjectName("xbutton") self.xbutton.setObjectName("xbutton")
self.gridLayout.addWidget(self.xbutton, 0, 0, 1, 1) self.horizontalLayout.addWidget(self.xbutton)
self.ybutton = QtWidgets.QCheckBox(self.groupBox_3) self.ybutton = QtWidgets.QCheckBox(Form)
self.ybutton.setChecked(True) self.ybutton.setChecked(True)
self.ybutton.setObjectName("ybutton") self.ybutton.setObjectName("ybutton")
self.gridLayout.addWidget(self.ybutton, 0, 1, 1, 1) self.horizontalLayout.addWidget(self.ybutton)
self.graph_checkbox = QtWidgets.QCheckBox(self.groupBox_3) self.gridLayout.addLayout(self.horizontalLayout, 7, 1, 1, 1)
self.label = QtWidgets.QLabel(Form)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 8, 0, 1, 1)
self.group_box = QtWidgets.QComboBox(Form)
self.group_box.setObjectName("group_box")
self.group_box.addItem("")
self.group_box.addItem("")
self.gridLayout.addWidget(self.group_box, 8, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
self.gridLayout.addItem(spacerItem1, 9, 0, 1, 1)
self.graph_checkbox = QtWidgets.QCheckBox(Form)
self.graph_checkbox.setChecked(True) self.graph_checkbox.setChecked(True)
self.graph_checkbox.setObjectName("graph_checkbox") self.graph_checkbox.setObjectName("graph_checkbox")
self.gridLayout.addWidget(self.graph_checkbox, 1, 0, 1, 1) self.gridLayout.addWidget(self.graph_checkbox, 10, 0, 1, 1)
self.graph_combobox = QtWidgets.QComboBox(self.groupBox_3) self.graph_combobox = QtWidgets.QComboBox(Form)
self.graph_combobox.setEnabled(False) self.graph_combobox.setEnabled(False)
self.graph_combobox.setObjectName("graph_combobox") self.graph_combobox.setObjectName("graph_combobox")
self.gridLayout.addWidget(self.graph_combobox, 1, 1, 1, 1) self.gridLayout.addWidget(self.graph_combobox, 10, 1, 1, 1)
self.verticalLayout.addWidget(self.groupBox_3) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.gridLayout.addItem(spacerItem2, 12, 0, 1, 1)
self.horizontalLayout_2.setContentsMargins(-1, 0, -1, -1)
self.horizontalLayout_2.setSpacing(2)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.okButton = QtWidgets.QPushButton(Form) self.okButton = QtWidgets.QPushButton(Form)
icon = QtGui.QIcon.fromTheme("dialog-ok") icon = QtGui.QIcon.fromTheme("dialog-ok")
self.okButton.setIcon(icon) self.okButton.setIcon(icon)
self.okButton.setObjectName("okButton") self.okButton.setObjectName("okButton")
self.horizontalLayout_2.addWidget(self.okButton) self.gridLayout.addWidget(self.okButton, 11, 0, 1, 2)
self.deleteButton = QtWidgets.QPushButton(Form) self.deleteButton = QtWidgets.QPushButton(Form)
icon = QtGui.QIcon.fromTheme("dialog-cancel") icon = QtGui.QIcon.fromTheme("dialog-cancel")
self.deleteButton.setIcon(icon) self.deleteButton.setIcon(icon)
self.deleteButton.setObjectName("deleteButton") self.deleteButton.setObjectName("deleteButton")
self.horizontalLayout_2.addWidget(self.deleteButton) self.gridLayout.addWidget(self.deleteButton, 2, 0, 1, 2)
self.verticalLayout.addLayout(self.horizontalLayout_2) self.label_2.setBuddy(self.peaktable)
self.label_5.setBuddy(self.average_combobox)
self.label_4.setBuddy(self.xbutton)
self.label.setBuddy(self.group_box)
self.retranslateUi(Form) self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form) QtCore.QMetaObject.connectSlotsByName(Form)
Form.setTabOrder(self.peaktable, self.limit_combobox)
Form.setTabOrder(self.limit_combobox, self.average_combobox)
Form.setTabOrder(self.average_combobox, self.xbutton)
Form.setTabOrder(self.xbutton, self.ybutton)
Form.setTabOrder(self.ybutton, self.group_box)
Form.setTabOrder(self.group_box, self.graph_checkbox)
Form.setTabOrder(self.graph_checkbox, self.graph_combobox)
def retranslateUi(self, Form): def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form")) Form.setWindowTitle(_translate("Form", "Form"))
self.label_2.setText(_translate("Form", "Selected points and regions"))
self.peaktable.setToolTip(_translate("Form", "Edit by entering new value: \n" self.peaktable.setToolTip(_translate("Form", "Edit by entering new value: \n"
"Single number for points (e.g. 1e-6); \n" "Single number for points (e.g. 1e-6); \n"
"two numbers separated by space for regions (e.g. 1e-6 5e-6). \n" "two numbers separated by space for regions (e.g. 1e-6 5e-6). \n"
"Changing between regions and points is NOT possible")) "Changing between regions and points is NOT possible"))
self.groupBox.setTitle(_translate("Form", "Average")) self.special_checkbox.setText(_translate("Form", "Use special value"))
self.left_pt.setSuffix(_translate("Form", " pts"))
self.left_pt.setPrefix(_translate("Form", "- "))
self.right_pt.setSuffix(_translate("Form", " pts"))
self.right_pt.setPrefix(_translate("Form", "+ "))
self.average_combobox.setItemText(0, _translate("Form", "Mean"))
self.average_combobox.setItemText(1, _translate("Form", "Sum"))
self.average_combobox.setItemText(2, _translate("Form", "Integral"))
self.groupBox_2.setTitle(_translate("Form", "Special value"))
self.special_comboBox.setToolTip(_translate("Form", "Automatic selection of respective points")) self.special_comboBox.setToolTip(_translate("Form", "Automatic selection of respective points"))
self.special_comboBox.setItemText(0, _translate("Form", "max(y)")) self.special_comboBox.setItemText(0, _translate("Form", "max(y)"))
self.special_comboBox.setItemText(1, _translate("Form", "max(abs(y))")) self.special_comboBox.setItemText(1, _translate("Form", "max(abs(y))"))
self.special_comboBox.setItemText(2, _translate("Form", "min(y)")) self.special_comboBox.setItemText(2, _translate("Form", "min(y)"))
self.special_comboBox.setItemText(3, _translate("Form", "min(abs(y))")) self.special_comboBox.setItemText(3, _translate("Form", "min(abs(y))"))
self.groupBox_3.setTitle(_translate("Form", "Result")) self.label_3.setText(_translate("Form", "Region around points"))
self.limit_combobox.setItemText(0, _translate("Form", "points"))
self.limit_combobox.setItemText(1, _translate("Form", "range"))
self.label_5.setText(_translate("Form", "Aggregation"))
self.average_combobox.setItemText(0, _translate("Form", "Mean"))
self.average_combobox.setItemText(1, _translate("Form", "Sum"))
self.average_combobox.setItemText(2, _translate("Form", "Integral"))
self.average_combobox.setItemText(3, _translate("Form", "Std. deviation"))
self.label_4.setText(_translate("Form", "New set based on"))
self.xbutton.setText(_translate("Form", "x")) self.xbutton.setText(_translate("Form", "x"))
self.ybutton.setText(_translate("Form", "y")) self.ybutton.setText(_translate("Form", "y"))
self.label.setText(_translate("Form", "Group by"))
self.group_box.setItemText(0, _translate("Form", "\"Group\" value"))
self.group_box.setItemText(1, _translate("Form", "x value"))
self.graph_checkbox.setText(_translate("Form", "New graph?")) self.graph_checkbox.setText(_translate("Form", "New graph?"))
self.okButton.setText(_translate("Form", "Apply")) self.okButton.setText(_translate("Form", "Apply"))
self.deleteButton.setText(_translate("Form", "Delete selected")) self.deleteButton.setText(_translate("Form", "Delete selection"))

View File

@ -1,6 +1,6 @@
import re import re
from ..Qt import QtCore, QtWidgets from ..Qt import QtCore, QtWidgets, QtGui
from .._py.ptstab import Ui_Form from .._py.ptstab import Ui_Form
from ..lib.pg_objects import LogInfiniteLine, RegionItem from ..lib.pg_objects import LogInfiniteLine, RegionItem
@ -27,15 +27,23 @@ class PointSelectWidget(QtWidgets.QWidget, Ui_Form):
self._last_item = None self._last_item = None
self.connected_figure = '' self.connected_figure = ''
self._avg_modes = ['mean', 'sum', 'integral', 'std']
self._special_values = ['max', 'absmax', 'min', 'absmin']
self._group_modes = ['group', 'x']
self.okButton.clicked.connect(self.apply) self.okButton.clicked.connect(self.apply)
self.deleteButton.clicked.connect(self.remove_points) self.deleteButton.clicked.connect(self.remove_points)
self.peaktable.itemChanged.connect(self.editing_finished) self.peaktable.itemChanged.connect(self.editing_finished)
self.peaktable.itemDoubleClicked.connect(self.editing_started) self.peaktable.itemDoubleClicked.connect(self.editing_started)
self.left_limit.setValidator(QtGui.QDoubleValidator())
self.right_limit.setValidator(QtGui.QDoubleValidator())
def keyPressEvent(self, e): def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Delete: if e.key() == QtCore.Qt.Key.Key_Delete:
self.remove_points() self.remove_points()
elif e.key() == QtCore.Qt.Key_F2: elif e.key() == QtCore.Qt.Key.Key_F2:
self.editing_started() self.editing_started()
else: else:
super().keyPressEvent(e) super().keyPressEvent(e)
@ -91,7 +99,7 @@ class PointSelectWidget(QtWidgets.QWidget, Ui_Form):
item = QtWidgets.QListWidgetItem(f'{self.pts[-1][0]:.5g} - {self.pts[-1][1]:.5g}') item = QtWidgets.QListWidgetItem(f'{self.pts[-1][0]:.5g} - {self.pts[-1][1]:.5g}')
else: else:
item = QtWidgets.QListWidgetItem(f'{self.pts[-1]:.5g}') item = QtWidgets.QListWidgetItem(f'{self.pts[-1]:.5g}')
item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) item.setFlags(item.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)
self.peaktable.blockSignals(True) self.peaktable.blockSignals(True)
self.peaktable.addItem(item) self.peaktable.addItem(item)
self.peaktable.blockSignals(False) self.peaktable.blockSignals(False)
@ -102,21 +110,22 @@ class PointSelectWidget(QtWidgets.QWidget, Ui_Form):
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def apply(self) -> dict: def apply(self) -> dict:
ret_dic = {'avg_range': [self.left_pt.value(), self.right_pt.value()], ret_dic = {
'avg_mode': {0: 'mean', 1: 'sum', 2: 'integral'}[self.average_combobox.currentIndex()], 'avg_range': self.get_limits(),
'special': None, 'idx': None, 'avg_mode': self._avg_modes[self.average_combobox.currentIndex()],
'xy': (self.xbutton.isChecked(), self.ybutton.isChecked())} 'special': None,
'idx': None,
'xy': (self.xbutton.isChecked(), self.ybutton.isChecked()),
'groupby': self._group_modes[self.group_box.currentIndex()],
}
if self.groupBox_2.isChecked(): if self.special_checkbox.isChecked():
ret_dic['special'] = {0: 'max', 1: 'absmax', 2: 'min', 3: 'absmin'}[self.special_comboBox.currentIndex()] ret_dic['special'] = self._special_values[self.special_comboBox.currentIndex()]
if len(self.pts) != 0: if len(self.pts) != 0:
ret_dic['idx'] = self.pts ret_dic['idx'] = self.pts
if self.graph_checkbox.isChecked(): gid = self.graph_combobox.currentData() if not self.graph_checkbox.isChecked() else ''
gid = ''
else:
gid = self.graph_combobox.currentData()
self.points_selected.emit(ret_dic, gid) self.points_selected.emit(ret_dic, gid)
@ -199,4 +208,22 @@ class PointSelectWidget(QtWidgets.QWidget, Ui_Form):
@QtCore.pyqtSlot(int, name='on_graph_checkbox_stateChanged') @QtCore.pyqtSlot(int, name='on_graph_checkbox_stateChanged')
def changed_state(self, checked): def changed_state(self, checked):
self.graph_combobox.setEnabled(checked != QtCore.Qt.Checked) self.graph_combobox.setEnabled(checked != QtCore.Qt.CheckState.Checked)
@QtCore.pyqtSlot(int, name='on_special_checkbox_stateChanged')
def changed_special(self, checked: int):
self.graph_combobox.setEnabled(checked != QtCore.Qt.CheckState.Checked)
def get_limits(self) -> tuple[float, float, str]:
try:
left = float(self.left_limit.text())
except ValueError:
left = 0.
try:
right = float(self.right_limit.text())
except ValueError:
right = 0.
return left, right, self.limit_combobox.currentText()

View File

View File

@ -187,10 +187,10 @@ class CodeEditor(QtWidgets.QPlainTextEdit):
self.highlight = PythonHighlighter(self.document()) self.highlight = PythonHighlighter(self.document())
def keyPressEvent(self, evt): def keyPressEvent(self, evt):
if evt.key() == QtCore.Qt.Key_Tab: if evt.key() == QtCore.Qt.Key.Key_Tab:
# use spaces instead of tab # use spaces instead of tab
self.insertPlainText(' '*4) self.insertPlainText(' '*4)
elif evt.key() == QtCore.Qt.Key_Insert: elif evt.key() == QtCore.Qt.Key.Key_Insert:
self.setOverwriteMode(not self.overwriteMode()) self.setOverwriteMode(not self.overwriteMode())
else: else:
super().keyPressEvent(evt) super().keyPressEvent(evt)
@ -225,7 +225,7 @@ class CodeEditor(QtWidgets.QPlainTextEdit):
def paintevent_linenumber(self, evt): def paintevent_linenumber(self, evt):
painter = QtGui.QPainter(self.current_linenumber) painter = QtGui.QPainter(self.current_linenumber)
painter.fillRect(evt.rect(), QtCore.Qt.lightGray) painter.fillRect(evt.rect(), QtCore.Qt.GlobalColor.lightGray)
block = self.firstVisibleBlock() block = self.firstVisibleBlock()
block_number = block.blockNumber() block_number = block.blockNumber()
@ -237,9 +237,9 @@ class CodeEditor(QtWidgets.QPlainTextEdit):
while block.isValid() and (top <= evt.rect().bottom()): while block.isValid() and (top <= evt.rect().bottom()):
if block.isVisible() and (bottom >= evt.rect().top()): if block.isVisible() and (bottom >= evt.rect().top()):
number = str(block_number + 1) number = str(block_number + 1)
painter.setPen(QtCore.Qt.black) painter.setPen(QtCore.Qt.GlobalColor.black)
painter.drawText(0, int(top), self.current_linenumber.width() - 3, height, painter.drawText(0, int(top), self.current_linenumber.width() - 3, height,
QtCore.Qt.AlignRight, number) QtCore.Qt.AlignmentFlag.AlignRight, number)
block = block.next() block = block.next()
top = bottom top = bottom
@ -252,7 +252,7 @@ class CodeEditor(QtWidgets.QPlainTextEdit):
if not self.isReadOnly(): if not self.isReadOnly():
selection = QtWidgets.QTextEdit.ExtraSelection() selection = QtWidgets.QTextEdit.ExtraSelection()
line_color = QtGui.QColor(QtCore.Qt.yellow).lighter(180) line_color = QtGui.QColor(QtCore.Qt.GlobalColor.yellow).lighter(180)
selection.format.setBackground(line_color) selection.format.setBackground(line_color)
selection.format.setProperty(QtGui.QTextFormat.FullWidthSelection, True) selection.format.setProperty(QtGui.QTextFormat.FullWidthSelection, True)

View File

@ -0,0 +1,30 @@
from __future__ import annotations
from pathlib import Path
from .usermodeleditor import QUsermodelEditor
from ..Qt import QtWidgets, QtCore, QtGui
class QEditor(QUsermodelEditor):
runSignal = QtCore.pyqtSignal(str)
def __init__(self, path: str | Path = None, parent=None):
super().__init__(path, parent=parent)
self.add_run_button()
def add_run_button(self):
self.disclaimer = QtWidgets.QLabel("This is work in progress and less than perfect :(")
self.disclaimer.setStyleSheet('QLabel {color: rgb(255, 0, 0); font-weight: bold; font-size: 2.5em;};')
self.centralwidget.layout().insertWidget(0, self.disclaimer)
self.run_button = QtWidgets.QPushButton("Run")
self.centralwidget.layout().addWidget(self.run_button)
self.run_button.clicked.connect(self.start_script)
@QtCore.pyqtSlot()
def start_script(self):
self.runSignal.emit(self.edit_field.toPlainText())

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
from ..Qt import QtWidgets, QtCore, QtGui from ..Qt import QtWidgets, QtCore, QtGui
from ..lib.codeeditor import EditorWidget from .codeeditor import EditorWidget
class QUsermodelEditor(QtWidgets.QMainWindow): class QUsermodelEditor(QtWidgets.QMainWindow):
@ -50,18 +50,20 @@ class QUsermodelEditor(QtWidgets.QMainWindow):
self.menuFile.addAction('Close', self.close, QtGui.QKeySequence.Quit) self.menuFile.addAction('Close', self.close, QtGui.QKeySequence.Quit)
self.resize(800, 600) self.resize(800, 600)
self.setGeometry(QtWidgets.QStyle.alignedRect( self.setGeometry(
QtCore.Qt.LeftToRight, QtCore.Qt.AlignCenter, QtWidgets.QStyle.alignedRect(
self.size(), QtWidgets.qApp.desktop().availableGeometry() QtCore.Qt.LayoutDirection.LeftToRight,
)) QtCore.Qt.AlignmentFlag.AlignCenter,
self.size(),
QtWidgets.qApp.desktop().availableGeometry()
)
)
@property
def is_modified(self): def is_modified(self):
return self.edit_field.document().isModified() return self.edit_field.editor.document().isModified()
@is_modified.setter def set_modified(self, val: bool):
def is_modified(self, val: bool): self.edit_field.editor.document().setModified(val)
self.edit_field.document().setModified(val)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def open_file(self): def open_file(self):
@ -75,17 +77,22 @@ class QUsermodelEditor(QtWidgets.QMainWindow):
def read_file(self, fname: str | Path): def read_file(self, fname: str | Path):
self.set_fname_opts(fname) self.set_fname_opts(fname)
with self.fname.open('r') as f: if self.fname is not None:
self.edit_field.setPlainText(f.read()) with self.fname.open('r') as f:
self.edit_field.setPlainText(f.read())
def set_fname_opts(self, fname: str | Path): def set_fname_opts(self, fname: str | Path):
self.fname = Path(fname) fname = Path(fname)
self._dir = self.fname.parent if fname.is_file():
self.setWindowTitle('Edit ' + str(fname)) self.fname = Path(fname)
self._dir = self.fname.parent
self.setWindowTitle('Edit ' + str(fname))
elif fname.is_dir():
self._dir = fname
@property
def changes_saved(self) -> bool: def changes_saved(self) -> bool:
if not self.is_modified: if not self.is_modified():
return True return True
ret = QtWidgets.QMessageBox.question(self, 'Time to think', ret = QtWidgets.QMessageBox.question(self, 'Time to think',
@ -97,9 +104,9 @@ class QUsermodelEditor(QtWidgets.QMainWindow):
self.save_file() self.save_file()
if ret == QtWidgets.QMessageBox.No: if ret == QtWidgets.QMessageBox.No:
self.is_modified = False self.set_modified(False)
return not self.is_modified return not self.is_modified()
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def save_file(self): def save_file(self):
@ -111,9 +118,9 @@ class QUsermodelEditor(QtWidgets.QMainWindow):
self.set_fname_opts(outfile) self.set_fname_opts(outfile)
self.is_modified = False self.set_modified(False)
return self.is_modified return self.is_modified()
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def overwrite_file(self): def overwrite_file(self):
@ -123,10 +130,10 @@ class QUsermodelEditor(QtWidgets.QMainWindow):
self.modelsChanged.emit() self.modelsChanged.emit()
self.is_modified = False self.set_modified(False)
def closeEvent(self, evt: QtGui.QCloseEvent): def closeEvent(self, evt: QtGui.QCloseEvent):
if not self.changes_saved: if not self.changes_saved():
evt.ignore() evt.ignore()
else: else:
super().closeEvent(evt) super().closeEvent(evt)

View File

@ -12,12 +12,13 @@ from ..lib.forms import SelectionWidget
class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit): class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
value_requested = QtCore.pyqtSignal(int) value_requested = QtCore.pyqtSignal(int)
def __init__(self, parent=None): def __init__(self, func_id: int, parent=None):
super().__init__(parent=parent) super().__init__(parent=parent)
self.setupUi(self) self.setupUi(self)
self.func = None self.func = None
self.func_idx = None self.func_idx = None
self.func_id = func_id
self.max_width = QtCore.QSize(0, 0) self.max_width = QtCore.QSize(0, 0)
self.global_parameter = [] self.global_parameter = []
self.data_parameter = [] self.data_parameter = []
@ -301,8 +302,10 @@ class ParameterSingleWidget(QtWidgets.QWidget):
self.name = name self.name = name
self.parametername.setText(convert(name)) self.parametername.setText(convert(name))
self.parametername.setToolTip('If this is bold then this parameter is only for this data. ' self.parametername.setToolTip(
'Otherwise, the general parameter is used and displayed') 'If this is bold then this parameter is only for this data. '
'Otherwise, the general parameter is used and displayed'
)
# self.value_line.setValidator(QtGui.QDoubleValidator()) # self.value_line.setValidator(QtGui.QDoubleValidator())
self.value_line.textChanged.connect(lambda: self.valueChanged.emit(self.value) if self.value is not None else 0) self.value_line.textChanged.connect(lambda: self.valueChanged.emit(self.value) if self.value is not None else 0)

View File

@ -77,8 +77,12 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
""" """
w = self.param_widgets[idx] w = self.param_widgets[idx]
self.stackedWidget.removeWidget(w) self.stackedWidget.removeWidget(w)
w.setParent(None)
w.deleteLater() w.deleteLater()
del self.param_widgets[idx] del self.param_widgets[idx]
_, func_id = self.functionwidget.get_selected()
self.get_functions()
self._current_function = None self._current_function = None
if len(self.param_widgets) == 0: if len(self.param_widgets) == 0:
@ -104,7 +108,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
if function is None: if function is None:
return return
dialog = QFitParameterWidget(self.stackedWidget) dialog = QFitParameterWidget(function_id, self.stackedWidget)
data_names = self.data_table.data_list(include_name=True) data_names = self.data_table.data_list(include_name=True)
dialog.set_function(function, function_idx) dialog.set_function(function, function_idx)
@ -206,9 +210,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
for m in self.models[model_id]: for m in self.models[model_id]:
func_id = m['cnt'] func_id = m['cnt']
self.stackedWidget.removeWidget(self.param_widgets[func_id]) self.remove_function(func_id)
self.param_widgets.pop(func_id)
self._complex.pop(model_id) self._complex.pop(model_id)
self._func_list.pop(model_id) self._func_list.pop(model_id)

View File

@ -8,9 +8,9 @@ from typing import Any
import numpy as np import numpy as np
from gui_qt.Qt import QtCore, QtWidgets, QtGui from ..Qt import QtCore, QtWidgets, QtGui
from gui_qt._py.fitcreationdialog import Ui_Dialog from .._py.fitcreationdialog import Ui_Dialog
from gui_qt.lib.namespace import QNamespaceWidget from ..editors.namespace import QNamespaceWidget
__all__ = ['QUserFitCreator'] __all__ = ['QUserFitCreator']

View File

@ -539,6 +539,10 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow):
if self.graphic.plotItem.sceneBoundingRect().contains(evt.scenePos()) and evt.button() == 1: if self.graphic.plotItem.sceneBoundingRect().contains(evt.scenePos()) and evt.button() == 1:
pos = vb.mapSceneToView(evt.scenePos()) pos = vb.mapSceneToView(evt.scenePos())
if not _inside_range(pos.x(), pos.y(), vb.viewRange()):
return
_x, _y = pos.x(), pos.y() _x, _y = pos.x(), pos.y()
if self.log[0]: if self.log[0]:
@ -854,3 +858,7 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow):
self.set_color(foreground=self._prev_colors[0], background=self._prev_colors[1]) self.set_color(foreground=self._prev_colors[0], background=self._prev_colors[1])
self._prev_colors = temp self._prev_colors = temp
def _inside_range(x: float, y: float, ranges: list[list[float]]) -> bool:
x_range, y_range = ranges
return (x_range[0] <= x <= x_range[1]) and (y_range[0] <= y <= y_range[1])

View File

@ -88,7 +88,6 @@ class QFCReader(QtWidgets.QDialog, Ui_FCEval_dialog):
def accept(self): def accept(self):
items = [self.listWidget.item(i).text() for i in range(self.listWidget.count())] items = [self.listWidget.item(i).text() for i in range(self.listWidget.count())]
print(items)
if items: if items:
with busy_cursor(): with busy_cursor():
self.read(items) self.read(items)

View File

@ -3,7 +3,7 @@ from pathlib import Path
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from .codeeditor import _make_textformats from ..editors.codeeditor import _make_textformats
from ..Qt import QtWidgets, QtCore, QtGui from ..Qt import QtWidgets, QtCore, QtGui
from nmreval.configs import config_paths from nmreval.configs import config_paths

View File

@ -4,6 +4,8 @@ from collections import namedtuple
import numpy as np import numpy as np
import nmreval
from nmreval import models from nmreval import models
from nmreval.configs import config_paths from nmreval.configs import config_paths
from nmreval.lib.importer import find_models, import_ from nmreval.lib.importer import find_models, import_
@ -28,6 +30,7 @@ class Namespace:
'y_err': (None, 'y error values'), 'y_err': (None, 'y error values'),
'fit': (None, 'dictionary of fit parameter', 'fit["PIKA"]'), 'fit': (None, 'dictionary of fit parameter', 'fit["PIKA"]'),
'np': (np, 'numpy module'), 'np': (np, 'numpy module'),
'nmreval': (nmreval, 'built-in classes and stuff')
}, },
parents=('Basic', 'General'), parents=('Basic', 'General'),
) )

View File

@ -3,8 +3,10 @@ import urllib.request
from functools import cache from functools import cache
from PyQt5 import QtWidgets, QtGui, QtCore from PyQt5 import QtWidgets, QtGui, QtCore
from .._py.pokewindow import Ui_Dialog from numpy.random import randint
from .._py.pokeentry import Ui_Form
from gui_qt._py.pokewindow import Ui_Dialog
from gui_qt._py.pokeentry import Ui_Form
def get_connection(db): def get_connection(db):
@ -37,6 +39,8 @@ class QPoke(QtWidgets.QDialog, Ui_Dialog):
self.comboBox_2.currentIndexChanged.connect(self.collect_pokemon) self.comboBox_2.currentIndexChanged.connect(self.collect_pokemon)
self.comboBox.currentIndexChanged.connect(self.collect_pokemon) self.comboBox.currentIndexChanged.connect(self.collect_pokemon)
self.pushButton.clicked.connect(self.randomize)
self.collect_pokemon() self.collect_pokemon()
def _fetch_names(self): def _fetch_names(self):
@ -149,12 +153,15 @@ class QPoke(QtWidgets.QDialog, Ui_Dialog):
self.tableWidget_2.clearContents() self.tableWidget_2.clearContents()
self.tableWidget_2.setRowCount(0) self.tableWidget_2.setRowCount(0)
self.tableWidget_2.setSortingEnabled(False)
for entry in result: for entry in result:
row = self.tableWidget_2.rowCount() row = self.tableWidget_2.rowCount()
self.tableWidget_2.setRowCount(row+1) self.tableWidget_2.setRowCount(row+1)
item = QtWidgets.QTableWidgetItem(f"{entry['entry_number']:04d}") item = QtWidgets.QTableWidgetItem(f"{entry['entry_number']:04d}")
item.setData(QtCore.Qt.ItemDataRole.UserRole, entry['species_id']) item.setData(QtCore.Qt.ItemDataRole.UserRole, entry['species_id'])
item.setData(QtCore.Qt.ItemDataRole.UserRole+1, entry['pokemon_id'])
self.tableWidget_2.setItem(row, 0, item) self.tableWidget_2.setItem(row, 0, item)
name_en = entry['name_en'] name_en = entry['name_en']
@ -181,7 +188,7 @@ class QPoke(QtWidgets.QDialog, Ui_Dialog):
type_en.append(t_en) type_en.append(t_en)
type_de.append(t_de) type_de.append(t_de)
item = QtWidgets.QTableWidgetItem('\n'.join(type_en)) item = QtWidgets.QTableWidgetItem(' / '.join(type_en))
item.setToolTip('\n'.join(type_en)) item.setToolTip('\n'.join(type_en))
self.tableWidget_2.setItem(row, 2, item) self.tableWidget_2.setItem(row, 2, item)
@ -215,11 +222,20 @@ class QPoke(QtWidgets.QDialog, Ui_Dialog):
self.tableWidget_2.setItem(row, 12, item) self.tableWidget_2.setItem(row, 12, item)
self.tableWidget_2.resizeColumnToContents(1) self.tableWidget_2.resizeColumnToContents(1)
self.tableWidget_2.resizeColumnToContents(2)
self.tableWidget_2.setSortingEnabled(True)
def show_pokemon(self): def randomize(self):
table = self.sender() select = randint(0, self.tableWidget_2.rowCount())
row = table.currentRow() self.show_pokemon(select)
poke_id = table.item(row, 0).data(QtCore.Qt.ItemDataRole.UserRole)
def show_pokemon(self, row: int = None):
table = self.tableWidget_2
if row is None:
row = table.currentRow()
species_id = table.item(row, 0).data(QtCore.Qt.ItemDataRole.UserRole)
poke_id = table.item(row, 0).data(QtCore.Qt.ItemDataRole.UserRole+1)
pokemon_name = table.item(row, 1).text() pokemon_name = table.item(row, 1).text()
connection = get_connection(self._db) connection = get_connection(self._db)
@ -227,7 +243,7 @@ class QPoke(QtWidgets.QDialog, Ui_Dialog):
cursor.execute( cursor.execute(
'SELECT p.id FROM pokemon p WHERE p.species_id = ?', 'SELECT p.id FROM pokemon p WHERE p.species_id = ?',
(poke_id,) (species_id,)
) )
pokemon = cursor.fetchall() pokemon = cursor.fetchall()
@ -237,9 +253,14 @@ class QPoke(QtWidgets.QDialog, Ui_Dialog):
for i in range(1, self.tabWidget.count()): for i in range(1, self.tabWidget.count()):
self.tabWidget.setTabVisible(i, False) self.tabWidget.setTabVisible(i, False)
widget_idx = 0
for i, p in enumerate(pokemon): for i, p in enumerate(pokemon):
entry_widget = self.tabWidget.widget(i) entry_widget = self.tabWidget.widget(i)
if poke_id == p[0]:
widget_idx = i
if entry_widget is None: if entry_widget is None:
self.tabWidget.addTab(PokemonEntry(p[0]), '') self.tabWidget.addTab(PokemonEntry(p[0]), '')
@ -247,12 +268,13 @@ class QPoke(QtWidgets.QDialog, Ui_Dialog):
self.tabWidget.setTabVisible(i, True) self.tabWidget.setTabVisible(i, True)
name = self.tabWidget.widget(i).create_pokemon(p[0]) name = self.tabWidget.widget(i).create_pokemon(p[0])
self.tabWidget.setTabText(i, name) self.tabWidget.setTabText(i, name)
self.tabWidget.setCurrentIndex(widget_idx)
class PokemonEntry(QtWidgets.QWidget, Ui_Form): class PokemonEntry(QtWidgets.QWidget, Ui_Form):
_db = '' _db = ''
def __init__(self, pokemon_id, parent=None): def __init__(self, pokemon_id: int, parent=None):
super().__init__(parent=parent) super().__init__(parent=parent)
self.setupUi(self) self.setupUi(self)
@ -275,7 +297,7 @@ class PokemonEntry(QtWidgets.QWidget, Ui_Form):
self.species_label.setToolTip(species['genus_de']) self.species_label.setToolTip(species['genus_de'])
self.height_label.setText(f"{pokemon['height'] / 10} m") self.height_label.setText(f"{pokemon['height'] / 10} m")
self.weight_label.setText(f"{pokemon['weight']} kg") self.weight_label.setText(f"{pokemon['weight'] / 10} kg")
if species['gender_ratio'] == -1: if species['gender_ratio'] == -1:
gender = "Gender unknown" gender = "Gender unknown"
@ -326,10 +348,23 @@ class PokemonEntry(QtWidgets.QWidget, Ui_Form):
self.type_labels[slot].setToolTip(QPoke.types[type_id][0]) self.type_labels[slot].setToolTip(QPoke.types[type_id][0])
evolutions = self.make_evolution(pokemon['evolution_id']) evolutions = self.make_evolution(pokemon['evolution_id'])
evo_text = []
for e in evolutions: self.tableWidget.clear()
evo_text.append(f'{e[0]} (#{e[1]:04d}) to {e[2]} (#{e[3]:04d}) \t\t ({e[4]})') self.tableWidget.setColumnCount(4)
self.evolution_bar.setText('<br>'.join(evo_text)) self.tableWidget.setRowCount(len(evolutions))
for i, e in enumerate(evolutions):
item = QtWidgets.QTableWidgetItem(f'{e[0]} (#{e[1]:04d})')
self.tableWidget.setItem(i, 0, item)
item = QtWidgets.QTableWidgetItem('to')
self.tableWidget.setItem(i, 1, item)
item = QtWidgets.QTableWidgetItem(f'{e[2]} (#{e[3]:04d})')
self.tableWidget.setItem(i, 2, item)
item = QtWidgets.QTableWidgetItem(f'{e[4]}')
self.tableWidget.setItem(i, 3, item)
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
if form['full_name_en'] is not None: if form['full_name_en'] is not None:
return form['full_name_en'] return form['full_name_en']
@ -438,7 +473,6 @@ class PokemonEntry(QtWidgets.QWidget, Ui_Form):
return form, types return form, types
@cache @cache
def make_evolution(self, poke_id: int): def make_evolution(self, poke_id: int):
steps = [] steps = []
@ -448,6 +482,7 @@ class PokemonEntry(QtWidgets.QWidget, Ui_Form):
cursor.execute('SELECT * FROM evolution_names WHERE id = ?', (poke_id,)) cursor.execute('SELECT * FROM evolution_names WHERE id = ?', (poke_id,))
chain = cursor.fetchall() chain = cursor.fetchall()
conn.close()
trigger_texts = [ trigger_texts = [
None, None,
@ -497,7 +532,6 @@ class PokemonEntry(QtWidgets.QWidget, Ui_Form):
} }
for c in chain: for c in chain:
lvl0 = c["name_en"] lvl0 = c["name_en"]
if c['gender'] == 1: if c['gender'] == 1:
lvl0 += ' (female)' lvl0 += ' (female)'
@ -519,17 +553,4 @@ class PokemonEntry(QtWidgets.QWidget, Ui_Form):
(lvl0, c['evolves_from'], c['evolve_en'], c['species_id'], ', '.join(filter(lambda x: x, level_text))) (lvl0, c['evolves_from'], c['evolve_en'], c['species_id'], ', '.join(filter(lambda x: x, level_text)))
) )
conn.close()
return steps return steps
if __name__ == '__main__':
app = QtWidgets.QApplication([])
sourcedb = 'pokemon.sqlite'
w = QPoke(sourcedb)
w.show()
app.exec()

View File

@ -677,9 +677,10 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
from ..math.skipping import QSkipDialog from ..math.skipping import QSkipDialog
dial = QSkipDialog(self) dial = QSkipDialog(self)
dial.exec() res = dial.exec()
self.management.skip_points(**dial.get_arguments()) if res:
self.management.skip_points(**dial.get_arguments())
@QtCore.pyqtSlot(name='on_action_coup_calc_triggered') @QtCore.pyqtSlot(name='on_action_coup_calc_triggered')
def coupling_dialog(self): def coupling_dialog(self):
@ -984,13 +985,21 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
@QtCore.pyqtSlot(name='on_actionFunction_editor_triggered') @QtCore.pyqtSlot(name='on_actionFunction_editor_triggered')
def edit_models(self): def edit_models(self):
if self.editor is None: if self.editor is None:
from ..lib.usermodeleditor import QUsermodelEditor from ..editors.usermodeleditor import QUsermodelEditor
self.editor = QUsermodelEditor(config_paths() / 'usermodels.py', parent=self) self.editor = QUsermodelEditor(config_paths() / 'usermodels.py', parent=self)
self.editor.modelsChanged.connect(lambda: self.fit_dialog.read_and_load_functions()) self.editor.modelsChanged.connect(lambda: self.fit_dialog.read_and_load_functions())
self.editor.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal) self.editor.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
self.editor.show() self.editor.show()
@QtCore.pyqtSlot(name='on_actionUse_script_triggered')
def open_editor(self):
from ..editors.script_editor import QEditor
editor = QEditor(self.path, parent=self)
editor.runSignal.connect(self.management.run_script)
editor.show()
@QtCore.pyqtSlot(list, bool) @QtCore.pyqtSlot(list, bool)
def extend_fit(self, sets: list, only_subplots: bool): def extend_fit(self, sets: list, only_subplots: bool):
if only_subplots: if only_subplots:

View File

@ -542,7 +542,9 @@ class UpperManagement(QtCore.QObject):
elif fit_limits[0] == 'in': elif fit_limits[0] == 'in':
inside = np.where((_x >= fit_limits[1][0]) & (_x <= fit_limits[1][1])) inside = np.where((_x >= fit_limits[1][0]) & (_x <= fit_limits[1][1]))
else: else:
inside = np.where((_x < fit_limits[1][0]) | (_x > fit_limits[1][1])) x_lim, _ = self.graphs[self.current_graph].ranges
inside_graph = (_x >= x_lim[0]) & (_x <= x_lim[1])
inside = np.where(((_x < fit_limits[1][0]) | (_x > fit_limits[1][1])) & inside_graph)
try: try:
if isinstance(we, str): if isinstance(we, str):
@ -791,16 +793,27 @@ class UpperManagement(QtCore.QObject):
_active = self.graphs[self.current_graph].active _active = self.graphs[self.current_graph].active
new_datasets = {} new_datasets = {}
groupby = params.pop('groupby')
for sid in _active: for sid in _active:
data_i = self.data[sid] data_i = self.data[sid]
if data_i.group not in new_datasets:
new_datasets[data_i.group] = [], []
new_x_axis, _temp = new_datasets[data_i.group]
pts = data_i.points(params) pts = data_i.points(params)
if pts:
new_x_axis.append(data_i.value) if groupby == 'group':
_temp.append(pts) if data_i.group not in new_datasets:
new_datasets[data_i.group] = [], []
new_x_axis, _temp = new_datasets[data_i.group]
if pts:
new_x_axis.append(data_i.value)
_temp.append(pts)
else:
for (_x, _y, _yerr) in pts:
if _x not in new_datasets:
new_datasets[_x] = [], []
new_x_axis, _temp = new_datasets[_x]
new_x_axis.append(data_i.value)
_temp.append([[_x, _y, _yerr]])
key_list = [] key_list = []
for label, (new_x_axis, _temp) in new_datasets.items(): for label, (new_x_axis, _temp) in new_datasets.items():
@ -1033,7 +1046,7 @@ class UpperManagement(QtCore.QObject):
else: else:
data = self.data[sets[0]] data = self.data[sets[0]]
if isinstance(data.data, new_type): if isinstance(data.data, new_type):
error_list.append(f'{data.name} is alreade of type {new_type.__name__}') error_list.append(f'{data.name} is already of type {new_type.__name__}')
continue continue
new_data = new_type(data.x, np.zeros(data.x.size)) new_data = new_type(data.x, np.zeros(data.x.size))
@ -1067,6 +1080,8 @@ class UpperManagement(QtCore.QObject):
@QtCore.pyqtSlot(list, list, bool) @QtCore.pyqtSlot(list, list, bool)
def eval_expression(self, cmds: list, set_ids: list, overwrite: bool): def eval_expression(self, cmds: list, set_ids: list, overwrite: bool):
if self.namespace is None:
self.namespace = self.get_namespace()
ns = self.namespace.flatten() ns = self.namespace.flatten()
if overwrite: if overwrite:
@ -1099,13 +1114,28 @@ class UpperManagement(QtCore.QObject):
if failures: if failures:
err_msg = QtWidgets.QMessageBox(parent=self.sender()) err_msg = QtWidgets.QMessageBox(parent=self.sender())
err_msg.setText('One or more errors occured during evaluation.') err_msg.setText('One or more errors occurred during evaluation.')
err_msg.setDetailedText('\n'.join(f'{d.name} failed with error: {err.args}' for d, err in failures)) err_msg.setDetailedText('\n'.join(f'{d.name} failed with error: {err.args}' for d, err in failures))
err_msg.exec() err_msg.exec()
self.sender().success = not failures self.sender().success = not failures
self.sender().add_data(self.active_sets) self.sender().add_data(self.active_sets)
@QtCore.pyqtSlot(str)
def run_script(self, text):
self.namespace = self.get_namespace()
ns = self.namespace.flatten()
ns['return_list'] = []
# custom namespace must be available in global namespace of exec, otherwise imports do not work in functions
exec(text, ns, ns)
new_sets = []
for new_data in ns['return_list']:
new_sets.append(self.add(new_data))
self.newData.emit(new_sets, '')
@QtCore.pyqtSlot(list, dict) @QtCore.pyqtSlot(list, dict)
def create_from_function(self, cmds: list, opts: dict): def create_from_function(self, cmds: list, opts: dict):
ns = dict(self.namespace.flatten()) ns = dict(self.namespace.flatten())

View File

@ -273,9 +273,14 @@ class Points:
def length(self): def length(self):
return len(self._x) return len(self._x)
def points(self, idx: list = None, special: str = None, def points(
avg_range: tuple[int, int] = (0, 0), avg_mode: str = 'mean', self,
pts: list = None) -> list[tuple]: idx: list = None,
special: str = None,
avg_range: tuple[int, int] = (0, 0),
avg_mode: str = 'mean',
pts: list = None,
) -> list[tuple]:
""" """
Return (x, y) values at specified positions. Return (x, y) values at specified positions.
@ -294,7 +299,7 @@ class Points:
avg_range (tuple of int) : avg_range (tuple of int) :
Region for average of y values. Tuple (a, b) uses ``y[i-a:i+b+1]`` around index `i`. Default is (0, 0). Region for average of y values. Tuple (a, b) uses ``y[i-a:i+b+1]`` around index `i`. Default is (0, 0).
avg_mode (str {'mean', 'sum', 'integral'} , optional) : avg_mode (str {'mean', 'sum', 'integral', 'std'} , optional) :
Averaging type Averaging type
`mean` : Arithmetic average `mean` : Arithmetic average
@ -303,6 +308,8 @@ class Points:
'integral`: Integration over range using Simpson's rule 'integral`: Integration over range using Simpson's rule
'std': Standard deviation
pts (list, optional) : pts (list, optional) :
If given, points will be appended. If given, points will be appended.
@ -313,8 +320,8 @@ class Points:
if (idx is None) and (special is None): if (idx is None) and (special is None):
raise ValueError('Either `idx` or `special` must be given') raise ValueError('Either `idx` or `special` must be given')
if avg_mode not in ['mean', 'sum', 'integral']: if avg_mode not in ['mean', 'sum', 'integral', 'std']:
raise ValueError(f'Parameter `avg_mode` is `mean`, `sum`, `integral`, not `{avg_mode}`' ) raise ValueError(f'Parameter `avg_mode` is `mean`, `sum`, `integral`, `std`, not `{avg_mode}`' )
if pts is None: if pts is None:
pts = [] pts = []
@ -388,6 +395,10 @@ class Points:
y_mean = simpson(y[left:right].real, x=x[left:right]) y_mean = simpson(y[left:right].real, x=x[left:right])
y_err_mean = np.linalg.norm(cumulative_trapezoid(y_err[left:right].real, x=x[left:right])) y_err_mean = np.linalg.norm(cumulative_trapezoid(y_err[left:right].real, x=x[left:right]))
elif mode == 'std':
y_mean = np.std(y[left:right])
y_err_mean = 0.
else: else:
y_mean = y[idx].real y_mean = y[idx].real
y_err_mean = y_err[idx] y_err_mean = y_err[idx]

View File

@ -95,7 +95,7 @@ def _integrate_c(func, omega: np.ndarray, temperature: np.ndarray, tau0: float,
for o, t in product(omega, temperature): for o, t in product(omega, temperature):
c = (c_double * 5)(o, tau0, e_m, e_b, t) c = (c_double * 5)(o, tau0, e_m, e_b, t)
user_data = cast(pointer(c), c_void_p) user_data = cast(pointer(c), c_void_p)
area = quad(LowLevelCallable(func, user_data), 0, np.infty, epsabs=1e-13)[0] area = quad(LowLevelCallable(func, user_data), 0, np.inf, epsabs=1e-13)[0]
res.append(area) res.append(area)
@ -111,7 +111,7 @@ def _integrate_py(func, axis, temp, tau0, e_m, e_b):
e_axis = np.linspace(max(0., e_m - 50*e_b), e_m + 50*e_b, num=5001) e_axis = np.linspace(max(0., e_m - 50*e_b), e_m + 50*e_b, num=5001)
ret_val = [] ret_val = []
for o, tt in product(x, temperature): for o, tt in product(x, temperature):
ret_val.append(simpson(func(e_axis, o, tau0, e_m, e_b, tt), e_axis)) ret_val.append(simpson(y=func(e_axis, o, tau0, e_m, e_b, tt), x=e_axis))
ret_val = np.array(ret_val).reshape(x.shape[0], temperature.shape[0]) ret_val = np.array(ret_val).reshape(x.shape[0], temperature.shape[0])

View File

@ -1,19 +1,31 @@
from __future__ import annotations
import numpy as np import numpy as np
from scipy import special as special from scipy import special as special
from ..utils import kB from ..utils import kB
class Weight2Phase: class Weight:
type = 'Line shape' type = 'Line shape'
name = 'Weighting factor' name = 'Weighting factor'
equation = r'A*[0.5 + 0.5 erf[(x-T_{0})/\DeltaT]] + A_{0}' equation = r'A * [0.5 \pm 0.5 erf[(x-T_{0})/\DeltaT]] + A_{0}'
params = ['T_{0}', r'\DeltaT', 'A', 'A_{0}'] params = ['T_{0}', r'\DeltaT', 'A', 'A_{0}']
choices = [('Direction', 'sign', {'increase': '+', 'decrease': '-'})]
bounds = [(0, None), (0, None), (None, None), (None, None)] bounds = [(0, None), (0, None), (None, None), (None, None)]
@staticmethod @staticmethod
def func(x, t0, dt, amp, off): def func(x: np.ndarray | float, t0: float, dt: float, amp: float, off: float, sign: str = '+') -> np.ndarray | float:
return amp*(0.5 + 0.5*special.erf((x-t0)/dt)) + off if sign not in '+-':
raise ValueError(f"`value` is `+` or `-`, not {sign}")
error_func = 1
if sign == '+':
error_func += special.erf((x-t0)/dt)
else:
error_func -= special.erf((x - t0) / dt)
return amp * error_func / 2. + off
class HendricksonBray: class HendricksonBray:
@ -24,5 +36,5 @@ class HendricksonBray:
bounds = [(0, None)] * 4 bounds = [(0, None)] * 4
@staticmethod @staticmethod
def func(x, a, b, e, w0): def func(x: np.ndarray | float, a: float, b: float, e: float, w0: float) -> np.ndarray | float:
return a*b / (b + (a-b)*np.exp(-e/kB/x)) + w0 return a*b / (b + (a-b)*np.exp(-e/kB/x)) + w0

View File

@ -3,11 +3,42 @@ try:
from scipy.integrate import simpson from scipy.integrate import simpson
except ImportError: except ImportError:
from scipy.integrate import simps as simpson from scipy.integrate import simps as simpson
from numpy import pi
from ..math.orientations import zcw_spherical as crystallites from ..math.orientations import zcw_spherical as crystallites
__all__ = ['CSA', 'Pake', 'SecCentralLine']
def _make_broadening(x: np.ndarray, sigma: float, mode: str):
dx = x[1] - x[0]
_x = np.arange(len(x)) * dx
_x -= 0.5 * _x[-1]
if mode == 'l':
apd = 2 * sigma / (4*_x**2 + sigma**2) / np.pi
else:
ln2 = np.log(2)
apd = np.exp(-4*ln2 * (_x/sigma)**2) * 2 * np.sqrt(ln2/np.pi) / sigma
return apd
def _make_bins(x: np.ndarray) -> np.ndarray:
bins = 0.5 * (x[1:] + x[:-1])
return np.r_[0.5 * (-x[1] + 3 * x[0]), bins, 0.5 * (3 * x[-1] - x[-2])]
def _make_x(x: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
_x = x
dx = x[1:] - x[:-1]
dx = np.min(dx)
width = x[-1] - x[0]
_x = np.arange(width/dx - 1) * dx + x[0]
bins = (_x[1:] + _x[:-1]) / 2
bins = np.r_[_x[0]-dx/2, bins, _x[-1] + dx/2]
return _x, bins
class Pake: class Pake:
type = 'Spectrum' type = 'Spectrum'
name = 'Pake' name = 'Pake'
@ -17,38 +48,39 @@ class Pake:
choices = [('Broadening', 'broad', {'Gaussian': 'g', 'Lorentzian': 'l'})] choices = [('Broadening', 'broad', {'Gaussian': 'g', 'Lorentzian': 'l'})]
@staticmethod @staticmethod
def func(x, c, delta, eta, sigma, t_pulse, broad='g'): def func(
x: np.ndarray,
c: float,
delta: float,
eta: float,
sigma: float,
t_pulse: float,
broad: str = 'g',
) -> np.ndarray:
a, b, _ = crystallites(100000) a, b, _ = crystallites(100000)
bins = 0.5 * (x[1:] + x[:-1])
bins = np.r_[0.5*(3*x[0]-x[1]), bins, 0.5*(3*x[-1]-x[-2])]
omega = delta * 0.5 * (3*np.cos(b)**2 - 1 - eta * np.sin(b)**2 * np.cos(2*a)) omega = delta * 0.5 * (3*np.cos(b)**2 - 1 - eta * np.sin(b)**2 * np.cos(2*a))
x_used, bins = _make_x(x)
s_left = np.histogram(omega, bins=bins)[0] s_left = np.histogram(omega, bins=bins)[0]
s_right = np.histogram(-omega, bins=bins)[0] s_right = np.histogram(-omega, bins=bins)[0]
s = s_left + s_right s = s_left + s_right
if sigma != 0: if sigma != 0:
_x = np.arange(len(x))*(x[1]-x[0]) apd = _make_broadening(x_used, sigma, broad)
_x -= 0.5*_x[-1]
if broad == 'l':
apd = 2 * sigma / (4 * _x**2 + sigma**2) / pi
else:
apd = np.exp(-4 * np.log(2) * (_x/sigma)**2) * 2 * np.sqrt(np.log(2) / pi) / sigma
ret_val = np.convolve(s, apd, mode='same') ret_val = np.convolve(s, apd, mode='same')
else: else:
ret_val = s ret_val = s
omega_1 = pi/2/t_pulse omega_1 = np.pi/2/t_pulse
attn = omega_1 * np.sin(t_pulse*np.sqrt(omega_1**2+0.5*(2*pi*x)**2)) / \ attn = omega_1 * np.sin(t_pulse*np.sqrt(omega_1**2 + 0.5*(2*np.pi*x_used)**2)) / np.sqrt(omega_1**2 + (np.pi*x_used)**2)
np.sqrt(omega_1**2+(np.pi*x)**2)
ret_val *= attn ret_val *= attn
ret_val /= simpson(y=ret_val, x=x_used)
return c * ret_val / simpson(ret_val, x) if x_used.size == x.size:
return c * ret_val
else:
return c * np.interp(x=x, xp=x_used, fp=ret_val)
class CSA: class CSA:
@ -60,28 +92,29 @@ class CSA:
choices = [('Broadening', 'broad', {'Gaussian': 'g', 'Lorentzian': 'l'})] choices = [('Broadening', 'broad', {'Gaussian': 'g', 'Lorentzian': 'l'})]
@staticmethod @staticmethod
def func(x, c, delta, eta, w_iso, sigma, broad='g'): def func(
x: np.ndarray,
c: float,
delta: float,
eta: float,
w_iso: float,
sigma: float,
broad: str = 'g',
) -> np.ndarray:
a, b, _ = crystallites(100000) a, b, _ = crystallites(100000)
bins = 0.5 * (x[1:] + x[:-1])
bins = np.r_[0.5*(-x[1] + 3*x[0]), bins, 0.5*(3*x[-1] - x[-2])]
omega = w_iso + delta * 0.5 * (3*np.cos(b)**2 - 1 - eta * np.sin(b)**2 * np.cos(2*a)) omega = w_iso + delta * 0.5 * (3*np.cos(b)**2 - 1 - eta * np.sin(b)**2 * np.cos(2*a))
s_left = np.histogram(omega, bins=bins)[0] s = np.histogram(omega, bins=_make_bins(x))[0]
s = s_left
if sigma != 0: if sigma != 0:
_x = np.arange(len(x)) * (x[1] - x[0]) print(len(s))
_x -= 0.5 * _x[-1] apd = _make_broadening(x, sigma, broad)
if broad == 'l':
apd = 2 * sigma / (4*_x**2 + sigma**2) / pi
else:
apd = np.exp(-4 * np.log(2) * (_x / sigma) ** 2) * 2 * np.sqrt(np.log(2) / pi) / sigma
ret_val = np.convolve(s, apd, mode='same') ret_val = np.convolve(s, apd, mode='same')
else: else:
ret_val = s ret_val = s
return c * ret_val / simpson(ret_val, x) return c * ret_val / simpson(y=ret_val, x=x)
class SecCentralLine: class SecCentralLine:
@ -94,10 +127,18 @@ class SecCentralLine:
('Broadening', 'broad', {'Gaussian': 'g', 'Lorentzian': 'l'})] ('Broadening', 'broad', {'Gaussian': 'g', 'Lorentzian': 'l'})]
@staticmethod @staticmethod
def func(x, c, cq, eta, f_iso, gb, f_l, spin=2.5, broad='g'): def func(
x: np.ndarray,
c: float,
cq: float,
eta: float,
f_iso: float,
gb: float,
f_l: float,
spin: float = 2.5,
broad: str = 'g',
) -> np.ndarray:
a, b, _ = crystallites(200000) a, b, _ = crystallites(200000)
bins = 0.5 * (x[1:] + x[:-1])
bins = np.r_[0.5*(-x[1] + 3*x[0]), bins, 0.5*(3*x[-1] - x[-2])]
# coupling constant # coupling constant
omega_q = 2 * np.pi * cq / (2*spin*(2*spin-1)) omega_q = 2 * np.pi * cq / (2*spin*(2*spin-1))
@ -116,17 +157,12 @@ class SecCentralLine:
orient += prefactor_c orient += prefactor_c
omega = 2*np.pi*f_iso + coupling * orient omega = 2*np.pi*f_iso + coupling * orient
s = np.histogram(omega / (2*np.pi), bins=bins)[0] s = np.histogram(omega / (2*np.pi), bins=_make_bins(x))[0]
if gb != 0: if gb != 0:
_x = np.arange(len(x)) * (x[1]-x[0]) apd = _make_broadening(x, gb, broad)
_x -= 0.5*_x[-1]
if broad == 'l':
apd = 2*gb / (4*_x**2 + gb**2) / np.pi
else:
apd = np.exp(-4*np.log(2) * (_x/gb)**2) * 2 * np.sqrt(np.log(2)/np.pi) / gb
ret_val = np.convolve(s, apd, mode='same') ret_val = np.convolve(s, apd, mode='same')
else: else:
ret_val = s ret_val = s
return c * ret_val / simpson(ret_val, x) return c * ret_val / simpson(y=ret_val, x=x)

View File

@ -336,7 +336,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Token:&lt;br/&gt;[abc]: Matches any of a, b, or c&lt;br/&gt;[a-z]: Matches any digit in the range a-z&lt;br/&gt;\d: Matches any digit in the range 0-9 (equal to [0-9}&lt;/p&gt;&lt;p&gt;Quantifiers:&lt;br/&gt;a*: 0 or more of a&lt;br/&gt;a*: 1 or more of a&lt;br/&gt;a?: 0 or 1 of a&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Token:&lt;br/&gt;[abc]: Matches any of a, b, or c&lt;br/&gt;[a-z]: Matches any digit in the range a-z&lt;br/&gt;\d: Matches any digit in the range 0-9 (equal to [0-9}&lt;/p&gt;&lt;p&gt;Quantifiers:&lt;br/&gt;a+: 0 or more of a&lt;br/&gt;a*: 1 or more of a&lt;br/&gt;a?: 0 or 1 of a&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -192,6 +192,7 @@
<addaction name="menuCut_to_visible_range"/> <addaction name="menuCut_to_visible_range"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionChange_datatypes"/> <addaction name="actionChange_datatypes"/>
<addaction name="actionUse_script"/>
</widget> </widget>
<widget class="QMenu" name="menuHelp"> <widget class="QMenu" name="menuHelp">
<property name="title"> <property name="title">
@ -1049,6 +1050,11 @@
<string>Remove data points outside visible y range. Uses real part of points.</string> <string>Remove data points outside visible y range. Uses real part of points.</string>
</property> </property>
</action> </action>
<action name="actionUse_script">
<property name="text">
<string>Use script...</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>

View File

@ -25,10 +25,50 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QFormLayout" name="formLayout">
<property name="verticalSpacing"> <property name="verticalSpacing">
<number>12</number> <number>12</number>
</property> </property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>National No.</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="nationaldex_label">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_1">
<property name="text">
<string>Species</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="species_label">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
@ -57,51 +97,13 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="5" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Weight</string> <string>Abilities</string>
</property> </property>
</widget> <property name="alignment">
</item> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<item row="7" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Height</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="height_label">
<property name="text">
<string>0.0 m</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="weight_label">
<property name="text">
<string>0.0 kg</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_1">
<property name="text">
<string>Species</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -130,44 +132,41 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="1" column="1"> <item row="4" column="0">
<widget class="QLabel" name="species_label"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>TextLabel</string> <string>Height</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="4" column="1">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="height_label">
<property name="text"> <property name="text">
<string>Abilities</string> <string>0.0 m</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0" colspan="2"> <item row="5" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Weight</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="weight_label">
<property name="text">
<string>0.0 kg</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="gender_label"> <widget class="QLabel" name="gender_label">
<property name="text"> <property name="text">
<string>TextLabel</string> <string>TextLabel</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>National No.</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="nationaldex_label">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -414,24 +413,46 @@ QProgressBar::chunk {
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<widget class="QLabel" name="evolution_bar"> <widget class="QTableWidget" name="tableWidget">
<property name="frameShape"> <property name="styleSheet">
<enum>QFrame::NoFrame</enum> <string notr="true">background-color: transparent;</string>
</property> </property>
<property name="frameShadow"> <property name="editTriggers">
<enum>QFrame::Raised</enum> <set>QAbstractItemView::NoEditTriggers</set>
</property> </property>
<property name="lineWidth"> <property name="showGrid">
<number>0</number> <bool>false</bool>
</property> </property>
<property name="text"> <property name="gridStyle">
<string>TextLabel</string> <enum>Qt::NoPen</enum>
</property> </property>
<property name="wordWrap">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1526</width> <width>1687</width>
<height>991</height> <height>991</height>
</rect> </rect>
</property> </property>
@ -14,13 +14,46 @@
<string>Gotta catch 'em all!</string> <string>Gotta catch 'em all!</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="1"> <item row="0" column="2">
<widget class="QComboBox" name="comboBox"/> <widget class="QPushButton" name="pushButton">
<property name="text">
<string>Random</string>
</property>
</widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QComboBox" name="comboBox_2"/> <widget class="QComboBox" name="comboBox_2"/>
</item> </item>
<item row="2" column="0" colspan="2"> <item row="0" column="1">
<widget class="QComboBox" name="comboBox"/>
</item>
<item row="0" column="4">
<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>
<item row="0" column="3">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
<item row="1" column="0" colspan="5">
<widget class="QSplitter" name="splitter"> <widget class="QSplitter" name="splitter">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -150,19 +183,18 @@
</column> </column>
</widget> </widget>
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="minimumSize">
<size>
<width>418</width>
<height>0</height>
</size>
</property>
<property name="currentIndex"> <property name="currentIndex">
<number>-1</number> <number>-1</number>
</property> </property>
</widget> </widget>
</widget> </widget>
</item> </item>
<item row="3" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>

View File

@ -6,27 +6,25 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>316</width> <width>417</width>
<height>747</height> <height>746</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QGridLayout" name="gridLayout">
<property name="leftMargin"> <item row="0" column="0" colspan="2">
<number>3</number> <widget class="QLabel" name="label_2">
</property> <property name="text">
<property name="topMargin"> <string>Selected points and regions</string>
<number>3</number> </property>
</property> <property name="buddy">
<property name="rightMargin"> <cstring>peaktable</cstring>
<number>3</number> </property>
</property> </widget>
<property name="bottomMargin"> </item>
<number>3</number> <item row="1" column="0" colspan="2">
</property>
<item>
<widget class="QListWidget" name="peaktable"> <widget class="QListWidget" name="peaktable">
<property name="toolTip"> <property name="toolTip">
<string>Edit by entering new value: <string>Edit by entering new value:
@ -39,230 +37,268 @@ Changing between regions and points is NOT possible</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item row="3" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QCheckBox" name="special_checkbox">
<property name="title"> <property name="text">
<string>Average</string> <string>Use special value</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>3</number>
</property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item>
<widget class="QSpinBox" name="left_pt">
<property name="suffix">
<string> pts</string>
</property>
<property name="prefix">
<string>- </string>
</property>
<property name="maximum">
<number>999</number>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="right_pt">
<property name="suffix">
<string> pts</string>
</property>
<property name="prefix">
<string>+ </string>
</property>
<property name="maximum">
<number>999</number>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="average_combobox">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Mean</string>
</property>
</item>
<item>
<property name="text">
<string>Sum</string>
</property>
</item>
<item>
<property name="text">
<string>Integral</string>
</property>
</item>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
<item> <item row="3" column="1">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QComboBox" name="special_comboBox">
<property name="title"> <property name="enabled">
<string>Special value</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool> <bool>false</bool>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_5"> <property name="toolTip">
<property name="spacing"> <string>Automatic selection of respective points</string>
<number>2</number>
</property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item>
<widget class="QComboBox" name="special_comboBox">
<property name="toolTip">
<string>Automatic selection of respective points</string>
</property>
<item>
<property name="text">
<string>max(y)</string>
</property>
</item>
<item>
<property name="text">
<string>max(abs(y))</string>
</property>
</item>
<item>
<property name="text">
<string>min(y)</string>
</property>
</item>
<item>
<property name="text">
<string>min(abs(y))</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Result</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<property name="spacing">
<number>3</number>
</property>
<item row="0" column="0">
<widget class="QCheckBox" name="xbutton">
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="ybutton">
<property name="text">
<string>y</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="graph_checkbox">
<property name="text">
<string>New graph?</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="graph_combobox">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>2</number>
</property>
<property name="topMargin">
<number>0</number>
</property> </property>
<item> <item>
<widget class="QPushButton" name="okButton"> <property name="text">
<string>max(y)</string>
</property>
</item>
<item>
<property name="text">
<string>max(abs(y))</string>
</property>
</item>
<item>
<property name="text">
<string>min(y)</string>
</property>
</item>
<item>
<property name="text">
<string>min(abs(y))</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>30</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Region around points</string>
</property>
</widget>
</item>
<item row="5" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="left_limit"/>
</item>
<item>
<widget class="QLineEdit" name="right_limit"/>
</item>
<item>
<widget class="QComboBox" name="limit_combobox">
<item>
<property name="text">
<string>points</string>
</property>
</item>
<item>
<property name="text">
<string>range</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Aggregation</string>
</property>
<property name="buddy">
<cstring>average_combobox</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="average_combobox">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Mean</string>
</property>
</item>
<item>
<property name="text">
<string>Sum</string>
</property>
</item>
<item>
<property name="text">
<string>Integral</string>
</property>
</item>
<item>
<property name="text">
<string>Std. deviation</string>
</property>
</item>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>New set based on</string>
</property>
<property name="buddy">
<cstring>xbutton</cstring>
</property>
</widget>
</item>
<item row="7" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="xbutton">
<property name="text"> <property name="text">
<string>Apply</string> <string>x</string>
</property>
<property name="icon">
<iconset theme="dialog-ok">
<normaloff>.</normaloff>.</iconset>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="deleteButton"> <widget class="QCheckBox" name="ybutton">
<property name="text"> <property name="text">
<string>Delete selected</string> <string>y</string>
</property> </property>
<property name="icon"> <property name="checked">
<iconset theme="dialog-cancel"> <bool>true</bool>
<normaloff>.</normaloff>.</iconset>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item row="8" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Group by</string>
</property>
<property name="buddy">
<cstring>group_box</cstring>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QComboBox" name="group_box">
<item>
<property name="text">
<string>&quot;Group&quot; value</string>
</property>
</item>
<item>
<property name="text">
<string>x value</string>
</property>
</item>
</widget>
</item>
<item row="9" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="graph_checkbox">
<property name="text">
<string>New graph?</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QComboBox" name="graph_combobox">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="12" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="11" column="0" colspan="2">
<widget class="QPushButton" name="okButton">
<property name="text">
<string>Apply</string>
</property>
<property name="icon">
<iconset theme="dialog-ok">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QPushButton" name="deleteButton">
<property name="text">
<string>Delete selection</string>
</property>
<property name="icon">
<iconset theme="dialog-cancel">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<tabstops>
<tabstop>peaktable</tabstop>
<tabstop>limit_combobox</tabstop>
<tabstop>average_combobox</tabstop>
<tabstop>xbutton</tabstop>
<tabstop>ybutton</tabstop>
<tabstop>group_box</tabstop>
<tabstop>graph_checkbox</tabstop>
<tabstop>graph_combobox</tabstop>
</tabstops>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>