From 20fa5b9fb09d1675c00228797a39982871e123d0 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 25 Oct 2021 03:28:45 +0300 Subject: [PATCH] - updated the PlotCanvas3d --- CHANGELOG.md | 4 +++ appGUI/PlotCanvas3d.py | 73 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2b213ef..262d4e49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta ================================================= +25.10.2021 + +- updated the PlotCanvas3d + 24.10.2021 - added an example showing performance degradation in VisPy 0.9.1 diff --git a/appGUI/PlotCanvas3d.py b/appGUI/PlotCanvas3d.py index c7dfc4fc..04a68b32 100644 --- a/appGUI/PlotCanvas3d.py +++ b/appGUI/PlotCanvas3d.py @@ -13,6 +13,8 @@ import time import vispy.scene as scene from vispy.scene.cameras.base_camera import BaseCamera +from vispy.scene.cameras.perspective import PerspectiveCamera +from vispy.util import keys from vispy.color import Color from appGUI.VisPyVisuals import ShapeGroup, ShapeCollection, TextCollection, TextGroup, Cursor from vispy.scene.visuals import InfiniteLine, Line, Rectangle, Text, XYZAxis @@ -364,8 +366,7 @@ class Camera_3D(scene.ArcballCamera): self.pan_button_setting = "2" def zoom(self, factor, center=None): - center = center if (center is not None) else self.center - super(Camera_3D, self).zoom(factor, center) + pass # def viewbox_mouse_event(self, event): # """ @@ -439,6 +440,74 @@ class Camera_3D(scene.ArcballCamera): # else: # event.handled = False + def viewbox_mouse_event(self, event): + """ + The viewbox received a mouse event; update transform + accordingly. + + Parameters + ---------- + event : instance of Event + The event. + """ + if event.handled or not self.interactive: + return + + PerspectiveCamera.viewbox_mouse_event(self, event) + + if event.type == 'mouse_release': + self._event_value = None # Reset + elif event.type == 'mouse_press': + event.handled = True + elif event.type == 'mouse_move': + if event.press_event is None: + return + + modifiers = event.mouse_event.modifiers + p1 = event.mouse_event.press_event.pos + p2 = event.mouse_event.pos + d = p2 - p1 + + if 1 in event.buttons and not modifiers: + # Rotate + self._update_rotation(event) + + elif 1 in event.buttons and keys.SHIFT in modifiers: + # Zoom + if self._event_value is None: + self._event_value = (self._scale_factor, self._distance) + zoomy = (1 + self.zoom_factor) ** d[1] + + self.scale_factor = self._event_value[0] * zoomy + # Modify distance if its given + if self._distance is not None: + self._distance = self._event_value[1] * zoomy + self.view_changed() + + elif 2 in event.buttons and not modifiers: + # Translate + norm = np.mean(self._viewbox.size) + if self._event_value is None or len(self._event_value) == 2: + self._event_value = self.center + dist = (p1 - p2) / norm * self._scale_factor + dist[1] *= -1 + # Black magic part 1: turn 2D into 3D translations + dx, dy, dz = self._dist_to_trans(dist) + # Black magic part 2: take up-vector and flipping into account + ff = self._flip_factors + up, forward, right = self._get_dim_vectors() + dx, dy, dz = right * dx + forward * dy + up * dz + dx, dy, dz = ff[0] * dx, ff[1] * dy, dz * ff[2] + c = self._event_value + self.center = c[0] + dx, c[1] + dy, c[2] + dz + + elif 2 in event.buttons and keys.SHIFT in modifiers: + # Change fov + if self._event_value is None: + self._event_value = self._fov + fov = self._event_value - d[1] / 5.0 + self.fov = min(180.0, max(0.0, fov)) + def limited_zoom(self, scale, center): try: