Exemple #1
0
 def __init__(self, model, parent=None):
     '''
     Constructor
     '''
     super(SmoothfitWidget, self).__init__(parent)
     self._ui = Ui_SmoothfitWidget()
     self._ui.setupUi(self)
     self._ui.sceneviewerWidget.setContext(model.getContext())
     self._ui.sceneviewerWidget.setModel(model)
     self._model = model
     self._model.setAlignSettingsChangeCallback(self._alignSettingsDisplay)
     self._model.setFitSettingsChangeCallback(self._fitSettingsDisplay)
     self._ui.sceneviewerWidget.graphicsInitialized.connect(
         self._graphicsInitialized)
     self._scene = None
     self._callback = None
     self._makeConnections()
 def __init__(self, model, parent=None):
     '''
     Constructor
     '''
     super(SmoothfitWidget, self).__init__(parent)
     self._ui = Ui_SmoothfitWidget()
     self._ui.setupUi(self)
     self._ui.sceneviewerWidget.setContext(model.getContext())
     self._ui.sceneviewerWidget.setModel(model)
     self._model = model
     self._model.setAlignSettingsChangeCallback(self._alignSettingsDisplay)
     self._model.setFitSettingsChangeCallback(self._fitSettingsDisplay)
     self._ui.sceneviewerWidget.graphicsInitialized.connect(self._graphicsInitialized)
     self._scene = None
     self._callback = None
     self._makeConnections()
