|
| 1 | +from vpython import * |
| 2 | +scene.width = scene.height = 500 |
| 3 | +scene.background = color.gray(0.8) |
| 4 | +scene.range = 2.2 |
| 5 | +scene.caption = "Click to pick an object and make it red." |
| 6 | +scene.append_to_caption("\nNote picking of individual curve segments.") |
| 7 | +box(pos=vector(-1,0,0), color=color.cyan, opacity=1) |
| 8 | +box(pos=vector(1,-1,0), color=color.green) |
| 9 | +arrow(pos=vector(-1,-1.3,0), color=color.orange) |
| 10 | +cone(pos=vector(2,0,0), axis=vector(0,1,-.3), color=color.blue, size=vector(2,1,1)) |
| 11 | +sphere(pos=vector(-1.5,1.5,0), color=color.white, size=.4*vector(3,2,1)) |
| 12 | +square = curve(color=color.yellow, radius=.05) |
| 13 | +square.append(vector(0,0,0)) |
| 14 | +square.append(pos=vector(0,1,0), color=color.cyan, radius=.1) |
| 15 | +square.append(vector(1,1,0)) |
| 16 | +square.append(pos=vector(1,0,0), radius=.1) |
| 17 | +square.append(vector(0.3,-.3,0)) |
| 18 | +v0 = vertex(pos=vector(-.5,1.2,0), color=color.green) |
| 19 | +v1 = vertex(pos=vector(1,1.2,0), color=color.red) |
| 20 | +v2 = vertex(pos=vector(1,2,0), color=color.blue) |
| 21 | +v3 = vertex(pos=vector(-.5,2,0), color=color.yellow) |
| 22 | +quad(vs=[v0, v1, v2, v3]) |
| 23 | +extrusion(path=[vector(-1.8,-1.3,0), vector(-1.4,-1.3,0)], |
| 24 | + shape=shapes.circle(radius=.5, thickness=0.4), color=color.yellow) |
| 25 | +ring(pos=vector(-0.6,-1.3,0), size=vector(0.2,1,1), color=color.green) |
| 26 | +lasthit = None |
| 27 | +lastpick = None |
| 28 | +lastcolor = None |
| 29 | + |
| 30 | +def getevent(evt): |
| 31 | + global lasthit, lastpick, lastcolor |
| 32 | + if lasthit != None: |
| 33 | + if lastpick != None: lasthit.modify(lastpick, color=lastcolor) |
| 34 | + else: lasthit.color = vector(lastcolor) |
| 35 | + lasthit = lastpick = None |
| 36 | + |
| 37 | + hit = scene.mouse.pick |
| 38 | + if hit != None: |
| 39 | + lasthit = hit |
| 40 | + lastpick = None |
| 41 | + if isinstance(hit, curve): # pick individual point of curve |
| 42 | + lastpick = hit.segment |
| 43 | + lastcolor = hit.point(lastpick)['color'] |
| 44 | + hit.modify(lastpick, color=color.red) |
| 45 | + elif isinstance(hit, quad): |
| 46 | + lasthit = hit.v0 |
| 47 | + lastcolor = vector(lasthit.color) # make a copy |
| 48 | + lasthit.color = color.red |
| 49 | + else: |
| 50 | + lastcolor = vector(hit.color) # make a copy |
| 51 | + hit.color = color.red |
| 52 | + |
| 53 | +scene.bind("mousedown", getevent) |
| 54 | + |
| 55 | +while True: # Needed when running from a terminal |
| 56 | + rate(30) |
0 commit comments