Skip to content

Commit b25498b

Browse files
authored
Merge pull request #274 from jcoady/jupyterlab4
updated some no_notebook demo programs
2 parents c147192 + b939b3a commit b25498b

File tree

5 files changed

+175
-2
lines changed

5 files changed

+175
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from vpython import *
2+
# This version uses VPython slider
3+
# See ButtonsSlidersMenus1 for a version that uses Jupyter slider
4+
5+
scene.userzoom = False
6+
scene.userspin = False
7+
scene.width = 400
8+
scene.height = 200
9+
scene.range = 1
10+
scene.background = color.red
11+
box(pos=vector(10,0,0)) # Force creation of canvas; box is not seen because it is outside the canvas
12+
cancopy = 'You can Ctrl-C or Command-C copy these RGB and HSV values:\n'
13+
scene.title = cancopy
14+
scene.append_to_title("RGB = <1.000, 0.000, 0.000>, HSV = <0.000, 0.000, 0.000>")
15+
16+
C = ['Red', 'Green', 'Blue', 'Hue', 'Saturation', 'Value']
17+
sliders = []
18+
19+
def set_background(sl):
20+
if sl.id < 3:
21+
rgb = vector(sliders[0].value, sliders[1].value, sliders[2].value)
22+
hsv = color.rgb_to_hsv(rgb)
23+
sliders[3].value = int(1000*hsv.x)/1000# reset HSV slider positions; display 3 figures
24+
sliders[4].value = int(1000*hsv.y)/1000
25+
sliders[5].value = int(1000*hsv.z)/1000
26+
else:
27+
hsv = vector(sliders[3].value, sliders[4].value, sliders[5].value)
28+
rgb = color.hsv_to_rgb(hsv)
29+
sliders[0].value = int(1000*rgb.x)/1000 # reset RGB slider positions; display 3 figures
30+
sliders[1].value = int(1000*rgb.y)/1000
31+
sliders[2].value = int(1000*rgb.z)/1000
32+
scene.background = rgb
33+
# For readability, limit precision of display of quantities to 3 figures
34+
f = "RGB = <{:1.3f}, {:1.3f}, {:1.3f}>, HSV = <{:1.3f}, {:1.3f}, {:1.3f}>"
35+
scene.title = cancopy + f.format(rgb.x, rgb.y, rgb.z, hsv.x, hsv.y, hsv.z)
36+
37+
scene.caption = '\n'
38+
for i in range(6): # Create the 3 RGB and 3 HSV sliders
39+
sliders.append(slider(length=300, left=10, min=0, max=1, bind=set_background, id=i))
40+
scene.append_to_caption(' '+C[i]+'\n\n') # Display slider name
41+
if i == 2: scene.append_to_caption("\n\n") # Separate the RGB and HSV sliders
42+
sliders[0].value = 1 # make the background red
43+
sliders[4].value = sliders[5].value = 1
44+
45+
46+
while True: # Needed when running from a terminal
47+
rate(30)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from vpython import *
2+
3+
scale = 4e-14/1e17
4+
ec = 1.6e-19 # electron charge
5+
kel = 9e9 # Coulomb constant
6+
scene.range = 2e-13
7+
8+
charges = [ sphere( pos=vector(-1e-13,0,0), Q=ec, color=color.red, size=1.2e-14*vector(1,1,1) ),
9+
sphere( pos=vector( 1e-13,0,0), Q=-ec, color=color.blue, size=1.2e-14*vector(1,1,1) )]
10+
11+
s = "Click or drag to plot an electric field vector produced by the two charges.\n"
12+
s += "On a touch screen, tap, or press and hold, then drag.\n"
13+
s += "Arrows representing the field are bluer if low magnitude, redder if high."
14+
scene.caption = s
15+
16+
def getfield(p):
17+
f = vec(0,0,0)
18+
for c in charges:
19+
f = f + (p-c.pos) * kel * c.Q / mag(p-c.pos)**3
20+
return f
21+
22+
def mouse_to_field(a):
23+
p = scene.mouse.pos
24+
f = getfield(p)
25+
m = mag(f)
26+
red = max( 1-1e17/m, 0 )
27+
blue = min( 1e17/m, 1 )
28+
if red >= blue:
29+
blue = blue/red
30+
red = 1.0
31+
else:
32+
red = red/blue
33+
blue = 1.0
34+
a.pos = p
35+
a.axis = scale*f
36+
a.color = vector(red,0,blue)
37+
a.visible = True
38+
39+
drag = False
40+
a = None
41+
42+
def down(ev):
43+
global a, drag
44+
a = arrow(shaftwidth=6e-15, visible=False)
45+
mouse_to_field(a)
46+
drag = True
47+
48+
def move(ev):
49+
global a, drag
50+
if not drag: return
51+
mouse_to_field(a)
52+
53+
def up(ev):
54+
global a, drag
55+
mouse_to_field(a)
56+
drag = False
57+
58+
scene.bind("mousedown", down)
59+
60+
scene.bind("mousemove", move)
61+
62+
scene.bind("mouseup", up)
63+
64+
while True: # Needed when running from a terminal
65+
rate(30)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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)

Demos_no_notebook/qt.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from vpython import *
2-
set_browser(type='pyqt')
2+
set_browser(type='pyqt5')
33
b = box()
44
scene.caption = "A box should appear in the window above"

vpython/no_notebook.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@ def run(*args, **kwargs):
5252
# Check for Ctrl+C. SIGINT will also be sent by our code if WServer is closed.
5353
def signal_handler(signal, frame):
5454
#print("in signal handler, calling stop server")
55-
stop_server()
55+
try:
56+
stop_server()
57+
except (KeyboardInterrupt):
58+
pass
59+
except:
60+
raise
5661

5762
signal.signal(signal.SIGINT, signal_handler)
5863

0 commit comments

Comments
 (0)