wavelab86 发表于 2023-2-22 11:48

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

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

  介绍

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

  FOR i,1,n_vals,1

  CALLSETDBL 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 macro

  n_vals=49

  FOR i,1,n_vals,1

  FORMAT 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 OPD

  DECLARE x,DOUBLE,1,n_vals#Variables to store OPD data

  DECLARE y,DOUBLE,1,n_vals

  FOR i,1,n_vals,1

  py=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 macro

  call_str$="This is the string for variable number"

  FOR i,1,n_vals,1

  CALLSETDBL 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 1

  FOR i,1,n_vals,1

  x(i)=CALD(i)

  A$=$CALLSTR(i)

  PRINT A$

  NEXT i

  然后,父宏调用第二个子宏(CALLMACRO_TEST_CHILD2.ZPL)。此宏与第一个子宏相同,唯一的区别是OPD数据(存储在y数组中)而不是光瞳坐标被传递回父宏:

  !Print values passed from parent macro

  n_vals=49

  FOR i,1,n_vals,1

  FORMAT 6.4

  PRINT"Doule precision value=",CALD(i)

  FORMAT 2 INT

  A$=$CALLSTR(i)

  PRINT A$

  NEXT i

  !Calculate OPD

  DECLARE x,DOUBLE,1,n_vals#Variables to store OPD data

  DECLARE y,DOUBLE,1,n_vals

  FOR i,1,n_vals,1

  py=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 macro

  call_str$="This is the string for variable number"

  FOR i,1,n_vals,1

  CALLSETDBL 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 2

  FOR i,1,n_vals,1

  y(i)=CALD(i)

  A$=$CALLSTR(i)

  PRINT A$

  NEXT i

  最后,父宏使用关键字PLOT绘制OPD与光瞳坐标数据:

  !Plot data

  PLOT 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

  然后将结果打印到图形窗口:

https://www.geek-workshop.com/data/attachment/forum/202302/22/114653x468d635tf64zt8p.jpg 、
Ansys Zemax光学软件咨询与订购方式联系人:光研科技南京有限公司 徐保平手机号:15051861513微信号:13627124798https://www.geek-workshop.com/data/attachment/forum/202302/22/114716t8b6be8355uqw5z8.png
页: [1]
查看完整版本: Zemax光学设计技术教程:如何从ZPL宏中调用另一个ZPL宏