Exemple #1
0
 def __init__(self, parent=None):
     '''
     Call the super class init functions
     '''
     QtGui.QWidget.__init__(self, parent)
     self._sceneviewer = None
     self._sceneviewernotifier = None
     self._enableUpdates = False
     self._maximumClippingDistance = 1
     # Using composition to include the visual element of the GUI.
     self.ui = Ui_SceneviewerEditorWidget()
     self.ui.setupUi(self)
 def __init__(self, parent=None):
     '''
     Call the super class init functions
     '''
     QtGui.QWidget.__init__(self, parent)
     self._sceneviewer = None
     self._sceneviewernotifier = None
     self._enableUpdates = False
     self._maximumClippingDistance = 1
     # Using composition to include the visual element of the GUI.
     self.ui = Ui_SceneviewerEditorWidget()
     self.ui.setupUi(self)
Exemple #3
0
class SceneviewerEditorWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        '''
        Call the super class init functions
        '''
        QtGui.QWidget.__init__(self, parent)
        self._sceneviewer = None
        self._sceneviewernotifier = None
        self._enableUpdates = False
        self._maximumClippingDistance = 1
        # Using composition to include the visual element of the GUI.
        self.ui = Ui_SceneviewerEditorWidget()
        self.ui.setupUi(self)

    def getSceneviewer(self):
        '''
        Get the sceneviewer currently in the editor
        '''
        return self._sceneviewer

    def setSceneviewer(self, sceneviewer):
        '''
        Set the current sceneviewer in the editor
        '''
        if not (sceneviewer and sceneviewer.isValid()):
            if self._sceneviewernotifier is not None:
                self._sceneviewernotifier.clearCallback()
                self._sceneviewernotifier = None
            self._sceneviewer = None
            return
        self._sceneviewer = sceneviewer
        self._maximumClippingDistance = sceneviewer.getFarClippingPlane()
        self._sceneviewernotifier = sceneviewer.createSceneviewernotifier()
        self.setEnableUpdates(self._enableUpdates)
        self._displayAllSettings()

    def setEnableUpdates(self, enableUpdates):
        self._enableUpdates = enableUpdates
        if self._sceneviewernotifier is not None:
            if enableUpdates:
                self._sceneviewernotifier.setCallback(self._sceneviewerChange)
                self._displayViewSettings()
            else:
                self._sceneviewernotifier.clearCallback()

    def _sceneviewerChange(self, event):
        '''
        Change to scene viewer; update view widgets if transformation changed
        '''
        changeFlags = event.getChangeFlags()
        if changeFlags & Sceneviewerevent.CHANGE_FLAG_TRANSFORM:
            self._displayViewSettings()

    def _displayAllSettings(self):
        '''
        Show the current scene viewer settings on the view widgets
        '''
        self._displayViewSettings()
        self.backgroundColourDisplay()

    def _displayViewSettings(self):
        '''
        Show the current view-related scene viewer settings on the view widgets
        '''
        self.viewAngleDisplay()
        self.eyePointDisplay()
        self.lookatPointDisplay()
        self.upVectorDisplay()
        self.nearClippingDisplay()
        self.farClippingDisplay()

    def _displayReal(self, widget, value):
        '''
        Display real value in a widget
        '''
        newText = '{:.5g}'.format(value)
        widget.setText(newText)

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

    def _parseVector(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) < 1:
            raise
        return values

    def viewAll(self):
        '''
        Change sceneviewer to see all of scene.
        '''
        self._sceneviewer.viewAll()
        self._maximumClippingDistance = self._sceneviewer.getFarClippingPlane()
        self._displayViewSettings()

    def perspectiveStateChanged(self, state):
        '''
        Set perspective/parallel projection
        '''
        if state:
            projectionMode = Sceneviewer.PROJECTION_MODE_PERSPECTIVE
        else:
            projectionMode = Sceneviewer.PROJECTION_MODE_PARALLEL
        self._sceneviewer.setProjectionMode(projectionMode)

    def viewAngleDisplay(self):
        '''
        Display the current scene viewer diagonal view angle
        '''
        viewAngleRadians = self._sceneviewer.getViewAngle()
        viewAngleDegrees = viewAngleRadians * 180.0 / math.pi
        self._displayReal(self.ui.view_angle, viewAngleDegrees)

    def viewAngleEntered(self):
        '''
        Set scene viewer diagonal view angle from value in the view angle widget
        '''
        try:
            viewAngleRadians = float(
                self.ui.view_angle.text()) * math.pi / 180.0
            if ZINC_OK != self._sceneviewer.setViewAngle(viewAngleRadians):
                raise
        except:
            print("Invalid view angle")
        self.viewAngleDisplay()

    def setLookatParametersNonSkew(self):
        '''
        Set eye, lookat point and up vector simultaneous in non-skew projection
        '''
        eye = self._parseVector(self.ui.eye_point)
        lookat = self._parseVector(self.ui.lookat_point)
        up_vector = self._parseVector(self.ui.up_vector)
        if ZINC_OK != self._sceneviewer.setLookatParametersNonSkew(
                eye, lookat, up_vector):
            raise

    def eyePointDisplay(self):
        '''
        Display the current scene viewer eye point
        '''
        result, eye = self._sceneviewer.getEyePosition()
        self._displayVector(self.ui.eye_point, eye)

    def eyePointEntered(self):
        '''
        Set scene viewer wyw point from text in widget
        '''
        try:
            self.setLookatParametersNonSkew()
        except:
            print("Invalid eye point")
            self.eyePositionDisplay()

    def lookatPointDisplay(self):
        '''
        Display the current scene viewer lookat point
        '''
        result, lookat = self._sceneviewer.getLookatPosition()
        self._displayVector(self.ui.lookat_point, lookat)

    def lookatPointEntered(self):
        '''
        Set scene viewer lookat point from text in widget
        '''
        try:
            self.setLookatParametersNonSkew()
        except:
            print("Invalid lookat point")
            self.lookatPositionDisplay()

    def upVectorDisplay(self):
        '''
        Display the current scene viewer eye point
        '''
        result, up_vector = self._sceneviewer.getUpVector()
        self._displayVector(self.ui.up_vector, up_vector)

    def upVectorEntered(self):
        '''
        Set scene viewer up vector from text in widget
        '''
        try:
            self.setLookatParametersNonSkew()
        except:
            print("Invalid up vector")
            self.upVectorDisplay()

    def nearClippingDisplay(self):
        '''
        Display the current near clipping plane distance
        '''
        near = self._sceneviewer.getNearClippingPlane()
        value = int(10001.0 * near / self._maximumClippingDistance) - 1
        # don't want signal for my change
        self.ui.near_clipping_slider.blockSignals(True)
        self.ui.near_clipping_slider.setValue(value)
        self.ui.near_clipping_slider.blockSignals(False)

    def nearClippingChanged(self, value):
        '''
        Set near clipping plane distance from slider
        '''
        near = (value + 1) * self._maximumClippingDistance / 10001.0
        self._sceneviewer.setNearClippingPlane(near)

    def farClippingDisplay(self):
        '''
        Display the current far clipping plane distance
        '''
        value = int(10001.0 * self._sceneviewer.getFarClippingPlane() /
                    self._maximumClippingDistance) - 1
        self.ui.far_clipping_slider.blockSignals(True)
        self.ui.far_clipping_slider.setValue(value)
        self.ui.far_clipping_slider.blockSignals(False)

    def farClippingChanged(self, value):
        '''
        Set far clipping plane distance from slider
        '''
        far = (value + 1) * self._maximumClippingDistance / 10001.0
        self._sceneviewer.setFarClippingPlane(far)

    def backgroundColourDisplay(self):
        '''
        Display the current scene viewer eye point
        '''
        result, colourRGB = self._sceneviewer.getBackgroundColourRGB()
        self._displayVector(self.ui.background_colour, colourRGB)

    def backgroundColourEntered(self):
        '''
        Set scene viewer diagonal view angle from value in the view angle widget
        '''
        try:
            colourRGB = self._parseVector(self.ui.background_colour)
            if ZINC_OK != self._sceneviewer.setBackgroundColourRGB(colourRGB):
                raise
        except:
            print("Invalid background colour")
        self.backgroundColourDisplay()
