Niccko commited on
Commit
22fd21f
·
1 Parent(s): 24d7bb6

Add test screens and 3d view

Browse files
Files changed (2) hide show
  1. app.py +40 -10
  2. zern_generator.py +39 -9
app.py CHANGED
@@ -1,5 +1,11 @@
1
  import gradio as gr
2
- from zern_generator import generate_zern_wavefront
 
 
 
 
 
 
3
 
4
  zerns = {}
5
 
@@ -9,13 +15,25 @@ def update_zerns(key, value):
9
  zerns[key] = value
10
 
11
 
 
 
 
 
 
 
12
  theme = gr.themes.Default(primary_hue=gr.themes.colors.red, secondary_hue=gr.themes.colors.pink)
13
- with gr.Blocks(theme=theme) as demo:
14
  with gr.Row():
15
  zern_sliders = []
16
- sliders_container = gr.Column()
17
  with gr.Column(scale=1):
 
 
 
18
  num_zernikes = gr.Number(label="Количество коэффициентов Цернике", value=2, interactive=True)
 
 
 
19
 
20
  @gr.render(inputs=[num_zernikes], triggers=[num_zernikes.change])
21
  def render_count(count):
@@ -24,7 +42,7 @@ with gr.Blocks(theme=theme) as demo:
24
  sliders_container.children.clear()
25
  count = min(count, 100)
26
  for i in range(count):
27
- sld = gr.Slider(key=i, label=f"Zernike {i}", minimum=-50, interactive=True,
28
  step=0.01, value=0)
29
 
30
  sld.change(update_zerns, inputs=[gr.Number(value=i, visible=False), sld])
@@ -32,13 +50,25 @@ with gr.Blocks(theme=theme) as demo:
32
 
33
  return gr.update()
34
 
35
- with gr.Column(scale=2):
36
- plot = gr.Plot()
37
- btn = gr.Button("Рассчитать")
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
 
40
- def on_button_click():
41
- return generate_zern_wavefront(*[zerns[key] for key in sorted(zerns)])
42
- btn.click(on_button_click, inputs=[], outputs=[plot])
43
 
44
  demo.launch()
 
1
  import gradio as gr
2
+ from zern_generator import generate_zern_wavefront_fig, generate_batch
3
+
4
+ css = """
5
+ .container {
6
+ max-height: 40vh;
7
+ }
8
+ """
9
 
10
  zerns = {}
11
 
 
15
  zerns[key] = value
16
 
17
 
18
+ def get_zern_from_file(file):
19
+ with open(file) as f:
20
+ coeffs = [float(l) for l in f]
21
+ return tuple(coeffs)
22
+
23
+
24
  theme = gr.themes.Default(primary_hue=gr.themes.colors.red, secondary_hue=gr.themes.colors.pink)
25
+ with gr.Blocks(theme=theme, css=css) as demo:
26
  with gr.Row():
27
  zern_sliders = []
28
+
29
  with gr.Column(scale=1):
30
+ # file_inp = gr.File(label="Загрузка коэффициентов из файла", height="2em")
31
+
32
+ resolution_num = gr.Number(value=256, label="Разрешение")
33
  num_zernikes = gr.Number(label="Количество коэффициентов Цернике", value=2, interactive=True)
34
+ sliders_container = gr.Column(elem_classes=["container"])
35
+ # file_inp.upload(get_zern_from_file, inputs=[file_inp], outputs=[*sliders_container.children])
36
+
37
 
38
  @gr.render(inputs=[num_zernikes], triggers=[num_zernikes.change])
39
  def render_count(count):
 
42
  sliders_container.children.clear()
43
  count = min(count, 100)
44
  for i in range(count):
45
+ sld = gr.Slider(key=i, label=f"Zernike {i}", minimum=-100, interactive=True,
46
  step=0.01, value=0)
47
 
48
  sld.change(update_zerns, inputs=[gr.Number(value=i, visible=False), sld])
 
50
 
51
  return gr.update()
52
 