Exemple #3
0
class SmoothfitWidget(QtGui.QWidget):
    '''
    classdocs
    '''
    def __init__(self, model, parent=None):
        '''
        Constructor
        '''
        super(SmoothfitWidget, self).__init__(parent)
        self._ui = Ui_SmoothfitWidget()
        self._ui.setupUi(self)
        self._ui.sceneviewerWidget.setContext(model.getContext())
        self._ui.sceneviewerWidget.setModel(model)
        self._model = model
        self._model.setAlignSettingsChangeCallback(self._alignSettingsDisplay)
        self._model.setFitSettingsChangeCallback(self._fitSettingsDisplay)
        self._ui.sceneviewerWidget.graphicsInitialized.connect(
            self._graphicsInitialized)
        self._scene = None
        self._callback = None
        self._makeConnections()

    def _graphicsInitialized(self):
        '''
        Callback for when SceneviewerWidget is initialised
        Set custom scene from model
        '''
        sceneviewer = self._ui.sceneviewerWidget.getSceneviewer()
        if sceneviewer is not None:
            scene = self._model.getRegion().getScene()
            sceneviewer.setScene(scene)
            sceneviewer.viewAll()

    def _makeConnections(self):
        self._ui.doneButton.clicked.connect(self._doneButtonClicked)
        self._ui.viewAllButton.clicked.connect(self._viewAllButtonClicked)
        self._ui.toolBox.currentChanged.connect(self._toolBoxPageChange)
        self._ui.alignLoadButton.clicked.connect(self._alignLoadButtonClicked)
        self._ui.alignSaveButton.clicked.connect(self._alignSaveButtonClicked)
        self._ui.alignScaleLineEdit.editingFinished.connect(
            self._alignScaleEntered)
        self._ui.alignRotationLineEdit.editingFinished.connect(
            self._alignRotationEntered)
        self._ui.alignOffsetLineEdit.editingFinished.connect(
            self._alignOffsetEntered)
        self._ui.alignMirrorCheckBox.clicked.connect(self._alignMirrorClicked)
        self._ui.alignResetButton.clicked.connect(
            self._alignResetButtonClicked)
        self._ui.alignAutoCentreButton.clicked.connect(
            self._alignAutoCentreButtonClicked)
        self._ui.projectClearButton.clicked.connect(
            self._projectClearButtonClicked)
        self._ui.projectPointsButton.clicked.connect(
            self._projectPointsButtonClicked)
        self._ui.filterTopErrorPushButton.clicked.connect(
            self._filterTopErrorClicked)
        self._ui.filterTopErrorProportionLineEdit.editingFinished.connect(
            self._filterTopErrorProportionEntered)
        self._ui.filterNonNormalPushButton.clicked.connect(
            self._filterNonNormalClicked)
        self._ui.filterNonNormalProjectionLimitLineEdit.editingFinished.connect(
            self._filterNonNormalProjectionLimitEntered)
        self._ui.fitLoadButton.clicked.connect(self._fitLoadButtonClicked)
        self._ui.fitSaveButton.clicked.connect(self._fitSaveButtonClicked)
        self._ui.fitStrainPenaltyLineEdit.editingFinished.connect(
            self._fitStrainPenaltyEntered)
        self._ui.fitEdgeDiscontinuityPenaltyLineEdit.editingFinished.connect(
            self._fitEdgeDiscontinuityPenaltyEntered)
        self._ui.fitMaxIterationsSpinBox.valueChanged.connect(
            self._fitMaxIterationsValueChanged)
        self._ui.fitPerformButton.clicked.connect(
            self._fitPerformButtonClicked)

    def clear(self):
        self._scene = None
        self._model.clear()

    def initialise(self):
        self._model.initialise()
        self._scene = self._model.getRegion().getScene()
        self._setupUi()
        self._graphicsInitialized()

    def setEnableSettingsSave(self, isEnabled):
        self._ui.alignSaveButton.setEnabled(isEnabled)
        self._ui.fitSaveButton.setEnabled(isEnabled)

    def getModel(self):
        return self._model

    def _displayReal(self, widget, value):
        newText = '{:.4g}'.format(value)
        widget.setText(newText)

    def _parseRealNonNegative(self, widget, currentValue):
        newValue = currentValue
        try:
            value = float(widget.text())
            if value < 0.0:
                raise ValueError("Value must be >= 0")
            newValue = value
        except:
            print("Value must be >= 0")
        self._displayReal(widget, newValue)
        return newValue

    def _parseRealZeroToOne(self, widget, currentValue):
        newValue = currentValue
        try:
            value = float(widget.text())
            if (value < 0.0) or (value > 1.0):
                raise ValueError("Value must be from 0 to 1")
            newValue = value
        except:
            print("Value must be from 0 to 1")
        self._displayReal(widget, newValue)
        return newValue

    def _displayVector(self, widget, values, numberFormat='{:.4g}'):
        '''
        Display real vector values in a widget
        '''
        newText = ", ".join(numberFormat.format(value) for value in values)
        widget.setText(newText)

    def _parseVector3(self, widget):
        '''
        Return real vector from comma separated text in line edit widget
        '''
        text = widget.text()
        values = [float(value) for value in text.split(',')]
        if len(values) != 3:
            raise ValueError('Not 3 values')
        return values

    def _setupUi(self):
        self._ui.toolBox.setCurrentIndex(0)
        self._alignSettingsDisplay()
        self._fitSettingsDisplay()

    def _alignSettingsDisplay(self):
        self._displayReal(self._ui.alignScaleLineEdit,
                          self._model.getAlignScale())
        self._displayVector(self._ui.alignRotationLineEdit,
                            self._model.getAlignEulerAngles())
        self._displayVector(self._ui.alignOffsetLineEdit,
                            self._model.getAlignOffset())
        self._ui.alignMirrorCheckBox.setCheckState(
            QtCore.Qt.Checked if self._model.isAlignMirror(
            ) else QtCore.Qt.Unchecked)

    def _fitSettingsDisplay(self):
        self._displayReal(self._ui.filterTopErrorProportionLineEdit,
                          self._model.getFilterTopErrorProportion())
        self._displayReal(self._ui.filterNonNormalProjectionLimitLineEdit,
                          self._model.getFilterNonNormalProjectionLimit())
        self._displayReal(self._ui.fitStrainPenaltyLineEdit,
                          self._model.getFitStrainPenalty())
        self._displayReal(self._ui.fitEdgeDiscontinuityPenaltyLineEdit,
                          self._model.getFitEdgeDiscontinuityPenalty())
        self._ui.fitMaxIterationsSpinBox.setValue(
            self._model.getFitMaxIterations())

    def registerDoneExecution(self, callback):
        self._callback = callback

    def _doneButtonClicked(self):
        self._model.setStatePostAlign(
        )  # ensure model is transformed; does nothing if not in align tab
        self._model.writeOutputModel()
        #sceneviewer = self._ui.sceneviewerWidget.getSceneviewer()
        #sceneviewer.setScene(Scene())
        self._ui.dockWidget.setFloating(False)
        self._callback()

    def _viewAllButtonClicked(self):
        self._ui.sceneviewerWidget.viewAll()

    def _toolBoxPageChange(self, page):
        if page == 0:
            self._model.setStateAlign()
        else:
            self._model.setStatePostAlign()

    def _alignLoadButtonClicked(self):
        self._model.loadAlignSettings()

    def _alignSaveButtonClicked(self):
        self._model.saveAlignSettings()

    def _alignScaleEntered(self):
        self._model.setAlignScale(
            self._parseRealNonNegative(self._ui.alignScaleLineEdit,
                                       self._model.getAlignScale()))

    def _alignRotationEntered(self):
        try:
            eulerAngles = self._parseVector3(self._ui.alignRotationLineEdit)
            self._model.setAlignEulerAngles(eulerAngles)
        except:
            print("Invalid model rotation Euler angles entered")
            self._alignSettingsDisplay()

    def _alignOffsetEntered(self):
        try:
            offset = self._parseVector3(self._ui.alignOffsetLineEdit)
            self._model.setAlignOffset(offset)
        except:
            print("Invalid model offset entered")
            self._alignSettingsDisplay()

    def _alignMirrorClicked(self):
        state = self._ui.alignMirrorCheckBox.checkState()
        self._model.setAlignMirror(state == QtCore.Qt.Checked)

    def _alignResetButtonClicked(self):
        self._model.resetAlignment()

    def _alignAutoCentreButtonClicked(self):
        self._model.autoCentreModelOnData()

    def _projectClearButtonClicked(self):
        self._model.clearDataProjections()

    def _projectPointsButtonClicked(self):
        self._model.calculateDataProjections()

    def _filterTopErrorClicked(self):
        self._model.filterTopError()

    def _filterTopErrorProportionEntered(self):
        self._model.setFilterTopErrorProportion(
            self._parseRealZeroToOne(
                self._ui.filterTopErrorProportionLineEdit,
                self._model.getFilterTopErrorProportion()))

    def _filterNonNormalClicked(self):
        self._model.filterNonNormal()

    def _filterNonNormalProjectionLimitEntered(self):
        self._model.setFilterNonNormalProjectionLimit(
            self._parseRealZeroToOne(
                self._ui.filterNonNormalProjectionLimitLineEdit,
                self._model.getFilterNonNormalProjectionLimit()))

    def _fitLoadButtonClicked(self):
        self._model.loadFitSettings()

    def _fitSaveButtonClicked(self):
        self._model.saveFitSettings()

    def _fitStrainPenaltyEntered(self):
        self._model.setFitStrainPenalty(
            self._parseRealNonNegative(self._ui.fitStrainPenaltyLineEdit,
                                       self._model.getFitStrainPenalty()))

    def _fitEdgeDiscontinuityPenaltyEntered(self):
        self._model.setFitEdgeDiscontinuityPenalty(
            self._parseRealNonNegative(
                self._ui.fitEdgeDiscontinuityPenaltyLineEdit,
                self._model.getFitEdgeDiscontinuityPenalty()))

    def _fitMaxIterationsValueChanged(self, value):
        self._model.setFitMaxIterations(value)

    def _fitPerformButtonClicked(self):
        self._model.fit()