class SceneviewerEditorWidget(QtGui.QWidget):

    def __init__(self, parent=None):
        '''
        Call the super class init functions
        '''
        QtGui.QWidget.__init__(self, parent)
        self._sceneviewer = None
        self._sceneviewernotifier = None
        self._enableUpdates = False
        self._maximumClippingDistance = 1
        # Using composition to include the visual element of the GUI.
        self.ui = Ui_SceneviewerEditorWidget()
        self.ui.setupUi(self)

    def getSceneviewer(self):
        '''
        Get the sceneviewer currently in the editor
        '''
        return self._sceneviewer

    def setSceneviewer(self, sceneviewer):
        '''
        Set the current sceneviewer in the editor
        '''
        if not (sceneviewer and sceneviewer.isValid()):
            if self._sceneviewernotifier is not None:
                self._sceneviewernotifier.clearCallback()
                self._sceneviewernotifier = None
            self._sceneviewer = None
            return
        self._sceneviewer = sceneviewer
        self._maximumClippingDistance = sceneviewer.getFarClippingPlane()
        self._sceneviewernotifier = sceneviewer.createSceneviewernotifier()
        self.setEnableUpdates(self._enableUpdates)
        self._displayAllSettings()

    def setEnableUpdates(self, enableUpdates):
        self._enableUpdates = enableUpdates
        if self._sceneviewernotifier is not None:
            if enableUpdates:
                self._sceneviewernotifier.setCallback(self._sceneviewerChange)
                self._displayViewSettings()
            else:
                self._sceneviewernotifier.clearCallback()

    def _sceneviewerChange(self, event):
        '''
        Change to scene viewer; update view widgets if transformation changed
        '''
        changeFlags = event.getChangeFlags()
        if changeFlags & Sceneviewerevent.CHANGE_FLAG_TRANSFORM:
            self._displayViewSettings()

    def _displayAllSettings(self):
        '''
        Show the current scene viewer settings on the view widgets
        '''
        self._displayViewSettings()
        self.backgroundColourDisplay()

    def _displayViewSettings(self):
        '''
        Show the current view-related scene viewer settings on the view widgets
        '''
        self.viewAngleDisplay()
        self.eyePointDisplay()
        self.lookatPointDisplay()
        self.upVectorDisplay()
        self.nearClippingDisplay()
        self.farClippingDisplay()

    def _displayReal(self, widget, value):
        '''
        Display real value in a widget
        '''
        newText = '{:.5g}'.format(value)
        widget.setText(newText)

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

    def _parseVector(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) < 1:
            raise
        return values

    def viewAll(self):
        '''
        Change sceneviewer to see all of scene.
        '''
        self._sceneviewer.viewAll()
        self._maximumClippingDistance = self._sceneviewer.getFarClippingPlane()
        self._displayViewSettings()

    def perspectiveStateChanged(self, state):
        '''
        Set perspective/parallel projection
        '''
        if state:
            projectionMode = Sceneviewer.PROJECTION_MODE_PERSPECTIVE
        else:
            projectionMode = Sceneviewer.PROJECTION_MODE_PARALLEL
        self._sceneviewer.setProjectionMode(projectionMode)

    def viewAngleDisplay(self):
        '''
        Display the current scene viewer diagonal view angle
        '''
        viewAngleRadians = self._sceneviewer.getViewAngle()
        viewAngleDegrees = viewAngleRadians*180.0/math.pi
        self._displayReal(self.ui.view_angle, viewAngleDegrees)

    def viewAngleEntered(self):
        '''
        Set scene viewer diagonal view angle from value in the view angle widget
        '''
        try:
            viewAngleRadians = float(self.ui.view_angle.text())*math.pi/180.0
            if ZINC_OK != self._sceneviewer.setViewAngle(viewAngleRadians):
                raise
        except:
            print("Invalid view angle")
        self.viewAngleDisplay()

    def setLookatParametersNonSkew(self):
        '''
        Set eye, lookat point and up vector simultaneous in non-skew projection
        '''
        eye = self._parseVector(self.ui.eye_point)
        lookat = self._parseVector(self.ui.lookat_point)
        up_vector = self._parseVector(self.ui.up_vector)
        if ZINC_OK != self._sceneviewer.setLookatParametersNonSkew(eye, lookat, up_vector):
            raise

    def eyePointDisplay(self):
        '''
        Display the current scene viewer eye point
        '''
        result, eye = self._sceneviewer.getEyePosition()
        self._displayVector(self.ui.eye_point, eye)

    def eyePointEntered(self):
        '''
        Set scene viewer wyw point from text in widget
        '''
        try:
            self.setLookatParametersNonSkew()
        except:
            print("Invalid eye point")
            self.eyePositionDisplay()

    def lookatPointDisplay(self):
        '''
        Display the current scene viewer lookat point
        '''
        result, lookat = self._sceneviewer.getLookatPosition()
        self._displayVector(self.ui.lookat_point, lookat)

    def lookatPointEntered(self):
        '''
        Set scene viewer lookat point from text in widget
        '''
        try:
            self.setLookatParametersNonSkew()
        except:
            print("Invalid lookat point")
            self.lookatPositionDisplay()

    def upVectorDisplay(self):
        '''
        Display the current scene viewer eye point
        '''
        result, up_vector = self._sceneviewer.getUpVector()
        self._displayVector(self.ui.up_vector, up_vector)

    def upVectorEntered(self):
        '''
        Set scene viewer up vector from text in widget
        '''
        try:
            self.setLookatParametersNonSkew()
        except:
            print("Invalid up vector")
            self.upVectorDisplay()

    def nearClippingDisplay(self):
        '''
        Display the current near clipping plane distance
        '''
        near = self._sceneviewer.getNearClippingPlane()
        value = int(10001.0*near/self._maximumClippingDistance) - 1
        # don't want signal for my change
        self.ui.near_clipping_slider.blockSignals(True)
        self.ui.near_clipping_slider.setValue(value)
        self.ui.near_clipping_slider.blockSignals(False)

    def nearClippingChanged(self, value):
        '''
        Set near clipping plane distance from slider
        '''
        near = (value + 1)*self._maximumClippingDistance/10001.0
        self._sceneviewer.setNearClippingPlane(near)

    def farClippingDisplay(self):
        '''
        Display the current far clipping plane distance
        '''
        value = int(10001.0*self._sceneviewer.getFarClippingPlane()/self._maximumClippingDistance) - 1
        self.ui.far_clipping_slider.blockSignals(True)
        self.ui.far_clipping_slider.setValue(value)
        self.ui.far_clipping_slider.blockSignals(False)

    def farClippingChanged(self, value):
        '''
        Set far clipping plane distance from slider
        '''
        far = (value + 1)*self._maximumClippingDistance/10001.0
        self._sceneviewer.setFarClippingPlane(far)

    def backgroundColourDisplay(self):
        '''
        Display the current scene viewer eye point
        '''
        result, colourRGB = self._sceneviewer.getBackgroundColourRGB()
        self._displayVector(self.ui.background_colour, colourRGB)

    def backgroundColourEntered(self):
        '''
        Set scene viewer diagonal view angle from value in the view angle widget
        '''
        try:
            colourRGB = self._parseVector(self.ui.background_colour)
            if ZINC_OK != self._sceneviewer.setBackgroundColourRGB(colourRGB):
                raise
        except:
            print("Invalid background colour")
        self.backgroundColourDisplay()