53
+ with gr.Column(scale=5):
54
+ with gr.Tab(label="2D"):
55
+ plot_2d = gr.Plot()
56
+ with gr.Tab(label="3D"):
57
+ plot_3d = gr.Plot()
58
+ with gr.Tab(label="Batch"):
59
+
60
+ plot_batch = gr.Plot(label="Тестовые экраны (NOLL scheme)")
61
+
62
+ with gr.Row():
63
+ btn = gr.Button("Рассчитать")
64
+ btn_batch = gr.Button("Рассчитать тестовые экраны")
65
+
66
+
67
+ def on_button_click(resolution):
68
+ return generate_zern_wavefront_fig(resolution, *[zerns[key] for key in sorted(zerns)])
69
 
70
 
71
+ btn.click(on_button_click, inputs=[resolution_num], outputs=[plot_2d, plot_3d])
72
+ btn_batch.click(generate_batch, inputs=[resolution_num], outputs=[plot_batch])
 
73
 
74
  demo.launch()
zern_generator.py CHANGED
@@ -8,11 +8,7 @@ SAMPLE_SIZE = 256
8
  span = (-1, 1)
9
 
10
 
11
- def generate_zern_wavefront(*zerns):
12
- ddx = np.linspace(*span, SAMPLE_SIZE)
13
- ddy = np.linspace(*span, SAMPLE_SIZE)
14
- xv, yv = np.meshgrid(ddx, ddy)
15
-
16
  num_zerns = len(zerns)
17
 
18
  degree = math.ceil((-3 + math.sqrt(8 * num_zerns + 1)) / 2)
@@ -20,10 +16,44 @@ def generate_zern_wavefront(*zerns):
20
 
21
  cart = RZern(degree)
22
  cart.make_cart_grid(xv, yv)
 
 
 
 
 
 
 
23
 
24
- Phi = np.array(cart.eval_grid(np.array(zerns), matrix=True))
25
- Phi[np.isnan(Phi)] = 0
26
- fig = plt.figure(figsize=(20, 10))
27
- plt.imshow(Phi)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  plt.show()
29
  return fig
 
8
  span = (-1, 1)
9
 
10
 
11
+ def generate_zern_wavefront(xv, yv, zerns):
 
 
 
 
12
  num_zerns = len(zerns)
13
 
14
  degree = math.ceil((-3 + math.sqrt(8 * num_zerns + 1)) / 2)
 
16
 
17
  cart = RZern(degree)
18
  cart.make_cart_grid(xv, yv)
19
+ return np.array(cart.eval_grid(np.array(zerns), matrix=True))
20
+
21
+
22
+ def generate_zern_wavefront_fig(resolution, *zerns):
23
+ ddx = np.linspace(*span, resolution)
24
+ ddy = np.linspace(*span, resolution)
25
+ xv, yv = np.meshgrid(ddx, ddy)
26
 
27
+ Phi = generate_zern_wavefront(xv, yv, zerns)
28
+ # Phi[np.isnan(Phi)] = 0
29
+ fig_2d, ax_2d = plt.subplots()
30
+ fig_3d, ax_3d = plt.subplots(subplot_kw={"projection": "3d"})
31
+ a = ax_2d.imshow(Phi, extent=(*span, *span), cmap='gray')
32
+ ax_3d.plot_surface(xv, yv, Phi)
33
+ fig_2d.colorbar(a)
34
+ plt.show()
35
+ return fig_2d, fig_3d
36
+
37
+
38
+ def generate_batch(resolution):
39
+ ddx = np.linspace(*span, resolution)
40
+ ddy = np.linspace(*span, resolution)
41
+ xv, yv = np.meshgrid(ddx, ddy)
42
+ fig = plt.figure()
43
+ fig.set_figwidth(30)
44
+ fig.set_figheight(20)
45
+ zern_index = 1
46
+ for i in range(5):
47
+ for j in range(6):
48
+ if j > i:
49
+ continue
50
+
51
+ zern = [0] * (zern_index - 1) + [1]
52
+ ax = plt.subplot2grid((5, 6), (i, j))
53
+ Phi = generate_zern_wavefront(xv, yv, zern)
54
+ ax.set_title(f"Zernike {zern_index-1}")
55
+ ax.imshow(Phi, extent=(*span, *span), cmap='gray')
56
+
57
+ zern_index += 1
58
  plt.show()
59
  return fig