本文使用两个示例演示了如何使用 ZPL 创建用户自定义解。第一个示例介绍了如何创建 ZPL 解以确保序列文件中像面的曲率半径等于系统的 Petzval 曲率。第二个示例介绍了如何在非序列元件编辑器 ( Non-Sequential Component Editor ) 中基于其他物体的参数来约束的物体 位置。
求解 ( Solve ) 是可以在诸如镜头数据编辑器或非序列元件编辑器之类的编辑器中主动调整特定值的功能。例如,可以在曲率半径,圆锥系数或 TCE 上指定求解类型,并通过单击要放置的求解单元的求解框进行设置。尽管 OpticStudio 提供了许多默认的求解类型,但用户有可能希望自定义求解类型,这可以通过使用Zemax 编程语言( Zemax Programming Language ,ZPL)来实现。
ZPL 宏求解可用于任何编辑器中的几乎所有单元(曲率半径,厚度,参数,多重结构等)。可以像任何其他求解类型一样,通过在编辑器中单击参数单元格右侧的小框来设置 ZPL 宏求解。
ZPL 宏求解通过执行 ZPL 宏来确定解的值,并使用 SOLVERETURN 关键字将其返回给编辑器。一旦创建了用于求解的宏,并将其放置在 <Documents>\Zemax\Macros 目录中,即可在求解窗口的“宏:( Macro: )”中输入该宏的名称:
请注意,在求解框中输入的宏名称不区分大小写,并且不需要其扩展名(.ZPL)。
为确保宏求解按照预期的方式工作,需要遵循一些规则,请参阅“技巧和陷阱”部分以获取更多信息。
假设我们想要能够自动将像面的曲率半径设置为等于 Petzval 曲率的解。当然,在编写宏之前,请始终先检查一下仍不支持的解!
加载文件:
<Documents>\Zemax\Samples\Sequential\Objectives\Petzval.zmx 。
宏求解需要计算系统的 Petzval 曲率,然后将值返回给 OpticStudio。系统的 Petzval 曲率是通过 PETC 优化操作数获得的,也可以通过 OPEV() 和 OCOD() 函数直接在宏中调用:
OCOD() 提取与优化操作数类型相对应的唯一数字代码
OPEV() 计算操作数的值,以 OCOD() 提取的唯一代码作为第一个参数,然后是优化操作数的参数。
在本例中:
请注意, SOLVERETURN 关键字用于将数据传递回编辑器。将该宏另存为 Macros 文件夹中的 PETC.zpl。曲率求解值必须以曲率 (1/R) 的形式返回,而不是曲率半径。所有其他求解直接返回值。
要应用宏,请在像面的曲率半径单元中选择求解框,然后选择 ZPL 宏求解类型,然后在单元格中键入宏名称:
瞧!OpticStudio 自动更新求解,并在“求解类型 ( Solve Type )”框中放置“Z”,以指示其处于激活状态:
第二个示例,我们将要使一个非序列物体在另一个非序列物体的末端之后10 mm。为此,需要计算前一个物体的长度,并用它来定位第二个物体。
文章附件里的非序列文件中,第一个物体是矩形的复合抛物线聚光镜 (Compound Parabolic Concentrator,CPC ) 物体。将此物体的最大长度定义为非序列元件编辑器中的参数。如果可以保证该物体始终是最大长度,则可以简单地使用带有偏移量的拾取求解来定位物体2。但是,实际长度有可能小于最大长度参数,因此必须计算实际长度并使用此值。同样,由于这是 CPC 矩形 (Rectangular CPC) 物体,因此 x 和 y 截面的实际长度可能会有所不同:必须选择两者中较小的一个。这是宏求解中的理想问题!
CPC的长度“ L”由帮助文件:“设置 ( Setup ) 选项卡 > 编辑器 ( Editors ) 组 > 非序列元件编辑器 ( Non-Sequential Component Editor ) > 非序列几何物体 ( Non-Sequential Geometry Objects ) > 复合抛物线聚光镜(Compound Parabolic Concentrator , CPC)”部分中的公式给出:
因为这是 CPC 矩形 物体,所以有两个相关的长度值:X 和 Y,两个长度中较小的将被 OpticStudio 用作 CPC的长度,除非该长度大于“长度 ( Length )”参数。本例中的长度是“长度”参数的值。因此,宏应使用上面的公式计算 CPC 物体的 X 和 Y 长度,选择两个值中较小的,添加10 mm偏移,并将该值返回给矩形物体的 Z 位置 ( Z Position )参数。如果 X 和 Y 之间的较小长度仍大于“长度”参数值,则宏应在“长度”参数值上添加10 mm偏移,然后返回该值。
可以在文章附件中找到执行上述操作的 REC_CPC.ZPL 宏:
如前所述,关键字 SOLVERETURN 用于将所需值传递回 NSCE。将宏放置在 <Documents>\Zemax\Macros 文件夹后,在主菜单中单击:宏 ( Macros ) > 更新宏列表 ( Refresh Macro List )。
在物体2(矩形)的参数 “Z 位置”的求解框中,选择“ ZPL 宏”,然后键入宏名称:
就像前面的示例一样,NSCE 将在参数旁边显示 “ Z”,表明已在该参数上设置了 ZPL 解:
请注意,如果使用 Ctrl-A 在文件中定义的2个组态之间切换会发生什么。CPC 矩形物体的 Y 角(度)参数在20到40度之间更改,因此物体的长度也会更改。发生这种情况时,应用于物体2的 “Z 位置” ZPL 求解将自动更改,以根据对应操作将此物体始终放置在 CPC 物体末端的10毫米后。
宏求解非常普遍,几乎可以使用任何计算来确定求解值。ZPL 支持的所有函数和关键字均可用。从宏菜单执行或作为求解执行的 ZPL 宏之间没有区别。但是,编写 ZPL 求解时应认真仔细:
许多 ZPL 关键字和某些函数不应在宏求解中使用。例如,从求解中调用 UPDATE 会更新所有求解,这将再次调用宏,从而导致无限循环,会使其他关键字无法使用(例如:,在每次调用求解时都要求用户输入数据)。
仅更新应用了求解的单元格。宏不应更新其他单元格或以其他方式修改系统(例如,不应优化)。
宏求解永远不要依赖求解之后的编辑器中的数据,因为如果先调用解,然后再通过单独的后续解修改源数据,这也可能会产生错误的数据。
仅当宏中的计算不是基于任何光线数据时,宏求解才可以放置在光阑面之前。有关更多信息,请参阅帮助文件的“编程 (Programming) 选项卡 > 关于ZPL ( About the ZPL ) >关键字 ( KEYWORDS ) > SOLVEBEFORESTOP” 部分。
为了使求解更强且尽可能通用,建议在需要进行表面参考时使用 SURC() 和 SOSO() 函数:
SURC() 通过其(特殊的)注释字符串参考表面
SOSO() 获取要设置求解的表面/物体编号
请记住,如果在镜头数据编辑器中的任何曲率半径单元上使用ZPL宏求解,则此参数的所有求解都将计算曲率 (1/R),而不是曲率半径(R)。这意味着应用于此参数的求解应返回曲率半径的倒数,而不是曲率半径本身。
用户负责对宏返回的数据进行错误检查。例如,如果宏调用 RAYTRACE 来计算光线参数,则应使用 RAYE() 来确保没有发生任何错误(例如渐晕或全内反射)。如果发生错误,则宏应在未调用 SOLVERETURN 的情况下退出,以确保没有值返回到单元格。这在优化过程中尤其重要。以下代码给出了如何测试错误的示例。
通常,宏求解应保持简短,简单,并避免冗长的计算。
最后,请注意,OpticStudio 不会尝试限定或验证求解宏。此功能很强大,且具有灵活性,但必须谨慎使用。