molde 0.1.11__py3-none-any.whl → 0.1.12__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.
Files changed (52) hide show
  1. molde/__init__.py +12 -12
  2. molde/__main__.py +81 -81
  3. molde/actors/__init__.py +5 -5
  4. molde/actors/common_symbols_actor.py +148 -164
  5. molde/actors/ghost_actor.py +12 -12
  6. molde/actors/lines_actor.py +31 -31
  7. molde/actors/round_points_actor.py +7 -7
  8. molde/actors/square_points_actor.py +32 -32
  9. molde/colors/__init__.py +1 -1
  10. molde/colors/color.py +150 -150
  11. molde/colors/color_names.py +124 -124
  12. molde/interactor_styles/__init__.py +2 -2
  13. molde/interactor_styles/arcball_camera_style.py +288 -288
  14. molde/interactor_styles/box_selection_style.py +87 -87
  15. molde/main_window.ui +864 -864
  16. molde/pickers/__init__.py +2 -2
  17. molde/pickers/cell_area_picker.py +61 -61
  18. molde/pickers/cell_property_area_picker.py +84 -84
  19. molde/poly_data/__init__.py +13 -13
  20. molde/poly_data/lines_data.py +23 -23
  21. molde/poly_data/vertices_data.py +24 -24
  22. molde/render_widgets/__init__.py +2 -2
  23. molde/render_widgets/animated_render_widget.py +164 -164
  24. molde/render_widgets/common_render_widget.py +429 -429
  25. molde/stylesheets/__init__.py +122 -122
  26. molde/stylesheets/common.qss +15 -15
  27. molde/stylesheets/create_color_page.py +61 -61
  28. molde/stylesheets/mainwindow.ui +646 -646
  29. molde/stylesheets/qcheckbox.qss +23 -23
  30. molde/stylesheets/qinputs.qss +81 -81
  31. molde/stylesheets/qlayouts.qss +23 -23
  32. molde/stylesheets/qmenubar.qss +12 -12
  33. molde/stylesheets/qprogressbar.qss +11 -11
  34. molde/stylesheets/qpushbutton.qss +89 -89
  35. molde/stylesheets/qradiobutton.qss +30 -30
  36. molde/stylesheets/qscrollbar.qss +29 -29
  37. molde/stylesheets/qslider.qss +61 -61
  38. molde/stylesheets/qtablewidget.qss +27 -27
  39. molde/stylesheets/qtabwidget.qss +28 -28
  40. molde/stylesheets/qtoolbar.qss +63 -63
  41. molde/stylesheets/qtoolbuttons.qss +14 -14
  42. molde/stylesheets/qtreewidget.qss +25 -25
  43. molde/ui_files/messages/new_loading_window.ui +73 -73
  44. molde/utils/__init__.py +8 -8
  45. molde/utils/format_sequences.py +44 -44
  46. molde/utils/poly_data_utils.py +66 -66
  47. molde/utils/tree_info.py +52 -52
  48. molde/windows/loading_window.py +189 -189
  49. {molde-0.1.11.dist-info → molde-0.1.12.dist-info}/METADATA +1 -1
  50. molde-0.1.12.dist-info/RECORD +68 -0
  51. molde-0.1.11.dist-info/RECORD +0 -68
  52. {molde-0.1.11.dist-info → molde-0.1.12.dist-info}/WHEEL +0 -0
@@ -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