ZEMAX | 编程语言 (ZPL) 简介
好酷屋教程网小编为您收集和整理了ZEMAX | 编程语言 (ZPL) 简介的相关教程:用户可以使用Zemax编程语言(ZemaxProgrammingLanguage,ZPL) 在OpticStudio中编写自己的程序。这些程序可以实现:自动重复键盘和鼠标的操作基于Opti
用户可以使用
Zemax编程语言 (
Zemax Programming Language
,
ZPL)
在OpticStudio中编写自己的程序。这些程序可以实现:自动重复键盘和鼠标的操作
基于OpticStudio的数据进行计算
以特定格式输出数据
以图表或表格的形式生成数据
以及很多其它的功能!
创建ZPL宏程序非常简单。本文概述了ZPL的主要功能、变量示例,描述了ZPL中重要的函数和关键词。
作者 Dan Hill, updated by Alessandra Croce
简介
ZPL是不区分大小写的“宏”或“脚本”语言,并且是扩展OpticStudio计算范围的最简单方法。它是根据BASIC建模的,并且是一种解释型语言。这意味着编写ZPL宏非常容易,但是这也意味着进行复杂计算时,其执行速度要比完全编译的代码慢。
ZPL脚本可以调用OpticStudio中已编译的函数(关键字和操作数),并且在以下情况下很实用:
当您需要特殊格式的数据
实现不在程序中的功能或计算,例如数据提取,导出或简单绘图
在没有适当的操作数时进行优化(创建自定义操作数)
创建自定义/复杂求解(创建自定义求解)
自动重复键盘的操作
请注意,ZPL不能用于编辑用户自定义表面或物体,若有需要,您可以使用DLL。
ZPL包含五个基本概念:
变量 (variables)、运算符 (operations)、函数 (functions)、关键词 (keywords)
和注
释
(comments)
。以下将对这些概念进行介绍,可以在OpticStudio帮助手册的“编程
(
Programming
)
选项卡>关于
ZPL(
About the ZPL
)
”部分查阅更多信息。ZPL的目标是为没有太多编程经验的光学工程师提供强大的编程工具,该工具可以快速执行,并且易于学习。OpticStudio还支持ZOS-API,这是API级别的接口,外部程序(例如Matlab或Python)可以通过ZOS-API访问OpticStudio的功能。想要了解更多信息,请查看文章 ” 什么是 ZOS-API ,作用是什么?” 。
赋值、变量和数组
基本的赋值语法为:
variable = expression
其中 “ = ” 意为“将值设为”。
变量
可以是数值 (numeric)
或字符串 (string)
,这取决于它们所包含的数据类型。表达式可以是确切值、其它变量或复杂的数学表达式/函数。只有数组变量需要在使用前声明,因此例如 x = 7 无需提前声明数字变量 x即可工作。如下有效赋值的示例:x = 4
y = 3
z = x + y
字符串变量名称中的最后一个字符必须带有 $ 字符:
newstring$ = "Here is the new string"
变量始终保持为双精度64位值。它们的名称有一些必须遵守的限制。变量名称不应:
超过28个字符
包含用作运算符的任何特殊字符 (*, !, <, &, 等)
包含任何空格 (改为使用 “ _ ”)
与关键字或函数相同
数组
ZPL还支持数组(或向量)变量,有4个预定义的向量,分别称为VEC1, VEC2, VEC3,和VEC4, 主要由其他命令(例如GETPSF, GETMTF, 等)使用,它们的大小由SETVECSIZE 关键字设置。
用户自定义数组变量必须在使用前用DECLARE 关键字声明。它们最多可以由4维构成,并可以为双精度或整数数据类型。必须使用RELEASE 关键字释放分配给数组的内存。
可以使用以下语法给用户自定义数组赋值:
arrayname(index1, index2, …) = value
可以使用以下语法提取值:
value = arrayname(index1, index2, …)
关键字和函数
ZPL中的命令分为两类:
使用关键字可以在 OpticStudio 中执行或更改某些内容,例如:
RAYTRACE 通过系统追迹特定的光线
SETUNITS 设置系统单位
PRINT 打印一些内容到屏幕或文件
使用函数可以在 OpticStudio 中报告某些内容,例如:
y_height = RAYY(5), 报告表面5上的光线截距的Y坐标
lens_units$ = $UNITS(), 报告系统的镜头单位
本文将给出关键字和函数的一些示例,这些示例涵盖了OpticStudio中可用的整个光线追迹和物理光学计算范围。请参阅OpticStudio帮助文件,以查看所有支持的函数,关键字和常规ZPL功能。
关键字
关键字和函数是对OpticStudio中已编译例程的调用,通常与
功能区
(
Ribbon Bar
)
中相关功能的工作原理非常相似。
RAYTRACE =>
LOADARCHIVE =>
它们的执行速度与内部命令一样快,而调用命令的消耗却很小。因此,不要认为ZPL太“慢”!但是请记住,宏中的显式计算将被解释执行,因此与已编译的程序相比速度较慢。如果宏内部的计算速度很重要,请改用 ZOS-API.NET 。
关键字可以指导程序流程(IF或FOR语句),或运行光线追迹或调整透镜参数等。例如,使OpticStudio将系统优化10圈,可以发送以下命令:
OPTIMIZE 10
同样,执行此代码与您按下“
优化(
Optimize
)
”按钮并在图形用户界面中选择“10圈(
10 Cycles
)
”完全相同。关键字和操作数
在Zemax早期,编写了诸如GETMTF 和GETZERNIKE 之类的关键字以访问相应的分析功能。但是,随着代码库的增加,这很快变得很单调。因此,通过其关联的优化操作数可以访问大多数分析功能。这可以通过评价函数执行,也可以直接使用 OPEV() or或 OPEW()数值函数从宏中调用操作数本身来执行。有关更多详细信息,请参见 “如何使用 OPEV 和 OPEW 获取ZPL宏中任意优化操作数的值” 。
函数
如前所述,函数与关键字不同,因为它们不执行或更改文件中的任何内容,而是使OpticStudio生成有关某些内容的报告。ZPL支持多种函数,包括数值和字符串。数值函数的示例是:
x = SQRT(y)y = ABSO(z*TANG(e*numpoints))pi = 4*ATAN(1)相反,字符串函数以 $ 符号开头,例如:
$DATE()$LENSNAME()surf3_glass$ = $GLASS(3)与关键字不同,函数只能在赋值的右侧,或者在作为关键字参数的表达式中使用。某些函数(例如PWAV()(报告系统的主波长))返回的值与参数无关,因此不需要提供该值。但是,仍然需要括号。
运算和逻辑运算符
ZPL支持基本的数值运算(加法,减法,除法,乘法)和字符串运算(加法)。两种运算的示例如下:
Z = (X + 1)/(Y * 6)
R$ = "Hello " + "World"将字符串"Hello World"赋给变量R$
其他数值和字符串函数,例如SINE(), SQRT(), $GETSTRING(), 等,可用于更复杂的运算。可以使用括号来自定义运算序列,否则默认运算序列为:函数(例如SQRT()), 逻辑运算符(例如>), 乘法和除法,加法和减法。
ZPL还支持逻辑运算符,包括数值和字符串。这些可用于逻辑测试以及对多个表达式的比较。逻辑运算的结果为“
真
(
TRUE
)
”(任何非零值)或“假
(
FALSE
)
”(零)。OpticStudio将零视为“假
”,将任何非零值视为“真
”。数值逻辑运算符表格如下:
& (AND) | > (GREATER THAN) |
| (OR) | < (LESS THAN) |
^ (XOR) | > = (GREATER or EQUAL) |
! (NOT) | < = (LESS or EQUAL) |
= = (EQUAL) | ! = (NOT EQUAL) |
数值逻辑运算符的示例如下:
IF(A > 5) THEN PRINT “A is greater than 5”
字符串逻辑运算符的表格如下:
$ = = (EQUAL) | $ > = (GREATER or EQUAL) |
$ > (GREATER THAN) | $ < = (LESS or EQUAL) |
$ < (LESS THAN) | $ ! = (NOT EQUAL) |
字符串逻辑运算符示例如下:
IF (C$ $== B$) THEN PRINT "Strings are identical"
赋值与逻辑运算符
错误使用运算符 “=” 和逻辑运算符 “= = ”很常见。
例如,下图中的宏:
在此宏中,“a = b”是赋值,读取为“将变量a的值设置为等于变量b的值”。由于操作成功,所以OpticStudio将a的值设置为等于b,并返回“真”。因此,宏可写为:
IF (TRUE)
PRINT “a equals b”
ELSE
PRINT “a does not equal b”
ENDIF
在这种情况下,OpticStudio会发现错误并返回:
Syntax error: Illegal assignment (a = b).
可以使用逻辑运算“a == b”来进行正确的操作。
IF 与 FOR 条件循环
ZPL可以进行IF与FOR的条件循环。
IF循环的语法如下:
IF (expression)
(commands)
ELSE
(commands)
ENDIF
或
IF (expression) THEN (single command)
IF循环通常与逻辑运算符一起用作表达式语句中的测试条件。例如:
IF (X < Y)
PRINT “X is less than Y”
ELSE
PRINT “X is greater than Y”
ENDIF
请注意,有一些要留给用户来发现的错误,例如,如果x = y会怎样?
FOR循环的语法如下:
FOR variable, start_value, stop_value, increment
(commands)
NEXT
例如:
FOR i, 1, 10, 1
PRINT i
NEXT
同时定义变量和起始值的以下语法也是有效的:
FOR i = 1, 10, 1
请注意,start_value和stop_value可以是显式数字,也可以是任何计算结果为数字的变量或表达式。增量应该是整数,或者是任何取值为整数的变量或表达式。
调用宏和子例程
关键字 CALLMACRO 可以用一个宏(父级)调用另一个宏(子级)。数字和字符串缓冲区可以在父宏和子宏之间共享数据。示例宏“ Parent.ZPL”和“ Child.ZPL”都包含在OpticStudio安装文件中,并在帮助文件的“
编程
(
Programming
)
选项卡>
关于ZPL
(
About the ZPL
)
>
从宏中调用宏
(
Calling a Macro from within a Macro
)
”部分进行了描述。关键字GOSUB可以执行跳转到SUB指示的子例程。子例程完成执行后,控制其值返回到GOSUB关键字之后的行。在整个宏中,可以多次调用子例程。请注意,它们是在同一个宏中定义的,与前述的分离的父/子宏的情况不同。有关子例程的更多信息,请参见OpticStudio帮助文件的“
编程
(
Programming
)
选项卡>关于ZPL
(
About the ZPL
)
>关键字
(
KEYWORDS
)
> GOSUB,SUB,RETURN和END”部分。
RAYTRACE, RAYTRACEX 和相关功能
对于要在序列模式下使用的宏,最重要的关键字之一是RAYTRACE,它追迹给定波长的单条光线(由归一化视场和光瞳坐标确定)。关键字没有其他作用,语法为:
RAYTRACE hx, hy, px, py, wave
例如:
RAYTRACE 0, 1, 0, 0, PWAV(),在主波长处追迹主光线。
然后,您可以使用后续函数提取任何相关的光线追迹数据,例如:
RAYX(x), RAYY(x),和 RAYZ(x),返回表面 x 上的光线的X-,Y-和Z-坐标
RAYL(x), RAYM(x),和 RAYN(x),返回表面x上的光线的方向余弦值
RANX(x), RANY(x),和 RANZ(x),返回光线击中表面x处的表面法线余弦值
RAYT(x)返回光线到表面 x 的光路长度
OPDC() 返回光线相对于主光线的光程差
例如,以下代码追迹波长2的边缘光线。然后将像面上光线的Y坐标截距提取并打印在屏幕上:
RAYTRACE 0, 0, 0, 1, 2
PRINT "The chief ray height is ", RAYY(NSUR())
函数RAYE()报告追迹光线时可能发生的任何错误:
如果在光线追迹过程中未发生任何错误,则返回零。
负值表示在该表面上发生了全内反射,该表面序号数是返回值的绝对值
正值表示光线错过了返回的表面编号
检查RAYE()是可选操作,但是,如果RAYE()不返回零,则上述数据提取函数可能会返回无效数据。
函数RAYV()可用于检查光线是否存在渐晕,即是否被孔径挡住了。该函数返回光线存在渐晕的表面编号;如果光线未发生渐晕,则返回零。请记住,如果光线照射到孔径上,仍会被追迹,并且可以通过使用RAYV()测试是否发生渐晕来将其排除在计算之外。
RAYTRACEX关键字是RAYTRACE的实用扩展。它调用OpticStudio光线追迹例程,从任意表面起始追迹当前系统中特定的光线。语法为:
RAYTRACEX x, y, z, l, m, n, surf, wave
如上所述,然后可以使用与RAYTRACE相同的后续功能提取有关光线追迹的数据。
ZPL 中的注释
最后,您可以使用
注释
来标注ZPL宏是如何工作的。任何以“!”为起始的行,或任何“#”后输入的字符都将作为注释,这些内容在执行ZPL宏时被忽略。OpticStudio将仅执行将这些组件包在一起的脚本。例如,想像您需要优化镜头,计算评价函数值,并将该值乘以5的对数,相应的ZPL如下所示:
执行ZPL宏的速度非常快,并且ZPL是非常容易学习和使用的语言。为了帮助您入门,知识库中有一些介绍Zemax编程语言某些功能的文章,并且OpticStudio下载文件中提供了许多示例。
以上就是好酷屋教程网小编为您收集和整理的ZEMAX | 编程语言 (ZPL) 简介相关内容,如果对您有帮助,请帮忙分享这篇文章^_^
本文来源: https://www.haoku5.com/IT/63a5006fbc08510b5307028d.html
相关推荐
热门专题
PS快捷键_PS快捷键大全
经典的Photoshop快捷键大全,如果你是入门阶段的水平,熟读此文并掌握,马上进阶为中级水平。matlab怎么换行?matlab换行教程
今天小编为大家带来的是matlab换行的教程,想知道怎么换行的小伙伴来看看接下来的这篇文章吧,相信一定会帮到你们的。matlab怎么换行?matlab换行教程1、首先在matlab主页面板中点击【Matlab求矩阵的乘积的操作方法
很多用户在使用Matlab的时候,不是很熟悉其中怎么求矩阵的乘积的?本期为你们带来的教程就描述了Matlab求矩阵的乘积的操作方法。Matlab求矩阵的乘积的操作方法打Matlab,在命令行窗口goldwave怎么启用延迟录制计时器?goldwave启用延迟录制计时器教程
很多小伙伴在使用goldwave的时候,想知道怎么启用延迟录制计时器,下面小编就为大家分享教程,感兴趣的小伙伴不要错过哦!goldwave怎么启用延迟录制计时器?goldwave启用延迟录制计时器教分区工具diskgenius强制删除文件的具体使用流程
很多人不知道分区工具diskgenius如何强制删除文件?今日为你们带来的文章是关于分区工具diskgenius强制删除文件的具体含义讲解,还有不清楚小伙伴和小编一起去学习一下吧。分区工具diskgpycharm使用技巧
今天小编给大家讲解pycharm使用技巧,有需要或者有兴趣的朋友们可以看一看下文,相信对大家会有所帮助的。pycharm使用技巧使用PyCharm软件需要python运行环境,这里我已经下载好。CAD看图软件哪个好用?如何使用CAD看图软件
在CAD中,大家都知道CAD图纸是使用CAD制图软件来绘制完成的,那保存的格式就是为dwg格式和dxf格式的。那需要对图纸内容进行查看的时候,就要适用到CAD看图软件。但看图软件有很多,那么CAD看图diskgenius怎么将分区中的文件复制到指定目录?diskgenius将分区中的文件复制到指定目录方法
使用diskgenius的时候,很多小伙伴不知道怎么将分区中的文件复制到指定目录,下面小编就给大家带来方法,有需要的小伙伴不要错过哦。diskgenius怎么将分区中的文件复制到指定目录?diskg分区工具diskgenius将硬盘合并分区的详细流程
说起分区工具diskgenius伙伴们都不陌生,那么使用怎么使用分区工具将硬盘合并分区呢?下面一起看看关于分区工具diskgenius将硬盘合并分区的详细流程吧。分区工具diskgenius将硬盘合MathType中公式与文字错位的处理方法
最近有很多朋友向我咨询关于MathType中公式与文字错位的问题,今天就为大家介绍MathType中公式与文字错位的处理方法,希望能够帮助到大家。MathType中公式与文字错位的处理方法方法一