dev #291
@@ -17,7 +17,7 @@ class DataTree(QtWidgets.QTreeWidget):
 | 
				
			|||||||
    moveItem = QtCore.pyqtSignal(list, str, str, int)  # items, from, to, new row
 | 
					    moveItem = QtCore.pyqtSignal(list, str, str, int)  # items, from, to, new row
 | 
				
			||||||
    copyItem = QtCore.pyqtSignal(list, str)
 | 
					    copyItem = QtCore.pyqtSignal(list, str)
 | 
				
			||||||
    saveFits = QtCore.pyqtSignal(list)
 | 
					    saveFits = QtCore.pyqtSignal(list)
 | 
				
			||||||
    extendFits = QtCore.pyqtSignal(list)
 | 
					    extendFits = QtCore.pyqtSignal(list, bool)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # noinspection PyUnresolvedReferences
 | 
					    # noinspection PyUnresolvedReferences
 | 
				
			||||||
    def __init__(self, parent=None):
 | 
					    def __init__(self, parent=None):
 | 
				
			||||||
@@ -465,7 +465,7 @@ class DataTree(QtWidgets.QTreeWidget):
 | 
				
			|||||||
        del_action = menu.addAction('Exterminate sets')
 | 
					        del_action = menu.addAction('Exterminate sets')
 | 
				
			||||||
        cp_action = menu.addAction('Replicate sets')
 | 
					        cp_action = menu.addAction('Replicate sets')
 | 
				
			||||||
        cat_action = menu.addAction('Join us!')
 | 
					        cat_action = menu.addAction('Join us!')
 | 
				
			||||||
        plt_action = save_action = extend_action = None
 | 
					        plt_action = save_action = extend_action = subfit_action = None
 | 
				
			||||||
        menu.addSeparator()
 | 
					        menu.addSeparator()
 | 
				
			||||||
        col_menu = menu.addMenu('Color cycle')
 | 
					        col_menu = menu.addMenu('Color cycle')
 | 
				
			||||||
        for c in available_cycles.keys():
 | 
					        for c in available_cycles.keys():
 | 
				
			||||||
@@ -497,6 +497,7 @@ class DataTree(QtWidgets.QTreeWidget):
 | 
				
			|||||||
            plt_action = menu.addAction('Plot fit parameter')
 | 
					            plt_action = menu.addAction('Plot fit parameter')
 | 
				
			||||||
            save_action = menu.addAction('Save fit parameter')
 | 
					            save_action = menu.addAction('Save fit parameter')
 | 
				
			||||||
            extend_action = menu.addAction('Extrapolate fit')
 | 
					            extend_action = menu.addAction('Extrapolate fit')
 | 
				
			||||||
 | 
					            subfit_action = menu.addAction('Plot partial functions')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        action = menu.exec(evt.globalPos())
 | 
					        action = menu.exec(evt.globalPos())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -504,6 +505,9 @@ class DataTree(QtWidgets.QTreeWidget):
 | 
				
			|||||||
        for gid, sets in idx.items():
 | 
					        for gid, sets in idx.items():
 | 
				
			||||||
            s.extend(sets)
 | 
					            s.extend(sets)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if action is None:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if action == del_action:
 | 
					        if action == del_action:
 | 
				
			||||||
            self.management.delete_sets(s)
 | 
					            self.management.delete_sets(s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -521,7 +525,10 @@ class DataTree(QtWidgets.QTreeWidget):
 | 
				
			|||||||
            self.saveFits.emit(s)
 | 
					            self.saveFits.emit(s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif action == extend_action:
 | 
					        elif action == extend_action:
 | 
				
			||||||
            self.extendFits.emit(s)
 | 
					            self.extendFits.emit(s, False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        elif action == subfit_action:
 | 
				
			||||||
 | 
					            self.extendFits.emit(s, True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif action.parent() == col_menu:
 | 
					        elif action.parent() == col_menu:
 | 
				
			||||||
            self.management.set_cycle(s, action.text())
 | 
					            self.management.set_cycle(s, action.text())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -991,15 +991,19 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
 | 
				
			|||||||
            self.editor.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
 | 
					            self.editor.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
 | 
				
			||||||
        self.editor.show()
 | 
					        self.editor.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @QtCore.pyqtSlot(list)
 | 
					    @QtCore.pyqtSlot(list, bool)
 | 
				
			||||||
    def extend_fit(self, sets: list):
 | 
					    def extend_fit(self, sets: list, only_subplots: bool):
 | 
				
			||||||
 | 
					        if only_subplots:
 | 
				
			||||||
 | 
					            self.management.extend_fits(sets, None, True)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        w = FitExtension(self)
 | 
					        w = FitExtension(self)
 | 
				
			||||||
        res = w.exec()
 | 
					        res = w.exec()
 | 
				
			||||||
        if res:
 | 
					        if res:
 | 
				
			||||||
            p = w.values
 | 
					            p = w.values
 | 
				
			||||||
            spacefunc = geomspace if p[3] else linspace
 | 
					            spacefunc = geomspace if p[3] else linspace
 | 
				
			||||||
            x = spacefunc(p[0], p[1], num=p[2])
 | 
					            x = spacefunc(p[0], p[1], num=p[2])
 | 
				
			||||||
            self.management.extend_fits(sets, x)
 | 
					            self.management.extend_fits(sets, x, False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @QtCore.pyqtSlot(name='on_action_create_fit_function_triggered')
 | 
					    @QtCore.pyqtSlot(name='on_action_create_fit_function_triggered')
 | 
				
			||||||
    def open_fitmodel_wizard(self):
 | 
					    def open_fitmodel_wizard(self):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -711,16 +711,20 @@ class UpperManagement(QtCore.QObject):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.newData.emit(f_id_list, gid)
 | 
					        self.newData.emit(f_id_list, gid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def extend_fits(self, set_id: list, x_range: np.ndarray):
 | 
					    def extend_fits(self, set_id: list, x_range: np.ndarray | None, only_subplots: bool):
 | 
				
			||||||
        graphs = {}
 | 
					        graphs = {}
 | 
				
			||||||
        for sid in set_id:
 | 
					        for sid in set_id:
 | 
				
			||||||
            data = self[sid]
 | 
					            data = fit = self[sid]
 | 
				
			||||||
            fit = data.copy(full=True, keep_color=True)
 | 
					 | 
				
			||||||
            fit.data = fit.data.with_new_x(x_range)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            graph_id = data.graph
 | 
					            graph_id = data.graph
 | 
				
			||||||
            if graph_id not in graphs:
 | 
					            if graph_id not in graphs:
 | 
				
			||||||
                graphs[graph_id] = []
 | 
					                graphs[graph_id] = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if not only_subplots:
 | 
				
			||||||
 | 
					                fit = data.copy(full=True, keep_color=True)
 | 
				
			||||||
 | 
					                if x_range is not None:
 | 
				
			||||||
 | 
					                    fit.data = fit.data.with_new_x(x_range)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                graphs[graph_id].append(self.add(fit))
 | 
					                graphs[graph_id].append(self.add(fit))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            color_scheme = available_cycles['colorblind']
 | 
					            color_scheme = available_cycles['colorblind']
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user