molde 0.1.3__py3-none-any.whl → 0.1.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- molde/__init__.py +12 -6
- molde/__main__.py +77 -74
- molde/actors/__init__.py +5 -5
- molde/actors/common_symbols_actor.py +164 -164
- molde/actors/ghost_actor.py +12 -12
- molde/actors/lines_actor.py +31 -31
- molde/actors/round_points_actor.py +7 -7
- molde/actors/square_points_actor.py +32 -32
- molde/colors/__init__.py +1 -1
- molde/colors/color.py +150 -120
- molde/colors/color_names.py +124 -124
- molde/interactor_styles/__init__.py +2 -2
- molde/interactor_styles/arcball_camera_style.py +288 -288
- molde/interactor_styles/box_selection_style.py +87 -70
- molde/main_window.ui +864 -864
- molde/pickers/__init__.py +2 -2
- molde/pickers/cell_area_picker.py +61 -61
- molde/pickers/cell_property_area_picker.py +84 -84
- molde/poly_data/__init__.py +13 -13
- molde/poly_data/lines_data.py +23 -23
- molde/poly_data/vertices_data.py +24 -24
- molde/render_widgets/__init__.py +2 -2
- molde/render_widgets/animated_render_widget.py +164 -164
- molde/render_widgets/common_render_widget.py +429 -433
- molde/stylesheets/__init__.py +122 -119
- molde/stylesheets/common.qss +16 -16
- molde/stylesheets/create_color_page.py +61 -61
- molde/stylesheets/mainwindow.ui +611 -611
- molde/stylesheets/qcheckbox.qss +23 -18
- molde/stylesheets/qinputs.qss +81 -78
- molde/stylesheets/qlayouts.qss +23 -22
- molde/stylesheets/qmenubar.qss +12 -12
- molde/stylesheets/qprogressbar.qss +11 -11
- molde/stylesheets/qpushbutton.qss +91 -91
- molde/stylesheets/qradiobutton.qss +30 -30
- molde/stylesheets/qscrollbar.qss +29 -29
- molde/stylesheets/qslider.qss +61 -61
- molde/stylesheets/qtablewidget.qss +27 -27
- molde/stylesheets/qtabwidget.qss +28 -29
- molde/stylesheets/qtoolbar.qss +52 -62
- molde/stylesheets/qtoolbuttons.qss +14 -14
- molde/stylesheets/qtreewidget.qss +25 -25
- molde/ui_files/messages/new_loading_window.ui +73 -73
- molde/utils/__init__.py +8 -8
- molde/utils/format_sequences.py +44 -44
- molde/utils/poly_data_utils.py +66 -66
- molde/utils/tree_info.py +52 -52
- molde/windows/loading_window.py +189 -189
- {molde-0.1.3.dist-info → molde-0.1.5.dist-info}/METADATA +6 -4
- molde-0.1.5.dist-info/RECORD +68 -0
- {molde-0.1.3.dist-info → molde-0.1.5.dist-info}/WHEEL +1 -1
- molde-0.1.3.dist-info/RECORD +0 -68
@@ -1,288 +1,288 @@
|
|
1
|
-
import numpy as np
|
2
|
-
from vtkmodules.vtkCommonTransforms import vtkTransform
|
3
|
-
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera
|
4
|
-
from vtkmodules.vtkRenderingCore import vtkPropPicker
|
5
|
-
|
6
|
-
from molde.actors import RoundPointsActor
|
7
|
-
|
8
|
-
|
9
|
-
class ArcballCameraInteractorStyle(vtkInteractorStyleTrackballCamera):
|
10
|
-
"""
|
11
|
-
Interactor style that rotates and zooms around the cursor.
|
12
|
-
"""
|
13
|
-
|
14
|
-
def __init__(self):
|
15
|
-
self.center_of_rotation = None
|
16
|
-
self.default_center_of_rotation = None
|
17
|
-
|
18
|
-
self.is_left_clicked = False
|
19
|
-
self.is_right_clicked = False
|
20
|
-
self.is_mid_clicked = False
|
21
|
-
|
22
|
-
self.is_rotating = False
|
23
|
-
self.is_panning = False
|
24
|
-
|
25
|
-
self.mid_button_click_position = (0, 0)
|
26
|
-
# cor = center of rotation
|
27
|
-
self.cor_actor = self._make_default_cor_actor()
|
28
|
-
self._create_observers()
|
29
|
-
|
30
|
-
def set_default_center_of_rotation(self, center):
|
31
|
-
self.default_center_of_rotation = center
|
32
|
-
|
33
|
-
def set_cor_actor(self, actor):
|
34
|
-
self.cor_actor = actor
|
35
|
-
|
36
|
-
def _create_observers(self):
|
37
|
-
self.AddObserver("LeftButtonPressEvent", self._left_button_press_event)
|
38
|
-
self.AddObserver("LeftButtonReleaseEvent", self._left_button_release_event)
|
39
|
-
self.AddObserver("RightButtonPressEvent", self._right_button_press_event)
|
40
|
-
self.AddObserver("RightButtonReleaseEvent", self._right_button_release_event)
|
41
|
-
self.AddObserver("MouseMoveEvent", self._mouse_move_event)
|
42
|
-
self.AddObserver("MouseWheelForwardEvent", self._mouse_wheel_forward_event)
|
43
|
-
self.AddObserver("MouseWheelBackwardEvent", self._mouse_wheel_backward_event)
|
44
|
-
self.AddObserver("MiddleButtonPressEvent", self._click_mid_button_press_event)
|
45
|
-
self.AddObserver("MiddleButtonReleaseEvent", self._click_mid_button_release_event)
|
46
|
-
|
47
|
-
def _left_button_press_event(self, obj, event):
|
48
|
-
# Implemented to stop the superclass movement
|
49
|
-
self.is_left_clicked = True
|
50
|
-
|
51
|
-
def _left_button_release_event(self, obj, event):
|
52
|
-
# Implemented to stop the superclass movement
|
53
|
-
self.is_left_clicked = False
|
54
|
-
|
55
|
-
def _right_button_press_event(self, obj, event):
|
56
|
-
self.is_right_clicked = True
|
57
|
-
self.is_rotating = True
|
58
|
-
|
59
|
-
cursor = self.GetInteractor().GetEventPosition()
|
60
|
-
self.FindPokedRenderer(cursor[0], cursor[1])
|
61
|
-
|
62
|
-
renderer = self.GetCurrentRenderer() or self.GetDefaultRenderer()
|
63
|
-
camera = renderer.GetActiveCamera()
|
64
|
-
|
65
|
-
if renderer is None:
|
66
|
-
return
|
67
|
-
|
68
|
-
picker = vtkPropPicker()
|
69
|
-
picker.Pick(cursor[0], cursor[1], 0, renderer)
|
70
|
-
pos = picker.GetPickPosition()
|
71
|
-
|
72
|
-
if pos != (0, 0, 0):
|
73
|
-
self.center_of_rotation = pos
|
74
|
-
|
75
|
-
elif self.default_center_of_rotation is not None:
|
76
|
-
self.center_of_rotation = self.default_center_of_rotation
|
77
|
-
|
78
|
-
else:
|
79
|
-
x0, x1, y0, y1, z0, z1 = renderer.ComputeVisiblePropBounds()
|
80
|
-
self.center_of_rotation = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2]
|
81
|
-
|
82
|
-
dx, dy, dz = np.array(camera.GetPosition()) - np.array(camera.GetFocalPoint())
|
83
|
-
distance_factor = np.sqrt(dx**2 + dy**2 + dz**2)
|
84
|
-
|
85
|
-
self.cor_actor.SetPosition(self.center_of_rotation)
|
86
|
-
self.cor_actor.SetScale((distance_factor / 3.5, distance_factor / 3.5, distance_factor / 3.5))
|
87
|
-
renderer.AddActor(self.cor_actor)
|
88
|
-
|
89
|
-
def _right_button_release_event(self, obj, event):
|
90
|
-
self.is_right_clicked = False
|
91
|
-
self.is_rotating = False
|
92
|
-
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
93
|
-
renderer.RemoveActor(self.cor_actor)
|
94
|
-
self.GetInteractor().Render()
|
95
|
-
self.EndDolly()
|
96
|
-
|
97
|
-
def _click_mid_button_press_event(self, obj, event):
|
98
|
-
self.is_mid_clicked = True
|
99
|
-
self.is_panning = True
|
100
|
-
cursor = self.GetInteractor().GetEventPosition()
|
101
|
-
self.mid_button_click_position = cursor
|
102
|
-
self.FindPokedRenderer(cursor[0], cursor[1])
|
103
|
-
|
104
|
-
def _click_mid_button_release_event(self, obj, event):
|
105
|
-
self.is_mid_clicked = False
|
106
|
-
self.is_panning = False
|
107
|
-
|
108
|
-
def _mouse_move_event(self, obj, event):
|
109
|
-
zoom = self.is_mid_clicked and self.GetInteractor().GetControlKey()
|
110
|
-
|
111
|
-
if zoom and not self.is_zooming:
|
112
|
-
self.is_zooming = True
|
113
|
-
|
114
|
-
if not zoom:
|
115
|
-
self.is_zooming = False
|
116
|
-
|
117
|
-
if self.is_zooming:
|
118
|
-
# Implementation based on this link
|
119
|
-
# https://github.com/Kitware/VTK/blob/4c4cd48244eaf1a74e0b096aae773c5498f7a782/Interaction/Style/vtkInteractorStyleTrackballCamera.cxx#L352
|
120
|
-
y0 = self.GetInteractor().GetLastEventPosition()[1]
|
121
|
-
y1 = self.GetInteractor().GetEventPosition()[1]
|
122
|
-
dyf = 10 * (y1 - y0) / self.GetCurrentRenderer().GetCenter()[1]
|
123
|
-
factor = 1.1 ** dyf
|
124
|
-
self.dolly_on_point(factor, *self.mid_button_click_position)
|
125
|
-
|
126
|
-
elif self.is_rotating:
|
127
|
-
self.rotate()
|
128
|
-
|
129
|
-
elif self.is_panning:
|
130
|
-
self.Pan()
|
131
|
-
|
132
|
-
self.OnMouseMove()
|
133
|
-
|
134
|
-
def _mouse_wheel_forward_event(self, obj, event):
|
135
|
-
int_pos = self.GetInteractor().GetEventPosition()
|
136
|
-
|
137
|
-
self.FindPokedRenderer(int_pos[0], int_pos[1])
|
138
|
-
|
139
|
-
if self.GetCurrentRenderer() is None:
|
140
|
-
return
|
141
|
-
|
142
|
-
motion_factor = 10
|
143
|
-
mouse_motion_factor = 1
|
144
|
-
|
145
|
-
factor = motion_factor * 0.2 * mouse_motion_factor
|
146
|
-
|
147
|
-
self.dolly(1.1**factor)
|
148
|
-
|
149
|
-
self.ReleaseFocus()
|
150
|
-
|
151
|
-
def _mouse_wheel_backward_event(self, obj, event):
|
152
|
-
int_pos = self.GetInteractor().GetEventPosition()
|
153
|
-
|
154
|
-
self.FindPokedRenderer(int_pos[0], int_pos[1])
|
155
|
-
|
156
|
-
if self.GetCurrentRenderer() is None:
|
157
|
-
return
|
158
|
-
|
159
|
-
motion_factor = 10
|
160
|
-
mouse_motion_factor = 1
|
161
|
-
|
162
|
-
factor = motion_factor * -0.2 * mouse_motion_factor
|
163
|
-
|
164
|
-
self.dolly(1.1**factor)
|
165
|
-
|
166
|
-
self.ReleaseFocus()
|
167
|
-
|
168
|
-
def rotate(self):
|
169
|
-
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
170
|
-
if renderer is None:
|
171
|
-
return
|
172
|
-
|
173
|
-
rwi = self.GetInteractor()
|
174
|
-
delta_mouse = np.array(rwi.GetEventPosition()) - np.array(rwi.GetLastEventPosition())
|
175
|
-
size = np.array(renderer.GetRenderWindow().GetSize())
|
176
|
-
motion_factor = 10
|
177
|
-
elevation_azimuth = -20 / size
|
178
|
-
rotation_factor = delta_mouse * motion_factor * elevation_azimuth
|
179
|
-
|
180
|
-
camera = renderer.GetActiveCamera()
|
181
|
-
|
182
|
-
self.rotate_around_center(rotation_factor[0], rotation_factor[1])
|
183
|
-
|
184
|
-
camera.OrthogonalizeViewUp()
|
185
|
-
|
186
|
-
renderer.ResetCameraClippingRange()
|
187
|
-
|
188
|
-
if rwi.GetLightFollowCamera():
|
189
|
-
renderer.UpdateLightsGeometryToFollowCamera()
|
190
|
-
|
191
|
-
rwi.Render()
|
192
|
-
|
193
|
-
def rotate_around_center(self, anglex, angley):
|
194
|
-
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
195
|
-
camera = renderer.GetActiveCamera()
|
196
|
-
|
197
|
-
transform_camera = vtkTransform()
|
198
|
-
transform_camera.Identity()
|
199
|
-
|
200
|
-
axis = [
|
201
|
-
-camera.GetViewTransformObject().GetMatrix().GetElement(0, 0),
|
202
|
-
-camera.GetViewTransformObject().GetMatrix().GetElement(0, 1),
|
203
|
-
-camera.GetViewTransformObject().GetMatrix().GetElement(0, 2),
|
204
|
-
]
|
205
|
-
|
206
|
-
saved_view_up = camera.GetViewUp()
|
207
|
-
transform_camera.RotateWXYZ(angley, axis)
|
208
|
-
new_view_up = transform_camera.TransformPoint(camera.GetViewUp())
|
209
|
-
camera.SetViewUp(new_view_up)
|
210
|
-
transform_camera.Identity()
|
211
|
-
|
212
|
-
cor = self.center_of_rotation
|
213
|
-
|
214
|
-
transform_camera.Translate(+cor[0], +cor[1], +cor[2])
|
215
|
-
transform_camera.RotateWXYZ(anglex, camera.GetViewUp())
|
216
|
-
transform_camera.RotateWXYZ(angley, axis)
|
217
|
-
transform_camera.Translate(-cor[0], -cor[1], -cor[2])
|
218
|
-
|
219
|
-
new_camera_position = transform_camera.TransformPoint(camera.GetPosition())
|
220
|
-
camera.SetPosition(new_camera_position)
|
221
|
-
|
222
|
-
new_focal_point = transform_camera.TransformPoint(camera.GetFocalPoint())
|
223
|
-
camera.SetFocalPoint(new_focal_point)
|
224
|
-
|
225
|
-
camera.SetViewUp(saved_view_up)
|
226
|
-
|
227
|
-
camera.Modified()
|
228
|
-
|
229
|
-
def dolly(self, factor):
|
230
|
-
cursor = self.GetInteractor().GetEventPosition()
|
231
|
-
self.dolly_on_point(factor, *cursor)
|
232
|
-
|
233
|
-
def dolly_on_point(self, factor, x, y):
|
234
|
-
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
235
|
-
camera = renderer.GetActiveCamera()
|
236
|
-
|
237
|
-
view_center = np.array(renderer.GetSize()) / 2
|
238
|
-
distance_to_center = (x, y) - view_center
|
239
|
-
dx, dy = distance_to_center * (1 - 1 / factor)
|
240
|
-
self.move_viewport(dx, dy)
|
241
|
-
|
242
|
-
if camera.GetParallelProjection():
|
243
|
-
camera.SetParallelScale(camera.GetParallelScale() / factor)
|
244
|
-
else:
|
245
|
-
camera.Dolly(factor)
|
246
|
-
if self.GetAutoAdjustCameraClippingRange():
|
247
|
-
renderer.ResetCameraClippingRange()
|
248
|
-
|
249
|
-
if self.GetInteractor().GetLightFollowCamera():
|
250
|
-
renderer.UpdateLightsGeometryToFollowCamera()
|
251
|
-
|
252
|
-
self.GetInteractor().Render()
|
253
|
-
|
254
|
-
def move_viewport(self, dx, dy):
|
255
|
-
"""
|
256
|
-
Moves the viewport in view coordinates by some amount of pixels.
|
257
|
-
|
258
|
-
Further explanations on this link:
|
259
|
-
https://github.com/open-pulse/OpenPulse/blob/5f7bd4719527383b2d3ea078e5f29f214f35128d/doc/code_explanation/move_viewport.pdf
|
260
|
-
"""
|
261
|
-
|
262
|
-
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
263
|
-
camera = renderer.GetActiveCamera()
|
264
|
-
width, heigth = renderer.GetSize()
|
265
|
-
|
266
|
-
if camera.GetParallelProjection():
|
267
|
-
view_height = 2 * camera.GetParallelScale()
|
268
|
-
else:
|
269
|
-
correction = camera.GetDistance()
|
270
|
-
view_height = 2 * correction * np.tan(0.5 * camera.GetViewAngle() / 57.296)
|
271
|
-
scale = view_height / heigth
|
272
|
-
|
273
|
-
focal_point = np.array(camera.GetFocalPoint())
|
274
|
-
camera_position = np.array(camera.GetPosition())
|
275
|
-
camera_up = np.array(camera.GetViewUp())
|
276
|
-
camera_in = np.array(camera.GetDirectionOfProjection())
|
277
|
-
camera_right = np.cross(camera_in, camera_up)
|
278
|
-
|
279
|
-
camera_displacement = scale * (camera_right * dx + camera_up * dy)
|
280
|
-
camera.SetPosition(camera_position + camera_displacement)
|
281
|
-
camera.SetFocalPoint(focal_point + camera_displacement)
|
282
|
-
|
283
|
-
def _make_default_cor_actor(self):
|
284
|
-
actor = RoundPointsActor([(0, 0, 0)])
|
285
|
-
actor.appear_in_front(True)
|
286
|
-
actor.GetProperty().SetColor(1, 0, 0)
|
287
|
-
actor.GetProperty().SetPointSize(10)
|
288
|
-
return actor
|
1
|
+
import numpy as np
|
2
|
+
from vtkmodules.vtkCommonTransforms import vtkTransform
|
3
|
+
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera
|
4
|
+
from vtkmodules.vtkRenderingCore import vtkPropPicker
|
5
|
+
|
6
|
+
from molde.actors import RoundPointsActor
|
7
|
+
|
8
|
+
|
9
|
+
class ArcballCameraInteractorStyle(vtkInteractorStyleTrackballCamera):
|
10
|
+
"""
|
11
|
+
Interactor style that rotates and zooms around the cursor.
|
12
|
+
"""
|
13
|
+
|
14
|
+
def __init__(self):
|
15
|
+
self.center_of_rotation = None
|
16
|
+
self.default_center_of_rotation = None
|
17
|
+
|
18
|
+
self.is_left_clicked = False
|
19
|
+
self.is_right_clicked = False
|
20
|
+
self.is_mid_clicked = False
|
21
|
+
|
22
|
+
self.is_rotating = False
|
23
|
+
self.is_panning = False
|
24
|
+
|
25
|
+
self.mid_button_click_position = (0, 0)
|
26
|
+
# cor = center of rotation
|
27
|
+
self.cor_actor = self._make_default_cor_actor()
|
28
|
+
self._create_observers()
|
29
|
+
|
30
|
+
def set_default_center_of_rotation(self, center):
|
31
|
+
self.default_center_of_rotation = center
|
32
|
+
|
33
|
+
def set_cor_actor(self, actor):
|
34
|
+
self.cor_actor = actor
|
35
|
+
|
36
|
+
def _create_observers(self):
|
37
|
+
self.AddObserver("LeftButtonPressEvent", self._left_button_press_event)
|
38
|
+
self.AddObserver("LeftButtonReleaseEvent", self._left_button_release_event)
|
39
|
+
self.AddObserver("RightButtonPressEvent", self._right_button_press_event)
|
40
|
+
self.AddObserver("RightButtonReleaseEvent", self._right_button_release_event)
|
41
|
+
self.AddObserver("MouseMoveEvent", self._mouse_move_event)
|
42
|
+
self.AddObserver("MouseWheelForwardEvent", self._mouse_wheel_forward_event)
|
43
|
+
self.AddObserver("MouseWheelBackwardEvent", self._mouse_wheel_backward_event)
|
44
|
+
self.AddObserver("MiddleButtonPressEvent", self._click_mid_button_press_event)
|
45
|
+
self.AddObserver("MiddleButtonReleaseEvent", self._click_mid_button_release_event)
|
46
|
+
|
47
|
+
def _left_button_press_event(self, obj, event):
|
48
|
+
# Implemented to stop the superclass movement
|
49
|
+
self.is_left_clicked = True
|
50
|
+
|
51
|
+
def _left_button_release_event(self, obj, event):
|
52
|
+
# Implemented to stop the superclass movement
|
53
|
+
self.is_left_clicked = False
|
54
|
+
|
55
|
+
def _right_button_press_event(self, obj, event):
|
56
|
+
self.is_right_clicked = True
|
57
|
+
self.is_rotating = True
|
58
|
+
|
59
|
+
cursor = self.GetInteractor().GetEventPosition()
|
60
|
+
self.FindPokedRenderer(cursor[0], cursor[1])
|
61
|
+
|
62
|
+
renderer = self.GetCurrentRenderer() or self.GetDefaultRenderer()
|
63
|
+
camera = renderer.GetActiveCamera()
|
64
|
+
|
65
|
+
if renderer is None:
|
66
|
+
return
|
67
|
+
|
68
|
+
picker = vtkPropPicker()
|
69
|
+
picker.Pick(cursor[0], cursor[1], 0, renderer)
|
70
|
+
pos = picker.GetPickPosition()
|
71
|
+
|
72
|
+
if pos != (0, 0, 0):
|
73
|
+
self.center_of_rotation = pos
|
74
|
+
|
75
|
+
elif self.default_center_of_rotation is not None:
|
76
|
+
self.center_of_rotation = self.default_center_of_rotation
|
77
|
+
|
78
|
+
else:
|
79
|
+
x0, x1, y0, y1, z0, z1 = renderer.ComputeVisiblePropBounds()
|
80
|
+
self.center_of_rotation = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2]
|
81
|
+
|
82
|
+
dx, dy, dz = np.array(camera.GetPosition()) - np.array(camera.GetFocalPoint())
|
83
|
+
distance_factor = np.sqrt(dx**2 + dy**2 + dz**2)
|
84
|
+
|
85
|
+
self.cor_actor.SetPosition(self.center_of_rotation)
|
86
|
+
self.cor_actor.SetScale((distance_factor / 3.5, distance_factor / 3.5, distance_factor / 3.5))
|
87
|
+
renderer.AddActor(self.cor_actor)
|
88
|
+
|
89
|
+
def _right_button_release_event(self, obj, event):
|
90
|
+
self.is_right_clicked = False
|
91
|
+
self.is_rotating = False
|
92
|
+
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
93
|
+
renderer.RemoveActor(self.cor_actor)
|
94
|
+
self.GetInteractor().Render()
|
95
|
+
self.EndDolly()
|
96
|
+
|
97
|
+
def _click_mid_button_press_event(self, obj, event):
|
98
|
+
self.is_mid_clicked = True
|
99
|
+
self.is_panning = True
|
100
|
+
cursor = self.GetInteractor().GetEventPosition()
|
101
|
+
self.mid_button_click_position = cursor
|
102
|
+
self.FindPokedRenderer(cursor[0], cursor[1])
|
103
|
+
|
104
|
+
def _click_mid_button_release_event(self, obj, event):
|
105
|
+
self.is_mid_clicked = False
|
106
|
+
self.is_panning = False
|
107
|
+
|
108
|
+
def _mouse_move_event(self, obj, event):
|
109
|
+
zoom = self.is_mid_clicked and self.GetInteractor().GetControlKey()
|
110
|
+
|
111
|
+
if zoom and not self.is_zooming:
|
112
|
+
self.is_zooming = True
|
113
|
+
|
114
|
+
if not zoom:
|
115
|
+
self.is_zooming = False
|
116
|
+
|
117
|
+
if self.is_zooming:
|
118
|
+
# Implementation based on this link
|
119
|
+
# https://github.com/Kitware/VTK/blob/4c4cd48244eaf1a74e0b096aae773c5498f7a782/Interaction/Style/vtkInteractorStyleTrackballCamera.cxx#L352
|
120
|
+
y0 = self.GetInteractor().GetLastEventPosition()[1]
|
121
|
+
y1 = self.GetInteractor().GetEventPosition()[1]
|
122
|
+
dyf = 10 * (y1 - y0) / self.GetCurrentRenderer().GetCenter()[1]
|
123
|
+
factor = 1.1 ** dyf
|
124
|
+
self.dolly_on_point(factor, *self.mid_button_click_position)
|
125
|
+
|
126
|
+
elif self.is_rotating:
|
127
|
+
self.rotate()
|
128
|
+
|
129
|
+
elif self.is_panning:
|
130
|
+
self.Pan()
|
131
|
+
|
132
|
+
self.OnMouseMove()
|
133
|
+
|
134
|
+
def _mouse_wheel_forward_event(self, obj, event):
|
135
|
+
int_pos = self.GetInteractor().GetEventPosition()
|
136
|
+
|
137
|
+
self.FindPokedRenderer(int_pos[0], int_pos[1])
|
138
|
+
|
139
|
+
if self.GetCurrentRenderer() is None:
|
140
|
+
return
|
141
|
+
|
142
|
+
motion_factor = 10
|
143
|
+
mouse_motion_factor = 1
|
144
|
+
|
145
|
+
factor = motion_factor * 0.2 * mouse_motion_factor
|
146
|
+
|
147
|
+
self.dolly(1.1**factor)
|
148
|
+
|
149
|
+
self.ReleaseFocus()
|
150
|
+
|
151
|
+
def _mouse_wheel_backward_event(self, obj, event):
|
152
|
+
int_pos = self.GetInteractor().GetEventPosition()
|
153
|
+
|
154
|
+
self.FindPokedRenderer(int_pos[0], int_pos[1])
|
155
|
+
|
156
|
+
if self.GetCurrentRenderer() is None:
|
157
|
+
return
|
158
|
+
|
159
|
+
motion_factor = 10
|
160
|
+
mouse_motion_factor = 1
|
161
|
+
|
162
|
+
factor = motion_factor * -0.2 * mouse_motion_factor
|
163
|
+
|
164
|
+
self.dolly(1.1**factor)
|
165
|
+
|
166
|
+
self.ReleaseFocus()
|
167
|
+
|
168
|
+
def rotate(self):
|
169
|
+
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
170
|
+
if renderer is None:
|
171
|
+
return
|
172
|
+
|
173
|
+
rwi = self.GetInteractor()
|
174
|
+
delta_mouse = np.array(rwi.GetEventPosition()) - np.array(rwi.GetLastEventPosition())
|
175
|
+
size = np.array(renderer.GetRenderWindow().GetSize())
|
176
|
+
motion_factor = 10
|
177
|
+
elevation_azimuth = -20 / size
|
178
|
+
rotation_factor = delta_mouse * motion_factor * elevation_azimuth
|
179
|
+
|
180
|
+
camera = renderer.GetActiveCamera()
|
181
|
+
|
182
|
+
self.rotate_around_center(rotation_factor[0], rotation_factor[1])
|
183
|
+
|
184
|
+
camera.OrthogonalizeViewUp()
|
185
|
+
|
186
|
+
renderer.ResetCameraClippingRange()
|
187
|
+
|
188
|
+
if rwi.GetLightFollowCamera():
|
189
|
+
renderer.UpdateLightsGeometryToFollowCamera()
|
190
|
+
|
191
|
+
rwi.Render()
|
192
|
+
|
193
|
+
def rotate_around_center(self, anglex, angley):
|
194
|
+
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
195
|
+
camera = renderer.GetActiveCamera()
|
196
|
+
|
197
|
+
transform_camera = vtkTransform()
|
198
|
+
transform_camera.Identity()
|
199
|
+
|
200
|
+
axis = [
|
201
|
+
-camera.GetViewTransformObject().GetMatrix().GetElement(0, 0),
|
202
|
+
-camera.GetViewTransformObject().GetMatrix().GetElement(0, 1),
|
203
|
+
-camera.GetViewTransformObject().GetMatrix().GetElement(0, 2),
|
204
|
+
]
|
205
|
+
|
206
|
+
saved_view_up = camera.GetViewUp()
|
207
|
+
transform_camera.RotateWXYZ(angley, axis)
|
208
|
+
new_view_up = transform_camera.TransformPoint(camera.GetViewUp())
|
209
|
+
camera.SetViewUp(new_view_up)
|
210
|
+
transform_camera.Identity()
|
211
|
+
|
212
|
+
cor = self.center_of_rotation
|
213
|
+
|
214
|
+
transform_camera.Translate(+cor[0], +cor[1], +cor[2])
|
215
|
+
transform_camera.RotateWXYZ(anglex, camera.GetViewUp())
|
216
|
+
transform_camera.RotateWXYZ(angley, axis)
|
217
|
+
transform_camera.Translate(-cor[0], -cor[1], -cor[2])
|
218
|
+
|
219
|
+
new_camera_position = transform_camera.TransformPoint(camera.GetPosition())
|
220
|
+
camera.SetPosition(new_camera_position)
|
221
|
+
|
222
|
+
new_focal_point = transform_camera.TransformPoint(camera.GetFocalPoint())
|
223
|
+
camera.SetFocalPoint(new_focal_point)
|
224
|
+
|
225
|
+
camera.SetViewUp(saved_view_up)
|
226
|
+
|
227
|
+
camera.Modified()
|
228
|
+
|
229
|
+
def dolly(self, factor):
|
230
|
+
cursor = self.GetInteractor().GetEventPosition()
|
231
|
+
self.dolly_on_point(factor, *cursor)
|
232
|
+
|
233
|
+
def dolly_on_point(self, factor, x, y):
|
234
|
+
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
235
|
+
camera = renderer.GetActiveCamera()
|
236
|
+
|
237
|
+
view_center = np.array(renderer.GetSize()) / 2
|
238
|
+
distance_to_center = (x, y) - view_center
|
239
|
+
dx, dy = distance_to_center * (1 - 1 / factor)
|
240
|
+
self.move_viewport(dx, dy)
|
241
|
+
|
242
|
+
if camera.GetParallelProjection():
|
243
|
+
camera.SetParallelScale(camera.GetParallelScale() / factor)
|
244
|
+
else:
|
245
|
+
camera.Dolly(factor)
|
246
|
+
if self.GetAutoAdjustCameraClippingRange():
|
247
|
+
renderer.ResetCameraClippingRange()
|
248
|
+
|
249
|
+
if self.GetInteractor().GetLightFollowCamera():
|
250
|
+
renderer.UpdateLightsGeometryToFollowCamera()
|
251
|
+
|
252
|
+
self.GetInteractor().Render()
|
253
|
+
|
254
|
+
def move_viewport(self, dx, dy):
|
255
|
+
"""
|
256
|
+
Moves the viewport in view coordinates by some amount of pixels.
|
257
|
+
|
258
|
+
Further explanations on this link:
|
259
|
+
https://github.com/open-pulse/OpenPulse/blob/5f7bd4719527383b2d3ea078e5f29f214f35128d/doc/code_explanation/move_viewport.pdf
|
260
|
+
"""
|
261
|
+
|
262
|
+
renderer = self.GetDefaultRenderer() or self.GetCurrentRenderer()
|
263
|
+
camera = renderer.GetActiveCamera()
|
264
|
+
width, heigth = renderer.GetSize()
|
265
|
+
|
266
|
+
if camera.GetParallelProjection():
|
267
|
+
view_height = 2 * camera.GetParallelScale()
|
268
|
+
else:
|
269
|
+
correction = camera.GetDistance()
|
270
|
+
view_height = 2 * correction * np.tan(0.5 * camera.GetViewAngle() / 57.296)
|
271
|
+
scale = view_height / heigth
|
272
|
+
|
273
|
+
focal_point = np.array(camera.GetFocalPoint())
|
274
|
+
camera_position = np.array(camera.GetPosition())
|
275
|
+
camera_up = np.array(camera.GetViewUp())
|
276
|
+
camera_in = np.array(camera.GetDirectionOfProjection())
|
277
|
+
camera_right = np.cross(camera_in, camera_up)
|
278
|
+
|
279
|
+
camera_displacement = scale * (camera_right * dx + camera_up * dy)
|
280
|
+
camera.SetPosition(camera_position + camera_displacement)
|
281
|
+
camera.SetFocalPoint(focal_point + camera_displacement)
|
282
|
+
|
283
|
+
def _make_default_cor_actor(self):
|
284
|
+
actor = RoundPointsActor([(0, 0, 0)])
|
285
|
+
actor.appear_in_front(True)
|
286
|
+
actor.GetProperty().SetColor(1, 0, 0)
|
287
|
+
actor.GetProperty().SetPointSize(10)
|
288
|
+
return actor
|