summaryrefslogtreecommitdiff
path: root/src/silx/gui/plot3d/Plot3DWidget.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/silx/gui/plot3d/Plot3DWidget.py')
-rw-r--r--src/silx/gui/plot3d/Plot3DWidget.py134
1 files changed, 73 insertions, 61 deletions
diff --git a/src/silx/gui/plot3d/Plot3DWidget.py b/src/silx/gui/plot3d/Plot3DWidget.py
index 09e06a2..9a88fe3 100644
--- a/src/silx/gui/plot3d/Plot3DWidget.py
+++ b/src/silx/gui/plot3d/Plot3DWidget.py
@@ -66,10 +66,9 @@ class _OverviewViewport(scene.Viewport):
# Add a point to draw the background (in a group with depth mask)
backgroundPoint = primitives.ColorPoints(
- x=0., y=0., z=0.,
- color=(1., 1., 1., 0.5),
- size=self._SIZE)
- backgroundPoint.marker = 'o'
+ x=0.0, y=0.0, z=0.0, color=(1.0, 1.0, 1.0, 0.5), size=self._SIZE
+ )
+ backgroundPoint.marker = "o"
noDepthGroup = primitives.GroupNoDepth(mask=True, notest=True)
noDepthGroup.children.append(backgroundPoint)
self.scene.children.append(noDepthGroup)
@@ -86,11 +85,12 @@ class _OverviewViewport(scene.Viewport):
Sync the overview camera to point in the same direction
but from a sphere centered on origin.
"""
- position = -12. * source.extrinsic.direction
+ position = -12.0 * source.extrinsic.direction
self.camera.extrinsic.position = position
self.camera.extrinsic.setOrientation(
- source.extrinsic.direction, source.extrinsic.up)
+ source.extrinsic.direction, source.extrinsic.up
+ )
class Plot3DWidget(glu.OpenGLWidget):
@@ -116,10 +116,10 @@ class Plot3DWidget(glu.OpenGLWidget):
class FogMode(_Enum):
"""Different mode to render the scene with fog"""
- NONE = 'none'
+ NONE = "none"
"""No fog effect"""
- LINEAR = 'linear'
+ LINEAR = "linear"
"""Linear fog through the whole scene"""
def __init__(self, parent=None, f=qt.Qt.Widget):
@@ -131,7 +131,8 @@ class Plot3DWidget(glu.OpenGLWidget):
depthBufferSize=0,
stencilBufferSize=0,
version=(2, 1),
- f=f)
+ f=f,
+ )
self.setAutoFillBackground(False)
self.setMouseTracking(True)
@@ -145,22 +146,24 @@ class Plot3DWidget(glu.OpenGLWidget):
# Main viewport
self.viewport = scene.Viewport()
- self._sceneScale = transform.Scale(1., 1., 1.)
- self.viewport.scene.transforms = [self._sceneScale,
- transform.Translate(0., 0., 0.)]
+ self._sceneScale = transform.Scale(1.0, 1.0, 1.0)
+ self.viewport.scene.transforms = [
+ self._sceneScale,
+ transform.Translate(0.0, 0.0, 0.0),
+ ]
# Overview area
self.overview = _OverviewViewport(self.viewport.camera)
- self.setBackgroundColor((0.2, 0.2, 0.2, 1.))
+ self.setBackgroundColor((0.2, 0.2, 0.2, 1.0))
# Window describing on screen area to render
- self._window = scene.Window(mode='framebuffer')
+ self._window = scene.Window(mode="framebuffer")
self._window.viewports = [self.viewport, self.overview]
self._window.addListener(self._redraw)
self.eventHandler = None
- self.setInteractiveMode('rotate')
+ self.setInteractiveMode("rotate")
def __clickHandler(self, *args):
"""Handle interaction state machine click"""
@@ -180,31 +183,35 @@ class Plot3DWidget(glu.OpenGLWidget):
if mode is None:
self.eventHandler = None
- elif mode == 'rotate':
+ elif mode == "rotate":
self.eventHandler = interaction.RotateCameraControl(
self.viewport,
orbitAroundCenter=False,
- mode='position',
+ mode="position",
scaleTransform=self._sceneScale,
- selectCB=self.__clickHandler)
+ selectCB=self.__clickHandler,
+ )
- elif mode == 'pan':
+ elif mode == "pan":
self.eventHandler = interaction.PanCameraControl(
self.viewport,
orbitAroundCenter=False,
- mode='position',
+ mode="position",
scaleTransform=self._sceneScale,
- selectCB=self.__clickHandler)
+ selectCB=self.__clickHandler,
+ )
elif isinstance(mode, interaction.StateMachine):
self.eventHandler = mode
else:
- raise ValueError('Unsupported interactive mode %s', str(mode))
+ raise ValueError("Unsupported interactive mode %s", str(mode))
- if (self.eventHandler is not None and
- qt.QApplication.keyboardModifiers() & qt.Qt.ControlModifier):
- self.eventHandler.handleEvent('keyPress', qt.Qt.Key_Control)
+ if (
+ self.eventHandler is not None
+ and qt.QApplication.keyboardModifiers() & qt.Qt.ControlModifier
+ ):
+ self.eventHandler.handleEvent("keyPress", qt.Qt.Key_Control)
self.sigInteractiveModeChanged.emit()
@@ -216,9 +223,9 @@ class Plot3DWidget(glu.OpenGLWidget):
if self.eventHandler is None:
return None
if isinstance(self.eventHandler, interaction.RotateCameraControl):
- return 'rotate'
+ return "rotate"
elif isinstance(self.eventHandler, interaction.PanCameraControl):
- return 'pan'
+ return "pan"
else:
return None
@@ -227,13 +234,12 @@ class Plot3DWidget(glu.OpenGLWidget):
:param str projection: In 'perspective', 'orthographic'.
"""
- if projection == 'orthographic':
+ if projection == "orthographic":
projection = transform.Orthographic(size=self.viewport.size)
- elif projection == 'perspective':
- projection = transform.Perspective(fovy=30.,
- size=self.viewport.size)
+ elif projection == "perspective":
+ projection = transform.Perspective(fovy=30.0, size=self.viewport.size)
else:
- raise RuntimeError('Unsupported projection: %s' % projection)
+ raise RuntimeError("Unsupported projection: %s" % projection)
self.viewport.camera.intrinsic = projection
self.viewport.resetCamera()
@@ -245,11 +251,11 @@ class Plot3DWidget(glu.OpenGLWidget):
"""
projection = self.viewport.camera.intrinsic
if isinstance(projection, transform.Orthographic):
- return 'orthographic'
+ return "orthographic"
elif isinstance(projection, transform.Perspective):
- return 'perspective'
+ return "perspective"
else:
- raise RuntimeError('Unknown projection in use')
+ raise RuntimeError("Unknown projection in use")
def setBackgroundColor(self, color):
"""Set the background color of the OpenGL view.
@@ -261,7 +267,7 @@ class Plot3DWidget(glu.OpenGLWidget):
color = rgba(color)
if color != self.viewport.background:
self.viewport.background = color
- self.sigStyleChanged.emit('backgroundColor')
+ self.sigStyleChanged.emit("backgroundColor")
def getBackgroundColor(self):
"""Returns the RGBA background color (QColor)."""
@@ -276,7 +282,7 @@ class Plot3DWidget(glu.OpenGLWidget):
mode = self.FogMode.from_value(mode)
if mode != self.getFogMode():
self.viewport.fog.isOn = mode is self.FogMode.LINEAR
- self.sigStyleChanged.emit('fogMode')
+ self.sigStyleChanged.emit("fogMode")
def getFogMode(self):
"""Returns the kind of fog in use
@@ -307,13 +313,13 @@ class Plot3DWidget(glu.OpenGLWidget):
self._window.viewports = [self.viewport, self.overview]
else:
self._window.viewports = [self.viewport]
- self.sigStyleChanged.emit('orientationIndicatorVisible')
+ self.sigStyleChanged.emit("orientationIndicatorVisible")
def centerScene(self):
"""Position the center of the scene at the center of rotation."""
self.viewport.resetCamera()
- def resetZoom(self, face='front'):
+ def resetZoom(self, face="front"):
"""Reset the camera position to a default.
:param str face: The direction the camera is looking at:
@@ -344,7 +350,9 @@ class Plot3DWidget(glu.OpenGLWidget):
if self.viewport.dirty:
self.viewport.adjustCameraDepthExtent()
- self._window.render(self.context(), self.getDevicePixelRatio())
+ self._window.render(
+ self.context(), self.getDotsPerInch(), self.getDevicePixelRatio()
+ )
if self._firstRender: # TODO remove this ugly hack
self._firstRender = False
@@ -366,7 +374,7 @@ class Plot3DWidget(glu.OpenGLWidget):
:rtype: QImage
"""
if not self.isValid():
- _logger.error('OpenGL 2.1 not available, cannot save OpenGL image')
+ _logger.error("OpenGL 2.1 not available, cannot save OpenGL image")
height, width = self._window.shape
image = numpy.zeros((height, width, 3), dtype=numpy.uint8)
@@ -380,22 +388,22 @@ class Plot3DWidget(glu.OpenGLWidget):
x, y = qt.getMouseEventPosition(event)
xpixel = x * self.getDevicePixelRatio()
ypixel = y * self.getDevicePixelRatio()
- angle = event.angleDelta().y() / 8.
+ angle = event.angleDelta().y() / 8.0
event.accept()
if self.eventHandler is not None and angle != 0 and self.isValid():
self.makeCurrent()
- self.eventHandler.handleEvent('wheel', xpixel, ypixel, angle)
+ self.eventHandler.handleEvent("wheel", xpixel, ypixel, angle)
def keyPressEvent(self, event):
keyCode = event.key()
# No need to accept QKeyEvent
converter = {
- qt.Qt.Key_Left: 'left',
- qt.Qt.Key_Right: 'right',
- qt.Qt.Key_Up: 'up',
- qt.Qt.Key_Down: 'down'
+ qt.Qt.Key_Left: "left",
+ qt.Qt.Key_Right: "right",
+ qt.Qt.Key_Up: "up",
+ qt.Qt.Key_Down: "down",
}
direction = converter.get(keyCode, None)
if direction is not None:
@@ -407,10 +415,12 @@ class Plot3DWidget(glu.OpenGLWidget):
self.viewport.orbitCamera(direction)
else:
- if (keyCode == qt.Qt.Key_Control and
- self.eventHandler is not None and
- self.isValid()):
- self.eventHandler.handleEvent('keyPress', keyCode)
+ if (
+ keyCode == qt.Qt.Key_Control
+ and self.eventHandler is not None
+ and self.isValid()
+ ):
+ self.eventHandler.handleEvent("keyPress", keyCode)
# Key not handled, call base class implementation
super(Plot3DWidget, self).keyPressEvent(event)
@@ -418,17 +428,19 @@ class Plot3DWidget(glu.OpenGLWidget):
def keyReleaseEvent(self, event):
"""Catch Ctrl key release"""
keyCode = event.key()
- if (keyCode == qt.Qt.Key_Control and
- self.eventHandler is not None and
- self.isValid()):
- self.eventHandler.handleEvent('keyRelease', keyCode)
+ if (
+ keyCode == qt.Qt.Key_Control
+ and self.eventHandler is not None
+ and self.isValid()
+ ):
+ self.eventHandler.handleEvent("keyRelease", keyCode)
super(Plot3DWidget, self).keyReleaseEvent(event)
# Mouse events #
_MOUSE_BTNS = {
- qt.Qt.LeftButton: 'left',
- qt.Qt.RightButton: 'right',
- qt.Qt.MiddleButton: 'middle',
+ qt.Qt.LeftButton: "left",
+ qt.Qt.RightButton: "right",
+ qt.Qt.MiddleButton: "middle",
}
def mousePressEvent(self, event):
@@ -440,7 +452,7 @@ class Plot3DWidget(glu.OpenGLWidget):
if self.eventHandler is not None and self.isValid():
self.makeCurrent()
- self.eventHandler.handleEvent('press', xpixel, ypixel, btn)
+ self.eventHandler.handleEvent("press", xpixel, ypixel, btn)
def mouseMoveEvent(self, event):
x, y = qt.getMouseEventPosition(event)
@@ -450,7 +462,7 @@ class Plot3DWidget(glu.OpenGLWidget):
if self.eventHandler is not None and self.isValid():
self.makeCurrent()
- self.eventHandler.handleEvent('move', xpixel, ypixel)
+ self.eventHandler.handleEvent("move", xpixel, ypixel)
def mouseReleaseEvent(self, event):
x, y = qt.getMouseEventPosition(event)
@@ -461,4 +473,4 @@ class Plot3DWidget(glu.OpenGLWidget):
if self.eventHandler is not None and self.isValid():
self.makeCurrent()
- self.eventHandler.handleEvent('release', xpixel, ypixel, btn)
+ self.eventHandler.handleEvent("release", xpixel, ypixel, btn)