1 from pyglet
.window
import key
2 from pyglet
.window
.mouse
import LEFT
, RIGHT
, MIDDLE
3 from util
import get_direction_vectors
, get_basis_vectors
5 class PlotController(object):
7 normal_mouse_sensitivity
= 4.0
8 modified_mouse_sensitivity
= 1.0
10 normal_key_sensitivity
= 160.0
11 modified_key_sensitivity
= 40.0
31 key
.NUM_1
:'rotate_z_neg',
34 key
.NUM_3
:'rotate_z_pos',
37 key
.NUM_7
:'spin_left',
39 key
.NUM_9
:'spin_right',
42 key
.NUM_5
:'reset_camera',
44 key
.NUM_ADD
:'zoom_in',
48 key
.NUM_SUBTRACT
:'zoom_out',
49 key
.PAGEDOWN
:'zoom_out',
52 key
.RSHIFT
:'modify_sensitivity',
53 key
.LSHIFT
:'modify_sensitivity',
55 key
.F1
:'rot_preset_xy',
56 key
.F2
:'rot_preset_xz',
57 key
.F3
:'rot_preset_yz',
58 key
.F4
:'rot_preset_perspective',
61 key
.F6
:'toggle_axe_colors',
66 def __init__(self
, window
, **kwargs
):
67 self
.invert_mouse_zoom
= kwargs
.pop('invert_mouse_zoom', False)
69 self
.camera
= window
.camera
71 # Rotation around the view Y (up) vector
74 # Rotation around the view X vector
77 # Rotation around the view Z vector
80 # Rotation around the model Z vector
83 # Reset to the default rotation
85 # Performs camera z-translation
88 # Use alternative sensitivity (speed)
89 'modify_sensitivity':False,
91 'rot_preset_xy':False,
92 'rot_preset_xz':False,
93 'rot_preset_yz':False,
94 'rot_preset_perspective':False,
97 'toggle_axe_colors':False,
102 def update(self
, dt
):
104 if self
.action
['zoom_out']: z
-= 1
105 if self
.action
['zoom_in']: z
+= 1
107 self
.camera
.zoom_relative(z
/10.0, self
.get_key_sensitivity()/10.0)
110 if self
.action
['left']: dx
-= 1
111 if self
.action
['right']: dx
+= 1
112 if self
.action
['up']: dy
-= 1
113 if self
.action
['down']: dy
+= 1
114 if self
.action
['spin_left']: dz
+= 1
115 if self
.action
['spin_right']: dz
-= 1
119 self
.camera
.euler_rotate(dx
*dt
*self
.get_key_sensitivity(), *(get_direction_vectors()[1]))
121 self
.camera
.euler_rotate(dy
*dt
*self
.get_key_sensitivity(), *(get_direction_vectors()[0]))
123 self
.camera
.euler_rotate(dz
*dt
*self
.get_key_sensitivity(), *(get_direction_vectors()[2]))
125 self
.camera
.mouse_translate(0, 0, dx
*dt
*self
.get_key_sensitivity(), -dy
*dt
*self
.get_key_sensitivity())
128 if self
.action
['rotate_z_neg'] and not self
.is_2D(): rz
-= 1
129 if self
.action
['rotate_z_pos'] and not self
.is_2D(): rz
+= 1
132 self
.camera
.euler_rotate(rz
*dt
*self
.get_key_sensitivity(), *(get_basis_vectors()[2]))
134 if self
.action
['reset_camera']:
137 if self
.action
['rot_preset_xy']:
138 self
.camera
.set_rot_preset('xy')
139 if self
.action
['rot_preset_xz']:
140 self
.camera
.set_rot_preset('xz')
141 if self
.action
['rot_preset_yz']:
142 self
.camera
.set_rot_preset('yz')
143 if self
.action
['rot_preset_perspective']:
144 self
.camera
.set_rot_preset('perspective')
146 if self
.action
['toggle_axes']:
147 self
.action
['toggle_axes'] = False
148 self
.camera
.axes
.toggle_visible()
150 if self
.action
['toggle_axe_colors']:
151 self
.action
['toggle_axe_colors'] = False
152 self
.camera
.axes
.toggle_colors()
154 if self
.action
['save_image']:
155 self
.action
['save_image'] = False
156 self
.window
.plot
.saveimage()
160 def get_mouse_sensitivity(self
):
161 if self
.action
['modify_sensitivity']:
162 return self
.modified_mouse_sensitivity
164 return self
.normal_mouse_sensitivity
166 def get_key_sensitivity(self
):
167 if self
.action
['modify_sensitivity']:
168 return self
.modified_key_sensitivity
170 return self
.normal_key_sensitivity
172 def on_key_press(self
, symbol
, modifiers
):
173 if symbol
in self
.keymap
:
174 self
.action
[self
.keymap
[symbol
]] = True
176 def on_key_release(self
, symbol
, modifiers
):
177 if symbol
in self
.keymap
:
178 self
.action
[self
.keymap
[symbol
]] = False
180 def on_mouse_drag(self
, x
, y
, dx
, dy
, buttons
, modifiers
):
183 self
.camera
.mouse_translate(x
, y
, dx
, dy
)
185 self
.camera
.spherical_rotate((x
-dx
,y
-dy
),(x
,y
), self
.get_mouse_sensitivity())
187 self
.camera
.zoom_relative([1,-1][self
.invert_mouse_zoom
]*dy
, self
.get_mouse_sensitivity()/20.0)
189 self
.camera
.mouse_translate(x
, y
, dx
, dy
)
191 def on_mouse_scroll(self
, x
, y
, dx
, dy
):
192 self
.camera
.zoom_relative([1,-1][self
.invert_mouse_zoom
]*dy
, self
.get_mouse_sensitivity())
195 functions
= self
.window
.plot
._functions
197 if len(functions
[i
].i_vars
)>1 or len(functions
[i
].d_vars
)>2: