这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » Zemax光学设计技术:如何从ZPL宏中调用另一个ZPL宏

共6条 1/1 1 跳转至

Zemax光学设计技术:如何从ZPL宏中调用另一个ZPL宏

菜鸟
2023-02-22 11:41:29     打赏

通常,在单独的代码段中执行计算的每个步骤是一种很好的编程实践,本文介绍如何从另一个宏中调用 ZPL 宏,以及如何在宏之间来回传递数据。

介绍在编写执行许多步骤的ZPL宏时,通常在单独的代码段中执行每个步骤是一种良好的编程做法。这可以通过ZPL子例程来完成,使用GOSUBSUBRETURNEND关键字。但是,在某些情况下,在单独的宏中执行每个步骤,然后从主(父)宏调用这些单独的(子)宏中的每一个可能更容易。例如,如果要在许多不同的宏中执行相同的计算,则在随后由各个父宏调用的子宏中执行此计算会更有效。这可以在OpticStudio中使用关键字CALLMACRO来完成。

从一个宏中调用另一个宏

可以在本文附带的.ZIP文件中找到调用两个单独子宏的父宏的示例。这些宏文件应放在{Zemax}\Macros 目录下,并用于位于{Zemax}\Samples\Objectives 目录中的文件“Cooke 40 degree field.zmx”。

父宏 CALLMACRO_TEST_PARENT.ZPL)首先定义数组来保存将由子宏返回的数据。然后,父宏使用CALLSETDBL关键字的数值和CALLSETSTR关键字的字符串值填充主宏缓冲区:n_vals = 49
DECLARE x, DOUBLE, 1, n_vals 
DECLARE y, DOUBLE, 1, n_valsFOR i, 1, n_vals, 1CALLSETDBL i, 2*i# Test values to demonstrate use of CALLSETDBL, CALLSETSTR keywords
A$ = call_str$ + $STR(i)
CALLSETSTR i, A$NEXT i
在这种情况下,数值和字符串值是简单的测试值,用于演示在父宏和子宏之间来回传递数据的方法。然后,父宏使用关键字CALLMACRO调用第一个子宏(CALLMACRO_TEST_CHILD1.ZPL)。在子宏中,存储在宏缓冲区中的值使用CALD$CALLSTR数字函数打印到输出窗口:! Print values passed from parent macron_vals = 49FOR i, 1, n_vals, 1FORMAT 6.4
PRINT "Doule precision value = ", CALD(i)
FORMAT 2 INT
A$ = $CALLSTR(i)
PRINT A$NEXT i
然后,该宏使用RAYTRACE关键字和OPDC函数计算弧矢方向光瞳坐标 Px = 0)和固定视场坐标 Hx = Hy = 0 处的各个子午光瞳坐标 Py)的光程差:! Calculate OPDDECLARE x, DOUBLE, 1, n_vals# Variables to store OPD data
DECLARE y, DOUBLE, 1, n_valsFOR i, 1, n_vals, 1py = 0.04166*i-1.04166
RAYTRACE 0, 0, 0, py, 1
x(i) = py
y(i) = OPDC()NEXT i
在此子宏中,光瞳坐标的值(存储在 x 数组中)使用以下方法传递回父宏:CALLSETDBL! Reset values to normalized pupil coordinates and pass them back to parent macrocall_str$ = "This is the string for variable number "FOR i, 1, n_vals, 1CALLSETDBL i, x(i)
A$ = call_str$ + $STR(i+50)
CALLSETSTR i, A$NEXT i
新字符串值也作为测试放置在宏缓冲区中,以确保将此数据传递回父宏。子宏完成后,OpticStudio 将返回到父宏,并且光瞳坐标的值将存储在相应的数组中:CALLMACRO CALLMACRO_TEST_CHILD1.ZPL! Save values passed back from child macro 1FOR i, 1, n_vals, 1x(i) = CALD(i)
A$ = $CALLSTR(i)
PRINT A$NEXT i
然后,父宏调用第二个子宏 CALLMACRO_TEST_CHILD2.ZPL)。此宏与第一个子宏相同,唯一的区别是OPD数据(存储在 y 数组中)而不是光瞳坐标被传递回父宏:! Print values passed from parent macron_vals = 49FOR i, 1, n_vals, 1FORMAT 6.4
PRINT "Doule precision value = ", CALD(i)
FORMAT 2 INT
A$ = $CALLSTR(i)
PRINT A$NEXT i! Calculate OPDDECLARE x, DOUBLE, 1, n_vals  # Variables to store OPD data
DECLARE y, DOUBLE, 1, n_valsFOR i, 1, n_vals, 1py = 0.04166*i-1.04166
RAYTRACE 0, 0, 0, py, 1
x(i) = py
y(i) = OPDC()NEXT i! Reset values to OPD results and pass them back to parent macrocall_str$ = "This is the string for variable number "FOR i, 1, n_vals, 1CALLSETDBL i, y(i)
A$ = call_str$ + $STR(i+100)
CALLSETSTR i, A$NEXT i
作为测试新的字符串值再次放置在宏缓冲区中,以确保将此数据传递回父宏。然后将数字OPD 数据存储到父宏的数组中:CALLMACRO CALLMACRO_TEST_CHILD2.ZPL! Save values passed back from child macro 2FOR i, 1, n_vals, 1y(i) = CALD(i)
A$ = $CALLSTR(i)
PRINT A$NEXT i
最后,父宏使用关键字PLOT绘制 OPD 与光瞳坐标数据:! Plot dataPLOT NEW
PLOT TITLE, "OPD FOR FIELD POINT 1, WAVELENGTH 1"
PLOT TITLEX, "NORMALIZED PUPIL COORDINATE"
PLOT TITLEY, "OPTICAL PATH DIFFERENCE (WAVES)"
PLOT RANGEX, -1.0, 1.0
PLOT RANGEY, -1.0, 1.0
PLOT DATA, x, y, n_vals, 1, 1, 1
PLOT GO
然后将结果打印到图形窗口:
图片




关键词: 光学 光学设计 ZEMAX    

专家
2023-02-22 13:40:58     打赏
2楼

写的好,学习和参考


菜鸟
2023-02-22 15:31:04     打赏
3楼

感谢楼主分享


专家
2023-02-22 15:46:39     打赏
4楼

感谢楼主分享


高工
2023-02-22 17:06:04     打赏
5楼

感谢分享


专家
2023-02-22 17:10:03     打赏
6楼

感谢分享


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]