-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathmouse.html
More file actions
290 lines (244 loc) · 22.1 KB
/
Copy pathmouse.html
File metadata and controls
290 lines (244 loc) · 22.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
<title>Mouse Input — VPython 3.2 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Radio Buttons" href="radiobutton.html" />
<link rel="prev" title="Menus" href="menu.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="mouse-input">
<h1><a class="toc-backref" href="#id1" role="doc-backlink">Mouse Input</a><a class="headerlink" href="#mouse-input" title="Permalink to this heading">¶</a></h1>
<nav class="contents" id="contents">
<p class="topic-title">Contents</p>
<ul class="simple">
<li><p><a class="reference internal" href="#mouse-input" id="id1">Mouse Input</a></p>
<ul>
<li><p><a class="reference internal" href="#scene-pause" id="id2">scene.pause</a></p></li>
<li><p><a class="reference internal" href="#scene-waitfor" id="id3">scene.waitfor()</a></p></li>
<li><p><a class="reference internal" href="#scene-mouse" id="id4">scene.mouse()</a></p></li>
<li><p><a class="reference internal" href="#scene-mouse-project" id="id5">scene.mouse.project()</a></p></li>
<li><p><a class="reference internal" href="#mouse-event-handlers" id="id6">Mouse Event Handlers</a></p></li>
</ul>
</li>
</ul>
</nav>
<p>Clicking or dragging the mouse generates events. VPython does not currently handle right button or middle button events.</p>
<section id="scene-pause">
<h2><a class="toc-backref" href="#id2" role="doc-backlink">scene.pause</a><a class="headerlink" href="#scene-pause" title="Permalink to this heading">¶</a></h2>
<p>The simplest use of the mouse is to pause and wait for a mouse click:</p>
<dl class="py function">
<dt class="sig sig-object py">
<span class="sig-name descname"><span class="pre">myevt</span> <span class="pre">=</span> <span class="pre">scene.pause()</span></span></dt>
<dd></dd></dl>
<p>A white triangle is displayed in the canvas to indicate that the program is paused, waiting for a mouse click. When the mouse is clicked, the variable <code class="docutils literal notranslate"><span class="pre">myevt</span></code> will have the following attributes:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.event</span></code> Type of event; will be “click”.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.pageX</span></code> The x-coordinate of the mouse position in pixels; (0,0) is in the upper left corner.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.pageY</span></code> The y-coordinate of the mouse position in pixels.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.pos</span></code> The position of the mouse in world coordinates (a vector)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.which</span></code> is the mouse button indicator (mouse is always 1 for now).</p></li>
</ul>
</section>
<section id="scene-waitfor">
<span id="waitfor"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">scene.waitfor()</a><a class="headerlink" href="#scene-waitfor" title="Permalink to this heading">¶</a></h2>
<p>Using <code class="docutils literal notranslate"><span class="pre">scene.waitfor()</span></code> allows you to specify the type of event (which, in addition to the mouse events listed below, can involve keypresses or even redraw events). A <code class="docutils literal notranslate"><span class="pre">scene.waitfor()</span></code> pauses the program until the particular event occurs.</p>
<dl class="py function">
<dt class="sig sig-object py">
<span class="sig-name descname"><span class="pre">myevt</span> <span class="pre">=</span> <span class="pre">scene.waitfor('click')</span></span></dt>
<dd><dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>argument</strong> (<em>string</em>) – Event(s) for which to wait.</p>
</dd>
</dl>
</dd></dl>
<p>Possible arguments are:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">click</span></code> Wait for mouse button click.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">mousedown</span></code> Wait for mouse button press.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">mouseup</span></code> Wait for mouse button release.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">mousemove</span></code> Wait for mouse to move.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">mouseenter</span></code> Wait for mouse to move into canvas.</p></li>
</ul>
<p>Multiple arguments may be combined, for example <cite>mousedown mousemove</cite>.</p>
<p>The variable <code class="docutils literal notranslate"><span class="pre">myevt</span></code> will have the following attributes:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.event</span></code> Type of event.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.pageX</span></code> The x-coordinate of the mouse position in pixels; (0,0) is in the upper left corner.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.pageY</span></code> The y-coordinate of the mouse position in pixels.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.pos</span></code> The position of the mouse in world coordinates (a vector)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.canvas</span></code> The canvas in which the event occured.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">myevt.which</span></code> is the mouse button indicator (mouse is always 1 for now).</p></li>
</ul>
</section>
<section id="scene-mouse">
<h2><a class="toc-backref" href="#id4" role="doc-backlink">scene.mouse()</a><a class="headerlink" href="#scene-mouse" title="Permalink to this heading">¶</a></h2>
<p>Information about the current state of the mouse is available in <code class="docutils literal notranslate"><span class="pre">scene.mouse()</span></code>, which can be interrogated at any time.</p>
<dl class="py function">
<dt class="sig sig-object py">
<span class="sig-name descname"><span class="pre">mickey</span> <span class="pre">=</span> <span class="pre">scene.mouse()</span></span></dt>
<dd><dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>pos</strong> (<em>vector</em>) – Is the current 3D position of the mouse cursor. This is always at a location in the plane parallel to the screen, passing through <code class="docutils literal notranslate"><span class="pre">scene.center</span></code>.</p></li>
<li><p><strong>pick</strong> (<em>object</em>) – The object (if any) on which the mouse cursor currently rests. If the cursor rests on a box named <em>cube</em> then <code class="docutils literal notranslate"><span class="pre">scene.mouse.pick</span> <span class="pre">==</span> <span class="pre">cube</span></code> will be True. Some objects are <em>not</em> pickable: label, helix, and curves, spheres, and arrows created by <code class="docutils literal notranslate"><span class="pre">make_trail</span></code>, <code class="docutils literal notranslate"><span class="pre">attach_trail</span></code>, and <code class="docutils literal notranslate"><span class="pre">attach_arrow</span></code>.</p></li>
<li><p><strong>ray</strong> (<em>vector</em>) – A unit vector from the camera to the mouse cursor.</p></li>
<li><p><strong>alt</strong> (<em>boolean</em>) – True if the ALT key is down.</p></li>
<li><p><strong>ctrl</strong> (<em>boolean</em>) – True if the CTRL key is down.</p></li>
<li><p><strong>shift</strong> (<em>boolean</em>) – True if the SHIFT key is down.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
</section>
<section id="scene-mouse-project">
<h2><a class="toc-backref" href="#id5" role="doc-backlink">scene.mouse.project()</a><a class="headerlink" href="#scene-mouse-project" title="Permalink to this heading">¶</a></h2>
<p>This returns the 3D position of the mouse cursor when projected onto a plane that is parallel to the specified normal, and passes through the point specified. Returns None if there is no intersection with the plane.</p>
<dl class="py function">
<dt class="sig sig-object py">
<span class="sig-name descname"><span class="pre">mypos</span> <span class="pre">=</span> <span class="pre">scene.mouse.project(</span> <span class="pre">normal=vec(0,1,0),</span> <span class="pre">point=vec(0,3,0)</span> <span class="pre">)</span></span></dt>
<dd><dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>normal</strong> (<em>vector</em>) – A unit vector normal to the plane onto which the cursor is to be projected.</p></li>
<li><p><strong>point</strong> (<em>vector</em>) – A point through which the projection plane passes. Default is <0, 0, 0>.</p></li>
<li><p><strong>d</strong> (<em>scalar</em>) – Alternative to <em>point</em>. Distance from origin to the projection plane.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<p>The following program allows the user to leave a trail of spheres in a plane parallel to the <em>xz</em> plane by moving the mouse with the mouse button up:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">xax</span> <span class="o">=</span> <span class="n">curve</span><span class="p">(</span><span class="n">pos</span><span class="o">=</span><span class="p">[</span> <span class="n">vec</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">vec</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="p">]</span> <span class="p">)</span>
<span class="n">yax</span> <span class="o">=</span> <span class="n">curve</span><span class="p">(</span><span class="n">pos</span><span class="o">=</span><span class="p">[</span> <span class="n">vec</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">vec</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="p">]</span> <span class="p">)</span>
<span class="n">zax</span> <span class="o">=</span> <span class="n">curve</span><span class="p">(</span><span class="n">pos</span><span class="o">=</span><span class="p">[</span> <span class="n">vec</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">),</span> <span class="n">vec</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span> <span class="p">]</span> <span class="p">)</span>
<span class="n">bb</span> <span class="o">=</span> <span class="n">box</span><span class="p">(</span><span class="n">pos</span><span class="o">=</span><span class="n">vec</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">size</span><span class="o">=</span><span class="n">vec</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mf">0.01</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="n">opacity</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
<span class="n">scene</span><span class="o">.</span><span class="n">autoscale</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">rate</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
<span class="n">mpos</span> <span class="o">=</span> <span class="n">scene</span><span class="o">.</span><span class="n">mouse</span><span class="o">.</span><span class="n">project</span><span class="p">(</span> <span class="n">normal</span><span class="o">=</span><span class="n">vec</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">point</span><span class="o">=</span><span class="n">vec</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mpos</span> <span class="o">!=</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">sphere</span><span class="p">(</span><span class="n">pos</span><span class="o">=</span><span class="n">mpos</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="o">.</span><span class="n">green</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="mouse-event-handlers">
<h2><a class="toc-backref" href="#id6" role="doc-backlink">Mouse Event Handlers</a><a class="headerlink" href="#mouse-event-handlers" title="Permalink to this heading">¶</a></h2>
<p>A mouse event can be bound to a function.</p>
<dl class="py function">
<dt class="sig sig-object py">
<span class="sig-prename descclassname"><span class="pre">scene.</span></span><span class="sig-name descname"><span class="pre">bind</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">'click'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">newcolor</span></span></em><span class="sig-paren">)</span></dt>
<dd><dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>firstargument</strong> (<em>string</em>) – Event type. May be ‘click’, ‘mousedown’, ‘mousemove’, ‘mouseup’.</p></li>
<li><p><strong>secondargument</strong> (<em>function</em>) – Name of function to be called when mouse event occurs.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<p>The following code allows the user to change the color of the sphere by clicking anywhere in the canvas:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">s</span> <span class="o">=</span> <span class="n">sphere</span><span class="p">(</span><span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="o">.</span><span class="n">cyan</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">change</span><span class="p">():</span>
<span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">color</span><span class="o">.</span><span class="n">equals</span><span class="p">(</span><span class="n">color</span><span class="o">.</span><span class="n">cyan</span><span class="p">):</span>
<span class="n">s</span><span class="o">.</span><span class="n">color</span> <span class="o">=</span> <span class="n">color</span><span class="o">.</span><span class="n">red</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">color</span> <span class="o">=</span> <span class="n">color</span><span class="o">.</span><span class="n">cyan</span>
<span class="n">scene</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s1">'click'</span><span class="p">,</span> <span class="n">change</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="userinput.html#eventhandler"><span class="std std-ref">Event Handlers</span></a>; <a class="reference internal" href="userinput.html#event-handling"><span class="std std-ref">Processing Events</span></a>; <a class="reference internal" href="userinput.html#polling"><span class="std std-ref">Polling</span></a>; <a class="reference internal" href="widgetPosition.html"><span class="doc">Widget Position</span></a></p>
</div>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">VPython</a></h1>
<h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="objects.html">3D Objects</a></li>
<li class="toctree-l1"><a class="reference internal" href="rate.html">Animations</a></li>
<li class="toctree-l1"><a class="reference internal" href="canvas.html">Canvases</a></li>
<li class="toctree-l1"><a class="reference internal" href="cameraAndLights.html">Camera and Lighting</a></li>
<li class="toctree-l1"><a class="reference internal" href="colorOpacityGlow.html">Color/Opacity/Glow</a></li>
<li class="toctree-l1"><a class="reference internal" href="makeshapes.html">Design New Objects</a></li>
<li class="toctree-l1"><a class="reference internal" href="file.html">Files/Libraries</a></li>
<li class="toctree-l1"><a class="reference internal" href="graph.html">Graphs</a></li>
<li class="toctree-l1"><a class="reference internal" href="math.html">Math Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="workwithobjects.html">Object Attachments</a></li>
<li class="toctree-l1"><a class="reference internal" href="rotation.html">Rotation</a></li>
<li class="toctree-l1"><a class="reference internal" href="textoutput.html">Text output</a></li>
<li class="toctree-l1"><a class="reference internal" href="texture.html">Textures</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="userinput.html">User Input</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="checkbox.html">Checkboxes</a></li>
<li class="toctree-l2"><a class="reference internal" href="key.html">Key input</a></li>
<li class="toctree-l2"><a class="reference internal" href="menu.html">Menus</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Mouse input</a></li>
<li class="toctree-l2"><a class="reference internal" href="radiobutton.html">Radio buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="textinput.html">Text input</a></li>
<li class="toctree-l2"><a class="reference internal" href="slider.html">Sliders</a></li>
<li class="toctree-l2"><a class="reference internal" href="widgetPosition.html">Widget Position</a></li>
<li class="toctree-l2"><a class="reference internal" href="userinput.html#processing-events">Processing Events</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="webvs7.html">VPython/WebVpython</a></li>
<li class="toctree-l1"><a class="reference internal" href="license.html">VPython license</a></li>
<li class="toctree-l1"><a class="reference internal" href="resources.html">Additional Resources</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="userinput.html">User Input</a><ul>
<li>Previous: <a href="menu.html" title="previous chapter">Menus</a></li>
<li>Next: <a href="radiobutton.html" title="next chapter">Radio Buttons</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>document.getElementById('searchbox').style.display = "block"</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
©2023, Ruth Chabay and Bruce Sherwood.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 5.0.2</a>
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/mouse.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>