class SmoothfitWidget(QtGui.QWidget):
    '''
    classdocs
    '''


    def __init__(self, model, parent=None):
        '''
        Constructor
        '''
        super(SmoothfitWidget, self).__init__(parent)
        self._ui = Ui_SmoothfitWidget()
        self._ui.setupUi(self)
        self._ui.sceneviewerWidget.setContext(model.getContext())
        self._ui.sceneviewerWidget.setModel(model)
        self._model = model
        self._model.setAlignSettingsChangeCallback(self._alignSettingsDisplay)
        self._model.setFitSettingsChangeCallback(self._fitSettingsDisplay)
        self._ui.sceneviewerWidget.graphicsInitialized.connect(self._graphicsInitialized)
        self._scene = None
        self._callback = None
        self._makeConnections()

    def _graphicsInitialized(self):
        '''
        Callback for when SceneviewerWidget is initialised
        Set custom scene from model
        '''
        sceneviewer = self._ui.sceneviewerWidget.getSceneviewer()
        if sceneviewer is not None:
            scene = self._model.getRegion().getScene()
            sceneviewer.setScene(scene)
            sceneviewer.viewAll()

    def _makeConnections(self):
        self._ui.doneButton.clicked.connect(self._doneButtonClicked)
        self._ui.viewAllButton.clicked.connect(self._viewAllButtonClicked)
        self._ui.toolBox.currentChanged.connect(self._toolBoxPageChange)
        self._ui.alignLoadButton.clicked.connect(self._alignLoadButtonClicked)
        self._ui.alignSaveButton.clicked.connect(self._alignSaveButtonClicked)
        self._ui.alignScaleLineEdit.editingFinished.connect(self._alignScaleEntered)
        self._ui.alignRotationLineEdit.editingFinished.connect(self._alignRotationEntered)
        self._ui.alignOffsetLineEdit.editingFinished.connect(self._alignOffsetEntered)
        self._ui.alignMirrorCheckBox.clicked.connect(self._alignMirrorClicked)
        self._ui.alignResetButton.clicked.connect(self._alignResetButtonClicked)
        self._ui.alignAutoCentreButton.clicked.connect(self._alignAutoCentreButtonClicked)
        self._ui.projectClearButton.clicked.connect(self._projectClearButtonClicked)
        self._ui.projectPointsButton.clicked.connect(self._projectPointsButtonClicked)
        self._ui.filterTopErrorPushButton.clicked.connect(self._filterTopErrorClicked)
        self._ui.filterTopErrorProportionLineEdit.editingFinished.connect(self._filterTopErrorProportionEntered)
        self._ui.filterNonNormalPushButton.clicked.connect(self._filterNonNormalClicked)
        self._ui.filterNonNormalProjectionLimitLineEdit.editingFinished.connect(self._filterNonNormalProjectionLimitEntered)
        self._ui.fitLoadButton.clicked.connect(self._fitLoadButtonClicked)
        self._ui.fitSaveButton.clicked.connect(self._fitSaveButtonClicked)
        self._ui.fitStrainPenaltyLineEdit.editingFinished.connect(self._fitStrainPenaltyEntered)
        self._ui.fitEdgeDiscontinuityPenaltyLineEdit.editingFinished.connect(self._fitEdgeDiscontinuityPenaltyEntered)
        self._ui.fitMaxIterationsSpinBox.valueChanged.connect(self._fitMaxIterationsValueChanged)
        self._ui.fitPerformButton.clicked.connect(self._fitPerformButtonClicked)

    def clear(self):
        self._scene = None
        self._model.clear()

    def initialise(self):
        self._model.initialise()
        self._scene = self._model.getRegion().getScene()
        self._setupUi()
        self._graphicsInitialized()

    def setEnableSettingsSave(self, isEnabled):
        self._ui.alignSaveButton.setEnabled(isEnabled)
        self._ui.fitSaveButton.setEnabled(isEnabled)

    def getModel(self):
        return self._model

    def _displayReal(self, widget, value):
        newText = '{:.4g}'.format(value)
        widget.setText(newText)

    def _parseRealNonNegative(self, widget, currentValue):
        newValue = currentValue
        try:
            value = float(widget.text())
            if value < 0.0:
                raise ValueError("Value must be >= 0")
            newValue = value
        except:
            print("Value must be >= 0")
        self._displayReal(widget, newValue)
        return newValue

    def _parseRealZeroToOne(self, widget, currentValue):
        newValue = currentValue
        try:
            value = float(widget.text())
            if (value < 0.0) or (value > 1.0):
                raise ValueError("Value must be from 0 to 1")
            newValue = value
        except:
            print("Value must be from 0 to 1")
        self._displayReal(widget, newValue)
        return newValue

    def _displayVector(self, widget, values, numberFormat = '{:.4g}'):
        '''
        Display real vector values in a widget
        '''
        newText = ", ".join(numberFormat.format(value) for value in values)
        widget.setText(newText)

    def _parseVector3(self, widget):
        '''
        Return real vector from comma separated text in line edit widget
        '''
        text = widget.text()
        values = [float(value) for value in text.split(',')]
        if len(values) != 3:
            raise ValueError('Not 3 values')
        return values

    def _setupUi(self):
        self._ui.toolBox.setCurrentIndex(0)
        self._alignSettingsDisplay()
        self._fitSettingsDisplay()

    def _alignSettingsDisplay(self):
        self._displayReal(self._ui.alignScaleLineEdit, self._model.getAlignScale())
        self._displayVector(self._ui.alignRotationLineEdit, self._model.getAlignEulerAngles())
        self._displayVector(self._ui.alignOffsetLineEdit, self._model.getAlignOffset())
        self._ui.alignMirrorCheckBox.setCheckState(
            QtCore.Qt.Checked if self._model.isAlignMirror() else QtCore.Qt.Unchecked)

    def _fitSettingsDisplay(self):
        self._displayReal(self._ui.filterTopErrorProportionLineEdit, self._model.getFilterTopErrorProportion())
        self._displayReal(self._ui.filterNonNormalProjectionLimitLineEdit, self._model.getFilterNonNormalProjectionLimit())
        self._displayReal(self._ui.fitStrainPenaltyLineEdit, self._model.getFitStrainPenalty())
        self._displayReal(self._ui.fitEdgeDiscontinuityPenaltyLineEdit, self._model.getFitEdgeDiscontinuityPenalty())
        self._ui.fitMaxIterationsSpinBox.setValue(self._model.getFitMaxIterations())

    def registerDoneExecution(self, callback):
        self._callback = callback

    def _doneButtonClicked(self):
        self._model.setStatePostAlign() # ensure model is transformed; does nothing if not in align tab
        self._model.writeOutputModel()
        #sceneviewer = self._ui.sceneviewerWidget.getSceneviewer()
        #sceneviewer.setScene(Scene())
        self._ui.dockWidget.setFloating(False)
        self._callback()

    def _viewAllButtonClicked(self):
        self._ui.sceneviewerWidget.viewAll()

    def _toolBoxPageChange(self, page):
        if page == 0:
            self._model.setStateAlign()
        else:
            self._model.setStatePostAlign()

    def _alignLoadButtonClicked(self):
        self._model.loadAlignSettings()

    def _alignSaveButtonClicked(self):
        self._model.saveAlignSettings()

    def _alignScaleEntered(self):
        self._model.setAlignScale(self._parseRealNonNegative(self._ui.alignScaleLineEdit, self._model.getAlignScale()))

    def _alignRotationEntered(self):
        try:
            eulerAngles = self._parseVector3(self._ui.alignRotationLineEdit)
            self._model.setAlignEulerAngles(eulerAngles)
        except:
            print("Invalid model rotation Euler angles entered")
            self._alignSettingsDisplay()

    def _alignOffsetEntered(self):
        try:
            offset = self._parseVector3(self._ui.alignOffsetLineEdit)
            self._model.setAlignOffset(offset)
        except:
            print("Invalid model offset entered")
            self._alignSettingsDisplay()

    def _alignMirrorClicked(self):
        state = self._ui.alignMirrorCheckBox.checkState()
        self._model.setAlignMirror(state == QtCore.Qt.Checked)

    def _alignResetButtonClicked(self):
        self._model.resetAlignment()

    def _alignAutoCentreButtonClicked(self):
        self._model.autoCentreModelOnData()

    def _projectClearButtonClicked(self):
        self._model.clearDataProjections()

    def _projectPointsButtonClicked(self):
        self._model.calculateDataProjections()

    def _filterTopErrorClicked(self):
        self._model.filterTopError()

    def _filterTopErrorProportionEntered(self):
        self._model.setFilterTopErrorProportion(self._parseRealZeroToOne(self._ui.filterTopErrorProportionLineEdit, self._model.getFilterTopErrorProportion()))

    def _filterNonNormalClicked(self):
        self._model.filterNonNormal()

    def _filterNonNormalProjectionLimitEntered(self):
        self._model.setFilterNonNormalProjectionLimit(self._parseRealZeroToOne(self._ui.filterNonNormalProjectionLimitLineEdit, self._model.getFilterNonNormalProjectionLimit()))

    def _fitLoadButtonClicked(self):
        self._model.loadFitSettings()

    def _fitSaveButtonClicked(self):
        self._model.saveFitSettings()

    def _fitStrainPenaltyEntered(self):
        self._model.setFitStrainPenalty(self._parseRealNonNegative(self._ui.fitStrainPenaltyLineEdit, self._model.getFitStrainPenalty()))

    def _fitEdgeDiscontinuityPenaltyEntered(self):
        self._model.setFitEdgeDiscontinuityPenalty(self._parseRealNonNegative(self._ui.fitEdgeDiscontinuityPenaltyLineEdit, self._model.getFitEdgeDiscontinuityPenalty()))

    def _fitMaxIterationsValueChanged(self, value):
        self._model.setFitMaxIterations(value)

    def _fitPerformButtonClicked(self):
        self._model.fit()