保捱科技网
您的当前位置:首页ZEMAX中文说明(精品)

ZEMAX中文说明(精品)

来源:保捱科技网
关于数据域编号需要直到一个非常重要的事情。如果它的值为零,则执行宏指令,得到OPTRETURN 0 中的值。然而,如果数据域编号不是零,那么不执行宏指令,而代替使用前面调用该宏指令时储存的数值。这种约定有着实质性的好处。如果宏指令计算了许多数值,它们所有都需要被优化,则这个宏指令只要调用一次,而多次使用ZPLM 操作数就可以得到这个数据。这比多次调用宏指令有效得多。例如,假设名为ZPL11.ZPL 计算三个数值,它们三个都需要优化。在这个宏指令中将使用OPTRETURN 来储存这三个数据:

OPTRETURN 0=x OPTRETURN 1=y OPTRETURN 2=z

那么在评价函数中用三个ZPLM 操作数来摘录这个数据,仅调用一次这个宏指令来执行优化:

ZPLM 11 0 ZPLM 11 1 ZPLM 11 2

仅在ZPLM 11 0 中调用宏指令ZPL11.ZPL。注意,仅当Int2 的值为零时,可以使用Hx、Hy、Px、和Py 的值,因为仅在这种情况下,宏指令才被求值。

最后,在宏指令执行过程中镜头数据不能有任何改变,这一点十分重要。这些改变将涉及到后面其他操作数求值。ZEMAX 不能将已经求值的镜头数据恢复到对ZPLM 指定的宏指令求值之前的状态。同样,ZPLM 也不应用在默认评价函数的中间,而应该放在ZEMAX 默认定义的那部分评价函数的前面或后面。如果在宏指令操作的过程中镜头数据被改变了,ZEMAX 将无法知道哪个数据被改变了,而且不能不能将镜头数据恢复到没改变时的原始状态。只允许ZPL 宏指令执行对镜头数据的拷贝数据进行优化,而不是对实际数据进行优化,这样可以避免出现上述情况,然而这个功能当前不被支持。其原因是有时候宏指令在对后面的操作数进行求值之前需要改变镜头数据。在这种情况下,应执行两个宏指令。第一个应按要求修改数据,第二个应将数据恢复到原始条件。这两个宏指令,和执行改变镜头数据的插入操作数一起,都可以在评价函数编辑界面中列出。 使用外部编译的程序的优化

创建一个用户自定义操作数(UDO)的第二种方法是编写一个外部窗口程序来计算数据,然后使用动态数据交换(DDE)来将数据输入ZEMAX 中或从ZEMAX 中输出。DDE 界面在“ZEMAX 扩展”一章中进行说明。那里介绍的内容在这里不再复述;这里的说明是在假定已理解那一章的内容的前提下进行的。

操作数UDOP 被用来从评价函数内部调用一个外部客户程序。客户程序可能通过制造多个联系到ZEMAX 服务器的DDE 调用来执行要求的计算,然后使用DDE 界面将结果返回到ZEMAX。然后将计算得出的数据放在评价函数编辑界面中的“值”栏中,这样才可能以通常的方法被优化。

UDOP 是很容易使用的。Int1 和Int2 的值分别用来指定客户程序编号和数据域编号。客户程序编号指出了哪个客户程序将被执行,而数据域编号则指出了由客户程序计算的哪个值

将被优化。

客户程序编号必须是0 到99 之间的整数。例如,如果一个UDOP操作数的Int1 的值被设为17,那么客户程序编号为17,被执行的客户程序必须被命名为UDO17.EXE。客户程序名必须始终使用与客户程序编号相对应的一个两位数。如果客户程序编号为6,那么要被执行的客户程序应该是UDO06.EXE。客户程序文件必须放在ZEMAX主目录下的\\UDO 目录中。当到达一个其数据域编号为零的UDOP 操作数,ZEMAX 将调用这个客户程序。假设客户程序编号为17,客户 程序将以如下的语法结构被调用:

UDO17.EXE 缓冲器代码 Hx Hy Px Py

这缓冲器代码是由ZEMAX 提供给客户程序的一个整数值,它是唯一能识别正确镜头的标识符。因为ZEMAX 能够同时对多个镜头进行求值,缓冲器代码被用作一个标识符,以便于当客户程序申请或返回数据时,它和正确的镜头相联系。注意在优化时,ZEMAX 将同时对许多镜头进行求值,将计算出输出的细微差异,这个优化将继续下去。客户程序必须计算指定镜头的数据。

一旦客户程序开始执行,客户程序必须执行一下一个关键的步骤: 1) 建立与ZEMAX 服务程序相连的DDE 链。

2) 将正确的镜头数据加载到ZEMAX 服务程序的存储器中。 3) 计算要求的数据。 4) 将数据传输回ZEMAX。

5) 清除ZEMAX 服务程序的存储器中的内容。 6) 终止DDE 链,并退出。

具有代表性的是,DDE 链是由ZCLIENT 编码维持的,这在DDE一章中介绍(当然如果愿意的话,用户自己可以自由编写它们)。ZCLIENT 调用了用户定义的用户函数来计算操作数数据。为了将正确的镜头数据加载到ZEMAX 服务程序的存储器中,必须发送一个单个的名为GetUDOSystem 项目到ZEMAX服务程序中。

其语法结构为“GetUDOSystem,缓冲器代码”。这将使ZEMAX 从系统存储器中重新得到这个正确的镜头数据,并且后面所有的DDE调用都是对这个镜头的操作(如光线追迹)。然后通过随意使用在DDE 一章中定义的任意一个DDE 项目调用来计算数据。一旦数据被计算完毕,最多有51 个值可以被放在一个长格式的字符串中。使用项目SetUDOData 将数据传送回服务程序,最后回到ZEMAX 内的优化程序。其语法结构为“SetUDOData,缓冲器代码,data0,data1, data2,data3,„,data50”。任何一个省略的数据项被认为是零。所有的数据必须是自由格式的整数、指数、和浮点数。

关键的是客户程序要用SetUDOData 返回一个字符串,即使它只包括一个缓冲器代码,而其余都是空的。ZEMAX 将等着客户程序返回这个字符串。因为ZEMAX 无法知道计算将用多长的时间,所以ZEMAX 将一直“暂停”,直到它得到这个数据。如果客户程序计算失败了,或者没有返回这个数据,ZEMAX 将不能完成这个操作数的执行,或者将永远暂停。在ZEMAX 内部按下ESC 键将会“中断”求值,使ZEMAX 跳过对这个操作数求值。可以通过客户程序的用户函数将控制返回到ZCLIENT 来终止DDE 链。

一个计算3个数据项,分别被称为a,b,c,的范例编码可以阅读如下: void UserFunction(char *szCommandLine) {

double a, b, c;

char szBuffer[500],szSub[256]; int buffer_code;

/*得到识别镜头的缓冲器代码*/

buffer_code = atoi(GerString(szCommandLine, 0, szSub)); /*将正确的镜头数据设置到服务程序储存器中*/

sprintf(szBuffer, “GetUDOSystem,%i”,buffer_code); PostRequestMessage(szBuffer, szBuffer); /* 这里是计算数据的地方⋯⋯,这些行省略了*/ /* 现在得到标记为0,1,2 的数据*/

/* 如果行的总长度超出255 个字符,则不要使用SetUDOData,*/ /* 而使用SetUDOItem。详细内容可参见有关ZEMAX 扩展的章节。 */

sprintf(szBuffer,“SetUDOData,%I,%.7f,%.7f,%.7f”,buffer_code,a,b,c); PostRequestMessage(szBuffer, szBuffer); }

注意,对客户程序的一个简单调用可以得到多个数据。这是数据域编号用来摆放的地方。数据域编号可以是0 和50 之间的数字,包括这两个数。这个编号指出了数据在与存储器中的镜头相对应的全局数组中位置。在客户程序的执行过程中, 客户DDE项目“SetUDOData 用来得到一个有51 个数的长字符串(或者少一点;空格和省略值被认为是零)。这些数据必须是数值,被存放在镜头缓冲器中,以供后面的UDOP 使用。在实际应用中,DDE 项目名在255 字符之内,这了SetUDOData 只能传送远小于51 项的数据;但是DDE 项目“SetUDOItem”通过一次传回一个数据可以在这个附近工作。

对于任意一个DDE 项目名有一个255 个字符的;因此SetUDOData 被只能通过少量的数值。为了在这个附近工作,可以使用SetUDOItem,这在“ZEMAX 扩展”中说明。总共有51 个不同的数据域,因此一个客户程序调用可以用来同时优化51 个不同的值。这个数据域编号值指出了哪个得到的数值将被放在那个UDOP 操作数的“值”栏中。

UDOP 也允许使用Hx,Hy,Px,和Py 数据域。这些数据也可以被客户程序读取,因为它们在命令行中跟在缓冲器代码后面被传送过去。

有一个非常重要的事是要知道数据域编号。如果它为零,则执行客户程序,并且将从数据位置0 得到的值放到值栏中。然而,如果数据域编号不为零,则不执行客户程序,由客户程序的一个前面的调用储存的先前值将被代替使用。这个约定的优点是它的实用性。如果客户程序要计算许多数值,这些数值都需要被优化,则客户程序仅需要调用一次,只要用多个的UDOP 操作数就可以得到这些数据。这比多次调用客户程序有效得多。

例如,假设一个名为UDO25.EXE 的客户程序计算了三个数值,它们都需要优化。在这个

客户程序中,通过使用“SetUDOData,buffercode,x,y,z”将这些数值传送回去。然后只调用一次客户程序,评价函数中的三个UDOP 操作数就可以记录这些数据,并执行优化,这三个操作数是:

UDOP 25 0 UDOP 25 1 UDOP 25 2

仅在操作数UDOP 25 0 的求值过程中调用客户程序UDO25.EXE。注意,仅当数据域值为零时,才使用数值Hx,Hy,Px,和Py,因为仅在这种情况下客户程序才被求值。与ZPL 宏指令的使用不同的是,UDO 在求值过程中可以随意改变镜头数据,这个因为所有的DDE 命令都是针对镜头数据的一个复制本执行的,而不是针对正在被执行的实际镜头数据。

有一个被称为UDO_DEMO.C 的范例UDO 源代码文件,它可以由ZCLIENT 编译和连接。这个可执行的文件需要被重命名为UDOxx.EXE,这里xx 是一个两位数的整数。这个UDO 范例得到6 个值:Hx,Hy,Px,Py,和两个虚拟常数,分别放在编号为0 到5的数据位置中。 使用建议

在初期设计过程中,优化时很少需要对每个视场的所有波长的所有光线进行追迹。因此,可以通过在优化时使用的视场和波长的数目来大大减少执行的时间。如果选择的视场和波长的权重被设为零,则在构建评价函数时默认评价函数运算法则将跳过这些零权重的视场或波长。其结果是追迹的光线少了许多,加快了执行速度。

例如,如果一个镜头在五个视场点被求值,则评价函数中仅包含第一、第三、和第五视场是可行的。当然,在设计的后期,需要包括所有的光线,默认评价函数需要被重新构建。由一些技巧可以用来改善执行结果。除非优化方案坚持用不实际的设计,否则不要对变量设置边界操作数。边界操作数增加了计算的难度。只要可能,尽量使用求解来代替明确的操作数。例如,如果可能的话,则用曲率求解来控制焦距,而不用操作数。

优化与现代镜头设计的技术是不可分的,而且,只有实践才能是设计者精通使用优化法则。那些精通其他软件优化法则的使用者可能会发现ZEMAX 更易于使用,而且只要少量经验,界面使用的技巧容易掌握,设计者可以专心于设计本身。如果你刚刚接触计算机化的镜头优化,则没有比实际操作更好的方法来学习它了。 全局最佳方案

这个产生评价函数的最小可能值的设计被称为是“全局”最佳方案,是最好的可能设计的定义。然而,没有已知的优化法则对于一个任意的设计问题都普遍可以发现其全局最佳方案,除非你想“直接找到”一个优化法则(换句话说,就是试验所有的无数可能解决方案来判断哪个是最好的)。使用计算机帮助的光学设计的技术有两个基本组成。首先,设计者必须能够确定一个合适的初始方案,第二,他或者她在优化过程中必须扮演一个监督员的角色。一个好的监督员知道什么时候、如何备份和尽量使程序进入一个更有效的方向。

不幸地是,这通常需要相当多的经验,甚至通常是相当枯燥无味的。一个经验丰富的设计者在寻找一个新的、更好的设计模式时,通常要靠直觉、分析和幸运三者结合。ZEMAX 为执行这个全局最佳方案的搜索提供了一个自动操作的能力;这个特性将在下一章介绍。

第十九章 公差规定

介 绍

ZEMAX 提供了一个使用简单,但灵活和强大的公差推导和灵敏度分析能力。这个用于分析的公差包括了结构参数的变化,如曲率、厚度、位置、折射率、阿贝常数、非球面系数,以及其它更多的参数。

ZEMAX 也支持表面和镜头组的偏心分析,表面或镜头组在任意一点的倾斜分析,表面外形的不规则分析,以及参数或特殊数据的值的变化分析。由于参数和特殊数据项可以说明非球面系数,梯度折射率系数,以及其它,因此这些数值的任意一个也都可以作为公差分析的一部分。不同的公差可以被用在任意一个组合中来估计调整和装配误差对系统性能的影响。

公差也可以使用简单的操作数来定义,如TRAD,它定义了一个曲率半径的一个公差。这些公差操作数和镜头文件一起被自动保存。我们可以在从主菜单中的编辑界面组中得到的公差数据编辑界面中编辑这些公差操作数。

公差可以被不同的标准所求值,包括RMS 斑点尺寸、RMS 波前差、MTF 反应曲线、标准误差、用户自定义评价函数、或者用来定义一个复杂的调整和求值过程的过程。另外,还可以定义补偿来模拟对装配后的镜头所作的调整。ZEMAX 也允许在一个补偿上设置。

可以以两种方式来计算公差:

灵敏度分析:对于给定的一批公差,是分别对每一个公差来测定它在标准里的变化量的。 反转灵敏度分析:分别对每个公差在性能方面的一个给定的最小允许减小量来计算公差。 灵敏度分析和反转灵敏度分析分别考虑每个公差对系统性能的影响。这个总体性能可由一个平方和根的计算来估计。

Monte Carlo 模拟是作为一个可选择的估计所有公差的总体影响的方法被提供的。这个模拟产生了一系列随机镜头,它们符合这个指定的公差。通过同时考虑所有的可应用的公差,可能可以得到预期性能的准确模拟。通过使用正态的、统一的、或者抛物线的统计方法,Monte Carlo模拟可以产生许多的设计方案。 基本流程 一个镜头的公差分析由这些步骤组成:

1) 给这个镜头定义一批适当的公差。通常,在这一章中定义的默认公差生成特性是一个好的起始点。公差在公差编辑界面中被定义和修改,这个界面在主菜单栏中的编辑界面菜单中得到。

2) 添加补偿,并且对每个补偿设置允许范围。默认的补偿是后焦距,它控制了象面的位置。也可以定义其它的补偿,如象面倾斜。因为可以使用“快速公差规定”,所以仅仅使用后焦补偿可以大大加速这个公差过程。可以定义的补偿的数量没有。

3) 选择一个适当的标准,如RMS 斑点尺寸或MTF。使用一个公差过程可以定义更复杂的公差标准,这将在后面介绍。

4) 选择要求的模式,灵敏度分析或者反转灵敏度分析。 5) 修改默认的公差,或者增加新的公差来满足系统要求。

6) 执行这些公差的一个分析。

7) 回顾由这个公差分析产生的数据,考虑公差的预算。如果需要,可返回到步骤5。

关于这个基本流程的详细内容将在后面的章节中提供。 公差操作数 一个公差操作数有一个四个字母的记忆码,如TRAD 代表半径公差。两个整数值,被简称为Int1和Int2,是联合这个记忆码来确定这个公差应用于其上的镜头表面。一些操作数用Int1和Int2 来作为其它目的,而不是定义表面编号。

每个公差操作数也都有一个最小值和最大值。这两个值指出了与名义值的最大可接受变化值。每个操作数也都有一个空栏来作为随意填写的注释栏,这可以使这个公差设置得更容易阅读。可用的公差操作数在下面的表格中列出,详细说明如下。

公差操作数

名 称 TRAD TCUR TFRN TTHI TCON TSDX TSDY TSTX TSTY TIRX TIRY TIRR TEXI TPAR TEDV TIND TABB TEDX TEDY TETX TETY Int1 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 第一表面 第一表面 第一表面 第一表面 Int2 表 面 公 差 — — — — — — — — — — — 数据项编号 参数编号 — — 最后表面 最后表面 最后表面 最后表面 曲率半径的公差,以镜头长度单位表示 曲率的公差,以镜头长度单位的倒数表示 曲率半径的公差,以光圈表示 圆锥常数的公差(无单位量) 标准表面的x 偏心的公差,以镜头长度单位表示 标准表面的y 偏心的公差,以镜头长度单位表示 标准表面的x 倾斜的公差,以度表示 标准表面的y 倾斜的公差,以度表示 标准表面的x 倾斜的公差,以镜头长度单位表示 标准表面的y 倾斜的公差,以镜头长度单位表示 标准表面不规则性的公差 使用泽尼克的标准表面不规则性的公差 表面的参数数值的公差 在d 光处的折射率的公差(参见注解) 阿贝常数值的公差(参见注解) 元 件 公 差 元件的x 偏心的公差,以镜头长度单位表示 元件的y 偏心的公差,以镜头长度单位表示 元件的x 倾斜的公差,以度表示 元件的y 倾斜的公差,以度表示 说 明 补偿表面编号 厚度或位置的公差,以镜头长度单位表示 特殊数据编号 表面的特殊数据值的公差 TETZ TUDX TUDY TUTX TUTY TUTZ

第一表面 表面编号 表面编号 表面编号 表面编号 表面编号 最后表面 — — — — — 元件的z 倾斜的公差,以度表示 用户自定义的x 偏心的公差 用户自定义的y 偏心的公差 用户自定义的x 倾斜的公差 用户自定义的y 倾斜的公差 用户自定义的z 倾斜的公差 用户自定义的公差 对于每个公差,都要在公差编辑界面上规定一个最小值和一个最大值。这些公差将在下面部分详细说明。 TRAD:曲率半径公差

用来直接规定曲率半径的公差。最小值和最大值是以镜头长度单位表示的极值偏差。例如,如果一个表面的名义曲率半径为100mm,该表面的最小和最大TRAD 值为-.50mm 和+.50mm,则将把该表面的曲率半径设为99.50mm 和100.50mm 来执行公差分析。 TCUR:曲率公差

用来规定曲率单位的公差,它直接关系到权重。最小值和最大值是以镜头长度单位的倒数表示的极值偏差。例如,如果一个表面的名义半径为100mm,则其名义曲率为0.01mm-1。如果该表面的最小和最大TCUR 值为-.001 mm-1 和+.001mm-1,则将把该表面的半径设为111.11mm 和90.909mm 来执行公差分析。 TFRN:光圈公差

当规定平坦的或者大半径的表面时,光圈公差是非常有用的。最小值和最大值是以光圈(无单位量)表示的极值偏差。操作数TWAV被用来定义测试波长。一个曲率有微小改变的表面的矢高的变化被近似给出:

r2ZC 2这里r是表面的半口径。矢高的变化关系到以光圈表示的偏差,如下:

ZN

2这里N是光圈的个数。二分之一因子假定了一个双倍通过的牛顿环类型测试。更详细的信息可参见Malacara,光学车间测试。 TTHI:厚度公差

TTHI被用来规定在元件组中的元件的绝对位置和镜片的厚度的公差。系统默认,假设厚度的所有变化仅仅影响该表面和与那个元件有接触的表面。例如,一个双胶合镜头的第一片镜片在厚度方面有一个+1.0mm 的变化,则第二片镜片的前后顶点都将偏移+1.0mm。然而,由于ZEMAX 通过使用从前面表面得到一个补偿来定义所有表面位置,因此,简单地增加+1.0mm 到这个表面将把这个系统中后面的所有镜头都偏移+1.0mm。在装配中更有可能发生的是这个

+1.0mm 的补偿将被这个镜头组后面的第一个空气间隔所吸收。TTHI可以通过允许指定一个“补偿”表面来处理这种情况。系统默认,这个补偿表面被指定为跟在被规定公差的表面之后的第一个空气间隔。为了举例说明,假设一个镜头,它的表面3 是BK7,表面4 是F2,表面5 是空气。名义厚度分别是3、4、和6mm。如果默认的公差法则为表面3 定义一个TTHI 操作数,则将在表面5 上放一个补偿。如果这个公差值为+.1mm,则在分析过程中,它们的厚度分别变成3.1mm、4.0mm、和5.9mm。这样,从表面6 到象面的表面的绝对位置将不受表面3 的厚度变化的影响。这个补偿是随意的;为了使用无效,将它设置成与公差相同的表面编号,如TTHI 3 3。对于一些系统,如那些由在一个镜筒中的一堆隔圈组成的系统,这个补偿可以不被要求。Int1 被用来定义表面编号,Int2 是补偿表面的编号,除非Int2 等于Int1。最小值和最大值是以镜头长度单位表示的极值偏差。 TCON:圆锥常数公差

TCON 被用来定义一个圆锥常数的公差。最小值和最大值是没有单位量的极值偏差。 TSDX,TSDY:表面偏心公差

TSDX 和TSDY 分别用来分析一个标准表面类型在x 和y 方向上的偏心。Int1 的值说明了表面编号,而且这个表面必须是一个标准表面类型。标准表面类型以外的表面类型可以用后面介绍的TEDX 和TEDY 操作数来规定公差。最小值和最大值是以镜头长度单位表示的偏心。TSDX 和TSDY 的分析使用了不规则的表面类型。参见这一章后面介绍的“不规则表面类型的公差规定”部分的说明。 TSTX,TSTY:表面倾斜公差

TSTX 和TSTY 被分别用来分析一个标准表面关于X 和Y 轴的倾斜。Int1 的值说明了表面编号,而且这个表面必须是一个标准表面类型。标准表面类型以外的表面类型可以用后面介绍的TETX 和TETY操作数来规定公差。最小值和最大值是以度表示的关于镜头的X 和Y 轴的倾斜。参见相关TIR 操作数TIRX 和TIRY 的描述。TSTX 和TSTY 的分析使用了不规则的表面类型。参见

TIRX,TIRY:表面TIR 公差

TIRX 和TIRY 被分别用来分析一个标准表面沿着X 和Y 轴的倾斜。Int1 的值说明表面编号,而且这个表面必须是一个标准表面类型。标准表面类型以外的表面类型可以用后面介绍的TETX 和TETY 操作数来规定公差。

TIRX 和TIRY 被用来指定关于总的指示器逃避或者TIR 的公差,这测量了在一个镜头中“光楔”的数值。最小值和最大值是在这个表面的最大口径半径处测得的以镜头长度单位表示的“矢高”的数值的两倍,这里最大口径半径是由这个表面的半口径定义的。其变化是如下给出的关于表示TIRX 和TIRY数值的归一化坐标x 或者y 归一化坐标的函数:

TRIXTRIYZxx;Zyy

22例如,如果TIRX 公差为0.10mm。则在镜头的最小+x 口径方向上的矢高为0.05mm,在最小-x 口径方向上的偏离为-.05mm,这表示一个值为0.10mm 的“总”的TIR。对于TIRY 也是相似的。这个最小值和最大值被用来简单地模拟表面在每个方向上的倾斜。这个表面的实际倾斜角给

出如下:

ZyxtanS11Zx;tany

S这里S 是表面的半口径。注意,沿着Y 方向的矢高意味着一个绕着X轴的一个旋转体,沿着X 方向的矢高意味着一个绕着Y 轴的一个旋转体。

TIRX 和TIRY 的分析使用了一个不规则的表面类型。参见这一章后面介绍的“不规则表面类型的公差规定”部分的说明。 TIRR:表面不规则度公差

TIRR 被用来分析一个标准表面的不规则度。Int1 的值指出了表面的编号,而且这个表面必须是一个标准表面类型。这里不直接支持非标准表面类型的不规则度的分析(关于模拟不规则度的更多的信息可参见下面的TEXT 操作数的说明)。

模拟不规则度比其它类型的公差要麻烦一点。这主要是因为自然形成的不规则度是随机的,不象半径的变化那样有确定性。因此,要作一些关于不规则度的自然状态的假设,以便于执行这些分析。当使用TIRR 时ZEMAX 所作的假设是,这个不规则度为球差的一半和象散的一半。这与假设100%的象散比起来,是一个性比较少的模拟,因为象散不能由调焦来补偿,因此是这个镜头中的一个更严重的缺点。

最小值和最大值是在表面的最大口径半径处测量的以光圈单位表示的不规则度,这里最大的口径半径是由表面的半口径定义的。可用TWAV 操作数来定义这个测试波长。ZEMAX 假设是在一个双倍通过的牛顿环类型测试中测量光圈的。例如,一个“W”光圈的TIRR 将产生表面矢高的一个变化,为:

ztW42(4y)

这里t是测试波长(由TWAV 操作数定义),是归一化的半径坐标,y是在y方向上的归一化的半径坐标。波前光路的变化与矢高和由这个表面隔开的两种介质的折射率的变化有关:

nOPz11

n2TIRR 的分析分析使用不规则的表面类型。当计算Monte Carlo 分析时,象散的角度可在0 到360 度之间自由选择。这允许随机确定的象散误差的模拟。这与对每个元件都沿着y 轴方向设置象散比起来,要少一些严格性,而多一些现实性。更多的信息可参见这一章后面介绍的“不规则表面类型的公差规定”部分的说明。 TEXI:使用泽尼克模式的表面不规则度公差

TEXI 被用来分析一个表面上的随机的、不规则的小幅度偏离,这个表面可以是一个标准表面、偶次非球面、或者泽尼克基本表面。Int1 的值指出了表面的编号,Int2 的值定义了用来模拟那个表面上的不规则度的泽尼克项的数目。这里不直接支持标准表面、偶次非球面、或者泽尼克表面之外的其它表面类型的不规则度分析。

TEXI 与TIRR 类似,只不过TEXI 使用泽尼克表面矢高来模拟不规则度,而不是用TIRR 使

用的第三级象差公式。关于泽尼克表面的完整的说明可参见“表面类型”一章。当使用TEXI 时,最小和最大公差值被解释成是以双通过光圈形式表示的在测试波长处的表面的近似波峰到波谷(PTV)误差。波峰到波谷是不规则度的一个粗略的测量。ZEMAX 计算了泽尼克多项式的每个单项的系数,这个多项式使用下面的公式来定义表面外形的偏离:

cf2n

这里f是双通过光圈的数量,n是用在这个不规则模型中的泽尼克项的个数,λ是测试波长。由一个n 的平方根按比例决定这些系数来说明一个事实,那就是泽尼克项的一个随机的集合通常将在一个RSS意义上求和,所以PTV 误差与泽尼克项的个数不是成线性比例的。

由于指定这个近似的全面PTV 误差是方便的,所以都可以根据上面的公式来计算每个泽尼克的项目。注意,有一个“c”值来代表以光圈表示的最小和最大公差。对于这个灵敏度分析,表面被转化成一个泽尼克表面,这个泽尼克多项式的所有系数被设成由上述等式得到的最小或最大的“c”值。注意,由于在口径边缘对于所有的多项式项目,表面矢高变形都是相同的,一个值为0.001 的“c”,这时,使用20 个泽尼克项将产生一个20c 的最大矢高偏离。

对于Monte Carlo 分析,将和灵敏度分析一样来转化表面,但不是每一个多项式项都被赋予一个位于最小和最大公差值之间的随机选择的系数。可以使用选择来作为操作数的统计学模型来选择这个随机值。可以参见STAT 命令的说明。

默认的泽尼克项的个数是36 个,这是最大值。通常讲,如果使用的项目越少,则不规则度的频率越低,即整个表面的起伏就越少;如果使用的项目越多,则将是高频率的不规则度,即整个表面的起伏就越多。注意TIRR 操作数模拟了不规则度的最低频率形式,对于整个表面仅仅是一个二次和四次偏离。TEXI 可以模拟更多的不规则表面,可以使用36 个项,在整个表面上通常可以看到大约5~15 个“起伏”。TEXI 不使用泽尼克表面的位置、x 倾斜、或者y 倾斜项。

因为泽尼克表面矢高表达式包含了标准表面和偶次非球面的一部分,所以这两种表面类型的任意一个都可以用由TEXI 操作数创建的泽尼克表面来模拟。如果表面已经是一个泽尼克表面,那么这个偏离被简单地加到已经在那里的多项式项中。如果表面是一个标准表面或者偶次非球面,则这个泽尼克表面的标准化半径被设成是这个表面的半口径。如果表面已经是一个泽尼克表面,最小和最大公差被假定是在已经定义的标准半径处测量的。

TEXI 总是忽略泽尼克项目0,即活塞术语,把这个值设为0。 TPAR:参数数据公差

TPAR 被用来规定参数数据的公差。Int1 数字是表面编号。Int2数字必须是1 和8 之间的一个整数,它说明参数编号。参见“表面类型”一章的表格,它列出了在每种表面模型中使用的参数编号。对于测定非球面系数的公差,以及更多,TPAR 是非常有用的。最小值和最大值是以被这个参数使用的任意单位表示的变化量。 TEDV:特殊数据值公差

TEDV 是特殊数据值的公差。特殊数据值被ZEMAX-EE 中的特殊数据编辑界面使用来定义

非球面项目、衍射系数、或者其他数据。Int1 用来识别表面,Int2 用来识别特殊数据编号。最小值和最大值是以被这个特殊数据值使用的任意单位表示极值误差。参见“表面类型”一章的表格,它列出了在每种表面模型中使用的特殊数据编号。 TIND:折射率公差

TIND 是折射率的公差。Int1 用来识别表面,最小值和最大值是折射率的极值误差。这个折射率误差是作为一个“补偿”来模拟的,它依赖于波长,除非这个表面的玻璃是一种由d 光折射率、阿贝常数、和dPgF 定义的“模拟”玻璃,或者这个表面的玻璃是一个目录玻璃,所有的定义波长都在0.3 和2.5 微米之间。在后两种情况之一中,TIND被解释成是一个d 光折射率的变化量,它将以一种非线性方式改变在所有波长处的折射率。 TABB:阿贝常数公差

TABB 是阿贝常数或者Vd 常数的公差。Int1 用来识别表面。最小值和最大值是阿贝常数的极值误差。如果表面的玻璃是一种由d 光折射率、阿贝常数、和dPgF 定义的“模拟”玻璃,或者表面的玻璃是一种目录玻璃,所有定义波长都在0.3 和2.5 微米之间,则TABB被解释成是d 光折射率的一个变化量,它将以一种非线性方式改变在所有波长处的折射率。否则,TABBA 将被忽略。这个折射率的变化是被在任意波长处的折射率的微分变化的一个估计,作为d 光折射率、阿贝常数、和dPgF 的一个函数来给出的。 TEDX,TEDY:元件偏心公差

TEDX 和TEDY 分别被用来分析在X 和Y 方向的偏心。由Int1和Int2 定义的两个表面编号指出了一个镜头组的起始表面和终止表面。最小值和最大值是以镜头长度单位表示的偏心。这两个公差要求ZEMAX 在这个镜头组的前面和后面插入一个坐标断点,然后将整个组作为一个整体进行偏心。由于这个原因,TEDX和TEDY 通常不在一个已存在的坐标断点两侧使用。如果你需要这个功能,可参见TUDX 和TUDY 的说明。

TEDX和TEDY也可以被用来模拟表面的偏心,和TSDX 和TSDY一样。TEDX 和TEDY 将作用于任意一种类型的表面,包括标准表面和非标准表面,而TSDX和TSDY只作用于标准表面。为了使用TEDX和TEDY 来偏心一个单一表面,只要简单将Int1 和Int2 设成相同的表面编号。为了检查来看看ZEMAX 实际上是否在做你想要做的事情,可参见在“公差结果的故障”一节中的SAVE 命令的说明。

TEDX 和TEDY 命令是可以被嵌套的。例如,去分析一个由表面5 到表面20 定义的镜头组的偏心,这是可能的;同样可以同时分析由表面5~8、8~12、14~20 等等定义的元件的偏心。这个功能可以模仿在一个装配中的元件的校准误差,以及在整个装配中的校准误差。这个嵌套的规则在“Monte Carlo 分析的嵌套规则”一节中将作完整的说明。 TETX,TETY,TETZ:元件倾斜公差

TETX、TETY、TETZ 分别被用来分析一个表面或者一个镜头组关于X、Y、或者Z 轴的倾斜。由Int1 和Int2 定义的两个表面编号指出了镜头组的起始表面和终止表面。最小值和最大值是以度表示的偏角。

这三个公差要求ZEMAX 在镜头组的前面和后面插入一个坐标断点,以及在镜头组的末尾使用一个虚拟表面以致可以返回到前顶点。然后整个组可以作为一个整体绕着一个点转动。

由于这个原因,当定义的表面范围中包括了一个坐标断点,它与在由拾取求解得到的TETX/Y/Z 控制的表面范围之外的下一个坐标断点有关,这时不应使用TETX/Y/Z。危险的情况是如果两个结果倾斜范围交迭在一起,那么这个元件的位置可能不是你想要的那样。如果你想要这个功能,可参见TUTX、TUTY、和TUTZ 的说明。

TETX 和TETY 也可以被用来模拟单一表面的倾斜,有时被称为“光楔”,和TSTX 和TSTY 一样。TETX 和TETY 可以作用于任意一种类型的表面,包括标准表面和非标准表面,而TSTX 和TSTY 只作用于标准表面。为了使用TETX 和TETY 来倾斜一个单一表面,只要简单地将Int1 和Int2 设成相同的表面编号。

默认的TETX 和TETY 是绕着镜头组的前顶点转动的,然而,绕着其他点转动通常是有利的。例如,一个设计好的镜头装配将绕着镜头的节点转动,这样可以在校准过程保证焦距。这种情况容易被ZEMAX 通过在节点处使用一个虚拟表面来模拟。简单地将起始表面(Int1)变成在节点处的虚拟表面,这样转动将绕着那一点进行。第一个表面可以被定位在与镜头组的其余部分有关的任意点上,因此倾斜可以绕着任意点发生。

TETX、TETY、和TETZ 操作数可以被嵌套。例如,分析一个由表面5 到20 定义的表面组的倾斜是可能的,同样也可以同时分析由表面5~8、8~12、14~20 等等定义的元件的倾斜。这个功能可以模仿在一个装配中的元件的校准误差,以及在整个装配中的校准误差。这个嵌套的规则在“Monte Carlo 分析的嵌套规则”一节中将作完整的说明。 TUDX,TUDY,TUTX,TUTY,TUTZ:用户自定义倾斜/偏心

这五个公差,TUDX、TUDY、TUTX、TUTY、和TUTZ,被用作更一般的用户自定义倾斜和偏心。这些名字是代表用户自定义偏心/倾斜X、Y、和Z 公差的记忆码。这些与TEDX、TEDY、TETX、和TETY 非常相似。其不同之处在于,ZEMAX 不会自动插入要求坐标断点表面来完成在公差范围内的指定的偏心和倾斜。为了使用TUDX、TUDY、TUTX、TUTY、和TUTZ 命令,你必须已经将由Int1指定的表面定义成一个坐标断点表面。通常,但不是一直,在镜头数据编辑界面中的后面将会有第二个坐标断点,它有一个关于这个公差参数的拾取求解。这个求解可以是正的或者负的,根据情况决定。这允许通过一定要求的手段来实现一些关于任意点复杂的转动和偏心。

有一点是很重要的,那就是为使用Tuxx 公差而插入的坐标断点对所有的倾斜和偏心有一个零的名义值。最小值和最大值对于TUDX 和TUDY 是以镜头长度单位为单位的,对于TUTX、TUTY、和TUTZ 是以度为单位的,就象坐标断点表面一样。 不规则表面类型的公差规定 公差操作数TSDX、TSDY、TSTX、TSTY、和TIRR 都使用不规则表面类型来模拟镜头表面的波动。关于不规则表面的详细说明可参见“表面类型”一章。

使用不规则表面类型的压倒性的优势在于速度、简易、和机动性。任意的标准的表面类型都可以被转化成一个不规则表面类型,而不需要虚拟表面和坐标断点。而且,倾斜、偏心、和不规则度的聚合效果可以完全通过使用Monte Carlo 分析来模拟。当ZEMAX 使用操作数TSDX、TSDY、TSTX、TSTY、和TIRR 来计算公差分析时,先要把表面从一个标准表面类型转化成一个不规则表面类型。这就是为什么在使用这些操作数时,只支持标准表面类型的原因。

公差控制操作数 这里也有一些公差控制操作数,它们可以被输入到公差数据编辑界面中。这些操作数不是公差,但是可以被用来定义补偿,为了进一步的评价而保存中间结果,定义统计性质,以及为光圈公差定义测试波长。

公差控制操作数

名 称 CEDV Int1 表面编号 Int2 特殊数据编号 说 明 设置一个特殊数据值作为一个补偿 设置一个补偿。代码是:0 代表厚度;1 代表半径;2 代表圆锥常数 设置一个参数作为一个补偿 保存被用来评价在编辑界面中的前面行中的公差的文件。参见下面的说明 对于随意选择的Monte Carlo 参数分析设置统计分配的类型。参见下面的说明 这个操作数设置了测试波长。“最小值”栏被用来编辑和显示这个测试波长 CMCO 操作数编号 结构操作数编号 设置一个多种结构操作数值作为一个补偿 COMP CPAR SAVE STA TWAV

公差控制操作数在下面将被详细说明。 CEDV:定义特殊数据值补偿

CEDV 被用来定义补偿的表面编号和特殊数据编号,以供公差分析使用。Int1 被用来指定表面,Int2 被用来定义特殊数据编号。例如,为了指定表面9 的特殊数据值17 为一个补偿,使用Int1=9、Int2=17的CEDV。

可参见“表面类型”一章的表格,它定义了哪些特殊数据被哪些表面类型所使用。最小值和最大值的用法与它们作为COMP 是一样的。可以定义的补偿的数目没有被。 CMCO:定义多种结构操作数补偿

CMCO 被用来定义补偿的操作数编号和结构编号,以供公差分析使用。Int1 被用来指定操作数编号,Int2 被用来定义结构编号。例如,为了指定结构4 中的多种结构操作数6 为一个补偿,可是用Int1=6、Int2=4 的CMCO。

关于使用多种结构操作数的信息可参见“多种结构”一章。最小值和最大值的用法与它们作为COMP 是一样的。可以定义的补偿的数目没有被。 COMP:定义补偿

COMP 被用来定义补偿的表面编号和类型,以供公差分析使用。Int1 被用来指定表面,Int2 被用来定义类型。Int2 使用一个定义如下的“代码”: Int2=0,补偿为厚度 Int2= 1,补偿为曲率半径

表面编号 表面编号 文件编号 类型 — 代码 参数编号 — 标准偏离的 编号 — Int2=2,补偿为圆锥常数

COMP 操作数的最小值和最大值指出了补偿的最大允许变化量。例如,如果一个补偿的名义值为50,最小值和最大值是-1.0 和1.0,那么这个补偿将被在49.0 和51.0 之间。如果选择了“用户自定义评价函数”,则尽管仍然使用补偿,但这个补偿的边界将被忽略。可以定义的补偿的数目没有被。 CPAR:定义参数补偿

CPAR 被用来定义补偿的表面编号和参数编号,以供公差分析使用。Int1 被用来指定表面,Int2 被用来定义参数编号。例如,为了指定表面5 的参数2 为一个补偿,使用Int1=5、Int2=2 的CPAR。参见“表面类型”一章的表格,它定义了哪些参数被哪些表面类型所使用。最小值和最大值的用法与它们作为COMP 是一样的。可以定义的补偿的数目没有被。 SAVE:保存灵敏度分析镜头

公差特性的操作数不总是明确的,特别对于那些使用坐标断点或者不寻常的评价函数的系统。为了得到一个最近的结果来看看公差程序实际上在做什么,可以使用SAVE 操作数。SAVE 被插入到任意你想要更详细检查的公差的后面。

例如,假设在公差数据编辑界面中你有一个公差操作数TEDX。在回顾最后的灵敏度之后,评价函数的改变看起来不再有意义了。在公差数据编辑界面中编辑公差操作数来在这个TEDX 命令后面增加一个SAVE 命令。对于Int1 的值,可以输入0 或者其它数字。下一次运行公差分析时,ZEMAX 将把用来计算TEDX 公差的文件保存到一个名为TSAV000n.ZMX 的文件中,这里n 是在Int1 栏中指定的整数。

这个镜头文件将被保存在与当前镜头相同的目录中。ZEMAX 将保存被用来在一个ZMX 格式文件中评价前述公差的镜头。以通常的方式运行这个公差文件,然后载入你指定的文件名。它将告诉你指示数据、坐标断点、拾取、变量(它们是被最佳调整的补偿)、以及被用来测定评价函数数据的评价函数(通常是对于最大公差值)。这个过程将让你去检验实际上的结构是你正试着要模拟的结构,将让你洞察ZEMAX 是如何调整你的镜头指示来测定公差。 STAT:定义统计

STAT 被用来在Monte Carlo 分析过程中定义 “飞行”统计。STAT命令采取了两个整数自变量。Int1 指定了统计类型:0 代表正态分布;1 代表均匀分布;2 代表抛物线分布;3 代表用户自定义分布统计。Int2 的值仅仅被正态分布使用,它定义了“n”,平均和极值公差之间的标准偏离的数值。统计类型将在这一章的后面部分的“Monte Carlo 分析”一节中将详细定义。 TWAV:测试波长

这个操作数设置了测试波长。当设置默认公差时,ZEMAX 将增加一个TWAV 操作数,它一个0.6328 微米(HeNe)的值作为这个测试波长。如果没有定义测试波长,那么ZEMAX 默认这个为主波长。可以在操作数列表中放置多于一个的TWAV 操作数;每个操作数都为其后面的操作数定义了测试波长。仅仅那些最小值和最大值以光圈形式被测量的操作数才被这个设置所影响。公差数据编辑界面中的“最小值”栏被用来编辑和显示这个测试波长。 默认公差的定义

可以从公差数据编辑界面的菜单栏中选择工具、默认公差来定义默认公差。可以从主菜单中选择编辑、公差数据来激活公差数据编辑界面。

默认公差对话框包含了以公差类型分类的几个选项: 表面公差 半径:如果选择了这个选择项,那么将包括默认的半径公差。默认的公差可以由一个以镜头长度单位表示的固定距离或者由在测试波长处的厚度光圈(由操作数TWAV 定义)来指定。这个公差仅仅被放在那些有光学功能的表面上,这样就排除了那些两边有相同折射率虚拟表面。如果表面是一个平面,则默认的公差值被指定作为一个以光圈表示的变化量,即使选择了其它选项也是这样。

厚度:如果被选中,则在每个顶点间隔上将指定一个厚度公差。ZEMAX 假设所有的厚度变化只影响那个表面和与那个元件相接触的其它表面;因此,在这个厚度后面的第一个空气间隔被用作一个补偿。详细内容可参见这一章前面的关于TTHI 的详细说明。

偏心X/Y:如果被选中,偏心公差被加到每个的镜头表面中。公差被定义作为一个以镜头长度单位表示的固定偏心数量。ZEMAX 使用TSDX 和TSDY 来表示标准表面的偏心,使用TEDX 和TEDY 来表示非标准表面的偏心。

倾斜(TIR)X/Y:如果被选中,则一个以镜头长度单位或者度表示的倾斜或者“全反射”公差被加到每个镜头表面中。ZEMAX 使用TSTX 和TSTY 来表示以度为单位的标准表面倾斜,使用TETX 和TETY 来表示以度为单位的非标准表面倾斜。

S+A 不规则:如果被选中,则在每个标准表面上指定一个球形的象散不规则。详细内容可参见前面给出的TIRR 的描述。

泽尼克不规则:如果被选中,将在每个标准表面上指定一个泽尼克不规则。详细内容可参见前面给出的TEXI 的描述。

折射率:TIND 被用来模拟折射率的变化。 阿贝常数:TABB 被用来模拟阿贝常数的变化。 元件公差 偏心X/Y:如果被选中,则偏心公差将被加到在每个镜头组上去。公差可以被定义为一个以镜头长度单位表示的固定偏心数量。

倾斜X/Y:如果被选中,一个以度表示的倾斜公差将被加到每个镜头组和表面上去。重要的一点是要注意系统默认镜头组绕着这个镜头组的第一个表面的顶点倾斜。关于绕着一些其它点倾斜的信息可参见在这一章前面介绍的TETX 和TETY 部分。

除了公差定义以外,在这个对话框中还有另外两个选项:

起始行:这个控制指出了默认公差应该被放在公差数据编辑界面中的哪个地方。如果行号大于1,那么从指定的行号开始附加新的默认公差。

使用焦距补偿:如果被选中,则将定义一个默认的后焦距(象面之前的厚度)补偿。至少要使用一个补偿才能大大缓解一定的公差,然而,补偿是否被使用则要依赖于设计的具体情况。也可以定义其它补偿。更多的信息可参见“补偿的定义”部分。这里有六个按钮:

OK:接受这些设置,并产生默认公差。

Cancel:关闭对话框,但不改变默认公差。 Save:保存这个设置,以供特性使用。 Load:恢复前面保存的设置。 Reset:将设置恢复到默认值。 Help:调用在线帮助系统。

系统默认,ZEMAX 允许的Monte Carlo 分析从一个高斯“正态”分布中摘取一个任意值。一旦定义了默认公差,它们将和镜头文件一起被自动保存。如果在镜头数据编辑界面中插入另外的表面,则公差表面将自动被重新编号。 补偿的定义

在这里可以定义许多不同的补偿:任意一个表面或者一些表面的厚度(使用地最多),曲率,圆锥常数,任意的参数或者特殊数据值。多种结构操作数也可以被定义作为一个补偿。对于使用特殊组成的倾斜和偏心作为补偿,参数值是很有用的。要被倾斜的表面必须已经被定义成一个坐标断点(或者也许是一个倾斜表面),并按要求带有一些适当的拾取求解。

系统默认象面焦距被指定作为一个补偿。你可以增加或者删除补偿来使这个分析适合你的特殊情况,可以使用任意多的补偿。通常,使用更多的补偿将放宽公差,但使系统的实际校准复杂化。可以使用公差操作数COMP、CPAR、CEDV、和CMCO 来定义所有的补偿。操作数的定义在“公差控制操作数”一节中描述。当使用一个过程来定义公差程序时,补偿可以被修改,在模拟的校准过程的不同阶段可以定义不同的公差组合。关于这个选项的详细内容,可参见这一章后面的“公差过程的使用”部分。 公差分析的执行

一旦所有的公差操作数和补偿都被定义好了,则可以执行公差分析了。为了执行公差分析,从主程序菜单栏中的工具菜单中选择公差规定。

显示的对话框有几个控制,它们被说明如下:

快速公差模式:本来,快速公差规定仅仅考虑了以近轴后焦距误差作为补偿的情况下的变化;其它所有的公差都将被忽略。快速模式对于粗略的公差规定是非常有用的,它的速度通常是标准模式的公差规定的50 倍。

评价:评价控制被用来指出什么将被用作一个评价图形。其选项为:

RMS 斑点尺寸(半径,x,或者y):这对于那些不接近于衍射极限的系统来说是最好的选择;例如,那些象差大于1个波长的系统。这是一个最快速的选项。对于这个公差分析ZEMAX 总是采用质心参考。

RMS 波前:这对于那些接近于衍射极限的系统来说是最好的选择;例如,那些象差小于1 个波长的系统。它几乎和RMS 斑点尺寸一样快。对于这个公差分析ZEMAX 总是采用质心参考。

评价函数:使用一个镜头定义好了的评价函数。这对于用户自定义公差规定标准来说是有用的。对于那些有非对称视场,或者有拦光的重要的表面口径的系统,用户自定义评价函数也是被要求的。如果使用了用户自定义评价函数,则没有边界约束将会被自动加到这个评价函数中。

几何或者衍射MTF(平均,子午,或者弧矢):这对于那些需要一个MTF 说明的系统来说

是最好的选择。如果选择了平均,则使用子午和弧矢反应的平均值。如果选择了几何MTF,ZEMAX 将使用MTF 的近似值,这样计算起来是快速的,对于公差规定目的来说是足够精确的。如果公差被放宽了,则基于MTF 公差规定的衍射可能是有问题的,这是因为如果OPD 误差太大了,则衍射MTF 可能是不可计算的,或者是没有意义的。如果空间频率是足够高的,并且对于MTF 的结果是足够差的,以致于在低于陪分析的频率的一些频率处达到了零,这尤其是正确的。MTF 是最慢的默认标准,基于计算的衍射要比几何慢一点。MTF 是子午和弧矢反应的平均值。MTF 被计算处的频率是在“MTF 频率”控制中被指定的。

瞄准误差:瞄准误差被定义为轴上视场追迹的主光线的半径坐标除以有效焦距。这个定义产生了象的角度偏离的一个测量。ZEMAX 通过仅仅使用一个BSER 操作数(关于BSER的详细内容可参见优化一章)来模拟瞄准误差。任意元件或者表面的偏心或者倾斜都将趋向于偏离主光线和增加BSER 操作数的值。瞄准误差总是在主波长处被计算的,以弧度表示。这个标准仅仅被那些半径对称系统所使用。注意,瞄准误差没有给出象质的指标;它仅仅是轴上光线偏离的一个测量。

用户过程:一个用户过程是一个宏,象一个命令文件,它在公差规定过程中定义了用作镜头的校准和评估的过程。关于这个选项的详细内容,可以参见这一章后面的“公差过程的使用”部分。

模式:模式是灵敏度或者反转灵敏度。灵敏度分析计算了对应于每个公差极值的评价函数的变化。反转灵敏度分析计算了每个公差的值,它导致了由最大标准指定的结果的降低。反转灵敏度模式将改变公差操作数的最小值和最大值。更多的信息可参见这一章中其它地方的关于“最大标准”和“反转灵敏度”的描述。

过程:如果要使用用户过程评价函数,这就是这个过程的名称。用户过程必须是一个以扩展名TSC 结尾的ASCII 码文件,必须在与可执行的ZMEAX.EXE 程序相同的目录中。

MTF 频率:如果MTF 被选择作为一个评价,那么这个控制是起作用的,被用来作为MTF 频率的定义。MTF 总是在象空间中被测量的,以线对每毫米表示。

最大标准:在使用反转灵敏度模式时,这个控制是起作用的,被用来定义对于反转公差计算的可接受结果的。例如,假设评价是RMS半径尺寸,一个系统的名义RMS 为.035mm。如果最大标准被设为0.050,那么ZEMAX 将计算每个公差的最小值和最大值,它将结果降低称为一个值为0.050 的RMS 斑点尺寸。最大标准必须表现出比名义系统所要求的更差的结果。当使用MTF 作为一个评价,则最大标准是更低的MTF 范围,因为更低的数值象征着更差的结果。可以通过按下在最大标准编辑窗口附近“?”来计算当前选择的标准的名义评价函数。

视场:通常来讲,用作优化和分析的视场定义对于公差规定是不适合的。例如,一个旋转对称镜头可以使用0、7、和10 度的视场定义。对于公差规定目的,当分析倾斜或者偏心公差时,视场定义的对称性的缺乏可能会导致错误的结果。当为公差规定而构建一个评价函数时,ZEMAX 可以使用三个不同的视场设置:

Y 对称:ZEMAX 计算最大的视场坐标,然后仅仅在Y 方向上的+1.0、+0.7、0.0、-0.7、和-1.0 乘以最大视场坐标处定义新的视场点。X 方向的所有值全都被设为零。这对于旋转对称镜头是默认的。

XY 对称:类似于Y 对称,只不过这里要使用9 个视场点。那5个Y 对称点被使用,仅仅在X 方向上增加了-1.0、-0.7、+0.7、和+1.0。

用户自定义:使用在当前镜头文件中存在的视场定义。当使用渐晕因子、规定多重结构镜头的公差、或者使用公差过程时,需要这个选项。当规定非旋转对称镜头或者带有复杂的视场权重的镜头时,也高度推荐使用用户自定义视场。如果用户自定义视场被使用,则将不执行权重的调节。对于Y 对称情况,中心点有一个2.0 的权重,其它所有的点都有一个1.0 的权重。对于XY 对称,中心点有一个4.0 的权重,其它所有的点为单位量。

采样:采样被用来设置在计算公差评价函数时要追迹多少条光线。越高的采样追迹越多的光线,给出越好的结果。然而,执行时间也将增加。通常,一个3 的采样对于光学系统的质量来说时足够了的。有高的象差数量的系统要求的采样比低象差的系统要高。决定最好的采样设置的最可靠的方法是先在采样为3 的情况下运行,然后再在采样为4 的情况下运行。如果结果有适度的改变,则使用高的设置。如果它们有较大的改变,则要检查更高的采样设置。如果结果改变不多,则返回到较低的采样。设置比要求更高的采样只会增加计算的时间,而不会增加结果的精确性。

执行灵敏度:如果这个选项被选中则将执行灵敏度(或者反转灵敏度)分析。如果这个选项没被选中,则它将绕过灵敏度部分和过程,直接到Monte Carlo 模拟。

优化循环#:这决定了ZEMAX 将如何严格地努力去优化补偿值。如果被设为自动,则ZEMAX 将调用“自动”模式的优化,它将运行优化,直到补偿的优化已会聚于一点了。对于粗略的公差规定,可以使用低的数值,如1、2、或者3。如果补偿是很难优化的,则一个较高的设置将会提高精度。如果选择了太少的优化循环,则公差将是比较讨厌的;预知的结果将比实际结果要差。“自动”设置用起来是最安全的。较高的设置是以运行时间为代价来提高精度的。仅仅在快速模式被关闭时采用这个选项。

显示描述:如果被选中,每个公差操作数的意义的一个完整描述将在分析报告中被提供。如果没被选中,则仅仅列出公差操作数的缩写。

显示补偿:系统默认,在灵敏度分析过程中补偿不会被打印出来。如果这个选项被选中,每个补偿值将和每个公差在评价函数中的变化一起被打印出来。

Monte Carlo:这个控制被用来指定将要执行多少Monte Carlo 模拟。20 的默认设置值将产生20 个符合指定的公差的随机镜头。更详细的内容可参见“Monte Carlo 模拟”部分。Monte Carlo 运转的数目可以被设为零,这将从摘要报告中省略Monte Carlo 分析。

统计:选择高斯“正态”分布、“均匀”分布、或者“抛物线”分布。这个设置仅仅被Monte Carlo 分析使用;参见关于统计模式和“STAT”命令的详细说明,这个命令提供了对使用的统计模式的详细控制。

保存MC 运行:这个选项被用来保存在Monte Carlo 分析过程中产生的指定数目的镜头文件。这个值指定了被保存的镜头文件的最大个数。例如,假设选择了20。在产生第一个Monte Carlo 镜头之后,这个镜头文件将被保存到文件MC_T0001.ZMX 中。第二个MonteCarlo 镜头文件将被产生,然后被保存到文件MC_T0002.ZMX 中,等等。仅仅开始的20 个Monte Carlo 镜头被保存(最后一个是MC_T0020.ZMX)。如果少于20 个的Monte Carlo 运行被要求,则保存

少于20 个的镜头。要确保你没有名为MC_Txxxx.ZMX 的镜头文件,因为当这些文件被保存时ZEMAX 将覆盖这些文件,而没有警告。这个特性的目的是为了进一步研究由Monte Carlo 特性产生的镜头。

结构#:对于多重结构镜头,这指出了哪个结构将被用来规定公差。仅仅选择的结构才被考虑,这个结构的编号将在最后的报告中被打印出来。如果选择了“所有”,则所有的结构将被同时考虑;在这种情况中,仅仅允许使用一个用户自定义评价函数和用户自定义视场。隐藏除最差外的其它所有:如果选择了,则所有的灵敏度数据的打印都将被关闭。这对于减小输出报告的尺寸是很有用的。“隐藏”选择栏通常与“显示最差”控制联系起来使用。“显示最差”控制可以被设置来仅仅分类和显示一定数量的公差操作数;这允许仅仅打印输出最严格的公差的。

显示最差:参见上面的“隐藏除最差外的其它所有”。

单独列出视场:当被选择时,ZEMAX 将分别对每个视场点列出预报结果。这允许将镜头结果作为一个视场位置的函数来详细检查。对于每个视场点在Monte Carlo 分析中的标准、最好、最差、平均、和标准偏离都将被列出。

强制光线瞄准:如果被规定公差的镜头已经使用了光线瞄准,则在估计公差时将使用光线瞄准。如果光线瞄准没有使用,则仅当选择了这个选择栏时才使用光线瞄准。通常,光线瞄准的使用将产生更精确的结果,但计算速度也更慢。对于初步或者粗略的公差工作,将这个开关拨向默认值“关闭”,但对于最后或者精确的公差工作,则将这个开关设为“打开”。

覆盖MC 图表:如果被选择了,对于每个Monte Carlo 产生的镜头,每个打开的分析图表窗口(如光线特性图或者MTF 曲线图)都将被更新和覆盖。对于显示模拟镜头的结果的总的范围,这个最后图表是很有用的。那些不会自动改变比例的分析图形是最有用的,如MTF、MTF vs. 高度、能量圈、和其它允许用户定义固定比例的图表,如光线特性图。静态、文本、和编辑窗口不会被更新。在公差分析完成以后,被覆盖的图形窗口将被标记作为静态窗口。对于每个MC 镜头来计算每个分析图表的时间将明显地减慢公差分析的速度。

状态:在公差分析的计算过程中,公差法则用这个控制被来提供状态信息。 在这个对话框的底部也有六个按钮: OK:使用当前的选项来执行公差分析。 Cancel:不执行公差分析而退出这个对话框。 Terminate:终止公差分析。

Save:保存当前选择的选项,以供进一步使用。 Load:恢复前面保存的设置。 Reset:将设置恢复为默认值。

一旦所有的选项都被选择好了,按下OK 以开始公差分析。关于计算方法的详细内容在下一节中被提供。

ZEMAX 是如何计算公差分析的

ZEMAX 通过将这个镜头保存到一个临时文件中来开始公差分析,在公差分析完成以后这个临时文件将被用来恢复这个镜头。在公差规定中所作的所有改变最后都将被丢弃,最初的

镜头文件将不作修改地被恢复。例外情况是在反转灵敏度分析过程中,在那里公差数据最小和最大可以被改变。

然后ZEMAX 将取消所有的变量。求解可以被留下来,然而,求解可能会在公差规定过程中导致一些问题;更多的信息可参见这一章后面的“带有求解的公差规定”部分。公差操作数被读取,以及由指定的COMP 和CPAR 定义的补偿参数被设为变量。如果使用了一个公差过程,则在这个公差规定过程中定义的补偿可以被修改。

如果在被规定公差的镜头中,光线瞄准是被打开的,或者如果“强制光线瞄准”开关被选择了,那么在公差的估计中将使用光线瞄准,否则,光线瞄准将被关闭。使用光线瞄准计算的公差是更准确的,但执行速度也较慢。关于光线瞄准的详细内容可参见“系统菜单”一章。然后ZEMAX 使用在公差对话框上的评价、视场、MTF 频率、和采样设置来为公差规定定义一个适当的评价函数。由于这是仅仅对这个临时文件所做的,所以为这个镜头所作的原始评价函数不会被扰乱。

边界约束被加到评价函数中来将补偿到使用COMP 和CPAR 命令指定的最小和最大边界内。如果使用了一个用户自定义评价函数,或者如果快速模式是打开的,则关于补偿的边界约束被忽略。然后ZEMAX 调用优化函数对于定义的补偿来查找最好的值。然后保存最后的镜头文件,以供公差规定法则后面使用。如果快速模式是打开的(见下),则仅仅调整后焦距,而不是优化这个镜头。这个镜头的评价函数被认为是“名义”评价函数。注意,这个名 义评价函数值与在优化或者评价函数编辑窗口中被报告的评价函数值通常是不一样的,因为ZEMAX 仅仅为公差规定的使用构建了一个新的评价函数。然后ZEMAX 继续运行灵敏度、反转灵敏度、或者Monte Carlo分析,如下所述。 快速公差规定模式

对于公差的评估,ZEMAX 有两种方法:快速和标准。如果“快速公差”模式被选择,则要采取几个假设,这将大大加快公差评估的速度。首先,所有定义的补偿和补偿边界约束全都被忽略掉。使用一个简单的焦距误差求解来将后焦距作为一个补偿来执行。这意味着这个焦距要被调整来保持这个名义镜头设计中离焦数量,而不会努力将后焦距重新优化地正好。这些假定大大加速了公差评估,导致这个分析提高了大约50 倍的速度。如果后焦距是唯一被要求的补偿,则快速模式是高精度的;具有代表性的是,快速模式的结果在慢得多的标准模式的结果的几个百分数。

如果快速模式没有被打开,则ZEMAX 将使用优化法则来寻找所有补偿的最好的值。如果后焦距是唯一的补偿,则快速公差模式是非常快的、正确的、而且应该被使用,这个系统可以被近轴光线描述得很好,如果那些旋转对称的系统。如果系统是高度非对称的或者有多个补偿,则不应该使用快速公差。当搞不清楚时,则可运行两种模式,然后比较结果。

在快速模式打开或者关闭时,灵敏度、反转灵敏度、或者MonteCarlo 分析法则都可以工作。由于快速模式不能很好地优化补偿,所以快速模式的结果通常比标准模式的结果要麻烦一点。 灵敏度分析

对于灵敏度分析,将使用下面的法则对每个公差进行求值:恢复临时镜头。

将其公差要被评估的参数调整到极小值。例如,如果被评估的公差是TRAD,其名义值为100mm,有一个为-0.1 的最小公差值,则这个半径被设为99.9。如果这个公差是一个倾斜或者偏心公差,则要按要求插入虚拟坐标断点来模拟这个波动。对于表面倾斜和偏心,如TSDX、TSDY、TSTX、TSTY、TIRX 或者TIRY,如果这个表面开始是一种标准类型,则将使用不规则表面类型。

调整补偿。使用的方法依赖于快速模式是否被打开,详细内容可参见这一节的前面部分。最后的评价函数将被打印到报告上。

对于最大公差值重复这个过程。

对于每个公差操作数来说,这个基本法则是重复的。

灵敏度分析的评价是在增加评价函数值方面,太宽松的公差通常比其它公差要有更大的贡献。这个技巧允许设计者来识别对于某些误差,如倾斜或者偏心,有高灵敏度的表面。通常,对于不同的误差,不同的表面也将有不同的灵敏度。灵敏度分析帮助来识别哪个公差需要被加紧,哪个公差需要被放松。这对于寻找最佳(和最小)的补偿的数量和调整的要求范围也是有利的。实际上,对于这个特性有更多的应用程序;例如,设计装配镜头来最佳化补偿杠杆。灵敏度分析帮助来识别哪个公差需要被加紧,哪个公差需要被放松输出的数量可以是最重要的,尤其对于有许多元件和相应的许多公差的镜头。通常,在所有可能的公差范围内,公差灵敏度的变化是非常大的。“显示最差”控制对于总结最差的事故是非常有用的,因为它可以根据对评价函数的贡献将公差分类,然后以递减的次序打印出来。如果只关心最差的事故,则“隐藏除最差外的其它所有”可以控制打印的大小。

在计算完所有单独的公差以后,ZEMAX 然后将计算统计的变化,其最重要的是在评价函数标准中可估计的变化和相应的可估计的结果。对于结果中可估计的变化的计算,ZEMAX 采用了一个平方根的和的平方(RSS)的假设。对于每个公差,结果相对于名义值的变化被平方,然后在最小和最大公差值之间取它们的平均值。然后将所有的公差的这个最后被平均的平方值加起来,再取这个结果的平方根。

采用最小和最大公差值的平均值是因为最小和最大公差值不能同时出现,因此平方值的总和将导致一个非常讨厌的预报。而这个最后的RSS 是结果的可估计的变化。 反转灵敏度分析

如果执行一个反转灵敏度分析,则将以和灵敏度分析所采用的一样的方法来计算公差。然而,当在最小和最大公差值之间作调整时,将在一个循环体内重复地执行这个计算。这个调整将一直做,直到最后的评价函数值近似等于在公差对话框中定义的最大标准值。

例如,如果评价为RMS 斑点尺寸,名义评价值为0.035,最大标准为0.050,则ZEMAX 将一直调整最小和最大公差值,直到在这两个极值处这个评价值为0.050。这里有一些这个规则的异常情况:最大标准必须象征比名义结果更差的结果。如果名义结果比最大标准差,则将出现一个错误信息,公差分析不再被执行。

如果最小和最大公差值调整导致了比名义系统更好的结果,则这个公差设置不能被修改,将报告这个最后的更好的结果。在规定半径公差的时候,当系统由于F/#的增加而改善时,这种情况可能会发生。如果公差的起始值产生了比最大标准值更好的结果,这个公差不再被调

整。这意味着在反转灵敏度分析过程中,公差不会被放松,只能被收紧。例如,如果名义值为0.035,最大标准为0.050,最初的公差产生一个0.040 的结果,则这个公差不会被增加。为了计算准确的,首先必须在公差数据编辑界面中放松公差,然后重复反转灵敏度分析。这样做是为了防止公差比必要的公差还要松。通常,比一些合理的数值更松的公差不会降低制造成本。

使用新调整的公差值来计算可估计的结果变化,其方法与对灵敏度分析所用的是相同的。反转灵敏度分析有利于收紧单独的公差,所以没有一个缺点对于结果降低有太大的贡献。 反转灵敏度分析有利于收紧单独的公差,所以没有一个缺点对于结果降低有太大的贡献。 注意,对于每个公差计算它的反转灵敏度的最大标准。结果估计的总体降低仍将有所有增加的RSS 给出。 Monte Carlo 分析

与灵敏度分析和反转灵敏度分析不同,Monte Carlo 分析将同时模拟所有波动的效果。 Monte Carlo 分析将同时模拟所有波动的效果 对于每个Monte Carlo 循环,所有已指定公差的参数都可以由其定义的参数范围和那个参数对于整个指定范围的一个分布的统计模式来随机设定。系统默认,假设所有公差都遵循相同的正态分布,它在最大和最小允许极值之间有一个四倍标准偏离大小的总宽度。例如,公差为+4.0/-0.0mm、值为100mm 的半径将被赋予在100.00mm与104.00mm 之间一个随机值,一个居中的在102.00mm 处的名义贡献,和一个1.0mm 的标准偏离。可以使用STAT 命令来改变这个默认的模式。每个公差操作数对于这个统计分布可以有一个的定义,或者有相同统计分布形式的操作数可以被分成一组。所有跟有一个STAT 命令的公差操作数将使用由那个STAT 命令定义的统计分布。可以在公差数据编辑界面中放置和你想要的一样多的STAT 命令。 STAT 命令采用两个自变量,Int1 和Int2。Int1 将被设为:0 代表正态;1 代表均匀;2 代表抛物线;3 代表用户自定义统计。仅仅对于正态统计,Int2 值将被设为那个参数的平均值和极值之间的标准偏离值。 有效的统计分布介绍如下。 正态统计分布 默认的分布是一个可修改的高斯“正态“分布,其形式为:

1x2p(x)exp(2),nxn

22这个修正是随机选择的值x(由到两个极值公差值之间的中点的一个偏移来测定)被在“n”个为零标准偏离之内。默认的“n”只为2,然而,“n”可以使用前面定义的STAT 命令的Int2 自变量来改变。这样做是为了确保选择的值不会超出指定的公差。这个标准被设为“n”的倒数乘以这个公差的最大范围的一半。例如,如果“n”为2,厚度的名义值为100mm,公差为+3 和-1mm,则应该从一个平均值为101mm、范围为正负2mm,标准偏离为1.0mm 的正态分布中摘取这个选择值。如果“n”为5,则这个标准偏离为0.4。“n”越大,选择的值靠近公差极值的平均值的可能性就越大。“n”越小,正态分布看起来就越象均匀分布。

均匀统计分布 均匀分布的形式为:

1,x 2Δ值为最小和最大公差值之间的差值的一半。注意,这个随机选择的值将以相同的概率分

p(x)布在指定的公差极值之间的任意地方。 抛物线统计分布 抛物线分布的形式为:

3x2p(x)3,x

2这里Δ的定义与均匀分布的完全相同。抛物线分布产生的选择值看起来更象在公差范围的极值处得到的,而不是象正态分布那样在中值附近。 用户自定义统计分布 用户自定义统计分布是由一个带有列成表格的分布数据的ASCII码文件来定义的。一个普通的概率函数可以被定义为:

p(xi)Ti,0.0x1.0

这里T 值相对于离散的x 值被列成表格。这个普通的分布可以在数学上被结合起来,以及从这些表格值的整体来说,一个可估计的x 值可以与表格分布象匹配的统计形式随机产生。这个文件的格式是两栏数据,如下:

X1 T1 X2 T2 X3 T3 ⋯⋯等等。

这里X 值是0.0 和1.0 之间的单调递增的浮点数,包括这两个数,T是对应于X 值而得到的概率。注意,ZEMAX 使用了一个覆盖从0.0到1.0 的范围的一个概率分布,因此第一个定义的X1 值必须等于0.0(它可以有任意的概率T1,包括零),最后一个定义的值必须是值为1.0 的Xn。最多可以使用200 个点来定义X=0.0 和X=1.0 之间的分布。如果列出了太多的点,则将出现一个警告。

对于后面定义的每个公差操作数(直到到达另一个STAT 命令),这个定义的最小和最大公差值将决定这个随机变量X 的实际范围。例如,如果一个为100.0 的值有一个-0.0 和+2.0 的公差,则这个概率分布将扩展到100.0 到102.0 的范围。

一旦在一个文件中定义数据,则这个文件必须被放在与ZEMAX程序相同的目录中,这个文件名(以及扩展名)必须被放在公差数据编辑界面中的与STAT 命令同行的注释栏中。这个STAT 类型必须被设为“3”。

这个文件名(以及扩展名)必须被放在公差数据编辑界面中的与STAT 命令同行的注释栏中一个可能的分布为:

0.0 0.0 0.1 0.5 0.2 1.0 0.3 0.5 0.4 0.0 0.5 0.5 0.8 4.0 1.0 5.0

注意,X 数据值不需要被均匀隔开;在概率快速变化的区域内可以用更精密的间隔。这个分布有两个波峰,较高的波峰更高度倾斜向分布的最大值一边。

用户自定义统计分布是非常灵活的,可以被用来模拟任意一种概率分布,包括歪斜的、多个波峰、或者被测量的统计概率数据。在一个相同的公差分析中可以定义和使用多个分布。 Monte Carlo 分析方法的说明 注意,从正态分布到均匀分布再到抛物线分布,将连续产生一个更讨厌的分析,因此将产生更保守的公差。

注意,从正态分布到均匀分布再到抛物线分布,将连续产生一个更讨厌的分析,因此将产生更保守的公差对于每个循环,将调整补偿,然后将这个评价函数和补偿的数值打印出来。在所有的Monte Carlo 试验之后,将提供一个统计概要。

Monte Carlo 分析的值将同时考虑所有的公差来估计镜头的性能。与在系统中指定了“最差事故”的灵敏度分析不同,Monte Carlo分析估计一个系统的符合指定公差的真实结果。提供的统计概要对于那些被大量生产的镜头系统是非常有用的。那些是一种性质的镜头,由于不合理的采样,当然不会遵循这些统计。然而,Monte Carlo 分析仍然是有用的,因为它指出了一个单一镜头符合要求的规格的概率。 Monte Carlo 分析嵌套规则 当执行Monte Carlo 分析时,将同时考虑所有公差。如果不遵循一定的规则,可能发生的情况是,定义的元件的倾斜和偏心操作数是相冲突的或者是不明确的。

公差,如TEDX、TEDY、TETX、或者TETY,要求ZEMAX 在表面组的前面和后面插入坐标断点,然后将这个表面组作为一个整体来倾斜或者偏心。由第一个坐标断点所作的倾斜或者偏心必须由第二个坐标断点来撤消。仅仅当第一个和第二个坐标断点的顶点在3D空间的相同位置时才能做到这一点。ZEMAX 通过拾取和位置求解来保证这个条件。

如果由多个公差操作数指定的表面范围交迭一起,则这个方法将失败。例如,如果在表面3~8 上有一个TETX,在表面5~12 上有后一个TETX,则倾斜了5~12表面组的第一个坐标断点将改变表面5~8的位置,第一个表面组的第二个坐标断点将被移动。在这种情况中,ZEMAX 不能保证坐标断点能象事先想好的那样工作。实际上,交迭的坐标断点没有一个统一的解释,因此要去想象一个光学系统,在这个系统中它们有一个有意义的物理解释,这是很难的。

然而,公差是可以被嵌套的,因为嵌套对于倾斜和偏心意味着一个明确的顺序。例如,在表面5~12 上的TETX 后面跟着在表面5~9上的TETX 和在表面10~12 上的TETX,是可以很好被执行的。这个顺序可以模拟一个有多个元件组成的装配的倾斜,每个元件可以在这个装配中自行倾斜。

嵌套规则是非常简单的:

1) 所有元件的倾斜和偏心公差必须被嵌套。

2) 在每个嵌套组中的最外面一对表面必须是第一个。 这是一套有效的操作数的例子:

TETX 5 12 TETX 5 10 TETX 11 12

这是一套无效的操作数:

TETX 5 12 TETX 9 15 TETX 5 15

第二个操作数是无效的,因为它部分与第一个操作数交迭(这违反了规则1)。第三个操作数是无效的,因为虽然它与操作数1 相嵌套,但它是两个操作数的最外面的范围(这违反了规则2)。第二个操作数必须被删除或者修改,而第三个操作数可以被放在第一个操作数的前面来构造一个合法的列表:

TETX 5 15 TETX 5 12

注意,尽管一个操作数与前面的一个操作数分享一个或者两个表面,但它被认为是嵌套的,因此TETX 5-15 后面可以跟另一个TETX 5-15 或者TETX 5-12 或者TETX 13-15,但不能跟TETX 4-13。 公差过程的使用 这个特性仅对ZEMAX 的EE 版本才有效 公差过程概述 公差过程是一个简单的宏,象一个命令文件,它定义了一个过程,按照它在公差规定过程中来评估一个镜头的性能。过程允许模拟一个镜头的一个复杂校准和评估过程。使用过程,可以采用下面的行动来一个有问题的镜头:

—增加或者删除补偿。 —载入一个新的评价函数。

—使用任意的评价函数来优化定义的补偿。

—监控和报告ZEMAX 通过一个评价函数能计算的任意一个值(由于这个评价函数调用了ZPL 宏指令,所以这实际上包括了ZEMAX 可以计算任意一个值)。

—将在分析的任意一个阶段中的镜头保存为一个ZMX 文件。可以将任意多的这些操作组合到过程中;因此可以定义多个评价函数和补偿组。在公差分析的评估过程中可以多次执行这个过程,包括:

—一次计算名义数据。

—对于在灵敏度分析中的每个公差操作数计算两次(一次对于最小公差,一次对于最大公差)。

—对于在反转灵敏度分析每个公差操作数计算多次(反转灵敏度分析可能需要反复计算)。

—对于产生的每个Monte Carlo 镜头计算一次。

公差过程文件必须是以扩展名TSC 结尾的ASCII 码文件,必须被放在与ZEMAX 程序相同

的目录中。任意一个引用的评价函数(有MF 扩展)也必须被放在这个目录中。 公差过程命令 公差过程命令被定义和说明如下。 !

语法结构: !一个注释行!

符号“!”被用来在过程的执行过程中被忽略的过程中定义注释。 CEDV 语法结构: CEDV surf param

CEDV 定义了一个新的特殊数据值补偿。值“surf”是在初始镜头文件中的表面编号。如果公差程序插入了另外的坐标断点或者其它虚拟表面,则ZEMAX 将自动给表面重新编号。值“param”对应于这个表面的某个特殊数据值的编号。 CLEARCOMP 语法结构: CLEARCOMP

CLEARCOMP 取消了当前所有的补偿。在调用命令OPTIMIZE之前必须定义新的补偿。 CMCO 语法结构:

CMCO operand config

CMCO 定义了一个新的多重结构操作数补偿。值“operand”是在原始镜头文件中的操作数(行)编号。值“config”对应于结构编号。 COMP 语法结构: COMP surf code

COMP 定义了一个新的补偿。值“surf”是在原始镜头文件中的表面编号。如果公差程序插入了另外的坐标断点或者其它虚拟表面,则ZEMAX 将自动给表面重新编号。值“code”为:0 代表厚度;1代表曲率;2 代表圆锥常数。 CPAR 语法结构: CPAR surf param

CPAR 定义了一个新的参数补偿。值“surf”是在原始镜头文件中的表面编号。如果公差程序插入了另外的坐标断点或者其它虚拟表面,则ZEMAX 将自动给表面重新编号。值“param”对应于这个表面的某个参数的编号。

LOADMERIT 语法结构:

LOADMERIT filename.mf

MF 文件必须驻留在与ZEMAX 相同的目录中。这个文件的格式应该是和使用评价函数编辑界面的工具、保存选项保存的一样的正确的文件格式。当评价函数被载入时,它取代了任意一个已存在的评价函数。如果公差程序插入了另外的坐标断点或者其它虚拟表面,则ZEMAX 将自动给那些涉及到表面的操作数重新编号。任意涉及到表面编号的操作数应该是原始的、未被改变的镜头的表面编号。然后对新的评价函数进行评估。最后的评价函数值是要作为“评价函数”被返回到公差分析程序的值,除非后面执行了一个LOADMERIT 或者OPTIMIZE命令。 OPTIMIZE 语法结构: OPTIMIZE n

OPTIMIZE 调用了最小阻尼二乘法优化程序,并执行“n”个优化循环。如果n 为零或者被忽略,则优化程序将以自动模式运行,当探测到收敛时终止优化。 REPORT 语法结构:

REPORT “text” operand

REPORT 将把任意用户定义的文本和当前载入的评价函数中任意操作数的值打印到公差输出窗口中。值“operand”是一个对应于要被打印的值的操作数(行)编号(注意,任意一个值都可以在一个评价函数中被计算,如果它不需要优化,则可以将它的权重设为零,但对于报告仍然有效)。如果操作数为零,那么整个评价函数的值将被打印出来。 SAVE 语法结构: SAVE n

SAVE 将把当前镜头文件保存到一个ZMX 文件中;其名称为TSAVnnnn.ZMX,这里nnnn 是表示数值“n”的一个四位数整数。如果,如果“n”为6,则这个文件将被保存为TSAV0006.ZMX。公差过程的例子作为一个例子,假设一个光学系统是由多个镜头元件组成的。作为校准和评估过程的一部分,这个系统被调整如下:将编号为2 的元件偏心,直到一个轴上测试光束在象的中间。然后将编号为4 的元件沿轴偏移,直到得到合适的放大率。最后,调整后焦距,仅仅用来最佳化轴上MTF。然后测量和记录畸变。 求出在5 个视场点的MTF。

假设使用一个已存在的坐标断点,表面3 的参数1 和参数2 来偏心编号为2 的元件。元件4 的位置为厚度10,以及后焦距为厚度15。此外,假设使一个轴上光线在象面中间的一个评价函数被定义在文件CENTER.MF 中,放大率约束的评价函数为文件MAGNIFY.MF,MTF评价函

数为文件MTF.MF , 评估的评价函数为文件EVALUATION.MF。相应的过程如下: ! 清除所有已存在的补偿,作为一个新的开始 CLEARCOMP

! 载入中心评价函数 LOADMERIT CENTER.MF ! 定义两个补偿来偏心元件2 CPAR 3 1 CPAR 3 2 ! 优化4 个循环 OPTIMIZE 4

! 清除偏心,载入放大率评价函数,调整厚度10 CLEARCOMP

LOADMERIT MAGNIFY.MF COMP 10 0 OPTIMIZE 4

! 现在,载入MTF 评价函数,并调整后焦距 CLEARCOMP LOADMERIT MTF.MF COMP 15 0 OPTIMIZE 4

! 最后,载入评估评价函数,并报告畸变和5 个MTF 值 ! 这些应该是EVALUATION.MF 文件中的前6 个操作数 CLEARCOMP

LOADMERIT EVALUATION.MF REPORT “Distortion =” 1 REPORT “MTF at field 1 =” 2 REPORT “MTF at field 2 =” 3 REPORT “MTF at field 3 =” 4 REPORT “MTF at field 4 =” 5 REPORT “MTF at field 5 =” 6

在这个过程的最后,由最后的LOADMERIT 或者OPTIMIZE 命令中引出的整个评价函数值将作为ZEMAX 报告和使用的“评价函数”被返回。 多重结构(变焦)镜头的公差规定 可以对一个多重结构镜头的每个结构进行公差分析。可以简单地从“结构#”的下拉框选择要求的结构。通常,是没有必要去规定所有结构的公差,但是这当然也是一个选项。当使用反转公差时,在每个结构中的连续公差分析将产生共同应用于所有结构的最紧的公差。 带有求解的公差规定 通常来说,你应该在对一个镜头进行公差规定之前删除所有的求解和变量。如果你有许多以后可能要用到的求解或者变量要删除,则更便利的方法是将这个镜头文件保存到一个临时文件中,以供公差规定使用。如果你将求解留在你的镜头文件中,则虽然公差规定仍然可以工作,但是其结果可能不是你所预期的那样。其原因是当这个光学系统包含了倾斜的和偏心的元件时,某些求解,如近轴边缘光线高度求解,将不再有意义了。尽管一个系统最初是旋转对称的,但大多数公差命令,如TETX 和TETY,将强制使这个系统变成非旋转对称。拾取求解也可能导致奇怪的结果,因为当插入或者删除坐标断点时,公差规定法则有时将用到表面描述数据(如厚度)。对于位置求解也有同样的,当镜头数据被公差规定法则改变以后,它可能不再工作。

然而,在有些场合里一个拾取求解是你真的想要的。例如,如果你正在以双通过模式使用一个镜头,一个元件的倾斜意味着后面一个镜头的倾斜,那么可以使用一个拾取求解来拾取前一个元件的倾斜。对于这种特殊情况,你必须使用命令TUTX 和TUTY,而且默认公差将不再工作。如果在系统中你有这些类型的求解,则要忽略警告“在公差规定之前要删除求解”。 公差结果的故障 参见关于SAVE 命令部分的说明。

如果任意一个被计算的公差数据,如评价函数和百分数变化,显示了一个“无穷大”的值,那么这意味着对于指定的公差,这种评价函数不能被评估。通常这种评价函数是不能被评估的原因是由于一些光线目标的全反射。如果任意公差有一个无穷大的评价函数,则遵循灵敏度分析的统计数据通常是没有意义的。一个解决方案要去掉两个或者多个公差值的因子,然后再重复这个分析。 公差规定的缺陷 当使用倾斜公差,如TETX 和TETY 时,一个可能的错误是光线的非物理传播。如果两个元件是由一个非常小的空气间隙或者虚拟表面隔开的,则默认公差将包括每个元件的倾斜。如果元件的间隔是小的,则一个元件绕着它与其它元件“相接触”的点倾斜是可能的。然而,这实际上是不可能发生的,对于少量的倾斜,这个公差值仍然是性能的一个好的指示。 因为公差程序倾斜和偏心了一个镜头,则这个法则将自动将光线瞄准变成“打开”(关于光线瞄准的详细内容可参见“系统菜单”一章)。如果公差法则报告的名义评价函数与预期值是不一样的,则可检查来看看在这个镜头文件中,光线瞄准是否“关闭”。试着使用“打开”的光线瞄准,再重新优化。通常,如果当光线瞄准打开和关闭时的评价函数有很大的差别,那么就让它打开。 摘 要 公差程序是非常灵活和强大的。ZEMAX 不使用近似值、推断法、或者估计来计算公差。由于这个原因,它对于传统的和复杂的系统两者都给出了有用的结果。要认识到公差规定是一个非常复杂的过程,ZEMAX 用来操作镜头数据的法则不是确实可靠的,这一点非常重要。因此,检验程序是否在计算一个合理的结果,这是设计者的责任。

第二十章 多重结构

介 绍

ZEMAX 提供了一个非常普通的功能,用来定义、分析、和优化在多重结构中使用的光学系统。多重结构用来设计变焦镜头,或者优化在不同波长上测试和使用的镜头,或者指定一些用在不同结构的光学系统。和其它ZEMAX 特性一样,多重结构被结合得很好。然而,像公差一样,精通它需要更多一点的注意和实践。

ZEMAX 使用一个简单的说明来学习定义多重结构的输入过程。这些结构通过同一个参数的不同值来区分。例如,在一个变焦镜头中,不同透镜组之间的间隔可以取多于一个的值。每一批一起使用的值形成了一个结构。 第一步

到目前为止最重要的步骤是,先用普通的ZEMAX 模式来定义一个结构。先以最复杂的结构开始是一个好的主意。如果所有的结构都有着同样数量的单元,则可以选取其中的任何一个结构。一旦你有了定义好的基本结构,现在应该定义新的结构,他们是第一个的变异形式。第一个结构也不需要被优化,你可以后面一起来优化这些结构。从主菜单条中选择编辑,多重结构。显示的电子表格是多重结构编辑界面(MCE)。使用MCE 的菜单条,结构(列)和操作数(行)都可以被插入和删除。这个插入和删除键也可以增加和删除新的操作数行。只要你保存你的镜头文件,输入到MCE 中的数据将被自动保存。

为了改变操作数类型,在类型列上双击。将显示一个对话框,在这里多重结构操作数的类型和数值都可以被改变。这些操作数也在下面的表格中被概述。

多重结构操作数的概述

类 型 CRVT THIC GLSS CONN PAR1 PAR2 PAR3 PAR4 PAR5 PAR6 PAR7 PAR8 XFIE YFIE 数 值 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 视场编号 视场编号 说 明 表面的曲率 表面的厚度 玻璃 圆锥系数 参数1 参数2 参数3 参数4 参数5 参数6 参数7 参数8 X 方向的视场值 Y 方向的视场值 FLWT FVDX FVDY FVCX FVCY WAVE WLWT PRWV APER STPS SDIA CSP1 CSP2 TSP1 TSP2 TSP3 HOLD APMN APMX APDX APDY TEMP PRES EDVA PSP1 PSP2 PSP3 MIND MABB 视场编号 视场编号 视场编号 视场编号 视场编号 波长编号 波长编号 忽略 忽略 忽略 表面编号 表面编号 表面编号 表面编号 表面编号 表面编号 忽略 表面编号 表面编号 表面编号 表面编号 忽略 忽略 表面编号/特视场权重 渐晕因子VDX 渐晕因子VDY 渐晕因子VCX 渐晕因子VCY 波长 波长权重 主波长编号 系统孔径值(无论当前的孔径定义是什么,如入瞳直径或者F/#)。也可参见SATP 光栏面编号。通过对每个结构指定一个整数参量可以将这个光栏移到任意一个有效的表面编号上(包括物面和像面)。 半孔径 曲率求解参数1 曲率求解参数2 厚度求解参数1 厚度求解参数2 厚度求解参数3 将数据保持在多重结构缓冲器中,但没有其它效果。这对于不丢失其相应的数据而临时关闭一个操作数是有用的。 表面孔径最小值。这个表面必须有一个定义的孔径(不是半孔径) 表面孔径最大值。这个表面必须有一个定义的孔径(不是半孔径) 表面孔径的X 偏离。这个表面必须有一个定义的孔径(不是半孔径) 表面孔径的Y 偏离。这个表面必须有一个定义的孔径(不是半孔径) 以摄氏度表示的温度 以大气压表示的空气压力。0 代表真空,1 代表普通大气压 这个操作数EDVA 用来将多个数值赋值给特殊数据值。这个操作数参数求解参数1(拾取表面)。这个操作数需要2 个数值自变量:表面编号和参数编号 参数求解参数2(比例因子)。这个操作数需要2 个数值自变量:表面编号和参数编号 参数求解参数3(补偿)。这个操作数需要2 个数值自变量:表面编号和参数编号 模拟玻璃的折射率 模拟玻璃的阿贝常数 殊数据编号 需要2 个数值自变量:表面编号和特殊数据编号 表面编号 表面编号 表面编号 表面编号 表面编号 MDPG 表面编号 模拟玻璃的dPgF 结构的总的权重。这个数值仅相对于其它结构的权重才有意义。这个结构权重仅由默认评价函数法则用来建立一个通过相对权重来支持所有结构的评价函数。如果这个结构权重为零,那么在构建默认评价函数的过程中略过这个结构。 视场类型。用0 来代表以度表示的角度,1 代表物高,2 代表近轴像高,3 代表实际像高 光线定位。用0 来代表没有,1 代表理想光线参考,2 代表实际光线参考 膜层的名称。如果有,则被应用于该表面上 空间坐标参考表面 在NSC 编辑界面中的对于非连续对象的参数列的修改 在NSC 编辑界面中的对于非连续对象的x,y, CWGT 忽略 FLTP RAIM COTN GCRS NPAR 忽略 忽略 表面编号 忽略 表面编号/对象/参数编号 表面编号/对象/位置 NPOS z,x 倾斜,y 倾斜,和z 倾斜位置值的修改。 位置标记是1 和6 之间的整数,分别代表x,y, z,x 倾斜,y 倾斜,和z 倾斜。 系统孔径类型。用0 代表入瞳直径,1 代表象空间F/#,2 代表物SATP

忽略 空间NA,3 代表通过光栏尺寸浮动,4 代表近轴工作F/#,5 代表物方锥形角。也可参见APER 结构数目的定义

结构数目(也称变焦位置的数目)可通过使用编辑菜单选项插入或者删除结构来改变。 每个结构的定义

为了定义一个多重结构操作数,在你想要改变的操作数的名称上双击(这些名称在最左边一列中列出)。例如,假设你想要给表面5 的厚度输入一个多重值。假定你想要三个不同的结构。使用编辑菜单插入2 个新的结构。在第一行的最左边一列上双击。在对话框的下拉表中选择“THIC”作为操作数类型。选择“5”作为表面编号,然后点击OK 按钮。现在在每个结构列中输入那个结构所需要的厚度。 增加和删除单元

多重结构特性的一个应用是去设计用或者不用现存的某些单元来操作的系统。这可以通过手动在一些结构中构造“幻影”单元来实现。其诀窍是将单元(实际上是单元的第一表面)定义成有一个随结构而变化的玻璃类型。假设在结构1 中一个单元是存在的,由玻璃BK7构成;在结构2 中,这个单元不存在。使用操作数GLSS,对于结构1 输入“BK7”,让结构2 的这个区域空着。虽然定义这个单元的表面在镜头指示中仍然存在,但是它们是无效的,因为它的玻璃已被删去(这个单元变成一对虚拟的表面)。注意,在所有的结构中表面的编号必须保持是一常数。

结构的改变

执行任何分析,这和平常一样。对于所有的计算和图表,这个程序将使用当前的结构。为了改变结构,在MCE 中该列的标题上双击,这个标题在你想要改变的结构的顶部。快捷键是Ctrl-A,shift-Ctrl-A 也能起作用。 利用多重结构的优化

ZEMAX 优化多重结构数据与优化其它常规电子表格数据一样容易。为了将一个多重结构参数变成变量,可以将光标放在那个参数上,然后按下Ctrl-Z。这是一个切换器;再次按下Ctrl-Z 将除去其可变性。当调用优化程序时,优化程序将自动将这个新的变量计算在内。你想定义多少个多重结构变量,就可以定义多少个。

为了同时优化全部的结构,可以从评价函数编辑界面的工具菜单中简单地选择“默认评价函数”,ZEMAX 将会为你建立一个适当的评价函数。使用操作数CONF 将执行对全部结构同时优化。在评价函数的求值过程中这个特殊的操作数将改变当前结构。这意味着在CONF后面定义的所有操作数将与这个新的结构有关。在操作数序列中可以多次使用CONF 来对不同参数进行求值。

边界约束和用户输入的优化操作数将在那些它们被定义的结构中被强制求值。例如,如果操作数CONF 1 后面跟着多个操作数,如EFFL或者REAY,那么它们仅仅在结构1 中被求值。为了在结构2 中强制执行这些同样的操作数,在操作数CONF 2 下将重复这些同样的操作数。这个的优点是,在每个结构中那些输入操作数和它们各自的目标值和权重可以是不同的。其缺点是要将应用于多个结构的操作数复制到每个结构中。 对于初始化多重结构的评价函数的建议

这里有两个不同的普通方法来初始化一个多重结构的评价函数。第一个方法是在默认评价函数的每个CONF 组中添加用户自定义的操作数: CONF1

对于结构1 的用户操作数⋯ 对于结构1 的默认操作数⋯ CONF 2

对于结构2 的用户操作数⋯ 对于结构2 的默认操作数⋯ CONF 3 ⋯等等

另一个方法定义默认评价函数,然后在这个评价函数的上面添加所有的用户操作数,以保持它们都在一起: CONF 1

对于结构1 的用户操作数⋯ CONF 2

对于结构2 的用户操作数⋯ CONF 3

对于结构3 的用户操作数⋯ 等等⋯ DMFS CONF 1

对于结构1 的默认操作数⋯ CONF 2

对于结构2 的默认操作数⋯ CONF 3

对于结构3 的默认操作数⋯ 等等⋯

两个评价函数都将完成同样的工作,但是第一种方法执行得更快一些,因为它减少了结构间转变的操作。第二种方法易于编辑和保持。注意在用户自定义操作数后面的操作数DMFS 的使用。这个操作数用来作为一个标记,以至于当默认评价函数被重新构建时,它将被添加在操作数DMFS 的后面,而用户输入的操作数将不会丢失。

注意,如果你改变了在多重结构界面上的视场的角度、高度或权重,或者波长的数值或权重时,你应该重新构建默认评价函数。当默认评价函数被重新构建时,它将使用每个结构的这些数据来决定被追迹的光线和适当的权重。

注意,如果你改变了在多重结构界面上的视场的角度、高度或权重,或者波长的数值或权重时,你应该重新构建默认评价函数 多重结构数据的求解的使用

在多重结构界面上支持两种求解:从其它操作数和结构中拾取,它带有随意的比例因子和补偿,以及热拾取求解。 MCE 拾取求解

假设有三种结构,在其中两个结构中某一行(比如说是THIC 或GLSS)的值必须是同一个值。在其中一个结构的该操作数上使用拾取求解来确保它们总是相同的。为了设置拾取求解,在 要放置这个求解的行和结构的交叉点上双击。将出现一个对话框,它允许定义求解类型,目标结构和操作数,以及比例因子和补偿。新的单元格的值被定义为:新的值=目标值*比例因子+补偿。注意,只要这个目标结构编号和操作数编号分别小于当前的结构编号和操作数编号,则这个目标值可以是MCE 中的任意其它的单元格的值。 MCE 热拾取求解

ZEMAX-EE 也支持“热拾取求解”,它结合了热膨胀效果;详细内容可参见“热分析”一章。

第二十一章 玻璃目录的使用

介 绍

ZEMAX 提供了几个标准的目录,你也可以创建你自定义的目录。你可以编辑这些标准目录来适合你的需要。这一章讲述了如何在已存在的或者新创建的目录中增加玻璃,以及在你

的光学设计中如何使用这些目录。你可以创建的玻璃目录的数量不受。

ZEMAX 根据输入到玻璃目录中的系数来计算折射率。当你在LDE 的玻璃一列中指定了一种玻璃,如BK7,ZEMAX 将在每个当前载入的玻璃目录中寻找这个玻璃名。如果找到这种玻璃,ZEMAX 将使用那种玻璃的系数,然后使用在那个目录中选择的这种玻璃的公式,来计算在每个定义波长处的折射率。这种方法看起来要比简单地输入折射率复杂得多,但是它有许多优点。首先,公式通常要比用户自己输入的数据更加准确。同时,目录数据比较方便,它仅仅需要用户提供玻璃的名称,在设计时的玻璃选择阶段中这是特别有利的。另外,可以使用任意一种波长,即使在那种波长上没有明确的折射率是可用的。其主要的缺点是必须计算这些系数,虽然这些数据在目录中是容易得到的,或者是容易计算的。

如果你有目录中没有的某些材料的折射率,或者如果你感到你的数据比目录中的数据更好,ZEMAX 将自动为你计算这些系数。参见“折射率数据的修改”一节。 要使用的玻璃目录的指定 这一章讲述了玻璃目录的载入,编辑,和管理。为了说明在一个特定的镜头中使用一个特定的玻璃目录,可以使用系统菜单,通用对话框中的玻璃目录表格。默认输入是“schott”,它指代玻璃目录SCHOTT.AGF。你可以在这行中指定选择目录或者附加目录。可以简单地输入目录的名称(没有扩展)来指定一个选择目录。你也可以同时指定多个目录,只要简单地将它们列出来,中间用空格隔开。例如,要使用“schott”和“hoya”目录,则只要输入“schott hoya”;要使用“ohara”,“schott”,和“infrared”目录,只要输入“ohara schottinfrared”。简单地点击那些在名称表下面一组选择栏中列出的玻璃目录名称也许更加容易。如果一个目录的名称没在可用的选择栏中列出,则你只须输入它的名称。

所有列出的目录必须在ZEMAX 主目录下的\\GLASSCAT 子目录中。要在界面中说明玻璃目录名称的原因是,每个镜头目录选择是分别与镜头储存在一起的。如果你现在保存一个镜头,晚些时候再载入这个镜头,则这些正确的目录,并且只有这些目录,将自动被载入。如果你喜欢,你可以为你设计的每个镜头指定不同的目录组合。 玻璃目录的载入 为了载入一个现存的玻璃目录来编辑,你可以选择工具,玻璃目录。在对话框的下拉清单中列出的那些玻璃目录中选择要编辑的目录名称。这个目录一旦被载入,你可以在这个目录中插入、删除、和修改数据,这些将在下面的章节中介绍。你可以保存新修改的目录,但是只能保存回具有相同名称的目录中。因此在编辑提供的目录时要十分小心;你可能会随意改变一些数据,则如果后来你使用这些目录数据,那么它们将产生不正确的光线追迹结果。 目录数据的说明 玻璃目录对话框显示了关于每种单独玻璃的大量数据。这些数据域将在下面的表格中介绍。

玻璃目录数据域

内 容 Catalog 描 述 用来指定显示哪个.AGF 格式的目录 Glass Rename 用来指定显示目录中的哪种玻璃的数据 当玻璃需要被给出一个不同的名称时,当前选择的玻璃的名称将在这个区域中被修改 每种玻璃的色散由一个公式来说明。这个控制器允许使用公式选择。如果这个设置被改变了,则色散数据变成无效,除非也输入对应的色散系数。参见“玻璃色散公式”一节 d 光或者波长为0.587 微米时的折射率。当计算折射率时,ZEMAX 将不Formula Index Nd 用这个数值。它仅作为参考。这个输入对于那些在0.587 微米波长附近区域不能很好传播光线的材料可能是没有意义的 在d 光处的阿贝常数值。当计算折射率时,ZEMAX 将不用这个数值。它仅作为参考 如果选中,则在全局优化,从模拟玻璃到实际玻璃的转换过程中将不选择这种玻璃,或者不被优化操作数RGLA 认可。 这个开关通过承认在镜头数据编辑界面中的,而不是在玻璃目录中的直接的热膨胀系数来承认非固体材料的精确的热模型,如气体和液体。但仅承认它的边缘效果;曲率半径和其它热拾取求解都将使用相邻材料的TCE,而不是用气体或者液体的TCE 对话框中间列的开头八行显示了色散系数数据。这些系数的名称根据玻璃公式的变化而变化 TCE 值是在从-30 到+70 摄氏度的温度范围内的膨胀系数。这是一个无单位量的系数。这个显示或者输入的值需要乘以1e-6 来产生真实值 以摄氏度表示的参考温度,折射率数据是根据这个温度定义的。假设这个温度是除了20 度以外的任意值,如果在高级对话框中选择了“Use T,P”,则仅仅说明说明正确温度与参考温度之间的温度变化影响 Abbe Vd Exclude Substitution Ignore Thermal Expansion K1,L1⋯,A0,A1⋯,A,B,C,等等 TCE Temp D0,D1,D2,E0,E1,Ltk 这些是热分析使用的热系数。详细内容可参见 “热分析”一章 P dPgF Min Wave,Max Wave P 是以克每立方厘米表示的材料密度 这个值是部分相对色散相对于正常线的偏离值 以微米表示的最小波长和最大波长,在这个范围内,色散公式将得到有效的折射率数据 这个数值是打算用来指出玻璃相对于BK7 的近似相对价格。例如,一个Relative Cost 值为3.5 的数指出了每磅这种玻璃的价格大约为BK7 的3.5 倍。这个数值仅仅打算用作一个大致的参考值。它的准确价格可以根据购买时玻璃的质量,数量,形式,和利用率而变化。更多的信息可与玻璃厂家联系 这是一些玻璃代码,它们指出了玻璃对于不同的环境影响的抵抗力如CR,FR,SR,AR,PR 何。这些代码对应于耐潮(CR)、耐污染(FR)、耐酸(SR)、耐碱(AR)、和耐磷酸盐(PR)。通常,这个数值越小(最好是零),这种玻璃越耐用。关于这些代码的完整说明和用来测量它们的测试条件,可与玻璃厂家联系

新目录的创建 要创建一个新的目录,先要退出ZEMAX,然后将一个目录(例如SCHOTT.AGF)复制到一个新的文件名中。然后你可以再运行ZEMAX,载入这个新目录,删去你不想要的数据,增加你想要的数据。你也可以直接编辑这个.AGF 文件,因为它是一个ASCII 码文件,但是它的格式被压缩了一些。 玻璃的色散公式 目录中的这些系数被用在任意一个ZEMAX 认可的多项式公式中。总共有九个不同的色散公式:色散的Schott 常数,Sellmeier 1,Sellmeier 2,Sellmeier 3,Sellmeier 4,Herzberger,Conrady,和光学手册公式的两种变形。有多个Sellmeier 公式的原因是由于在关于测定折射率数值的著作中的通用等式的形式有多个变形。也有一个色散公式是由六位数的MIL 数值来描述的,但是这些折射率是由在电子表格中输入的MIL 数值直接计算出来的。这个MIL 数值公式不是玻璃目录的一部分,所以它将不会出现。关于这个MIL 数值公式的说明可参见这一章中后面章节。

如果你有以下列等式之一的形式给出的折射率数据,则你可以往当前载入的目录中增加新的玻璃。在所有的等式中λ都是以微米表示的。 Schott 公式 Schott 色散常数公式是:

n2a0a12a22a34a46a58

这些必需的系数在大多数厂家的玻璃目录中都可以得到。不仅Schott 使用这个公式,其它玻璃厂家也广泛使用这个公式。 Sellmeier 1 公式 Sellmeier 1 公式是:

K32K12K22n1222

L1L2L32三项中的所有系数都可以被输入来描述材料,虽然可能仅仅使用其中的少数项。 Sellmeier 2 公式 Sellmeier 2 公式是:

B12B2n1A2

122222这个公式仅使用两项,在第二项地分子中没有波长因素,而且在公式中有一项常数项。

Sellmeier 3 公式 Sellmeier 3 公式类似于Sellmeier 1 公式,它增加一个附加项:

K32K12K22K42 n12222L1L2L3L42Sellmeier 4 公式 Sellmeier 4 公式是:

B2D2 n1A22CE2Herzberger 公式 Herzberger 表达式为:

nABLCL2D2E4F6

1

20.028这个Herzberger 公式主要用在红外光谱中。

L这些相对于红外材料的系数经常用试验方法测得,它们的结果有很大的差别;应小心使用来说明精确的折射率数值。ZEMAX 没有一个更广泛的红外目录的原因是由于这些数据的大的不定性。如果你有更好的关于给出的材料或者样本材料的数据,则一定要使用它。通常关于玻璃的某一特殊部分的熔炼号数据在系数项中是可以得到的;这个数据对于一些应用软件也可能是有用的。 Conrady 公式 Conrady 公式为:

AB3.5Conrady 公式用来应用于数据稀少的情况。例如,如果你仅有三对折射率-波长数据,应用于六项的Schott 公式将在中间波长产生没有意义的数据。 光学手册1 公式 从光学手册中可得到两个相似的公式。“手册1”公式为:

Bn2A2D2

C光学手册2 公式 “手册1”公式为:

nn0

n2ABD2 2C使用色散公式的综合说明 重要的一点是要注意到一些出版物使用了一些相似,但不同于任何一个表达式的等式。重新整理这些表达式,将它们变成你所需要的形式,然后重新计算必需的系数,这通常是可以的。

通过与从手册或者出版物中得到的折射率数据的列表相比较来检验这些系数,这也是一个好主意。也可使用色散图表或列表特性,或者色散数据报告,它们列出了每个表面的折射率数据。如果有差异,可要仔细检查你输入的数据,以及核实是否使用了正确的单位和公式。 折射率数据的配合 也可参见下面“熔炼号数据的配合”的说明通常,你在设计时要用的材料都已经在目录中了。如果没有,你可以输入系数,以供前面介绍过的公式使用。作为选择,ZEMAX 将为你计算Schott、Herzberger、Conrady、或者Sellmeier1 色散公式系数。在玻璃目录对话框显示以后,点击数据修改按钮,将显示“配合折射率数据”对话框。

在屏幕的左边是一个两列的电子表格编辑界面。使用鼠标输入你拥有的波长(以微米表示)和折射率。你输入的数据越多,配合的数据就越精确。如果你有比电子表格需要的还要多的数据,可以使用离你感兴趣的波长区域比较近的数据。如果你使用Conrady 公式,至少需要三个点才能得到一个好的配合数据,对于Schott、Herzberger、或者Sellmeier 1 公式则需要6 个点或者更多。通过从下拉列表中选择公式名称来选择要使用的公式。你可能想依次试着计算每种模式,来判断哪种模式将得到最小的差值。

RMS 误差是给出的数据和使用配合系数结果产生的折射数据之间的RMS 配合误差。最大误差是配合数值与任意一个数据点之间的最大的差值。这两个数值都可以与折射率的大小相比较,当然它们是没有单位量的。因为Sellmeier 1 公式有非线形的系数,所以它的数据配合是反复迭代的,因此这个公式将使用其它公式多得多的计算时间来配合数据。

现在将光标移到“名称”区域,然后为目录输入材料名称。选择“配合”按钮,ZEMAX 将计算最佳的系数。残留的RMS 误差和最大的单点误差将在显示界面的底部列出。为了将这个数据输入到当前载入的目录,可选择“增加到目录”按钮。ZEMAX 将出现一个信息来说明这种玻璃已被保存。

当一种玻璃被加到目录中时,如果有传播数据,则它们必须如下节中介绍的那样被添加进去。否则将在所有的波长上使用内部默认传播数值1.0折射率和波长数据也可以被保存在一个ASCII 码文件中,以供后面使用,以及通过选择适当的按钮来载入这些数据来再次配合。这个ASCII 码文件也可以在ZEMAX外部被编辑,然后被载入来配合数据。 熔炼号数据的配合 也可参见上面“折射率数据的配合”的说明重要的是要了解,由ZEMAX 计算或者在玻璃厂家的目录中列出的折射率值是许多“熔炼号”或者许多炉的玻璃的折射率的平均值。从一个熔炼号出来的某一片特定玻璃将稍微有些偏离目录值或者名义值,这个偏差是非常小的,但是名义值与实际值之间的差值对于一些系统是很重要的。

通常,优质的光学玻璃从厂家运输过来时,将附带着一张数据表,它指出了这批供应的玻璃在少数波长上的折射率,作为对名义目录值的一个补偿,或者作为直接测量的折射率值。一般代表性地提供3~5个波长-折射率数据点。这个数据被成为“熔炼号”数据,因为它是相对于在同一时间熔炼的一炉玻璃的特殊值。从玻璃目录对话框中可以得到的熔炼号数据工具是一个手动的应用程序,它可以在玻璃目录中将提供的有限的熔炼号数据转化成一种可用的新的玻璃类型。

对于熔炼号数据最多允许有8 个波长-折射率点,如果你有超过8个的点,可使用前面节中介绍的“折射率配合”工具;最少允许的点数是3 个,然而,至少应该使用4 个点,最好有5 个点来得到一个好的熔炼号配合数据。由熔炼号折射率数据定义的波长范围应尽可能得宽,至少应该覆盖预期的波长范围,以供通过熔炼号玻璃的光线追迹使用。在所有的情况中,应该在使用配合数据之前仔细检查它的正确度。

熔炼号数据工具提供了下列控制:

玻璃:在玻璃目录中选择的指定玻璃的名称。

熔炼号名称:要创建的新的玻璃的名称。其默认值为这个指定玻璃名称后面加上“_MELT”,这个名称的长度不得超过20 个字符。

公式:用在新的熔炼号玻璃中的色散公式。可以选择Schott,Herzberger,Conrady,或者Sellmeier 1。其默认公式为Schoot 公式,除非这个指定的玻璃使用这些公式中的一个,而在后一种情况下,将使用与指定玻璃用样的公式。

使用:这个选项将“打开”或者“关闭”每个数据行。 波长:被输入的对应于折射率的波长,以微米表示。

名义值:使用指定的玻璃色散公式在定义的波长上的折射率。

实际值:从熔炼号数据中得到实际测量的折射率。注意,如果实际数据被编辑了,则“delta”值将自动调整,来保持这个值不变。

Delta:实际折射率与名义折射率之间的差值。注意,如果delta被编辑了,则“实际”值将自动调整,来保持这个值不变。

配合/插入:选择这个按钮将开始如下介绍的配合过程。 取消:中断熔炼号数据配合过程。

在配合结束以后,这种新的熔炼号玻璃将被加入到这个玻璃目录中,这个目录将被保存,并且将出现一份总结配合过程的报告。 熔炼号数据配合方法的介绍 配合熔炼号数据的问题通常只用少量的数据点,典型值为3~5 个。而大多数配合程序至少需要8 个数据点来产生一个高精度的数值。因此,这个问题是从少量的数据点推断在大量的、足够的数据点上的折射率的差异,来精确配合最后的结果色散。

ZEMAX 使用下列法则来实现这个过程:

首先,实际色散数据的配合是使用Conrady 公式来计算的。使用Conrady 公式是因为当只有三点被定义时,它是稳定的、合理的。

然后,仅使用定义的波长点来计算名义数据的Conrady 配合。产生大量的覆盖指定玻璃

的整个可用波长范围的数据点(通常是60 个)。在每个指定的折射率值上加上一个补偿值,这个补偿值是仅使用熔炼号数据波长产生的两个Conrady 配合之间的差值。

最后,使用选择的公式来配合最后大量的波长数据点(不一定是Conrady 公式)。这是加入到目录中的最后配合数据。

在熔炼号数据配合后,将出现一份总结熔炼号数据的配合过程的报告。在使用新的熔炼号玻璃之前要仔细检查这份报告!ZEMAX 自动将所有从名义玻璃中得到的传播,密度,价格因素,和其它一些数据,全部复制到这个熔炼号玻璃中。

在使用新的熔炼号玻璃之前要在产生的熔炼号数据配合报告中仔细检查折射率的正确性!

传播数据的定义 选择“传播”按钮将在玻璃目录内部调用传播数据编辑界面。传播数据是指依赖于玻璃的厚度和波长的光的强度的传递系数。

ZEMAX 使用Beer 定律来模拟这个传递强度:

te

这里α是吸收系数,τ是通过玻璃的光程长度。参数α与波长有关,其单位为长度的倒数。关于偏振光线追迹和传播的信息可参见“偏振分析”一章。

传播数据是在玻璃目录中由三个数值定义的:以微米表示的波长,传递系数,和以毫米表示的参考厚度。例如,玻璃在波长为0.35微米处对于25mm 的厚度的传播数据为0.65。在传播数据编辑界面中可以定义多个数据点。ZEMAX 在内部将这个数据转化为“每毫米”,并加到两个定义波长之间。如果在定义波长之外的一个波长上执行光线追迹,则将使用最接近的波长上的传播数据;否则,ZEMAX 执行一个线形插值法。

不是所有在提供的目录中列出的玻璃都有有效的传播数据,特别是对于红外材料和其它一些非商业的玻璃类型。如果由玻璃厂家提供了传播数据,则通常包括它。如果没有可用的可靠数据,或者这个数据完全被省略,则在所有的波长上将使用默认的内部传播数据1.0气体和液体的模拟一旦在玻璃目录中定义了一种材料,ZEMAX 将使用那种材料的指定TCE 来测量使用这种材料的表面的半径,中心厚度,和其它一些数据的热膨胀。然而,如果材料不是一种固体,而是气体或者液体,那么热膨胀通常不是由这种材料的性质决定,而是由这种使用材料的边缘厚度决定的。

在这种特殊情况中,ZEMAX 需要使用在镜头数据编辑界面中提供的TCE 来定义这种使用材料的性质,而不是用在玻璃目录中提供的TCE。可以通过在玻璃目录中设置这种材料的“忽略热膨胀”开关来完成这一过程。 其它玻璃目录选项 选择“折射率分类”将按d 光(0.587 微米)折射率进行分类,“阿贝常数分类”将按d 光阿贝常数Vd 数值进行分类,“名称分类”将按玻璃名称进行分类(先按字母排列,然后按数字排列)。选项Calc Nd/Vd 将基于色散系数计算Nd 和Vd。选项Report 将提供一份选择 的玻璃的文本列表。

玻璃的快速查找 查看任意一种玻璃的数据的最快速的方法是,在镜头数据编辑界面中的目标玻璃的名称上点击一下,然后选择工具,玻璃目录(或者,如果玻璃目录已经显示出来了,则选择GLA 按钮)。这样将显示恰当的目录和玻璃。 熔炼号玻璃的使用 熔炼号玻璃是指那些由一个六位数数字描述的玻璃,如5170代表BK7。熔炼号中的前三位数字为玻璃的d 光折射率减去1,没有小数位;后三位数字为玻璃的阿贝常数乘以10。如果你愿意,你可以直接输入一个六位数数字来代表一种玻璃,而不是输入玻璃名。根据熔炼号定义的折射率和阿贝常数数字,ZEMAX 使用一个公式计算在每一种波长处的折射率。这个公式是依赖于许多典型玻璃的系数的最小二乘法配合。具有代表性的,这个计算的折射率数据大约精确到0.001。在远紫外或者远红外中的波长处,这个折射率是不可信的。对于玻璃来说,熔炼号玻璃通常是色散常数(或者其它)模型的候补替代方法,然而,如果没有可用的数据,则它们是有用的。注意,熔炼号玻璃是一个近似值,尽管它在可见光范围内通常是一个非常好的近似值。在可见光范围之外,如在紫外光或者红外光范围内,熔炼号玻璃是不准确的,不应使用。

重要的是要注意,由六位数的熔炼号计算的折射率与那些由玻璃目录计算的折射率,即使你正在使用熔炼号是与目录中的玻璃相符合的。折射率数据将由在主界面中输入的熔炼号直接计算得出的;而不是由玻璃目录数据计算得出的,即使带有那个熔炼号的玻璃在目录中。 模拟玻璃的使用 ZEMAX 可以使用在d 光(0.5875618 微米)处的折射率,阿贝常数,和一个术语来理想化一种玻璃,这个术语描述了部分相对色散到正常线的偏离值。在d 光处的折射率给出了一个符号Nd。阿贝常数(也称为V 常数)也给出了一个符号Vd,被定义为:

VdNd1

NFNC这里NF和NC分别是在0.4861327 微米和0.6562725 微米处的折射率,部分相对色散术语是

Pg,F。

根据在可见光范围内的标准玻璃的典型色散,ZEMAX 使用一个公式来估算在可见光范围内的任意一个波长处的折射率,如一个Nd和Vd 值的函数。对于典型玻璃,这个公式将精确到0.0001。值NF和NC和Pg,F在玻璃求解对话框中指定,这个对话框可从镜头数据编辑界面中得到的。

注意,模拟玻璃是一个近似值,尽管它在可见光范围内通常是一个非常好的近似值。在可见光范围之外,如在紫外光或者红外光范围内,模拟玻璃是不准确的,不应使用。 玻璃目录资源 ZEMAX 包含的玻璃目录的数据通常是由玻璃厂家提供的。例如Schott 目录中的数据是由

Schott 玻璃工艺厂家提供给FocusSoftware 的。这个数据已经被转换成ZEMAX.AGF 格式。

尽管玻璃目录中包含的数据通常是可靠的,但是在转换或者编辑这些数据时总是可能会出现一些错误。终极用户要检查所有折射率的正确度,这一点绝对是至关重要的!在考虑到光学构成情况下,这尤其是正确的。目录数据可能是错误的,在信任它之前必须检验它的正确性。

包含在目录INFRARED.AGF 中的数据是从出版的资源中汇编的,如下表所述。少量材料可能包含在下表中没有引用的目录中。在确信这些材料的正确度之前应该特别仔细检查。

红外目录数据资源

材 料 AG3ASS3 AGCL AGGAS2 AGGESE2 AL2O3 ALN ALON AMTIR1 AMTIR3 BAF2 BEO CALCITE CAF2 CAMOO4 CAWO4 CDSE CDTE CLEARTRAN CSBR CUGAS2 GAAS GEO2 GE_LONG GERMANIUM IRG2 IRG3 资 源 光学手册第11 卷 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 Amtir 规格说明书 Amtir 规格说明书 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 规格说明书(Morton) 光学手册第11 光学手册第11 Amtir 规格说明书 光学手册第11 JOSA,47,244(57):48,579(58) JOSA,47,244(57):48,579(58) Schott 规格说明书 Schott 规格说明书 IRGN6 IRG7 IRG9 IRG11 IRG15 IRG100 KRS5 LIF LINBO3 LIO3 MGF2 MGO NACL PBF2 SAPPHIRE SILICON F_SILICA SRF2 SRTIO3 TAS TE ZBLA ZBLAN ZNGEP2 ZNO ZNSE ZNS Schott 规格说明书 Schott 规格说明书 Schott 规格说明书 Schott 规格说明书 Schott 规格说明书 Schott 规格说明书 光学手册第11 卷 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 红外和光电系统手册V.III 光学手册第11 红外和光电系统手册V.III 光学手册第11 红外和光电系统手册V.III 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 红外和光电系统手册V.III 包含在目录MISC.AGF 中的数据是从出版的资源中汇编的,如下表所述。

杂项目录数据资源

材 料 ACRYLIC ADP BASF5 BASF55 BATIO3 资 源 光学手册第11 卷 光学手册第11 卷 Laikin,镜头设计 Laikin,镜头设计 光学手册第11 卷 BBO CAF2 CDS COC KDP LAF3 LIYF3 PBMOO4 PMMA POLYCARB POLYSTRY PYREX QUARTZ SAN SEAWATER SILICA SRMOO4 TEO2 TYPEA VACUUM

废弃的目录数据 光学手册第11 光学手册第11 光学手册第11 Hoechst Celanese 规格说明 光学手册第11 卷 光学手册第11 卷 光学手册第11 光学手册第11 光学手册第11 光学手册第11 光学手册第11 Laikin,镜头设计 光学手册第11 光学手册第11 Laikin,镜头设计 光学手册第11 光学手册第11 光学手册第11 Laikin,镜头设计 Laikin,镜头设计 WATER WATER Laikin,镜头设计 环境保律的改变要求许多光学玻璃的厂家停业。在各个玻璃厂家的早期目录中列出的玻璃中,3 种中大约有2 种已经停产,因此这些将不再在任意一个ZEMAX 目录中列出。然而,如果能找到一个代替品,则许多这中的玻璃将存在在光学商店中,可以实际应用在新的光学设计中。同时,许多现有的设计需要被模拟和光线追迹,特别在设计一个新的光学系统来协调现有的光学系统。由于这些原因,仍然提供了旧目录。

所有的废弃目录都给出了一个名称, 如对于Schott 是OLD_SCHO.AGF,对于Hoya 是OLD_HOYA.AGF,等等。这些目录中包含着废弃而又可用的玻璃的数据,尽管在新旧目录中有着同样名称的玻璃可能有不同的折射率,因为一些玻璃是以再用形式表示来遵守新的环境约定。因为尽管一些新的玻璃的成分可能已经变了,但是它可以有与旧玻璃相同的名称,因此光学工程技术员在检查由Focus Software 根据实际应用的玻璃的熔炼清单预报的折射率数据时要特别谨慎。

要盲目相信使用目录数据计算得到的折射率的正确性。有许多潜在错误的来源,例如原始样本的测量,数据的配合,厂家目录中的数据的输入,和后来的往ZEMAX 中的重新输入,

以及最后的ZEMAX代码本身。

第二十二章 热分析

介绍

这个特性仅对ZEMAX 的EE 版本有效环境因素如周围的温度和空气压力,能够影响光学系统的性能。这里要考虑三个主要因素。第一,玻璃的折射率依赖于温度和波长,相对于空气测量的相对折射率也随着压力的变化而变化;第二,玻璃随着温度的变化而膨胀和收缩,这将改变镜头的半径和厚度。第三,镜头元件之间的间隔会由于使用材料的热胀冷缩而改变。

ZEMAX 的热分析特性可以说明所有这些影响。通过说明这些热影响,可以用ZEMAX 在某一特殊温度或者一个温度范围内分析和优化一个设计。由色散公式给出的折射率数据通常是针对一个标准温度和压力而言的,它们分别是20 或25 摄氏度和1 个大气压。同时,折射率数据习惯上是以空气折射率为参考的,这意味着空气有一个单位的折射率。以空气为参考的折射率称为相对折射率。当折射率是以真空(它真正有一个单位的折射率)为参考时,此时的折射率称为绝对折射率。对于任何玻璃这两个参考值的差值是一个关于波长、温度和压力的函数。

温度和压力的定义 两个用户提供的数值定义了这个环境:以摄氏度表示的周围的温度和以大气压为单位测量的周围的大气压力。这两个数值将在一个对话框中设置,这个对话框可以在系统,通用对话框中的环境表格中找到。在这个对话框也有一个带着标题“使用温度,压力”的选择栏。

如果没有选中这个选择栏,则这个温度和压力数据将被忽略。忽略温度和压力数据将会加快折射率的计算速度,因此如果温度为20 摄氏度,压力为1 个大气压,则空着这一栏不选;这是默认的环境设置。这个标准的温度和压力条件被缩写成STP。如果选择了“使用温度,压力”一栏,则在折射率的计算过程中要考虑温度和压力的数值。系统默认,任一定义的温度和压力将被应用到光学系统的所有表面上。然而,也支持在统一系统中需要定义多个温度的光学系统。这对于那些有一些镜头在真空中或者在热区域中的系统是需要的;而对于其它的系统是不需要的。 折射率的计算 ZEMAX 总是使用相对折射率数据,而不用绝对折射率数据。因此,ZEMAX 需要几个步骤来计算这个折射率数据。对于每种玻璃类型在任一波长处计算折射率的一些基本步骤为:

—计算在标准温度和压力条件下玻璃的折射率。 —计算在标准温度和压力条件下空气的折射率。

—计算在标准温度和压力条件下玻璃的绝对折射率(相对于真空)。 —计算在特殊的温度条件下玻璃的绝对折射率的变化值。 —计算在特殊的温度和压力条件下空气的折射率。

—计算在特殊的温度和压力条件下玻璃相对于空气的折射率。

最后的结果是在特殊的温度和压力条件下,相对于空气在特殊的温度和压力条件下的折射率的玻璃折射率,这是ZEMAX 用来追迹光线的折射率。没有指定玻璃的表面的折射率被认

为是空气的折射率,有着单位折射率。由于在执行光线追迹时,仅与折射率的比例值有关,所以没有必要去采用绝对折射率。同时也要注意到,ZEMAX 能够通过将周围的空气压力变为零来容易地模拟在真空中使用的系统。

通常,没有必要去定义一种折射率小于单位折射率的“真空”折射率材料。然而,在一些情况下,可以手动得到一种真空折射率材料。例如,假设一个光学系统包含一个空气密封的单元,其中的空气将被排出。如果这个光学系统的其余部分不在真空中,则使用值为1 的周围大气压力,将这个被排出空气的单元的“玻璃”被指定为是“真空”(这种“真空”材料在目录MISC.AGF 中定义)。这个方法对于任意的周围温度和压力设置将产生一个恰当的结果。对于在标准温度和压力条件下的玻璃的折射率,ZEMAX 使用存储在玻璃目录中的色散公式和数值数据。详细内容可参见“玻璃目录的使用”一章。对于空气的折射率,ZEMAX 将使用下面公式:

nair1这里

(nref1)P1.0(T15)3.4785103

nref29498102255402132.81.0108 221461411T是以摄氏度表示的温度,P是相对大气压力(无单位量),以及λ是以微米为单位测量。这个空气折射率公式从F.Kohlrausch,PraktischePhysik,1998,第1 卷,第408 页中得到的。 玻璃的绝对折射率随着温度变化的变化值由下面的表达式给出:

nabsE0TE1T2n2123D0TD1TD3T 222nik这里n 是在标准温度和压力条件下的相对折射率,T是相对20 摄氏度的温度的变化值(如果温度高于20 摄氏度,则DT 是一个正数),另外的六个常数是由玻璃厂家提供来描述玻璃的热性能的。这个表示玻璃折射率变化的模型是由Schott 玻璃技术公司发展得出的。

这六个常数必须全部提供给玻璃目录,以保证计算是有效的。这六个常数的默认值全部为零,这使折射率的变化值为零;因此,如果没有热性能数据被加到目录中,则认为没有热影响,折射率恢复到在标准温度和压力条件下的折射率数值。没有提供这六个常数,ZEMAX 将不能计算任意一种玻璃的折射率的热变化。然而,如果这六个系数是无效的,还是可以使用一些近似值。详细内容可参见这一章后面的“折射率热变化数据的添加”部分。

ZEMAX 将不考虑对于梯度折射率表面,熔炼号玻璃,或者仅由折射率和阿贝常数描述的模拟玻璃的折射率的环境影响。然而,使用多重结构编辑界面来手动定义多个环境的性能的变化是有可能的。为了分析或者优化在特殊温度和压力条件下的一个完整的镜头,需要的是去定义在高级对话框中相对数据。然后,半径和厚度都被假定是在这个特殊温度下测定的,并且ZEMAX 将相应地计算折射率数据。 多个温度和压力数据的定义 当必须在多个环境下分析和优化一个镜头时,如一个宽的温度范围或者不同的海拔高度(或者两者都有),则热分析特性的真正能力才得到发挥。这些镜头系统提出了一些新的问题:

必须提供指定测定半径和厚度的正常温度的一个方法。

必须说明由于环境变化而得出的折射率,半径,和厚度的变化量。 必须考虑对使用材料的热影响。

一些表面可能是在一个温度或压力下,而另一些则表面是在不同的温度或压力下。ZEMAX 将在所有细节中考虑这些任务。建立一个多个环境镜头的基本方法是:

定义在正常温度和压力条件下的镜头。这通常是标准温度和压力条件,是镜头被虚构的环境。仅在这个温度和压力条件下指定所有的半径和厚度数据。

现在使用多重结构特性定义附加结构(参见多重结构一章)。

在附加结构中,将指定半径和厚度,以及一个被称为“热拾取求解”的特殊求解将被用来调整每个附加结构的半径和厚度数据。控制温度和压力的多重结构操作数是TEMP 和PRES。TCE 代表膨胀的热系数。当一个玻璃元件的温度改变了,则其尺寸的线形变化将由下式给出:

LL(1T)

这里L是线形尺寸,是TCE,ΔT是温度的变化量。随着材料的膨胀,曲率半径也将膨胀。因此玻璃表面的厚度和半径都将随着温度的变化而线形变化。这个线形假定仅仅是一个近似值,对于大多数材料和温度范围这不是一个相当好的数值。

TCE 系数是在玻璃目录中连同玻璃的色散数据一起定义的。关于TCE 数据的详细内容可参见“玻璃目录的使用”一章。

要考虑热影响的那些参数的定义在多重结构编辑界面中,有一个特殊的求解,称为“热拾取”。ZEMAX 根据一个新的结构相对于“参考”结构的温度和压力,利用这个拾取求解来计算一个多种结构参数的新的值。热拾取仅仅影响某些类型的多重结构数据值,如下所述。 曲率半径值(CRVT) 如果多重结构操作数是一个CRVT,那么这个结构的相应表面的曲率是根据在正常结构中的对应曲率值,两个结构之间的温度差,和对应材料的TCE 值计算得到的。

如果被求解的表面所用的玻璃的类型是在目录中说明的(如BK7或F2),则使用从目录中得到的TCE 值。如果玻璃类型为“空气”,即在玻璃栏中没有输入,则有两种可能性:如果前面使用的玻璃的类型是一种目录玻璃,则使用那种玻璃的TCE 值,否则,将忽略热效应。这些规则有一个重要的分歧:如果一个元件是一个双胶合镜头,那么对于第一个半径的TCE 值是第一种玻璃的TCE 值,而对于第二个和第三个半径的TCE 值是第二种玻璃的TCE 值。换句话说,ZEMAX 忽略了在双胶合镜头中引起的“压力”。这个假设对于一个大的温度范围可能是不准确的。 厚度值(THIC) 如果操作数为一个THIC,则有两种可能性。如果这个表面是由目录玻璃构成的,则使用这种玻璃的TCE 值;否则,使用在这个表面的TCE 栏中指定的TCE 值。TCE 栏是用来输入那

些用来装配加工的材料的用户自定义TCE 数据的。一个另外的要点是:如果这个表面不是由目录玻璃构成的,则热膨胀将沿着材料的长度进行计算,这个长度是从这个表面的边缘开始,一直延伸到下一个表面的边缘。由于材料是沿着边缘长度计算的,而不是沿着中心厚度,因此这是一个更为精确的计算。

例如,假设两个镜头被一个中心厚度空间为80mm 的铝片隔开。如果铝片的第一个表面(即第一个镜头的后表面)的矢高为-5mm,第二个表面(即第二个镜头的前表面)的矢高为8mm,则总的边缘厚度为93mm。如果铝的TCE 值为23.50E-6,则在+20 摄氏度的温度变化下,边缘厚度将从93mm 边到93.0437mm。忽略两个镜头表面的矢高的变化(实际上ZEMAX 是考虑到这个影响的,这里为了方便起见则忽略它),则铝片的中心厚度变成80.0437。注意这是一个与仅考虑中心厚度的计算不同的膨胀数量。

因为这个沿着边缘长度的膨胀说明了半径和邻近表面的变化,所以如果半径变化了,则即使一个值为0.0 的TCE 也将导致厚度的变化。为了关闭厚度的热膨胀,不要使用值为0.0 的TCE,而只要简单地把热拾取求解全部去掉就可以了。 参数值 参数值的热拾取求解的性质依赖于参数编号和表面类型。如果这个参数被认为有一个长度单位,则将使用一个恰当的缩放比例,就跟前面介绍的曲率半径一样。如果单位是长度的幂数,如长度的平方或者长度的倒数,则也将使用恰当的缩放比例。否则,热拾取将忽略热效应,简单地从正常结构中拾取对应的数值。

特殊的表面类型,如多项式非球面,二元光学,全息,和其它一些使用参数或者特殊数据的表面,必须人为地在多重结构编辑界面中增加一些操作数和热拾取求解;自动的热设置工具将不能自动地增加这些操作数。 特殊数据值 特殊数据值的热拾取求解的性质依赖于表面类型。通常,仅仅“标准化半径”需要被按比例缩放。它的便利之处是由于热膨胀只是简单地考虑长度的缩放比例这个事实。因为大多数特殊数据表面使用的是无单位量的系数,所以只有标准化半径需要被缩放。这将同样很好地有效作用于二元光学表面和多项式非球面表面。对于那些不使用标准化半径的特殊数据表面,热拾取求解将忽略热效应,只是简单地从正常结构中拾取相应的数据值。

特殊表面类型,如多项式非球面,二元光学,全息,和其它一些使用参数或者特殊数据的表面,必须人为地在多重结构编辑界面中增加一些操作数和热拾取求解;自动的热设置工具将不能自动地增加这些操作数。 其它的所有数据值 其它的所有数据值是一些直接的拾取,这些值将与在正常结构中的相应数据值一样。热效应将被忽略。

在单个结构中多个环境的定义有时需要将光学系统的不同部分放在不同的温度和压力条件下。注意,这不同于那些通过多重结构将整个系统放在不同的环境中。通过使用多重结构操作数TEMP 和PRES 可以将表面组各自的温度和压力分配给它们自己,即使只定义了1 个结构。其关键是每个TEMP 和PRES 操作数说明了在多重结构编辑界面中跟在它们后面的所有操

作数的环境。在编辑界面中列出的最后一个TEMP 和PRES操作数定义了“全局”环境,这将应用于所有没在多重结构编辑界面中列出的数据。

例如,假设一个光学系统模型要求表面1~5 在20 摄氏度的温度下,而表面6~10 在50 摄氏度的温度下。第一个列出的操作数应该是TEMP(同样的说明也应用于PRES),定义了50 摄氏度的初始环境。所有的对应于表面6~10 的曲率,厚度,半口径,玻璃,和其它数值将被列在操作数TEMP后面。然后这个列表应该以另一个TEMP操作数结束,这一个定义了20 摄氏度的“全局”温度。最后系统将在各自的温度(和/或压力)下估算各个表面。

理解两个基本规则是非常重要的:

所有跟在TEMP 和PRES 操作数后面的多重结构编辑界面操作数将在那个温度和压力下被求值

在多重结构编辑界面中列出的最后一个TEMP 和PRES 定义了所有其它在或者不在多重结构编辑界面上的数据的温度和压力

迄今为止,在建立一个复杂的多个环境的镜头过程中最重要的一个步骤是仔细检查它的设置。做这项工作的两个很好的工具是在指示报告中的折射率数据和多重结构数据表格。这个表格列出了每个玻璃类型的温度和压力,以及相应的热拾取。检查在每个参数上的热拾取求解也是一个好主意;这些数据至少应该部分被检查来检验正确的温度范围和被使用的膨胀。 自动的热设置自动建立用来热分析的镜头的便利方法是在“编辑菜单”一章中的“多重结构”下的“工具”部分。 TCE 数据的添加 这里有两类TCE 数据。对于那些使用目录中的一个名称命名的玻璃类型(如Schoot 目录中的BK7)的表面,ZEMAX 使用在这个目录中指定的TCE 数据。关于热膨胀系数值α的描述可参见“玻璃目录的使用”一章。

如果表面不使用目录玻璃,则TCE 的值是从镜头数据编辑界面中的TCE 栏中直接摘录下来。TCE 栏是电子表格的最后一行,在“参数”栏的右边。

注意TCE 是一个无单位量的参数,总是等于输入的系数乘以1E-6。因此,一个值为23.50E-6 的TCE 只要简单地输入23.5。在计算热效应时,ZEMAX 将自动将1E-6 考虑进去。 气体和液体的模拟 关于非固体材料的热效应模拟的重要信息可参见“玻璃目录的使用”一章中的“气体和液体的模拟”部分。

折射率的热效应变化量数据的添加 与温度,周围大气压力,和波长相关的折射率的变化量将通过使用前面给出的多项式表达式来模拟任意一种玻璃。这个表达式需要六个系数来定义与绝对折射率的变化有关的温度和波长。通常,对于那些由用户自己添加的材料,这六个描述变化量的系数都是不可变的。然而,大多数玻璃目录至少包含了一个折射率随着温度的变化而变化的比率的单一的线性近似值。这个数值被称为dn/dt。如果这个唯一可用的数据是一个单一的dn/dt,则这个一般表达式的近似值可以被假设为,除D0之外的所有系数都为零:

nabsn21D0T

2这里意味着给出了D0的一个合理的近似值:

D02ndn

n21dtD0需要被计算,然后输入到玻璃目录中。在标准温度和压力条件下测量的在中心波长处的相对折射率是表示折射率n 的一个适当值。随后要极度小心地检查在不同波长和温度下计算的折射率数据,以确保这是一个适当的近似值。注意,dn/dt 应该是一个绝对值,而不是一个相对值。在使用唯一的单一dn/dt 数值时,要保持极度的小心和怀疑。使用单一的dn/dt 数值来估算术语0 D 的值仅仅是一个粗略的近似方法。与温度相关的折射率的实际变化量在任意一个宽的波长或温度范围内都不可能是线性的。因此,在使用唯一的单一dn/dt 数值时,要保持极度的小心和怀疑。 无热效应镜头的优化 为了优化一个无热效应的镜头,首先要使用前面节中介绍的方法来定义多个结构,这些结构被要求来模拟在每个温度下的镜头。然后,仅在正常结构中定义用来优化的变量。例如,假设正常结构为编号1的结构,结构2,3,和4 是对每个曲率和厚度使用热拾取求解定义的。仅将正常结构中的曲率和厚度设为变量。

优化镜片组之间的空间材料的TCE 也是有可能的。为了达到这个目的,可以在镜头数据编辑界面中的TCE 栏中的数值上设置变量。 热分析的 有关ZEMAX 的热分析性能的正确度有几个。首先,在整个使用的温度范围内应该始终检查TCE 数据的正确度。也应该和使用的玻璃的厂商一起检查折射率数据系数。

热分析对于那些倾斜,偏移,或者其它非传统的光学系统不必正确地工作。在计算那些不对称的元件的边缘厚度的位移是会有些困难;例如彼此间相互倾斜的两个镜头之间的边缘厚度。为Schott玻璃而提供的热折射率和TCE数据是从Schott得到的,他们表明在从-40 到+80 摄氏度的温度范围,和在从0.435 到0.4微米的波长范围内,这些数据是正确的。在1.06 微米外的数据可能以较低的精度被推出。而对于其它玻璃提供的数据和这个范围精度是未知的。因为热效应模拟的复杂性,所以在关键应用和所有的计算中没有一个数据是可以信任的,ZEMAX 中的折射率数值和TCE 数值应该被地检验。即使在上述指定的范围内工作于Schott 玻璃时,这也是正确的。

第二十三章 偏振分析

介 绍

这个特性仅对ZEMAX 的EE 版本有效

光线追迹程序通常将光线看作是一个几何实体,仅有位置,方向,和相位。例如,在一个表面上的一条光线完全由光线的截止坐标,用来定义光线与当前光轴所夹的角度的方向余

弦,和用来测定沿着这条光线的光程长度或光程差的相位来描述。

在两种介质的分界面上,如玻璃和空气,将根据Snell 定律产生折射。通常在不影响光束方向的分界面上的效果将被忽略。这些效果包括电场的振幅和相位差,这于入射角,入射光偏振,和两种介质的性质,以及在分界面上的任何光学膜。

偏振分析是传统光线追迹的一个扩充,它考虑了光线在通过一个光学系统的传播过程中的光学膜以及反射和吸收的损失具有的效果。 有关偏振概念的复习 ZEMAX 用户手册不是有意要成为偏振理论的指南。这个题目很大,在别的地方以被很好地介绍。范例可参见由J.Bennett 在光学手册第一卷,McGraw Hill(1995)中写的评论。电场的振幅和偏振状态可以方便地用琼斯向量表示:

EyE

Ey这里Ex和Ey是被求值的复数。电场向量中的x 和y 方向正交于光线的传播向量。在两种介质的分界面上,传递系数,反射系数,和电场的相位对于电场的S 和P 分量是不同的。电场的S 分量是沿着与入射平面正交的轴的,而P 分量是位于入射平面的。入射平面包含了在截止点的光线传播向量和表面法线向量。因而,电场被分成ES和EP分量,这两个都是被求值的复数。

在分界面后面的电场是通过S 和P 的传递系数(如果表面是折射面)或者反射系数(如果表面是反射)贡献计算的。ZEMAX 计算反射系数和传递系数,但仅仅使用与光线传播相适合的一个值。简单地说,这章讨论的剩下部分将使用反射系数和传递系数术语来表示我们感兴趣的术语。如果表面是一个反射面(也就是玻璃类型为MIRROR),则程序将自动使用反射系数。因而,折射后的电场为:

ESS,EPEPP ES这里传递系数,S和P,是被求值的复数。在计算S E 和p E 投影以后,他们将被重新组合成琼斯向量,继续传播到下一表面。传递系数的计算依赖于入射介质的折射率,光学膜(如果有的话)中每层膜的折射率(可能是复数)和厚度,底层的折射率(可能是复数)。关于计算的细节在光学手册第一卷,McGraw Hill(1995)中已提到,这里将不再重复。

有许多方法可以定义感兴趣的参数来描述偏振光束。所有这些表达式都与入射角,波长,偏振方向有关。这里是在ZEMAX 中经常使用的术语和他们的定义: 反射振幅,ρ

反射振幅是电场的反射系数的被求值的复数。 传递振幅,τ

传递振幅是电场的传递系数的被求值的复数。 反射强度,R

反射强度是垂直于表面测量的。它被给出了一个符号R,而且总是一个0 和1 之间的实数。反射强度可以由反射振幅计算得到,如下:

R=ρ*ρ。

传递强度,T

传递强度是垂直于表面测量的。它被给出了一个符号T,而且总是一个0 和1 之间的实数。传递强度可以由传递振幅计算得到,如下:

T=τ*τ。

吸收强度,A

吸收强度仅仅是一种电场强度,既不是传递强度,也不是反射强度:

A=1.0-T-R。

二次衰减,D

二次衰减意味着“两个衰减”,用来比较S 偏振光与P 偏振光相比的强度损失。二次衰减定义如下:

DTSTP

TSTP相位,P

对于S 和P 偏振光,传递光束的相位通常是不同的。相位由下面公式给出:

PSarg(ES),PParg(EP)

延滞,S

延滞是S 和P 偏振光之间的相位差,或者

Sarg(ES)arg(EP)

无膜表面的性质 仅仅在垂直入射时,在绝缘介质之间的无膜表面有传递和反射振幅,他们由Fresnel 表达式表示:

nn4n1n2R12,T 2nnn1n2122在以除垂直以外的角度入射时,这个关系更加复杂。例如,在空气和BK7 之间的表面在波长为0.55 微米处有一个是入射角的函数的反射和传递振幅。

注意,反射振幅随着入射角的增加而快速增加,直到在临界入射角处,所有的光线都被反射,而没有折射。也要注意,S 和P 偏振状态有着不同的传递振幅。这导致了一个由光阑照度分布决定的偏振。 在ZEMAX 中薄膜的定义 对于绝缘介质,折射率纯粹是一个实数,因此它的虚部为零。对于金属材料,折射率是一个复数。在折射率虚部的普通使用中有两种符号约定,ZEMAX 使用下面的约定:

nik

这里n 是通常的折射率,k 是消光系数。通常使用的另一种符号约定是nik,但ZEMAX 使用那种正的形式。因此,材料,如铝,有一个带着典型的负的k 值的复数折射率。对于铝,折射率由下式近似给出:

0.77.0i 注意,对于典型的吸收材料使用这个约定,这个消光系数是一个负数。

ZEMAX 使用一个ASCII 码文件格式来定义所有的薄膜数据。在这个文件中提供了两种类型的数据:单一材料的名称和折射率,以及由定义的材料组成的单一薄膜的名称和结构。这个文件可以是一个任何有效的文件名。ZEMAX 提供了一个被称为COATING.DAT 的样本文件,对于任意的新镜头COATING.DAT是一个默认的薄膜文件名。可以定义多个薄膜文件,并且由特定镜头文件使用的薄膜文件的名称是在系统,通用,偏振表格对话框中定义。

ZEMAX 强烈建议COATING.DAT 的任意修改要保存在一个有着不同文件名的文件中, 以至于后面对ZEMAX 的更新不会覆盖对COATING.DAT 作出的改变。

ZEMAX 强烈建议COATING.DAT 的任意修改要保存在一个有着不同文件名的文件中在薄膜文件中,关键字MATE(对于材料)、TAPR(对于锥形轮廓)、和COAT(对于薄膜),被用来定义不同类型的薄膜数据。先得出所有的材料和锥形定义,然后得出所有的薄膜定义。 这个文件包括了下列格式: MATE <材料名称> 波长的实部,虚部 波长的实部,虚部 ⋯⋯

MATE <下一个材料名> 波长 实部 虚部 波长 实部 虚部 ⋯⋯

TAPR <锥形名称> DX x偏心 DY y偏心

RT 术语编号 半径术语 ⋯⋯

TAPR <下一个锥形名称> DX x偏心 DY y偏心

RT 术语编号 半径术语 ⋯⋯

COAT <薄膜名称>

材料 厚度 用绝对值 循环索引 锥形名称 材料 厚度 用绝对值 循环索引 锥形名称 ⋯⋯

COAT <下一个薄膜名称>

材料 厚度 用绝对值 循环索引 锥形名称 材料 厚度 用绝对值 折射索引 锥形名称 ⋯⋯

如果这个“用绝对值”,“循环索引”,和“锥形名称”是被省略,则“用绝对值”和“循环索引”两个都被假定为零,而且认为没有锥形轮廓。 MATE 数据部分 材料名称可以是长度不超过20个字符的任意的用户自定义名称,不允许有空格和特殊符号。

ZEMAX 以下面的方法使用材料数据:

波长自变量总是以微米表示的。波长必须按上升顺序被指定。 实部的值是该材料在相应波长处的实际折射率。 虚部的值是消光系数。

如果对于一种材料只提供了一种波长,则无论哪种波长被追迹,都要使用这个实部 和虚部。因此薄膜材料的色散被忽略。

如果对于一种材料定义了两种或者更多的波长,则对于比最短的定义波长还要短的波长,要使用最短波长的数据。对于比最长的定义波长还要长的波长,要使用最长波长的数据。对于在两者之间的波长,使用线性插值法。 TAPR 数据部分 通常,ZEMAX 假定,在整个光学表面上薄膜厚度是一致的。然而,由于一些光学薄膜的应用方法不同,一个薄膜可能不定的厚度,这通常是半径对称的。锥形薄膜是通过应用一个锥形函数来定义的,这个函数是将一个无单位量的系数乘以名义薄膜厚度计算得到的。任一薄膜的任一层都可以应用一个锥形,而且每一膜层都可以有不同的锥形。 有效的薄膜厚度为:

deffdf

这里d 是名义薄膜厚度,f是锥形因子。锥形因子定义如下:

firi

i020这里r是偏移的半径坐标,定义如下:

r(xxd)2(yyd)2

如果锥形因子等于一个负数,ZEMAX 假定它为零。参数dx,dy,和i都已在薄膜文件的锥形

数据部分中定义了。注意,半径坐标的奇次方、偶次方和零次方全都被使用。通常这个系数都有与镜头单位有关的单位和大小。在定义或使用锥形薄膜时,应该仔细检查是否使用了正确的镜头单位。

定义或使用锥形薄膜时,应该仔细检查是否使用了正确的镜头单位。锥形名称可以是长度不超过20个字符的任意的用户自定义名称,不允许有空格或特殊符号。 ZEMAX 将以下列方式使用锥形数据:

如果跟在关键字TAPR 后面的任意一行中的第一个关键字是DX或者DY,那么在同一行中关键字DX 或者DY 后面的数据值分别被认为是以镜头单位表示的x 和y 的偏移。

如果第一个关键字是RT,则第二个数据值必须是0 和20 之间的整数,包括这两个数。这个整数决定了术语编号,或者半径的幂。第三个数据值是在半径幂数上的系数。除非已被定义,否则ZEMAX 使用的任意一个术语都被认为是零。 薄膜数据部分 膜层的顺序是很重要的!可参见下节中的说明。

薄膜名称可以是长度不超过20个字符的任意的用户自定义名称,不允许有空格或特殊字符。

ZEMAX 以下列方式使用薄膜数据:

如果薄膜文件先被读入,则ZEMAX 将检验是否每种薄膜都是由在材料部分中定义的材料组成。如果应用的材料没被定义,则将产生一个错误。

薄膜厚度不仅可以以主波长在介质中的厚度的单位测量(相对定义),也可以以与任何波长无关的微米测量(绝对定义)。如果使用相对定义,则由两个不同的镜头文件以两种不同的主波长使用的同样的薄膜将有不同的实际厚度。薄膜的实际厚度由下式测量:

d0n0T

这里0是以微米表示的主波长,n0薄膜在主波长上的折射率的实部,T 是在薄膜文件中指定的薄膜的“光学厚度”。例如,在一个折射率实部为1.4 的薄膜材料中,一个在一个值为0.550 微米的主波长上的1/4 波长薄膜(T=0.25)的厚度为0.0982 微米。注意,仅仅使用折射率的实部被使用来测定膜层的厚度。

如果整数“用绝对值”是零(或者被省略),则这个厚度将被认为是一个相对值;否则,薄膜厚度是以微米表示的绝对值。“循环索引”决定了ZEMAX 是如何复制膜层组的。详细内容可参见下节。 重复的膜层组的定义 一些薄膜包含了重复的膜层组,例如,一个膜层被定义如下: COAT 3GROUPS MAT0 0.25 0 0 MAT1 0.25 0 0 MAT2 0.50 0 0

MAT3 0.25 0 0 MAT1 0.25 0 0 MAT2 0.50 0 0 MAT3 0.25 0 0 MAT1 0.25 0 0 MAT2 0.50 0 0 MAT3 0.25 0 0 MAT4 0.25 0 0

注意,材料MAT1,MAT2,和MAT3 的序列被重复了三次。这是一个完全可以接受的语法结构,然而,这需要用11 个文本行和11个膜层来定义这个薄膜。通过使用参数“循环索引”可以使用一个简写的语法结构。整数参数“循环索引”被设为是一组膜层将被重复的次数。在第一个膜层和最后一个膜层上都必须设置“循环索引”(这是为了说明膜层的范围,ZEMAX 在两个方向也都将读取数据,如下所述)。上述的薄膜可以被写成下面的形式: COAT 1GROUP MAT0 0.25 0 0 MAT1 0.25 0 3 MAT2 0.50 0 0 MAT3 0.25 0 3 MAT4 0.25 0 0

注意在列出的第一和第三膜层中出现了参数“3”。这种语法结构不但可以节省输入,它也可以减少不小心的输入错误,减轻编辑负担,而且还可以保持了膜层的总数;这对于每种薄膜定义都是有限的(可参见下节关于薄膜数据的说明)。虽然上述的薄膜实际上模拟了11 个膜层,但是它仅定义5 个“膜层”。

关于“循环索引”的使用,有一些要点:

关于可以定义的不同的膜层组的数量,或者每组包含多少膜层,是没有的,只要在COAT 标题下的行数不超过在下面定义的最大的允许膜层的数量就可以了。

一个值为0 的“循环索引”与一个值为“循环索引”是一样的;那是因为,零并不意味着不包含一组膜层。

循环不可以嵌套,也不可以重叠。 关于薄膜数据的总数的 在目录中有一个空间,可以容纳50 种材料,每种材料可以有100个波长-折射率点,50 种薄膜种类,每种薄膜可以有不超过200 个膜层。

有少量一些访问薄膜文件数据的方法。第一,可以在ZEMAX 外部通过使用任何ASCII 码文本编辑器来编辑薄膜文件。第二,在主菜单栏上的“工具”菜单下的“编辑薄膜文件”选项,它可以调用Windows的NOTEPAD 编辑器。而且,在“工具”菜单下的还有一个“薄膜列表”选项,它列出了薄膜和材料的定义数据。如果要编辑这个薄膜文件,则要重新载入这个文件,以便于可以修改新的薄膜数据;在工具菜单下有一个菜单选项,可以用来重新载入这个目录。

ZEMAX 提供的默认材料和薄膜 ZEMAX提供的默认COATING.DAT 文件包含了几种材料和少量普通的光学薄膜。下表介绍了一些包含在默认文件中的材料和薄膜。

默认的材料和薄膜

材 料 AIR AL2O3 ALUM ALUM2 CEF3 LA2O3 MGF2 N15 THF4 ZNS ZRO2 薄 膜 AR GAP HEAR1 HEAR2 METAL NULL WAR

这些材料和薄膜是有意用来作为一个范例,可能不会在任意特定的情形中都是可用的。薄膜厂家和设计者总要检查特殊薄膜材料的详细信息。关于如何定义这些材料和薄膜的详细信息,可以使用在“报告菜单”一章中介绍的薄膜列表报告。 表面上薄膜的指定 一旦定义了一种薄膜,则可以通过在薄膜栏中指定这种薄膜的名称来将它应用在一个表面上;薄膜栏位于镜头数据编辑界面的最右边。ZEMAX 将使用下面四个规则之一来说明薄膜的定义:

如果指定的表面是从空气到玻璃的分界面,则膜层像在薄膜文件中指定的那样可以被严格说明。入射介质是空气,因此,最外层被列在薄膜定义的第一行(在顶部),然后是下一层,等等,基层是表面的玻璃类型。薄膜的定义不包括基层索引和材料定义。这里的玻璃术

氧化铝,折射率1.59 铝,折射率0.7-7.0i 铝的另一个定义 氟化铈,折射率1.63 氧化镧,折射率1.95 氟化镁,折射率1.38 折射率为1.5 的虚构材料 氟化钍,折射率1.52 硫化锌,折射率2.35 氧化锆,折射率2.1 说 明 普通的减反膜,定义为MGF2 的1/4 波长 用来显示短暂传播的一个小的空气间隙 高性能的减反膜 高性能的减反膜 用来分光的薄的铝层 主要用来调试的厚度为零的薄膜 减反膜“W”,定义为一个LA2O3 的半波长,后面再加上MGF2 的1/4 波长 说 明 单位折射率,用来表示薄膜中包含的空气间隙 语意味着玻璃类型不是“MIRROR”,也不是空格(这被认为是表示空气的单位折射率)。梯度折射率镜头是被认可的玻璃。

如果指定的表面是空气和空气,或者玻璃和玻璃之间的分界面,薄膜也像从空气到玻璃那样被严格定义,使用与针对入射和基层介质所做的相似的计算。

如果指定的表面是从玻璃到空气的分界面,则膜层的顺序将自动翻转,因此这个薄膜与它在从空气到玻璃的情况中应用的薄膜是相同的。因此,如果分界面是从空气到玻璃的,则由ALHHS 定义的薄膜应该被解释成SHHLA。

如果表面类型是一个反射镜,则薄膜定义必须包括基层索引。然后薄膜定义中的最后一层被假定为是一个半无穷厚的基层材料。

ZEMAX 也可以模拟某些情况,如被阻止的TIR;可参见这一章后面的说明。 如果没有定义薄膜,ZEMAX 应做什么如果薄膜栏中是空的,则应采取下列措施: 如果这个表面是一个反射镜,则假定这个表面镀了一层折射率为0.7-7.0i 的一层厚的铝层。这个铝层是足够厚的,以致于没有任何光线可以通过这个铝层。

如果这个表面是绝缘界面,则采取裸露的、没镀膜的表面。 理想化的薄膜的定义 有些时候我们不知道准确的薄膜定义,或者不需要薄膜性质的详细模型。对于这些情况,可以使用一个简单化的理想薄膜。不用输入这种薄膜的名称,而是输入字母“I”,后面跟着一个小数点和薄膜的传播小数。例如,传播98.5%光的薄膜被称为“I.985”。这种薄膜名称不需要在薄膜文件中定义,但是,如果这个名称出现在可用薄膜的下拉列表中,则它应该在薄膜文件中列出。

ZEMAX 简单地设定传递强度T=0.985(或者无论这个值是多少),则反射部分是R=1-T,以及传递振幅为t=sqrt(T),反射振幅为r=sqrt(R)。 入射偏振的定义 一些个别的分析设置,如那些偏振光线追迹(参见分析菜单一章),考虑了入射偏振的描述。这个偏振完全是由琼斯向量定义的:

ExE

Ey这里Ex和Ey都有一个数量和一个相位。ZEMAX 将指定的Ex和Ey的值规范化成有一个单位数量,如果指定了任意的光瞳照度则应适当缩放这个强度。注意,Ex和Ey的值都是在相对电场振幅的条件下测定的。由于Ez(在当前光轴上)始终为零,所以在光线的当前坐标系中Ex和

Ey的值描述了这个电场。然后,电场从当前的Ex和Ey描述转化成空间的Ex和Ey、Ez描述。 由于一般来说光线不可能平行于物空间光轴,所以空间Ez不一定为零。这个转化是通过选择琼斯向量分量Ex来说明沿着向量S 方向的电场,这个方向没有空间Y分量。琼斯向量分量Ey说

明了沿着向量P方向的电场,这个方向垂直于S 方向,没有空间X 分量。向量P和S被定义成

SPR,这里R 是光线向量。然后由当前的Ex和Ey在S和P方向上的投影计算得出空间Ex和

Ey、Ez。这个计算的详细步骤将由ZEMAX 自动操作,不需要另外的输入。由于偏振向量必须平行于光线方向,所以对于有限的物距来说,有着不同光瞳坐标的光线的偏振向量是不平行的。

偏振分量的定义 在两种介质之间的任意分界面可以使一束光线产生偏振。ZEMAX支持一个理想化的模型来代表一个普通的偏振装置。这个模型被当作一个特殊的“琼斯矩阵”表面类型来执行。这个琼斯矩阵根据

ABExExEE yCDy来更改一个琼斯向量(它描述了电场),这里A,B,C,D,Ex和Ey都是复数。在镜头数据编辑界面中,ZEMAX 提供一些单元来定义A的实部,A的虚部,等等。注意,电场的Z分量不受琼斯矩阵表面影响。这个普通的琼斯矩阵可以用来定义种类繁多的偏振组成。例如,参见在下表中的琼斯矩阵范例。数字格式是(a,b),这里a是实部值,b是虚部值。

琼斯矩阵范例

偏振组成 空矩阵 矩 阵 (0,0)(1,0) (1,0)(0,0)(0,0)(0,0) (1,0)(0,0)(0,0)(1,0) (0,0)(0,0)(0,0)(1,0) (0,1)(0,0)(0,0)(0,1) (1,0)(0,0)(-1,0)(0,0) (0,0)(1,0)(1,0)(0,0) (0,0)(-1,0)X 分析 Y 分析 在X 方向上的1/4 波面 在Y 方向上的1/4 波面 在X 方向上的半波面 在Y 方向上的半波面 光强过滤器,25%传播

(0.5,0)(0,0) (0,0)(0.5,0)ZEMAX 可以使用偏振分析来计算什么ZEMAX 可以产生R,T,A,D,P,和S 的图形,作为波长对于给定的入射角的函数,或者作为角度对于给定的波长的函数,详细内容可参见“分析”一章。通过使用“偏振光线追迹”特性,ZEMAX可以计算和列出详细的计算过程,用来追迹任一给定光线通过系统的偏振状态。另外一些特性计算了于偏振有关的结果;详细内容可参见“分析菜单”一章。 总体的吸收和传播系数 ZEMAX 也可以准确地计算单一光线地传播,或者整个光瞳地一个平均值。传播系数计算是基于表面影响的,如反射损失,而通过玻璃的总体传播系数的计算是根据Beer定律:

te

这里,α是吸收系数,τ是通过玻璃的长度。参数α通常与波长有关,有一个长度倒数的单位。关于传递数据的定义的详细内容可参见“玻璃目录的使用”一章。在所有的ZEMAX 计算中都不考虑偏振效果。 双折射材料的模拟 双折射材料是使用在“表面类型”一章中介绍的双折射输入/输出表面类型来模拟的。关于具体例子的重要细节和信息可参见那一章。

当光线通过双折射介质时,对于S 和P 偏振光,玻璃的折射率是不同的。寻常光折射率是在垂直面或者S 偏振光上得到的折射率,而非常光折射率则是在平行面或者P 偏振光上得到的折射率。

ZEMAX 允许选择追迹寻常光线或者非常光线。ZEMAX 一次只能追迹这两种光线中的一种或者另一种。注意,S 和P 偏振光线的方向通常与在薄膜和菲涅耳表面效果的计算中使用的是不一样的。这里的S 和P 指的是相对于晶体的光轴的垂直面和平行面。包含折射光线和晶体光轴的矢量的平面是平行面,而P 矢量位于这个平面内,并垂直于光线矢量;S 矢量是P 矢 量和光线矢量的正交矢量。

对于双折射材料的偏振分析,需要采用一些假设。ZEMAX 假设,如果追迹寻常光线,那么S 分量是重要的,而P 分量的传递系数被设为零;对于非常光线,ZEMAX 假设P 分量是需要的,因此S 分量的传递系数被设为零。

这个方法是很简单的,它对于每个可能光路都将产生正确的传递系数结果。如果在系统中有2 对双折射表面,则需要4 个光线轨迹;如果有3 对双折射表面,则需要8 个光线轨迹,等等。 受抑全反射的模拟 当一条通过玻璃的光线以一个大于临界角的角度射到一个分界面上,将产生受抑全反射(FTIR)。如果紧密放置另一个绝缘体介质,如另一片玻璃,而不接触那个分界面,则一些光线将通过这个薄的空气间隙,而传播出去,即使在这个分界面上的折射不能满足Snell定律。

反射光束和传递光束都将受到空气间隙的厚度的影响。在间隙厚度为零的内,光线将继续传播,就好象没有分界面一样;而在一个远大于波长的一个分数的大间隙厚度的内,那么事实上所有的光线将被全部反射。

虽然这发生在一个特殊的情况中,但是这个普通的模型作为另一个薄膜问题归入到ZEMAX 手动FTIR 的偏振程序中。其诀窍是定义一个反应这种情形的薄膜。一个默认的这种薄膜是厚度为有着单位折射率的空气的0.1 波长的GAP。使用Y 正切值为1.0 的倾斜表面,将薄膜GAP 放在这个分界面上来产生能正确模拟偏振性质的系统。

注意,不能像这一章前面所介绍的那样,通过编辑薄膜文件来改变空气间隙的厚度。在薄膜GAP 被放入以后,ZEMAX 现在可以计算反射光和传递光的偏振性质。然而,用作其它目的(如系统传播系数的计算,光线特性曲线,优化)的光线追迹将仅仅沿着传播光路进行。为了模拟反射光路,只要简单地给这个内倾斜表面一个MIRROR 的表面类型,加上一个90度的光轴断点,以及照常改变后面的厚度的符号。现在在这种情况中的薄膜需要被修改来表明第二个绝缘体块的存在,即使在传播光路中不执行光线追迹,而只在反射光路中执行光线追迹。 在薄膜文件需要定义一个新的薄膜(在这个例子中被称为FTIR),它看起来像: COAT FTIR AIR .1 N15 1

当这个薄膜被应用一个反射镜面上时,将把这个反射镜面作为一个后跟玻璃片的空气间隙。注意,基层玻璃的折射率和色散通过在薄膜文件定义一种玻璃来详细模拟当然是可能的;这里N15 被用来作为简单说明。这个用来定义基层玻璃的最后一种材料,N15的厚度是没有用的,因为当应用到反射镜面上时,ZEMAX 总是假设基层是半无穷的。最后的镜头和反射图显示如下。对于每个系统模型,其反射图和传递图都是一样的。图形可参见使用手册第357页。

最后注意,也可以通过简单地增加这个间隙厚度来模拟常规的TIR。大于波长的一个分数很多的距离本质上等价于一个无穷大的间隙。然而,由于“下溢”数值误差的缘故,这种情况产生的原因是由于传播系数是非常低的,因此对于易消失的光波传播来说,在薄膜文件不应该定义一个非常大的厚度。一个波长,或者一个为1.0 的光学厚度通常是足够了的。 偏振分析的 对于ZEMAX 偏振分析性能有一些。无论何时作出制作决定,都要仔细检查薄膜文件中的数据的正确性。同时,应该将由ZEMAX产生的折射率和传播率的曲线图送到薄膜厂家那里,作为一个检查来确保这种薄膜将像要求的那样运作。

对于某些表面类型,如近轴表面、衍射光栅、二元光学表面、或者菲涅耳表面,偏振光线追迹法则通常不能得到正确的结果。一般,只有那些有由Snell 定律说明的折射光或者反射光的表面才有有效的被计算的偏振数据。特别地,偏振法则假定光线保持在折射或者反射后的影响平面内。这对于常规的折射光学系统是正确的(这是Snell定律的一个条件),但对于衍射光学系统和“假象”表面,如近轴镜头,这通常是不正确的。

虽然梯度折射率表面的影响(反射和传播系数)也被说明,但不考虑通过梯度折射率介质的传播的偏振影响。因为光线在通过梯度折射率介质时经过了一条弯曲的光路,所以偏振

矢量将以一个ZEMAX不能计算的方式旋转。图形可参见使用手册第358页

第二十四章 ZEMAX 程序设计语言

介 绍

这个功能只有ZEMAX 的XE 和EE 版本才有

在ZEMAX 的应用中ZEMAX 程序设计语言(ZPL)为了方便使用宏语言而特意设计的语言。ZPL 提供了用户自行扩展的功能。这意味着如果你一种特别的计算或图解显示,而这些功能在ZEMAX 中是没有的,那你就可以自行编写ZPL 程序来做这些工作。ZPL 程序能被储存在磁盘里并能从ZEMAX 内部被调用。 你可以建立一个ZEMAX 程序库,并且可以和其他ZEMAX 用户一起共享。

ZPL 类似与BASIC 程序设计语言,除了不是所有的BASIC 结构和关键字都被支持,以及加了一些新性能和独特的功能来进行光线追迹以外。如果你熟悉BASIC 语言,你将很快地学会ZPL。如果你不懂BASIC 语言,或者你以前根本不懂程序设计,请不要惊慌。ZPL是容易使用的,这一章将给你一些简单的用法说明和例子,让你从头开始学习。 创建ZPL 程序 如果一个已存在的程序所能实现的任务与你想要完成的任务相似,那么在这个程序的基础上创建一个新程序去实现这个功能可能是容易的。如果你正尝试着写你的第一个ZPL 程序,你可能会想去看一下这一章末尾的例子一节。在 \\MACROS 目录下也能找到一些ZPL 宏指令的例子,它们在“ZEMAX 例子文件”一章中被介绍。

应用任何ASCII 码文本编辑器(如NOTEPAD 编辑器)去创建ZPL 文件。只要你希望,你可以给文件起任何描述性文件名,但文件必须以 .ZPL 扩展名结尾。 运行ZPL 程序 为了运行你的 ZPL 程序,从主菜单选择宏,编辑/运行 ZPL 宏,一个ZPL 控制对话框将会出现,对话框里有着以下选项:

现有文件:一个可用的宏的下拉式列表。所有列出的宏都是以扩展名 .ZPL 结尾的ASCII 码文件。文件必须在为ZPL 宏而设置的目录下,参见“文件菜单”一章中关于参数选择对话框中目录表的部分。

执行后关闭:如果这一项被选中,那么在执行宏指令后ZPL 控制对话框将自动关闭。 安静模式:如果这一项被选中,默认的文本输出窗口将不再显示。这对于那些不产生有用文本的图表宏指令是十分有用的。

状态:再执行宏指令的过程中,ZEMAX 在这个区域显示状态信息,这个状态信息是用来说明正在执行的宏指令的“行”号。这个状态信息每四分之一秒更新一次。

终止:终止按扭将使目前正在运行的宏指令停止运行。

取消:如果一个宏指令正在运行,取消按扭将终止当前宏指令,如果没有宏指令在运行,取消按扭将关闭ZPL 控制对话框。

编辑:编辑按扭将调用Windows NOTEPAD 编辑器。这个编辑器可以用来修改宏指令和对宏指令进行改名。

查看:查看按扭将在一个文本窗口中显示宏指令文件的内容,在这里它可以上下滚动和打印出来。在查看窗口中不允许编辑。从“现有文件”中选择要运行的宏指令,然后点击执行。ZEMAX 将开始运行程序。任何从PRINT 语句中输出的文本或错误信息将被放置在一个文本文件中。当宏指令终止执行以后,这个文本文件将在一个窗口显示出来。可以用CLOSEWINDOW 关键字来抑制这个输出窗口的显示。 ZPL 概述 ZPL 程序包括一系列命令(称为语句),它们被储存在ASCII码文本文件中。你可以用ZEMAX 外的任何文本编辑器来创建ZPL程序(你也可以编辑ZEMAX 内部的程序,这将在后面部分进行说明)。对于大多数(但不是全部)命令,ZPL语言使用与BASIC相似的语法结构。例如,语句 x=5

是一种有效的ZPL 语句。在这一简单的语句中要注意一些重要的东西。首先,变量不需要被说明。这意味着被称为变量的“x”在被赋予5这个值之前不需要已经存在。如果“x”已经被赋值,那么它现在将被重新赋值。因此变量在使用之前不需要被说明。第二,不需要特殊符号来终止一个语句,例如在C 语言中的“;”。因此,每个ZPL语句都必须自成一行。ZPL支持行函数调用。下列形式的语句是允许使用的: x= SQRT(5) y= SINE(x)

z= SQRT(x+5*(7-x))

函数SQRT(平方根)和SINE(正弦)在ZPL 中已被建立。有许多这样的单操作数函数,所有这些在后面部分详细说明。注意ZPL 是不分大小写的,SQRT( )和sqrt( )是一样的。ZPL 文档将使用一般惯例,函数和关键字用大写字母,其他的用小写字母。前面出现的所有语句都有一个共同的特点:它们都是赋值语句。这意味着等号右边的表达式将被求值,结果被赋予等号左边的指定变量。在ZPL 中还有一种语句,称为关键字。

关键字的一个例子是PRINT。关键字PRINT 后面跟着一列术语,它们有逗号隔开,这些都将被打印出来。例如,ZPL语句 x = 3 y = 4

z = SQRT(x*x+y*y)

PRINT “The hypotenuse is”, z 在屏幕上将打印出下列内容:

The hypotenuse is 5.0000

注意ZPL 强制使运算符优先。在任何一对括号里,运算操作按着特殊的顺序执行。ZPL 使用下列由高到低的优先级:函数(如SQRT),逻辑运算(如==),乘法和除法,然后是加法和减法。圆括号总是不考虑优先级,在这个意义上,它有着最高的优先级。

有许多其他的关键字将在后面部分被介绍。 ZPL 变量 变量为数值量提供了临时性的储存单元,当编写程序时这些数值量的精度是不知道的,但当运行程序时精度将被规定。当你需要一个新的变量时,ZEMAX 将为你完成大部分的工作。例如,前面出现的简单语句 x = 5

使ZEMAX 给这新变量分配储存单元,并记录下与它有关的值。变量一旦被定义,它就可以使用在后面任何一个表达式中。然而,关于ZPL 变量的使用也有一些规则。

首先,变量名不能包含任何ZPL 用来逻辑运算和分界的“特殊”符号,如(, ), =, +, -, *, /, !, >, <, ^, &, |, #, “, 和空格号。

第二,一个变量不能与关键字和函数同名,例如THIC 和RAYX,由于ZEMAX 是不分大小写的,所以你也不能通过用rayX 和Thic 来避开这一条规则。

第三,任何一个变量名都必须少于28 个字母。违反了这些规则,虽然程序运行看起来没有错误,但都将产生语法错误,根本不能得到你想要的结果。ZPL 中的变量数最多不得超过200 个。任何ZPL 变量都是以 位双精度数据形式储存。 ZPL 函数 ZPL 函数是可以用在赋值语句的右边,在形式上它与关键字是不一样的。函数可以不要自变量,也可以有一个自变量或多个自变量。

所有的函数都将返回一个值。例如一个函数,如PWAV( ) (主波长),将返回一个不依靠自变量的值,因此它不需要自变量。但无任如何,圆括号仍然需要。

许多函数都有相对应的关键字。例如,函数RADI( )将返回与自变量相对应的表面的曲率半径(RADI(3)返回第三表面的曲率半径)。同样也有一个关键字RADI 设定表面的曲率半径。详细信息参见关键字的说明。

所有的函数都在下面的表格中列出。如果给出一个函数形如FUNC( ),那么表明它不需要自变量,FUNC(x)则表明它需要一个自变量,FUNC(x,y)表明它需要两个自变量,等等。

ZPL 函数表

函 数 ABSO(X) ACOS(X) APMN(X) 自 变 量 数字表达式 数字表达式 表面编号 返 回 值 表达式的绝对值 反余弦值(弧度表示) 最小半口径值。对于星形通光孔径是指臂宽;对于长方形和椭圆通光孔径是指口径的X 方向半宽度 最大半口径值。对于星形通光孔径是指臂数;对APMX(X) APXD(X) APYD(X) APTP(X) ASIN(X) 表面编号 表面编号 表面编号 表面编号 数字表达式 于长方形和椭圆通光孔径是指口径的Y 方向半宽度 孔径的X 方向的偏心值 孔径的Y 方向的偏心值 描述指定表面口径类型的整数代码 反正弦值(弧度表示) ASPR() ATAN(X) ATYP() AVAL() CONF() CONI(X) COSI(X) CURV(X) EDGE(X) EOFF() ETIM() EXPE(X) EXPT(X) FICL(vec#) FLDX(X) FLDY(X) FTYP() FVCX ( X ) FVCY(X) FVDX(X) FVCY(X) FWGT(X) GABB(X) GETT(window, line,column) GIND(X) GLCA(X) GLCB(X) 无 数字表达式 无 无 无 表面编号 数值表达式(弧度表示) 表面编号 表面编号 无 无 数值表达式 数值表达式 间,包括1 和4 视场编号 视场编号 无 当前绘图设备的尺寸比例 反正切值(弧度表示) 系统光圈类型代码:0 指EPD,1指F/#,2 指NA,3 指随光栏尺寸移动 系统光圈值 返回当前的结构编号,在1 和最大结构数之间,包括这两个数 表面的圆锥系数 表达式的余弦值 表面的曲率 表面在指定半口径时的边缘厚度 文件结束标记。如果已到文件末尾则返回1,否则返回0。仅在执行关键字READ 后函数才有效 从最后一个TIMER 开始所经过的时间(以秒表示) 以e 为底数的指数值 以10 为底数的指数值 的内容 指定视场的X 方向的角度或高度 指定视场的Y 方向的角度或高度 如果视场类型是以度数表示的角度则为0,是物高则为1,是理想像高则为2,是实际像高则为3,高度以镜头单位为单位(见UNIT) Vector #,在1和4 之光纤耦合效率。参见下面关于FICL函数使用方法视场编号 视场编号 视场编号 表面编号 要记录的窗口数、行数、列数的数值 表面编号 表面编号 表面编号 指定视场的X 方向和Y 方向的压缩渐晕因子 指定视场的X 方向和Y 方向的偏心渐晕因子 指定视场的权重 玻璃库里指定表面对应的玻璃的阿贝常数 从任何一个打开的文本窗口中记录数值。这功能允许我们利用ZEMAX在窗口中显示的任意值进行计算 玻璃库里指定表面对应的玻璃的d光折射率 指定表面球面顶点的X 矢量 指定表面球面顶点的Y 矢量 GLCC(X) GLCX(X) GLCY(X) GLCZ(X) 表面编号 表面编号 表面编号 表面编号 指定表面球面顶点的Z 矢量 指定表面球面顶点的X 坐标 指定表面球面顶点的Y 坐标 指定表面球面顶点的Z 坐标 如果字符串A$是一种有效玻璃名,如BK7,那么返回这种玻璃在玻璃库中的编号。关键字GLAS 可以GNUM(A$) 字符串变量名 用玻璃编号来设定表面的玻璃类型。如果A$不是玻璃库中的玻璃名,返回0。如果字符串是“MIRROR”,返回 –1 玻璃库里指定表面对应的玻璃的相对部分色散系数 率。对于梯度和非梯度介质都有效 主波长的折射率 返回小于自变量的最大整数 表达式的自然对数值 表达式的常用对数值 X 平方和Y 平方之和的平方根 以度数表示的最大半视场角,或着以镜头单位表示的半物高或半像高。如果视场是由角度、像高或物高定义的,那么返回值不依赖于自变量 当前使用的玻璃的数量 返回当前的评价函数值 返回结构个数 GPAR(X) GRIN(s,w,x,y,z) INDX(X) INTE(X) LOGE(X) LOGT(X) MAGN(x,y) MAXF() MAXG() MFCN() NCON() NPAR(surf, object,param) 表面编号 表面#,波长#,x,y 和返回编号为w 的波长在s 表面的指定位置的折射z 轴坐标 表面编号 数值表达式 正的数值表达式 正的数值表达式 X 和y 是实数 无 无 无 无 Surf 是表面编号,object是目标编号,param 是要返回的值的参数编号 Surf 是表面编号,object是目标编号,code 是0-6,分别代表要返回的位置相对于参考位置的x,y,z 坐标,x,y,z 倾斜 从非连续元件的编辑界面的参数栏中返回一个值 NPOS(surf, object,code) 从非连续元件的编辑界面的位置栏中返回一个值 NSUR() 无 指定表面的编号 NWAV() 无 指定波长的编号 如果字符串A$是一个有效的优化操作数名,如EFFL,则ONUM 返回这个操作数的id 编号。关键ONUM(A$) 字符串名 字SETOPERAND 可以用操作数id 编号来设定评价函数编辑界面中的操作数类型。如果A$不是操作数名,ONUM 返回0 OPDC() 无 优化函数编辑界面中光程差。仅在RAYTRACE 被调用后才有效 从优化函数编辑界面的指定行和列中记录数据。行号与操作数编号一样;列号中1 指操作数类型,2 指int1,3 指int2,4-7 指Hx-Py,8 指目标值,9 指权重,10 指实际值,11 指贡献百分值。也可参见MFCN和关键字SETOPERAND 沿着光线到指定表面的光程长度。与RAYT 和RAYO OPER(row,col) 的行(操作数编号)和列(数据类型) OPTH(X) PARn(X) PMOD() PVHX() PVHY() PVPX() PVPY() PWAV() RADI(X) RAGX(X) RAGY(X) RAGZ(X) RAND(X) RANX(X) RANY(X) 表面编号 表面编号 无 无 无 无 无 无 表面编号 表面编号 表面编号 表面编号 正的数值表达式 表面编号 表面编号 不同,OPTH 考虑了由衍射引起的相位变化,如光栅、全息、二元光学等 表面参数“n” 如果近轴模式关闭则为0,否则为1POWR(x,y) X 是正数,y 为任意数y 的x 次方。X 必须是正数,否则用它的绝对值 优化操作数ZPLM 的Hx 参数 优化操作数ZPLM 的Hy 参数 优化操作数ZPLM 的Px 参数 优化操作数ZPLM 的Py 参数 主波长编号 表面的曲率半径 光线截止点的x 球形坐标,仅在RAYTRACE 被调用后才有效 光线截止点的y 球形坐标,仅在RAYTRACE 被调用后才有效 光线截止点的z 球形坐标,仅在RAYTRACE 被调用后才有效 均匀分布在0 和表达式值之间的随机浮点值 表面法线的x 方向的余弦,仅在RAYTRACE 被调用后才有效 表面法线的y 方向的余弦,仅在RAYTRACE 被调用后才有效 RANZ(X) RAYE() 表面编号 无 表面法线的z 方向的余弦, 光线追迹错误标记,没有错误则返回0,仅在RAYTRACE 被调用后才有效。详细信息参见有关关键字RAYTRACE 的内容 穿过表面后光线在x 方向的余弦。仅在RAYTRACE 被调用后才有效 穿过表面后光线在y 方向的余弦。仅在RAYTRACE 被调用后才有效 穿过表面后光线在z 方向的余弦。仅在RAYTRACE 被调用后才有效 从前一表面到指定表面光线的光程长度。光程长度是长度乘以折射率,这两个数都有可能是负数。仅在RAYTRACE 被调用后才有效。也可参见OPTH 和RAYT 从前一表面到指定表面光线的光程长度。光程长RAYL(X) RAYM(X) RAYN(X) 表面编号 表面编号 表面编号 RAYO(X) 表面编号 RAYT(X) 表面编号 度有可能是负数。仅在RAYTRACE 被调用后才有效。也可参见OPTH 和RAYO 如果无渐晕则为0,否则为渐晕面的编号。仅在RAYTRACE 被调用后才有效 光线截止点的x 坐标。仅在RAYTRACE 被调用后才有效 光线截止点的y 坐标。仅在RAYTRACE 被调用后才有效 光线截止点的z 坐标。仅在RAYTRACE 被调用后才有效 在指定视场位置的RI RAYV() RAYX(X) RAYY(X) RAYZ(X) RELI(f) SAGG(x,y,z) 无 表面编号 表面编号 表面编号 相对照度 x、y 是编号为z 的表面坐标,以镜头单位表表面上指定点的矢高,以镜头单位表示 示 任意一个代表ZEMAX表字符串必须是有效的表面类型名,如STANDARD , EVENASPH ,PARAXIAL,等等。使用的每一种表面类型的有效文件名都将在指定的数据报告种显示出来 如果两个字符串相等,SCOM 返回0;如果A$小于SCOD(A$) 面类型的字符串变量或文字 SCOM(A$,B$) 任意两个字符串变量 B$,SCOM 返回一个小于0 的值;否则返回一个大于0的值 SDIA(X) SIGN(X) SINE(X) SLEN(A$) SQRT(X) STYP(n) SVAL(A$) TANG(X) TMAS() THIC(X) UNIT() VEC1(X) VEC2(X) VEC3(X) VEC4(X) VERS() WAVL(X) WWGT(X) XMIN() XMAX() YMIN() YMAX()

函数FICL()的使用 表面编号 数值表达式 数值表达式(弧度表示) 正的数值表达式 表面编号n 数值表达式(弧度表示) 总重量(以克表示) 表面编号 无 正的下标值 正的下标值 正的下标值 正的下标值 无 波长编号 波长编号 无 无 无 无 指定表面的半口径 如果自变量小于0 则返回-1,自变量是0 则返回0,自变量大于0 则返回+1 表达式的正弦值 任意一个字符串变量 在字符串A$中字母的个数 表达式的平方根 表面的表面类型代码,参见SCOD 任意一个字符串变量 字符串值。返回字符串A$的浮点值 表达式的正切值 从第一面到像面之间所有镜头的总的重量(以克表示) 指定表面的厚度 如果当前单位类型是毫米、厘米、英寸或米,则分别返回0、1、2 或3 返回数组中指定下标的元素的值 返回数组中指定下标的元素的值 返回数组中指定下标的元素的值 返回数组中指定下标的元素的值 返回一个四位数的版本号。最典型的版本号是5500。以后ZEMAX 版本将返回更大的版本号 波长(以微米表示) 波长的权重 图表窗口中的最小x 坐标 图表窗口中的最大x 坐标 图表窗口中的最小y 坐标 图表窗口中的最大y 坐标 函数FICL 是计算光纤耦合的。因为函数要使用许多自变量,所以自变量要先放在一个向量组里,然后再调用函数。这向量组必须是已定义的四维数组。放在向量组里的数值定义如下:

0 = 采样精度 1 = 波长# 2 = 视场#

3 = 忽略来源标志(0 代表否,1 代表是) 4= 输出方NA 5= 接收方NA

6 = 输出方x 角度错误 7 = 输出方y 角度错误 8 = 接收方x 角度错误 9 = 接收方y 角度错误 10 = 接收方x 方向偏差 11 = 接收方y 方向偏差 12 = 接收方z 方向偏差

通过调用函数FICL(n)来计算光纤耦合,这里n 是包含自变量列表的向量组的个数。 ZPL 数算 ZPL 宏指令包括基本的数算,如加、减、乘、除。各类语法 结构显示如下: x = y+z x = y-z x = y*z x = y/z

其余所有的运算只有通过使用ZPL 函数或ZPL 逻辑运算来实现,这些将在后面的章节中介绍。 ZPL 逻辑运算符 逻辑运算符被用来构造复合语句,这个语句的最后的结果是1或者0。大部分逻辑运算采用形式

(表达式)(运算符)(表达式)

这类似于数学语句,如1+2。补集运算是用非运算符“!”,它仅需一个自变量,它的形式是 !(表达式)。逻辑运算使用了一个惯例,0代表“假”,非0 值代表“真”。如果表达式的值为0(假),非运算返回1(真);如果表达式的值为非0 值(真),则返回0(假)。非运算常用在IF 语句中,例如: IF !x THEN “x is zero.”

其他逻辑运算也可用来作为IF 语句的部分自变量。例如,一个IF 语句可以包含两个条件,当这两个条件都是真时才能执行THEN 语句:

IF (x>1) & (y<2) THEN PRINT “Both conditions are true.”

这两个条件通过用&表示的“与”运算符联系起来。注意这里的圆括号是用来强制使括号里的内容优先。ZPL 支持的逻辑运算符列表如下:

ZPL 逻辑运算符

逻辑运算符 & | 说 明 与,仅当两个表达式都为非0 值时返回1 或,当至少有一个表达式为非0 值时返回1 ^ ! == > < >= <= !=

异或,当仅有一个表达式为非0 值时返回1 非,当(表达式)为非0 值时返回0,否则返回1 等于,当表达式相等时返回1 大于,当左边的表达式大于右边的表达式时返回1 小于,当左边的表达式小于右边的表达式时返回1 大于等于,当左边的表达式大于或等于右边的表达式时返回1 小于等于,当左边的表达式小于或等于右边的表达式时返回1 不等于,当表达式不相等时返回1 ZPL 字符串变量及其运算 ZPL 支持字符串变量和基本的字符串操作。字符串变量不需要说明,但可以在任何时候用一个定义语句来创建字符串变量,例如:

newstring$ = “Here is the new string.”

注意,字符串变量和数值变量以字符串末尾是否跟字母$来区分。字符串变量可以用操作符“+”连接起来。例如:

C$ = A$ + B$

连接句中也可包含字符串常量:

total$ = “A$ is”+ A$ + “and B$ is” + B$ 也可以有用来摘录文本数据的字符串函数,例如:

title$ = $LENSNAME( )

注意这里的函数$LENSNAME( )是以字母$开头。这样可以认为函数是返回一个字符串结果。字符串函数可以用在定义语句中,例如:

this$ = “Here is the lens title:”+ $LENSNAME( ) 字符串变量可以像其他字符串一样被打印出来:

PRINT “Here is A$:”, A$

注意函数PRINT 可以仅仅打印字符串变量;如在打印语句中有串联操作或字符串函数则不被支持。正确的方法是先把字符串连成一个新的字符串,然后再打印新的字符串:

A$ = B$ + C$ PRINT A$

另外,逗号也可以作为连接操作符:

PRINT A$, B$, C$ 字符串不能像这样直接打印:

PRINT $LENSNAME( ) !不正确

其实正确的方法是先把函数值赋给一个变量,然后再打印这个变量:

Z$ = $LENSNAME( ) PRINT Z$

$STR( )是一个很重要的函数。这个函数可以把任意表达式当成自变量,只要这个表达式的值

一个数字。$STR 在把一个数值数据转变为字符串的格式变换中十分有用:

A$= “The expression evaluates to”+ $STR(SQRT(3*3+4*4+z*y))

其相反功能的函数是SVAL(A$),它把字符串转化成浮点数。 下面的表格中列出了可用的字符串函数。

ZPL 字符串函数

函 数 $COMMENT(i) $DATE( ) $FILENAME( ) $FILEPATH() $GLASS(i) $LEFTSTRING(A$,n) $LENSNAME( ) $NOTE(line#) $PATHNAME( ) $RIGHTSTRING(A$,n) $STR(expression) $UNITS( )

ZPL 字符串逻辑运算 字符串逻辑运算与前面讲述的(数值)逻辑运算很像。关键的差别在于表达式是字符串,而不是数字。可用的字符串逻辑运算符在下列表格中进行说明。

ZPL 字符串逻辑运算符

逻辑运算符 $== $> $< $>= $<= 说 明 等于,如果左右两边的字符串是一样的则返回1 大于,如果左边的字符串大于右边的字符串则返回1 小于,如果左边的字符串小于右边的字符串则返回1 大于等于,如果左边的字符串大于右边的字符串、或者和右边的字符串一样则返回1 小于等于,如果左边的字符串小于右边的字符串、或者和右边的字符串一样则返回1 返回第i 面的注释字符串 返回当前的日期和时间字符串。它的格式在环境对话框中被规定。 返回当前镜头的文件名,不带路径 返回当前镜头的文件名,带完整路径 返回编号为I 的表面对应的玻璃的名称 返回字符串A$左边的n 个字母。如果A$字母个数少于n,剩余的空间用空格填补。这允许字符串有固定的长度格式。参见$RIGHSTRING 返回在通用数据系统对话框中定义的镜头标题 返回在通用数据系统对话框中定义的注解信息 返回当前镜头文件的路径名。这对于确定镜头文件储存的哪个目录里很有用 返回字符串A$右边的n 个字母。如果A$字母个数少于n,剩余的空间用空格填补。这允许字符串有固定的长度格式。参见$LEFTSTRING 返回一个格式由关键字FORMAT 确定的字符串。这个数字表达式可以是任意形式,包括常数、变量和函数的组合形式 根据当前镜头单位返回MM、CM、IN 和M 中的一个 说 明 $!=

不等于,如果左右字符串不一样则返回1 例如,一个IF 语句可以来比较字符串,如下:

A$ = “TEST” B$ = “TEST”

IF(A$ $== B$) THEN PRINT “Strings are identical.” ZPL 关键字 ZPL 关键字提供了直接指导程序流程、产生输出、执行一些重要任务(如光线追迹和修改镜头规定等)的功能。每个关键字都在下面的章节里被详细介绍。功能相似或者有联系的关键字被列在一起。 APMN,APMX 用途

用来设定表面通光孔径的最小/最大半口径。 语法结构

APMN(surface) = (new_value) APMX(surface) = (new_value) 说明

这两个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的数值。求出表达式(surface)的值,然后取整,用这个整数来作为表面编号。如果这个表面编号小于0 或者大于表面的数量,那么这条命令将被略过。否则,求出表达式(new_value)的值,被赋值来作为该表面通光孔径的最小 (APMN)或最大半口径(APMX)。虽然通光孔径的半口径数据的意义与使用的孔径类型有关,但它还是适用于所有通光孔径,两者的关系在下表中说明。

通光孔径类型和APMN 使用方法

孔径类型 无孔径(None) 环形口径(Circular aperture) 环形挡光(Circular obscuration) 星形(Spider) 长方形口径(Rectangularaperture) 长方形挡光(Rectangular obscuration) 椭圆口径(Elliptical aperture) 椭圆挡光(Elliptical obscuration) 自定义口径(User aperture) 自定义挡光(User obscuration) 浮动口径(Floating aperture)

不用 设定最小半口径 设定最小半口径 设定臂宽 设定x 半宽度 设定x 半宽度 设定x 半宽度 设定x 半宽度 不用 不用 不用 APMN 用成 APMX 用成 不用 设定最大半口径 设定最大半口径 设定臂数 设定y 半宽度 设定y 半宽度 设定y 半宽度 设定y 半宽度 不用 不用 不用 例子:

APMN(3) = 1.75 APMX(3) = 3.50 APXD,APYD 用途

用来设定表面通光孔径的x/y 偏心。 语法结构

APXD(surface) = (new_value) APYD(surface) = (new_value) 说明

这两个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的数值。求出表达式(surface)的值,然后取整,用这个整数来作为表面编号。如果这个表面编号小于0 或者大于表面的数量,那么这条命令将被略过。否则,求出表达式(new_value)的值,被赋值来作为该表面通光孔径的x偏心(APXD)或者y 偏心(APYD)。 例子:

APXD(3) = -3.6 APYD(5) = -1*APYD(3) APTP 用途

用来设定表面的通光孔径类型。 语法结构

APTP(surface) = integer_code 说明

这两个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的数值。求出表达式(surface)的值,然后取整,用这个整数来作为表面编号。如果这个表面编号小于0 或者大于表面的数量,那么这条命令将被略过。否则,求出表达式(integer_code)的值,取整后赋值来作为通光孔径类型。通光孔径类型被存成正数代码形式,详见下表说明。

表面类型代码

正数代码 0 1 2 3 4 5 6 7 无(None) 环形孔径(Circular aperture) 环形挡光(Circular obscuration) 星形(Spider) 长方形孔径(Rectangular aperture) 长方形挡光(Rectangular obscuration) 椭圆孔径(Elliptical aperture) 椭圆挡光(Elliptical obscuration) 通光孔径类型 8 9 10

例子

APTP(3) = 1 ATYP,AVAL 用途

自定义孔径(User aperture) 自定义挡光(User obscuration) 浮动口径(Floating aperture) 用来设定系统光圈的类型和值。 语法结构

ATYP = (code) AVAL = (new_value) 说明

这两个关键字是用来设定系统光圈的类型和值。光栏类型用下列代码来定义:

系统光圈类型代码 光圈类型 入瞳直径(Entrance Pupil Diameter) 像空间F/#(Image Space F/#) 物空间数值孔径(Object Space Numerical Aperture) 通过光栏尺寸浮动(Float By Stop Size) 例子

! Set the EPD to be 35 ATYP = 0 AVAL = 35.0 BEEP 用途

产生可以听见的嘟嘟声。 语法结构

BEEP 说明

当运算结束或者需要输入时用这条命令来提醒用户。 CLOSE 用途

关闭前面用OPEN 命令打开的ASCII 码文件。 语法结构

CLOSE

代码 0 1 2 3 说明

参见关键字OPEN 的说明 CLOSEWINDOW 用途

禁止显示默认输出窗口。 语法结构

CLOSEWINDOW 说明

CLOSEWINDOW 用来使ZPL 宏指令进入“安静”模式。如果宏指令中的任何一行中有关键字CLOSEWINDOW,那么通常在宏指令执行结束时显示的文本窗口将不再显示。CLOSEWINDOW 对宏指令的执行不产生任何其他影响。 COLOR 用途

用来设定图表功能中的线条和文字的墨水颜色。 语法结构

COLOR(n) 说明

n 的值必须是整数。如果自变量是0,颜色被设成黑色。否则,由这个整数决定的颜色将用在所有后面出现的图表模式中的线条和文字。12 种有效颜色加上黑色,用数字0-12 表示。ZEMAX 通常用不同的颜色来表示不同的视场和波长;如颜色1 表示视场1 或者波长1,等等。 CONI 用途

CONI 用来设定表面的二次曲线常数。 语法结构

CONI(surface) = (new_value) 说明

这两个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的数值。求出表达式(surface)的值,然后取整,用这个整数来作为表面编号。如果这个表面编号小于0 或者大于表面的数量,那么这条命令将被略过。否则,求出表达式(new_value)的值,然后赋值。 例子

CONI 1 = -1 相关关键字

UPDATE CURV 用途

CURV 用来设定表面的曲率。

语法结构

CURV(surface) = (new_value) 说明

这两个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的数值。求出表达式(surface)的值,然后取整,用这个整数来作为表面编号。如果这个表面编号小于0 或者大于表面的数量,那么这条命令将被略过。否则,求出表达式(new_value)的值,然后赋值。 例子

CURV(3) = -CURV(4) + .001 相关关键字 UPDATE DELETE 用途

从电子表格中删除表面 语法结构

DELETE (n) 说明

n 这个值必须是一个整数表达式。参见INSERT。 例子

DELETE 5 DELETE i+2*j EDVA 用途

设定表面的特别数据。 语法结构

EDVA surf,ed_value,new_value 说明

表达式surf 指明要修改的表面。表达式ed_value 的值必须是与一个特殊数据值的位置对应的整数,有关表面的特殊数据值的内容可参见“表面类型”一章。求出表达式new_value 的值,用来作为该表面特殊数据的更新值。 例子

EDVA 5, 6, x+y END 参见 GOSUM FINDFILE 用途

用来查找储存在磁盘里的文件名。

语法结构

FINDFILE TEMPNAME$, FILTER$ 说明

这个关键字需要两个表达式,一个用来指定存放文件名的字符串变量,另一个用来指定包含“筛选器”字符串的字符串变量。这个筛选器字符串通常用来指定路径名和与想得到得文件类型相符合的通配符。见下面的例子。

FINDFILE 对于要列出一个目录下所有的某一类型的文件或者分析大量类似的镜头文件是很有用的,只要调用一个带有不同筛选器的FINDFILE 语句,然后再调用带有原始筛选器名的FINDFILE 语句。每次调用一个带有新筛选器的FINDFILE 语句,都将复位返回这个筛选器遇到的第一个文件。 例子

FILTER$ = “C:\\ZEMAX\\*.ZMX”

PRINT “Listing of all ZEMAX files in”, FILTER$ FINDFILE TEMPFILE$, FILTER$ LABEL 1

If (SLEN(TEMPFILE$)) PRINT TEMPFILE$

FINDFILE TEMPFILE$, FILTER$ GOTO 1 ENDIF

PRINT “No more files.”

FLDX, FLDY, FWGT, FVDX, FVDY, FVCX, FVCY 用途

FLDX 和FLDY 用来改变指定的视场点。FWGT 用来改变视场的权重。FVDX 和FVDY 用来改变x 和y 的渐晕偏心因子。FVCX 和FVCY 用来改变x 和y 的渐晕压缩因子。 语法结构

FLDX (field number) = (new_value) FLDY (field number) = (new_value) FWGT (field number) = (new_value) FVDX (field number) = (new_value) FVDY (field number) = (new_value) FVCX (field number) = (new_value) FVCY (field number) = (new_value) 说明

这些关键字需要两个表达式,一个用来指定视场编号,另一个用来定义一个新的值。求出表达式(field number)的值,然后取整,用这个整数来作为视场编号。如果视场编号小于1 或者大于视场的数量,那么这条命令被略过。否则,求出表达式(new_value)的值,再赋值。

因为视场值的改变会影响光线坐标和表面的半口径,所以建议再改变任何视场设定后执行以下UPDATE 命令。 例子

FLDX 1=0.0 FLDY 1=12.5 FWGT 1=1.0 相关函数

FLDX,FLDY,FWGT,MAXF,FTYP,FVDX,FVDY,FVCX,FVCY 相关关键字

UPDATE,FTYP FOR,NEXT 用途

关键字FOR 和NEXT 定义了一个程序块,这个块将在一个循环里执行指定次数。 语法结构

FOR variable=start_value,stop_value,increment Statements⋯ NEXT 说明

关键字FOR 标志着一组要多次执行的语句的开始。FOR 需要一个变量作为计数器(不一定要是整数)来说明计数器的起始值、终止值和增量。关键字NEXT 标志着这组语句的结束。FOR-NEXT 循环可以嵌套。FOR 语句和NEXT 语句的数量必须一样多。

在到达FOR 语句之前,关于循环开始、终止和增量的表达式的值就已经被求出来,并保存起来。甚至当确定这些值的表达式中含有一些在程序块中其值要改变的变量时,终止值和增量也不再重新计算。这些值在FOR 循环开始使用时才有效。如果开始值和终止值一样,循环体正好执行一次;如果开始值小于终止值,直到计数器变量大于终止值循环体才停止执行;如果开始值大于终止值,直到计数器变量小于终止值循环体才停止执行。 例子

FOR i=1,25,1 PRINT i NEXT j=5 k=0

FOR i=j,j+5,2 k=i+j+k NEXT FORMAT 用途

为后面的PRINT 语句规定数值精度格式。 语法结构

FORMAT m.n [EXP] 说明

整数m 和n 被一个小数点隔开。m 是指要打印的总的字母个数,这些字母中的一些可能是空格。n 是指小数点后的位数。因此,FORMAT 8.4 将使后面的PRINT 语句打印出小数点后面带有4 位数字的8 个字母。FORMAT .5 将使PRINT 语句显示5 个小数位,总的位置数是任意的。FORMAT 只会影响PRINT 语句的数值输出。如果一个数值太大了,不在m 个数字位之内,那么FORMAT 语句的m部分将被忽略。在符号m.n 后的可选择的关键字EXP 规定了是否使用指数形式。 例子

x = 1.123 FORMAT 12.0

PRINT “An integer portion =”,x FORMAT 12.8

PRINT “A decimal portion =”,x FORMAT 12.8 EXP

PRINT “Exponential notation =”,x FTYP 用途

FTYP 用来使视场类型在角度(以度表示)、物高和像高三者之间转变。 语法结构

FTYP = (new_value) 说明

表达式(new_value)的值必须是0、1、2 或3 之中的一个。如果值是0 则表示视场类型是角度(以度表示),1 则表示是物高(以镜头长度单位表示),2 则表示是理想像高(以镜头长度单位表示),3 则表示是实际像高(以镜头长度单位表示)。视场类型的设定不会改变视场大小,因此也不用使系统更新。不论视场类型什么时候被改变,视场大小通常都是用关键字FLDX 和FLDY 来调整。 相关函数

FLDX,FLDY,FWGT,MAXF 相关关键字

UPDATE,FLDX,FLDY,FWGT GDATE 用途

GDATE 用来将镜头文件名下的当前日期放到用户自定义图表界面中的文本框中。 语法结构

GDATE 说明

GDATE 主要用来使你自定义的图表看起来像其他的ZEMAX 图表。 例子

参见GRAPHICS 部分。 GETEXTRADATA 用途

从特殊数据编辑界面中得到特殊数据值,并把它放到向量组变量(VEC1、VEC2、VEC3 或VEC4)中的一个里。 语法结构

GETEXTRADATA vector_expression,surface_expression 说明

数据将被储存在指定的VECn 数组变量中。例如,如果命令GETEXTRADATA 1,5 被执行,那么表面5 的特殊数据将被储存在VEC1 中。数据将用如下的格式来储存,这里每行的第一个数字是指数组中的位置:

0: 向量中特殊数据值的个数 1: 第一个特殊数据 n: 第n 个特殊数据

有关特殊数据值的叙述请参见“表面类型”一章。 GETGLASSDATA 用途

从当前的玻璃库中得到任意一种玻璃的数据,并把它放到向量组变量(VEC1、VEC2、VEC3 或VEC4)中的一个里。 语法结构

GETGLASSDATA vector_expression,glass_number 说明

数据将被储存在指定的VECn 数组变量中。例如,如果命令GETGLASSDATA 1,32 被执行,那么第32 号玻璃的数据将被储存在VEC1 中。玻璃的编号可用函数GNUM 得到。数据将用如下的格式来储存,这里每行的第一个数字是指数组中的位置:

0: 向量中数据值的个数

1: 公式编号:1 代表Schott,2 代表Sellmeier 1,3 代表Herzberger,4 代表Sellmeier

2,5 代表Conrady

2: MILNUM 3: Nd 4: Vd

5: -30 到+70 摄氏度时的热膨胀系数 6: +70 到+300 摄氏度时的热膨胀系数

7: 密度(以克/立方厘米为单位) 8: 与正常线之间的偏离值P gf 9: 最小波长 10: 最大波长

11-16:相对部分色散常数(它的值与计算公式有关) 17-22:热色散常数 GETMTF 用途

计算当前载入的镜头文件的子午和弧矢MTF、实部、虚部、相位或者方波响应曲线等的值,并把这些值存放在向量组变量(VEC1、VEC2、VEC3 或VEC4)中的一个里。 语法结构

GETMTF freq,wave,field,sampling,vector,type 说明

自变量freq 是指要求的以线对/毫米为单位的空间频率,如果这个频率小于0 或者大于截止频率,GETMTF 返回0。自变量wave 是指计算中使用的波长编号相对应的整数,0 说明采用全部波长进行计算。自变量field 必须是在1 到最大视场编号之间的一个整数,它的值指定了使用的视场。自变量sampling 可以是1(32*32),2(*),3(128*128),等等⋯⋯,一直到2048*2048。自变量vector 必须是1 到4 之间的整数,它规定了这些数据将被储存在哪个向量组里。自变量type 是指数据类型:1 代表MTF,2 代表实部,3 代表虚部,4代表相位(以度表示),5 代表方波MTF。如果任何一个自变量超出了规定的有效取值范围,那么将用取值范围内最接近的一个数值来代替它。

数据将被以下面的格式返回到一个向量组中:数组位置0:子午响应曲线;数组位置1:弧矢响应曲线。 例子

!这个宏指令计算当前载入镜头在30lp/mm 处、采用全部波长、在最大规定视场处、网格密度为32*32(sampling=1)时的T&S 曲线,数据将被存放在向量组1 中,下面就是的到该数据的全部语句:

GETMTF 30,0,NFLD( ),1,1,1

PRINT “Tangential response:”,vec1(0) PRINT “Sagittal response:”,vec1(1) GETPSE 用途

计算当前载入镜头文件的衍射的点扩散分布函数,并把这些数据存放在向量组变量(VEC1,VEC2,VEC3 或VEC4)中的一个里。 语法结构

GETPSE wave,field,sampling,vector 说明

自变量wave 是指与计算时使用的波长编号相对应的整数,0 说明采用全部波长进行计算。自变量field 必须是在1 到最大视场编号之间的一个整数,它的值指定了使用的视场。自变量sampling 可以是1(32*32)、2(*)、3(128*128)、等等⋯⋯,一直到2048*2048。自变量vector 必须是1 到4 之间的一个整数,它规定了这些数据将被存放在哪个向量组里。如果任何一个自变量超出了规定的有效取值范围,那么将用取值范围内最接近的一个数值来代替它。数据将被以下面的格式返回到一个向量组中:

数组位置0:在向量组中PSF 数据点的总的数目。通常,这个数为4*n*n,这里n 是采样尺寸(32,,等等)。例如,如果采样密度是2,那么瞳孔采样尺寸是*,在向量中将有128*128 或者16384 个数值。这里每个数值需要8 位空间,或者说总共需要131kb空间。如采样密度为1024 则至少需要8Mb 空间来存放向量组;如果采样密度再高,则需要Mb 或者更多的空间来计算PSF。位置0也能返回返回其他数值,如错误信息代码。如果位置0 的数值为0,则说明计算失败;如果为-1,则说明向量组太小,容纳不下所有的数据,使用关键字SETVECSIZE 使数组增大;如果为-2,则说明系统内存太小,不能计算这个PSF 数据。

数组位置1 用4*n*n 空间把PSF 数据的强度保存下来,并将之归一化。第一个2n 的值代表第一行,从-x 到+x 扫描;接下来的2n的值代表其他行,从+y 到-y 扫描。

数组位置4*n*(n+1)保存了各个数值点之间的间隔(以微米表示)。 例子

!这个宏指令将计算当前载入镜头采用全部波长、在第一视场处、网格密度为32*32(sampling=1)时的PSF,数据将被储存在vector1中。

SETVECSIZE 4500 GETPSF 0,1,1,1 Np=vec1(0) IF (np==0)

PRINT “PSF Computation aborted.” GOTO 1 ENDIF IF (np==-1)

PRINT “SETVECSIZE too small for PSF data.” GOTO 1 ENDIF IF (np==-2)

PRINT “Not enough system RAM for PSF data.” GOTO 1 ENDIF

PRINT “There are”,np, “ data points,spaced”,vec1(np+1),“microns apart” LABEL 1 GETSYSTEMDATA 用途

得到大部分特定的系统数据,如有效焦距、工作F/#、照度分布因子和其他一些与特定面无关的数据。并把这些数据存放在向量组变量(VEC1,VEC2,VEC3 或VEC4)中的一个里。 语法结构

GETSYSTEMDATA vector_expression 说明

这些数据被储存在指定的数组变量VECn 中。例如,如果命令GETSYSTEMDATA 1 被执行后,这些系统数据将被存放在VEC1 中。数据将用如下的格式来储存,这里每行的第一个数字是指数组中的位置:

0: 向量中系统数据的个数 1: 光圈值 2: 照度分布因子

3: 照度分布类型(0:均匀分布;1:高斯分布;2:正切分布) 4: 使用Env 数据(如果用则为1,不用则为0) 5: 以摄氏度表示的温度(仅当使用Env 时有效) 6: 以大气压表示的压力(仅当使用Env 时有效) 7: 有效焦距 8: 像空间F/# 9: 物空间数值孔径 10: 工作F/# 11: 入瞳直径 12: 入瞳位置 13: 出瞳直径 14: 出瞳位置 15: 理想像高 16: 理想放大率 17: 角放大率 18: 总长度

19: 使用光线定位(如果用则为1;不用则为0) 20: 光瞳x 移位 21: 光瞳y 移位 22: 光瞳z 移位 23: 光栏数值 GETVARDATA 用途

得到当前所有优化变量的数量、类型和值,并把这些数据存放在向量组变量(VEC1,VEC2,VEC3 或VEC4)中的一个里。

语法结构

GETVARDATA vector 说明

这些数据将被储存在指定的数组变量VECn 中。例如,如果命令GETVARDATA 1 被执行,那么数据将被存放在VEC1 中。数据将用如下的格式来储存,这里每行的第一个数字是指数组中的位置:

0: n,变量的个数 1: 第一个变量的类型代码 2: 第一个变量的参数编号 3: 第一个变量的对象编号 4: 第一个变量的值

5*q- 4: 第q 个变量的类型代码 5*q- 3: 第q 个变量的参数编号 5*q- 2: 第q 个变量的对象编号 5*q- 1: 第q 个变量的值等等⋯⋯

整数q 从1 到n,这里n 是变量的个数。如果n 为0,则没有有效数据返回。在数组0 位置的数n 的值总是有效的。变量的类型代码将在下表中说明,表面编号、参数编号、对象编号的值可能与变量有关,也可能无关。 GETVARDATA 类型和id 代码

变量类型 曲率 厚度 二次曲线常数 折射率 阿贝常数 相对部分色散△Pg,F 膨胀系数 参数值 特殊数据值 多重结构操作数值 不连续对象位置x 坐标 不连续对象位置y 坐标 不连续对象位置z 坐标 不连续对象x 方向倾斜 不连续对象y 方向倾斜 类型代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 表面# 表面# 表面# 表面# 表面# 表面# 表面# 表面# 表面# 操作数# 表面# 表面# 表面# 表面# 表面# — — — — — — — 参数# 特殊数据# 结构# — — — — — 表面编号 参数编号 对象编号 — — — — — — — — — — 对象# 对象# 对象# 对象# 对象# 不连续对象z 方向倾斜 不连续对象参数

GETZERNIKE 用途

16 17 表面# 表面# — 参数# 对象# 对象# 计算当前载入的镜头文件的泽尼克边缘系数,并把这些数据存放在向量组变量(VEC1,VEC2,VEC3 或VEC4)中的一个里。 语法结构

GETZERNIKE maxorder,wave,field,sampling,vector 说明

自变量maxorder 可以是1 到37 之间的任意一个值,它与要求的最高的泽尼克边缘有关。自变量wave 和field 是波长和视场编号对应的整数值。自变量sampling 的值规定了适合该系数的网格的尺寸,sampling 可以是1(32*32)、2(*)、3(128*128)等等⋯⋯,一直到2048*2048。自变量vector 必须是1 到4 之间的整数,它规定了这些数据将被存放在哪个向量组里。如果任何一个自变量超出了规定的有效取值范围,那么将用取值范围内最接近的一个数值来代替它。

这些数据将以下列格式返回到一个向量组里:数组位置1:波形的最高点;数组位置2:光程差为0 时的均方根(这个值没有实际意义,但可供参考);数组位置3:主光线的均方根;数组位置4:像中心的均方根;数组位置5:变化量;数组位置6:斯特列尔变化率;数组位置7:均方根错误;数组位置8:最大错误。余下的数组位置由实际的泽尼克系数数据组成,泽尼克数据1 在数组位置9,泽尼克数据2 在位置10,等等。 例子

!这个宏指令计算了当前载入的镜头在波长1、视场1、网格密度为32*32(sampling=1)处时的前面37 个泽尼克边缘系数。这些系数将被存放在向量1 中。先得到这些数据:

GETZERNIKE 37,1,1,1,1 !现在还不能输出 FORMAT 16.6

PRINT “Peak to Valley :”,vec1(1) PRINT “RMS to chief :”,vec1(3) PRINT “RMS to centroid :”,vec1(4) PRINT “Variance :”,vec1(5) PRINT “Strehl ratio :”,vec1(6) PRINT “RMS Fit Error :”,vec1(7) PRINT “Maximum Fit Error :”,vec1(8) i=1 label 1 FORMAT 2.0

PRINT “Zernike #”,i,“=” FORMAT 16.6 PRINT vec1(8+i) i=i+1

IF (I<38) THEN GOTO 1 PRINT “All Done!” GLAS 用途

GLAS 是用来设定表面的玻璃类型。 语法结构

GLAS(surface)=(glass_number) GLAS(surface)=glass$ 说明

这个关键字需要两个表达式,一个用来指定表面编号,另一个定义玻璃编号。如果玻璃编号是-1,则玻璃类型设成“平面镜”;如果玻璃编号是0,则玻璃类型为空格或者统一的折射率;否则玻璃编号必须是1 到由MAXG 返回的数值之间的一个数。GLAS 也承认包含所要求的玻璃名称的字符串变量,如“BK7”。 例子

GLAS 3=MAXG( ) A$=“BK7” GLAS 4=GNUM(A$) GLAS 4=A$ 相关关键字 UPDATE GLENSNAME 用途

GLENSNAME 将使当前的镜头名放在文本框或者用户自定义的图表窗口的左上角。 语法结构

GLENSNAME 说明

GLENSNAME 主要是用来使你定义的图表看起来与其他的图表一样。 例子

参见GRAPHICS 部分。 GOSUB、SUB、RETURN and END 用途

这四个关键字是一起用来定义和调用ZPL 宏指令文件中的子程序的。每个关键字都有其特殊的用途。GOSUB 指引程序流程到自定义的子程序;SUB 用来定义子程序名,同时也象征

子程序体的开始;RETURN 象征着程序将在最近的GOSUB命令出现的地方继续执行;END 象征着程序将立即停止。 语法结构

参见例子部分中的结构范例。 说明

每个ZPL 宏指令文件都可以有不超过50 个的子程序。每个子程序都必须用RETURN 语句来终止,在一个子程序体中只能有一个返回语句。如果定义了子程序,那么至少必须有一个END 语句用来象征主程序体的结束,主程序体必须在文件的顶部。

在一个宏指令中可以使用不超过50 个的“嵌套级”。例如,如果子程序ABC 调用了子程序XYZ,那么嵌套级为2;如果子程序XYZ又调用了子程序DEF,那么嵌套级为3。在ZPL 中所有的变量都是全局变量,任何一个在子程序中使用或定义的变量,在主程序中同样继续存在。 例子

x=1 y=2 GOSUB add

PRINT “the sum of ”,x,“and”,y,“is”,z END SUB add z = x+y RETURN GOTO 用途

通常,每个程序行都将依次执行下去。但GOTO 允许程序在任意一点继续执行。GOTO 一般使用在带有LABEL 命令的程序中。 语法结构

GOTO label_number GOTO text_label 说明

在程序中必须有一个带有相关label_number 或者text_label 的LABEL 命令,否者程序将产生错误。 例子

LABEL 1 x=RAND(10)

IF x<=5 THEN GOTO 1

PRINT “X is greater than 5.” GRAPHICS 用途

创建一个标准的ZEMAX 图表界面,这个界面中带有作为副标题的刻度行。 语法结构

GRAPHICS GRAPHICS OFF 说明

如果GRAPHICS 被单独定义,那么将产生一个标准的ZEMAX图表窗口。所有后面出现的图表命令将被发送到这个新建窗口中。GRAPHICS OFF 将关闭现有打开的图表窗口,然后显示这个关闭的窗口。 例子

GRAPHICS xmx =xmax( ) xmn =xmin( ) ymx =ymax( ) ymn =ymin( ) xwidth =xmx-xmn ywidth =ymx-ymn

xleft =xmn+( .1*xwidth) xrigh =xmn+( .9*xwidth) ytopp =ymn+( .1*ywidth) ybott =ymn+( .7*ywidth) LINE xleft,ytopp,xrigh,ytopp LINE xrigh,ytopp,xrigh,ybott LINE xrigh,ybott,xleft,ybott LINE xleft,ybott,xleft,ytopp

GTITLE “the rain in spain falls mainly on the plain” GLENSNAME GDATE

GTEXT xmx/2,ymx/2,0,“start this text in the center.” GTEXTCENT ymx*.05,“center this text near the top.” GTEXT xmx*.05,ymx*.75,90,“place me vertically near left edge.”

GTEXT xmx*.15,ymx*.68,30,“orient me at 30 degrees.” GRAPHICS OFF 产生的图表显示如下。

图 1

GTEXT 用途

GTEXT 用用户自定义文字作为图表块的标注。 语法结构

GTEXT x,y,angle,user_text GTEXT x,y,angle,A$ 说明

坐标x 和y 指的是文字字符串显示的地方的左下角位置,“user_text”既可以是提供的字符串常量,也可以是字符串变量名。angle 规定了文字相对于图表框是如何旋转的,它的默认值是0(水平)。也可参见SETTEXTSIZE。 例子

参见GRAPHICS 部分。 GTEXTCENT 用途

GTEXT 用用户自定义文字作为图表块的中心标注。 语法结构

GTEXTCENT y,user_text 说明

坐标y 是指文字字符串user_text 的垂直位置。也可参见SETTEXTSIZE。 例子

参见GRAPHICS 部分。 GTITLE 用途

除了文字需要被指定外,GTITLE 的其他部分和GTEXT 类似,GTITLE 指定的文字显示在图表的标题栏的中心。GTITLE 有利于使你定义的ZPL 图表看起来像标准的ZEMAX 图表。 语法结构

GTITLE user_text 说明

GTITLE 主要用来使你定义的图表与其他ZEMAX 图表看起来一样。 例子

参见GRAPHICS 部分。 HAMMER 用途

调用锤形优化法则使用当前评价函数来优化当前镜头。 语法结构

HAMMER

HAMMER number_of_cycles 说明

如果没有提供自变量,那么锤形优化运行1 圈;如果提供了一个自变量,那么这个自变量必须是1 到99 之间的一个整数,且锤形优化法则将运行指定的圈数。

相关函数 MFCN 例子

PRINT “Starting merit function:”,MFCN( ) HAMMER 3

PRINT “Ending merit function:”,MFCN( ) IF-THEN-ELSE-ENDIF 用途

IF 提供了条件程序的执行和分支。 语法结构

IF (expression) (statements) ELSE

(statements) ENDIF 或者

IF (expression) THEN (statement) 说明

IF-ELSE-ENDIF 结构被用来选择执行跟在IF 语句后面的语句群或者跟在ELSE 语句后面

的语句群,但不能全部执行。如果表达式的值为0 则认为它是假的,否则则认为它是真的。这个表达式可以是任意一种有效的ZPL 表达式类型,包括函数、变量、操作数和常量。虽然ELSE 语句是随意的,但IF 语句必须与ENDIF 成对出现。IF-ENDIF 语句对可以随意嵌套。IF-THEN 结构是单一指令的选择执行语句的简易形式。如果指定了一个THEN 关键字,那么IF 语句被终止,而且不需要ENDIF 语句。IF-THEN 结构不支持ELSE 关键字。 例子

x =1 y =2 IF (xPRINT “x is less than y.” ELSE

IF (x==y) THEN PRINT “x equals y.”

IF (x>y) THEN PRINT “x is greater than y.” ENDIF INPUT 用途

INPUT 提供了一种在宏指令运行时提示用户输入数值或文本数据的方法。 语法结构

INPUT “Prompt String”, variable INPUT variable

INPUT “Prompt String”, string_variable INPUT string_variable$ 说明

variable 必须是有效的变量名。如果变量名是一个字符串变量,那么输入的内容将被认为是文字字符串;否则则认为是数值。如果没有提供提示字符串,那么INPUT 命令将使用一个“?”提示符。提示符一直显示在屏幕上,而且输入的内容总是只从键盘键入。 例子

INPUT “Enter value for x:”, x PRINT “X=”, x

INPUT “Enter a value for A$:”, A$ PRINT A$ INSERT 用途

INSERT 在电子表格中插入一个新的表面。 语法结构

INSERT(n) 说明

n 必须是一个整数表达式的值。也可参见DELETE 和SURFTYPE。 例子

INSERT 5 INSERT i+2*j LABEL 用途

LABEL 为GOTO 命令提供目标,详细内容参见“GOTO”部分。 语法结构

LABEL label_number LABEL text_label 说明

label_number 必须是一个大于0 的整数,如1 或7。如果使用文字标记,那么它不能包括空格和其他一些用作分隔符的特殊符号。LABEL 本身对程序流程没有影响。 例子

LABEL 7

LABEL startover LINE 用途

LINE 是图表显示中的简单的画直线的函数。 语法结构

LINE oldx,oldy,newx,newy 说明

LINE 将求出四个表达式的值,并画出指定点的连线。坐标系是指当前图表框架,而且被限定在由XMIN、YMIN、XMAX 和YMAX指定的边界内。虽然仅只有整数像素值才可被准确划分,但LINE 也接收实数值作为其自变量,并把这实数坐标值四舍五入,取与其最接近的整数值。LINE 仅在图表模式中才有效。线的颜色由当前的墨水颜色控制,而墨水颜色则用关键字COLOR 指定。 例子

参见GRAPHICS 部分。 LOADCATALOG 用途

为当前载入的镜头重新载入玻璃及其存在的目录。 语法结构

LOADCATALOG 说明

当镜头被载入时,如果它的一些相关的玻璃目录和数据文件,包括文件COATING.DAT,还没有被载入,那么它们将被自动载入。然而,如果这些目录已被修改过了,也许是被ZPL 宏

指令自己改的,那么可能要用关键字LOADCATALOG 来强制重新载入这些目录。除非COATING.DAT 和玻璃AGF 目录文件被修改过了,否则从当前的ZEMAX 方案开始设计以来都不会使用这个关键字。 LOADLENS 用途

从磁盘中载入一个新的镜头文件来取代当前内存中的镜头文件。 语法结构

LOADLENS “filename” [appendflag] LOADLENS file$ [appendflag] 说明

LOADLENS 将从磁盘中载入一个新的镜头文件。如果文件名中包含完整的路径,如C:\\MYDIR\\MYLENS.ZMX,那么指定的文件将被载入;如果没有路径,那么将使用默认路径作为镜头的路径(参见文件菜单一章中环境下的内容)。如果appendflag 的值为0 或者没有appendflag, 那么LOADLENS 只简单地载入文件;如果appendflag 的值大于0,那么文件被加到由appendflag 的值指定的表面的后面。 例子

LOADLENS “COOKE。ZMX” 相关关键字

SAVELENS LOADMERIT 用途

从磁盘中载入一个评价函数文件来取代当前的评价函数。 语法结构

LOADMERIT “filename” LOADMERIT file$ 说明

LOADMERIT 将从磁盘中载入一个新的评价函数。如果文件名中包含完整的路径,如

C:\\MYDIR\\MYLENS.MF,那么指定的文件被载入;如果没有路径,那么将使用默认路径作为镜头的路径(参见文件菜单一章中参数选择下的目录) NEXT 参见FOR NUMFIELD 用途

设置定义的视场的数目。 语法结构

NUMFIELD NUMWAVE 用途

设置定义波长的数目。 语法结构

NUMWAVE OPEN 用途

打开一个现有的ASCII 数值文本文件,让READ 命令读入数据。 语法结构

OPEN “filename” OPEN A$ 说明

指定的文件名必须是提供的有效文件,或者包含文件名的字符串变量。参见关键字READ 和CLOSE。通常在读完所有的数据后才关闭文件。 例子

PRINT “Reading the double-column file TEST.DAT!” OPEN “TEST.DAT” READ x1, y1 READ x2, y2 READ x3, y3 CLOSE OPTIMIZE 用途

调用优化法则来用当前评价函数优化当前镜头。 语法结构

OPTIMIZE

OPTIMIZE number_of_cycles 说明

如果没有提供自变量,那么优化在“自动”模式下运行,当运算法则探测到这个过程已在聚集在一点时优化结束。如果提供了自变量,它必须是0 到99 之间的整数值,优化法则将运行指定圈数。 相关函数

MFCN 例子

PRINT “Starting merit function:”, MFCN( ) OPTIMIZE

PRINT “Ending merit function:”, MFCN( ) OPTRETURN 用途

通过使用优化操作数ZPLM 返回数值给优化法则。 语法结构

OPTRETURN (datafield) = (result) 说明

OPTRETURN 采用两个由等号隔开的自变量。表达式(datafield)的值必须在0 到50 之间。datafield 是指存放表达式(result)的值的数组位置。OPTRETURN 的唯一的目的是使在ZPL 宏指令中计算出的值可以被最优化。

优化操作数ZPLM 必须使用在评价函数中来调用ZPL 宏指令,再用OPTRETURN 得到返回的值。详细内容参见“优化”一章。 例子

x = SQRT(THIC(3)+RADI(5)) OPTRETURN j = x+5 OUTPUT 用途

指定文本输出的目的地,即可以输出到屏幕上,也可以输出到文件中。 语法结构

OUTPUT SCREEN OUTPUT “filename” OUTPUT “filename” APPEND OUTPUT A$ OUTPUT A$ APPEND 说明

如果单独定义了OUTPUT SCREEN,那么后面执行的PRINT语句将直接输出内容到屏幕上;如果提供了一个有效地文件名,那么后面执行的PRINT 语句将输出内容到该文件名指定的文件中。为了关闭先前创建的文件,可使用OUTPUT SCREEN,它将直接将后面的PRINT 的内容输出到屏幕上;SHOWFILE 将关闭这个文件,并把它发送到作为屏幕显示的文本阅览程序中;PRINTFILE 将关闭这个文件,并将它再当前定义的打印设备上打印出来。如果有关键字APPEND 跟在文件名后面,那么后面输出的内容将被加在这个文件的后面。否则,这个文件的内容将被覆盖。 例子

OUTPUT “x.txt”

PRINT “This will not appear on the screen, but in the file x.txt.” OUTPUT SCREEN

PRINT “This will appear on the screen.” OUTPUT “x.txt” APPEND

PRINT “This will appear after the first line in the file x.txt.”

相关关键字

CLOSE,OPEN,SHOWFILE,PRINTFILE PARn 用途

PARn 用来设定表面编号的第n 个参数。这个参数值在“表面类型”一章中已详细说明。每种表面模型都使用了0 到8 个参数值。 语法结构

PAR1 (surface) = (new_value) PAR8 (surface) = (new_value) 说明

这个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的值。求出表达式(surface)的值,取整后得到表面编号。如果表面编号小于0 或者大于表面数,则这条命令将被略过。否则,求出表达式(new_value)的值,再将之赋值。注意,PARn 是指8 个不同的命令:PAR1,PAR2,⋯⋯,PAR8。 例子

PAR1 (1) = 250 相关关键字

UPDATE PARAXIAL 用途

用来控制对于近轴光线或者实际光线是否使用光线定位。 语法结构

PARAXIAL ON PARAXIAL OFF 说明

当前的近轴模式可以通过调用一个函数PMOD 来建立,如果近轴模式关闭则函数返回0,否则则返回1。可用这个特点被来选择是用实际光线还是用近轴光线进行光线追迹。某些计算,如畸变测量,和计算一些第一顺序特性,如有效焦距,需要用近轴光线进行追迹。 例子

mode = PMODE( )

IF mode THEN PRINT “Paraxial mode is on !” IF !mode THEN PRINT “Paraxial mode is not on!” PARAXIAL ON

PRINT “Now paraxial mode is on!” PRINT “Restoring original mode⋯” IF !mode THEN PARAXIAL OFF PAUSE 用途

暂停程序执行,并且显示状态信息。 语法结构

PAUSE PAUSE x

PAUSE “Ready to continue⋯” PAUSE x+SQRT(5) 说明

当关闭图表窗口时,这个特性将被自动调用。

PIXEL 用途

在当前的图表窗口中打开一个像素点。 语法结构

PIXEL xcoord,ycoord 说明

这个特性有利于制作点列图。 POLDEFINE 用途

为后面的POLTRACE 命令定义输入的偏振状态。 语法结构

POLDEFINE Ex, Ey, Phax, Phay 说明

关键字POLDEFINE 被用来为后面的偏振光追迹定义输入的偏振状态。POLDEFINE 需要两个规格化的电场强度Ex 和Ey,同样需要X 和Y 方向的相位角(以度为单位)。默认值分别是0,1,0,0。偏振状态一旦被定义,它将一直保持到其被改变为止。 例子

POLDEFINE 2.0, 2.0, 45.0, -66.0 相关关键字

POLTRACE POLTRACE 用途

调用ZEMAX 偏振光追迹程序去追迹通过当前系统的特殊光线。 语法结构

POLTRACE (Hx), (Hy), (Px), (Py), (wavelength), (vec), (surf) 说明

表达式(Hx)和(Hy)必须在-1 到1 之间取值,它们代表归一化的对象坐标。瞳孔坐标由表达式Px 和Py 指定,它们也必须在-1 和1 之间取值。有关归一化坐标的更多内容请参见“约

定和定义”一章中的 “归一化的视场和光瞳坐标”部分。表达式wavelength 的值必须是1 到最大定义波长数之间的整数。表达式vec 的值必须是1 到4 之间的整数,包括1 和4。表达式surf 的值必须是1 到最大表面数之间的整数,包括这两个数。

光线输入的偏振状态由关键字POLDEFINE 定义。某条光线一旦被追迹,这条光线的偏振数据将被存放在由表达式vec 指定的向量变量中。例如,如果命令“POLTRACE Hx,Hy,Px,Py,w,2,n”被执行,那么数据将被存放在VEC2 中。数据以下面所述的格式储存,这里每行的第一个数字是指数组位置:

0: n,输入数组的数据个数 1: 在通过指定表面后光线的强度 2: 电场强度E 的x 分量,实部 3: 电场强度E 的y 分量,实部 4: 电场强度E 的z 分量,实部 5: 电场强度E 的x 分量,实部 6: 电场强度E 的y 分量,实部 7: 电场强度E 的z 分量,实部 8: 反射光中S 偏振光的振幅,实部 9: 反射光中S 偏振光的振幅,虚部 10: 透射光中S 偏振光的振幅,实部 11: 透射光中S 偏振光的振幅,虚部 12: 反射光中P 偏振光的振幅,实部 13: 反射光中P 偏振光的振幅,虚部 14: 透射光中P 偏振光的振幅,实部 15: 透射光中P 偏振光的振幅,虚部

如果数组位置0 的值为0,则将产生一个错误,而且偏振数据是无效 的。当指定的光线不能被追迹时将会产生这种情况。要摘录扩展错误 信息可参见RAYTRACE 命令。 例子

POLDEFINE 0, 1, 0, 0

POLTRACE 0, 1, 0, 0, PWAV( ), 1, NSUR( )

PRINT “Transmission of chief ray at primary wavelength is”,vec1(1) 相关关键字

POLDEFINE,RAYTRACE PRINT 用途

PRINT 用来输出常量文本和变量数据到屏幕上或者文件里,这依赖于由关键字OUTPUT 决定的当前状态。 语法结构

PRINT PRINT x

PRINT “The value of x is”, x PRINT “x=”, x, “x+y =”, x+y 说明

单独的PRINT 语句将打印一个空行。带有一列文本自变量和表达式的PRINT 语句将打印每个文本字符串(在双引号范围内)和每个表达式的数值。PRINT 语句使用由FORMAT 指定的数值输出格式。如果列表的最后一项后面跟着一个逗号,那么PRINT 将不用回车号结束这一行。 例子

x = 3

PRINT “X equals”, x PRINTFILE 用途

打印一个文本文件。 语法结构

PRINTFILE “filename” PRINTFILE NAME$ 说明

filename 必须是有效范围内的文件名或者包含有效文件名的字符串变量。这个文件必须是ASCII 码文件(由ZPL 中的OUTPUT 和PRINT 语句创建的),同时必须在当前目录下。即使没有执行CLOSE语句,PRINTFILE 也将关闭这个文件。 例子

OUTPUT “test.txt”

PRINT “Print this to the printer.” PRINTFILE “test.txt” 相关关键字

OPEN,OUTPUT,CLOSE,PRINT,PRINTFILE PRINTWINDOW 用途

打印任何打开的图表和文本窗口。 语法结构

PRINTWINDOW winnum 说明

winnum 的值必须是一个整数或者一个值为整数的表达式。整数winnum 对应于要打印的窗口编号。当窗口被打开时,ZEMAX 将从1开始给它们顺序编号。任何关闭的窗口将从窗口列表中删除,但余下的窗口不再重新编号。在一个窗口被关闭后打开的窗口将使用可用的最小

的窗口编号。 例子

PRINTWINDOW 5 PWAV 用途

设定主波长。 语法结构

PWAV(wavelength number) 说明

求出表达式(wavelength number)的值,把主波长设成这个指定的编号。 例子

PWAV 1 相关函数

WAVL,WWGT,PWAV RADI 用途

RADI 用来设定表面的曲率半径。 语法结构

RADI(surface) = (new_value) 说明

这个关键字需要两个关键字,一个用来指定表面编号,另一个用来定义一个新的值。求出表达式(surface)的值,取整后用来得到表面编号。如果这个表面编号的值小于0 或者大于最大的表面数,那么这条命令将被略过。否则,求出表达式(new_value)的值,并将之赋值。 例子

RADI i+m = -1200 相关关键字

UPDATE RAYTRACE 用途

调用ZEMAX 光线追迹程序去追迹通过当前系统的一条特殊光线。 语法结构

RAYTRACE (Hx), (Hy), (Px), (Py), (wavelength) 说明

表达式Hx 和Hy 必须在-1 到1 之间取值,象征归一化的对象坐标。瞳孔坐标由表达式Px 和Py 指定,它们也必须在-1 到1 之间取值。有关归一化坐标的更多内容请参见“约定和定义”一章中的“归一化的视场和光瞳坐标”部分。表达式wavelength 为随意值,默认为主波长,但如果提供了这个值,这个值必须是1 到最大定义波长数之间的整数。

一旦光线被追迹,那么这条光线的截取坐标和方向余弦将使用ZPL 函数RAYX,RAYY,RAYZ,RAYL,RAYM 和RAYN 来确定。如果在光线追迹过程中产生了错误,那么函数RAYE(对于RAY错误)将返回一个不是0 的数。如果RAYE 为负数,则表明在编号为返回值的绝对值的表面上产生了全反射。如果RAYE 大于0,则光线没有到达该表面。虽然对RAYE 的检查是随意的,但如果RAYE 不为0,则函数RAYX、RAYY、⋯⋯,将返回无效的数值。函数RANX、RANY 和RANZ 将返回截止表面的法线的方向余弦,函数OPDC 返回光线的光程差。函数RAYV 返回光线被挡住的表面的编号,如果光线没被挡住则返回0。返回的那些通过渐晕面的表面值不可能是准确的。 例子

PRINT “Tracing the marginal ray at primary wavelength!” n = NSUR( )

RAYTRACE 0, 0, 0, 1 y = RAYY(n)

PRINT “The ray intercept is”, y

PRINT “Tracing the chief ray at maximum wavelength!” RAYTRACE 0, 1, 0, 0, NWAV( ) y = RAYY(n)

PRINT “The ray intercept is”, y 相关关键字

RAYTRACEX RAYTRACEX 用途

调用ZEMAX 光线追迹程序去追迹通过当前系统的一条特殊光线。 语法结构

RAYTRACEX (x), (y), (z), (l), (m), (n), (surf), (wavelength) 说明

表达式x,y,z,l,m,n 定义了输入光线的位置和方向余弦。表达式surface 必须是0 和表面数减1 之间的整数,包括这两个数。表达式wavelength 为随意值,默认为主波长,但如果提供了这个值,则必须是1 到最大定义波长数之间的整数。

如果对象有无穷大的厚度,且参数surf 为0,那么虽然光线仍在对象介质空间中定义,但是要假定输入坐标与第一面有关,而不是对象面。否则ZEMAX 将不作任何更改而使用指定的坐标一旦光线被追迹,那么这条光线的截取坐标和方向余弦将使用ZPL函数RAYX,RAYY,RAYZ,RAYL,RAYM 和RAYN 来确定。注意只有那些从第“surf”面后的表面中得到才有效。

一旦光线被追迹,那么这条光线的截取坐标和方向余弦将使用ZPL 函数RAYX,RAYY,RAYZ,RAYL,RAYM 和RAYN 来确定。如果在光线追迹过程中产生了错误,那么函数RAYE(对于RAY错误)将返回一个不是0 的数。如果RAYE 为负数,则表明在编号为返回值的绝对值的表面上产生了全反射。如果RAYE 大于0,则光线没有到达该表面。虽然对RAYE 的检查是随意的,但如果RAYE 不为0,则函数RAYX、RAYY、⋯⋯,将返回无效的数值。函数RANX、RANY 和RANZ 将返

回截止表面的法线的方向余弦,函数OPDC 返回光线的光程差。函数RAYV 返回光线被挡住的表面的编号,如果光线没被挡住则返回0。返回的那些通过渐晕面的表面值不可能是准确的。 例子

n = NSUR( )

RAYTRACEX 0, 1, 0, 0, 0, 1, 0, NWAV( ) y = RAYY(n)

PRINT “The intercept is”, y 相关关键字

RAYTRACE READ 用途

从一个由OPEN命令读入的现已打开的ASCII码数值文本文件中读取数据。 语法结构

READ x READ x, y

READ x, y, z, a, b, c, q 说明

ASCII 码文件必须已经打开,详细内容参见关键字OPEN。每个READ 命令从文件中读入一行数据。这行的第一个位置的数据存放到列出的第一个变量中,第二个位置的数据存放到列出的第二个变量中,依次类推。因此,在READ 语句中列出变量的个数应该与文本文件中的列数相配对。文件中的数值数据应由空格隔开。数据的类型是任意的,并在内部将其提升为双精度。在一行中最多可以读入2000个字母。列出的变量必须是有效的ZPL 变量名。通常在所有的数据都被读入后关闭文件。参见函数EOFF。 例子

PRINT “Reading the double-column file TEST.DAT!” OPEN TEST.DAT READ x1, y1 READ x2, y2 READ x3, y3 CLOSE READSTRING 用途

从一个由OPEN命令读入的现已打开的ASCII码文本文件中读取数据。 语法结构

READSTRING A$ 说明

这个ASCII 码文件必须已经打开,详细内容参见关键字OPEN。每个READ 命令从文件中读

入一行。读入的整行数据被存放在列出的变量中。这个列出的变量必须是一个有效的ZPL 字符串变量名,这个变量名不必已被说明。通常在所有的数据都被读入后关闭文件。参见函数EOFF。 例子

PRINT “Reading the contents of file TEST.DAT!” OPEN TEST.DAT READSTRING A$ PRINT A$ CLOSE REM.! 说明

REM 用来指出这行的其余部分是注释。 语法结构

REM text ! text 说明

这个惊叹号也用来象征注释。如果命令REM 和符号“!”在一行的开端,在任何空格、制表符或者其他字母之前,那么它们仅被认为是注释指示器。任何其他用法将在运行时产生语法错误。 例子

REM any text can be placed after the REM command. ! any text can also be placed ! after the exclamation symbol. RETURN 参见GOSUB SAVELENS 用途

保存当前的镜头文件。 语法结构

SAVELENS [“filename”] SAVELENS NEW$ 说明

SAVELENS 将把当前镜头文件保存到磁盘中。当前内存中的镜头名也将被改变。如果文件名已存在,那么镜头数据将被保存在当前文件名中。 例子

SAVELENS

SAVELENS “NEWCOPY.ZMX”

SAVELENS NEW$ 相关关键字

LOADLENS SDIA 用途

SDIA 用来设定表面的半口径。 语法结构

SDIA(surface) = (new_value) 说明

这个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的值。求出表达式(surface)的值,取整后得到表面编号。如果表面编号小于0 或者大于表面数,则这条命令将被略过。否则,求出表达式(new_value)的值,再将之赋值。

如果new_value 的值是一个正数,则不管原来半口径的状态是什么,其状态都将变成“固定”。如果new_value 的值为负数,那么其状态将设成“自动”,它将再下次调用“UPDATE”时被更新。 例子

SDIA(5) = SDIA(4) 相关关键字

UPDATE SETAIM 用途

设定光线定位功能的状态。 语法结构

SETAIM state 说明

这个关键字需要一个数值表达式,它必须是0 到2 之间的整数。表达式state 是一个代码,0 代表无光线定位(关闭),1 代表近轴光线参考,2 代表实际光线参考。 例子

SETAIM 1 SETCONFIG 用途

为多重结构(变焦)系统设置当前结构。 语法结构

SETCONFIG (confignumber) 说明

这个关键字需要一个数值表达式,它必须是1 到最大结构数之间的整数。求出表达式的值,取整后得到结构编号。

例子

SETCONFIG 4 相关函数

CONF,NCON SETNSCPARAMETER 用途

设置非连续元件系统编辑界面中的任何对象的参数值。 语法结构

SETNSCPARAMETER surface, object, parameter, value 说明

这个关键字需要3 个数值表达式,它们的值是一个整数,分别指定非连续元件系统的表面编号、对象编号和参数编号。第四个自变量是为指定参数而定义的新值。 例子

SETNSCPARAMETER 4, 2, 15, newp15value 相关函数

NPOS,NPAR 相关关键字

SETNSCPOSITION SETNSCPOSITION 用途

设置非连续元件系统编辑界面中任何对象位置的x 坐标,y 坐标,z坐标,或者x 倾斜,y 倾斜, z 倾斜。 语法结构

SETNSCPOSITION surface, object, code, value 说明

这个关键字需要3 个数值表达式,它们的值是一个整数,分别指定非连续元件系统的表面编号、对象编号和一个代码。这个代码为1到6,分别代表x 坐标,y 坐标,z 坐标,或者x 倾斜,y 倾斜, z 倾斜。第四个自变量是为指定位置而定义的新值。 例子

SETNSCPOSITION 4, 2, 2, newyvalue 相关函数

NPOS,NPAR 相关关键字

SETNSCPARAMETER SETOPERAND 用途

将评价函数编辑界面中任意一行或者一列设成某一数值。

语法结构

SETOPERAND row, col, value 说明

这个关键字需要2 个数值表达式,它们的值是整数,分别指定评价函数编辑界面中的行和列。整数col 是1 则代表操作数类型;2 代表int1;3 代表int2;4-7 代表Hx-Py;8 代表目标值;9 代表权重。注意实际值和贡献百分数不能直接设定,只能计算得出。 例子

SETOPERAND 1, 8, tarvalue 相关函数

MFCN,OPER SETTEXTSIZE 用途

改变由命令GTEXT 写下的字符的大小。 语法结构

SETTEXTSIZE xsize, ysize 说明

这个两个由代表字符大小的自变量是指图表屏幕宽度的分数。例如,默认的文本尺寸是70,40,这意味着每个字符大小是图表屏幕宽度的1/70,以及屏幕高度的1/40。不带自变量则使文本尺寸恢复回默认值。 例子

! 使文本尺寸是默认值的两倍 SETTEXTSIZE 35, 20 ! 使文本尺寸恢复回默认值 SETTEXTSIZE SETTITLE 用途

设置镜头的标题,它通常将在所有的图中显示出来。 语法结构

SETTITLE A$

SETTITLE “Here is the lens title” SETUNITS 用途

设置当前的镜头长度单位 语法结构

SETUNITS code 说明

这个关键字需要一个数值表达式,它的值必须是0 到3 之间的一个整数。这个代码是0 则

代表毫米,1 代表厘米,2 代表英寸,3 代表米。这个功能不能以任何方式缩放或者转变镜头数据,它只能改变镜头的指示数据是如何表达的。 例子

SETUNITS 0 SETVAR 用途

改变用来优化的变量的状态。 语法结构

SETVAR (surface_expression), VARCODE,(status_expression) 说明

自变量surface_expression 的值必须是0 到最大表面数之间的整数,否则将产生一个错误。surface_expression 决定了哪个表面将被设成变量。VARCODE 必须是下列ASCII 记忆码之一:

R 代表曲率半径 T 代表厚度

C 代表二次曲线系数 Pn 代表参数n En 代表特殊数据值n

如果status_expression 的值是0,那么这个表面的变量状态被设成与优化无关。否则,这个值被设成可变的。 例子

SETVAR j+3, R, 1 SETVAR 5, P6, 0

SETVAR surfk+2, E06, status SETVECSIZE 用途

改变数组VEC1、VEC2、VEC3、VEC4 的最大容量。 语法结构

SETVECSIZE (expression) 说明

自变量expression 的值必须是1 到100,000 之间的整数。四个向量组变量总是有相同的容量。 SETVIG 用途

设置镜头的渐晕因子。 语法结构

SETVIG

说明

参见“约定和定义”一章中的关于渐晕因子的描述。 SHOWFILE 说明

使用ZEMAX 文件阅览器在屏幕上显示文本文件。 语法结构

SHOWFILE “filename” saveflag SHOWFILE NAME$ saveflag 说明

filename 必须是有效范围内的文件名,或者包含有效文件名的字符串变量。这个文件必须是一个ASCII 码文件(是在ZPL 中由OUTPUT 和PRINT 语句创建的),且必须在当前目录下。这个文件一旦被显示,它将和其他文本文件一样可以上下滚动以及被打印出来。可以滚动和打印数据的能力是用OUTPUT 和SHOWFILE 语句代替单一的PRINT 语句的主要优点。即使没有执行CLOSE 语句,SHOWFILE 也能关闭文件。如果自变量saveflag 为0 或者被省略,那么当窗口被关闭时这个也将被删除。如果saveflag 是一个非0 值,那么即使在窗口关闭之后文件仍将保留下来。 例子

OUTPUT “test.txt”

PRINT “Print this to a file.” SHOWFILE “test.txt” 相关关键字

OPEN,OUTPUT,CLOSE,PRINT,PRINTFILE SOLVETYPE 用途

改变一个给定表面和值的求解状态。这里仅支持有一部分求解类型,如要有关设置其他求解类型的信息请与FSI 联系。 语法结构

SOLVETYPE (surf_expression), CODE, (arg1), (arg2), (arg3) 说明

自变量surf_expression 的值必须是0 到最大表面数之间的一个整数,否则将产生错误。自变量CODE 必须是下表列出的一个ASCII记忆码。表达式arg1、arg2、arg3 的值分别是指在“求解”一章中规定的第一个、第二个、第三个求解参数。

关键字SOLVETYPE 中的代码 求解类型 曲率拾取(Curvature Pickup) 厚度拾取(Thickness Pickup) 厚度边缘光高(Thickness MarginalRay Height) 代码 CP TP TM 玻璃补偿(Glass Offset) 玻璃拾取(Glass Pickup) 锥形拾取(Conic Pickup) 参数1-8 拾取(Parameter 1-8 Pickup) 例子

GO GP KP P1, P2 ⋯ P8 !下一行将在表面7 上加一个玻璃拾取求解类型,从第5 表面拾取SOLVETYPE 7, GP, 5 ! 加一个比例因子为-1 的厚度拾取求解类型SOLVETYPE 7, TP, 5, -1 STOPSURF 用途

STOPSURF 用来设置用编号确定的当前光栏面的位置。 语法结构

STOPSURF (surface) 说明

这个关键字需要一个表达式,它的值必须是1 到表面数减1 之间的一个整数。 例子

STOPSURF n+2 相关关键字

UPDATE SUB 参见GOSUB SURFTYPE 用途

改变表面类型。 语法结构

SURFTYPE (surf_expression), CODE 说明

自变量surf_expression 的值必须是0 到表面数之间的一个整数。自变量CODE 是一个代表表面类型的整数值。这个整数代码可以在运行时由函数SCOD 确定。命令SURFTYPE 不能用来设置光栅漂移、光栅相位或者用户自定义表面。 例子

SURFTYPE j+1, SCOD(“STANDARD”) B$ = “EVENASPH” SURFTYPE 5, SCOD(B$) THIC 用途

THIC 用来设置表面的厚度。

语法结构

THIC (surface) = (new_value) 说明

这个关键字需要两个表达式,一个用来指定表面编号,另一个用来定义一个新的值。求出表达式(surface)的值,取整后得到表面编号。如果这个表面编号小于0 或者大于表面数,那么这条命令被略过。否则求出表达式(new_value)的值,再将之赋值。 例子

THIC i+m = THIC(i+n)-1 相关关键字

UPDATE TIMER 用途

重新设置内部时钟。这一特点与ZPL 函数ETIM( )联合使用可用来测量自最后一个TIMER 命令以来所经过的时间。 语法结构

TIMER 说明

TIMER 和ETIM( )主要用来测试ZPL 编译器和各种程序结构的运行效率。 例子

i = 0 TIMER LABEL 1 x = RAND(1000) i = i+1

IF i<10000 THEN GOTO 1 FORMAT .1

RPINT “Elapsed time:”, ETIM( ), “Seconds” UPDATE 用途

更新瞳孔位置、折射率数据、近轴常量、半口径、最大视场归一化数据和求解。如果自从上一次更新以来指示数据(如半径和厚度)已被改变, 那么必须在光线追迹和系统评价之前使用关键字UPDATE。如果UPDATE 命令后面跟着其他单词,如“ALL”,那么所有打开的窗口都同时被更新。 语法结构

UPDATE UPDATE ALL 例子

THIC 5 = THIC(5)-1 UPDATE

VEC1,VEC2,VEC3,VEC4 用途

这些关键字用来设置向量组变量VEC1、VEC2、VEC3 和VEC4。每个向量组可以储存一个由双精度浮点数组成的数组。 语法结构

VEC1 (array_subscript) = (new_value) VEC2 (array_subscript) = (new_value) 说明

VEC1⋯4 用来把一些用户数据存放到一个数组中。表达式array_subscript 可以是其值被取整的任意一个表达式。这个作为结果的整数表达式必须在0 和当前最大数组容量之间,数组的起始容量是100,否则将被告示一个错误。ZPL 功能VEC1⋯4 可被用来记录数据。为了改变默认容量使之不同于100,请使用关键字SETVECSIZE。 例子

i = 0 LABEL 1 i = i+1 VEC1(i) = i

IF i<10 THEN GOTO 1 j = 0 LABEL 2 j = j+1

VEC2(j) = VEC1(j)*VEC1(j) IF j<10 THEN GOTO 2 i = 0 LABEL 3 i = i+1

PRINT “x=”, VEC1(i), “x*x=”, VEC2(i) IF i<10 THEN GOTO 3 PRINT

PRINT “ALL done!” WAVL,WWGT 用途

WAVL 和WWGT 是用来改变波长的值和权重。 语法结构

WAVL (wavelength number) = (new_value)

WWGT (wavelength) = (new_value) 说明

这两个关键字需要两个表达式,一个用来指定波长编号,另一个用来定义一个新的值。求出表达式(wavelength number)的值,取整后得到波长编号。如果这个波长编号小于1 或者大于波长数,那么这条命令将被略过。否则,求出(new_value)的值,再将之赋值。 例子

WAVL 1 = 0.486 WAVL 2 = 0.587 WWGT 1 = 1.0 WWGT 2 = 0.65 相关函数

WAVL,WWGT 范例1

假设你需要一个程序取打印出每个定义视场角的主光线在像平面的截止坐标。通常这比你想象的更加必须,例如,ZEMAX 的点列图都是对应于主光线的坐标画出来的,因此拿截止坐标来充当这些数据是完全可以的。这对于横向的光线像差也是同样,它们也是以主光线为参考。学习ZPL 的最好的方法就是学习前面已写好的程序。仔细阅读下面的程序,并尽量理解程序的逻辑结构。

nfield = NFLD() maxfield = MAXF() n = NSUR() FOR i=1,nfield,1 hx = FLDX(i)/maxfield hy = FLDY(i)/maxfield PRINT “Field number”,i RAYRACE hx,hy,0,0,PWAV()

PRINT “x-field angle:”,FLDX(i),“y-field angle:”,FLDY(i) PRINT “x-chief ray :”,RAYX(i),“y-chief ray :”,RAYY(i) PRINT NEXT

PRINT “ALL done!”

程序的第一行调用了函数NFLD(),它将返回定义的视场数,并将它赋值给变量“numfield”,第二行调用了函数MAX(),它将返回最大的半视场角(以度表示),并将它存放在变量“maxfield”中。然后通过调用函数NSUR()将表面编号存放在变量“n”中。然后定义了一个以i 作为视场位置的计数器的FOR 循环,这个计数器从1 开始,最大值为nfield,每个循环的增量为1。定义“hx”和“hy”的两个程序行使用了函数FLDX()和FLDY(),它们将返回当前的编号为i 的视场位置的x-和y-角度。然后用关键字RAYTRACE进行光线追迹。注意主光线通

过瞳孔的中心,这就是为什么两个瞳孔坐标都为0 的原因。函数PWAV()返回主波长的编号,这通常是针对主光线的。各样的PRINT 语句将像面上的主光线坐标输出到屏幕上。如果你喜欢, 你可以试着将程序输入到ZPL 末尾的文件中(如CHIEF.ZPL),然后在ZEMAX 内运行它来进行测试。当主光线为参考点时,得到的坐标与那些在点列图中列出的是一样的。 范例 2

这是一个估计当前光学系统的均方根斑点尺寸(轴上)的ZPL 程序例子。程序追迹许多通过系统的随机光线,并记录下这些光线相对于主波长的主光线的偏离量。当前波长的权重被应用来估计均方根斑点尺寸。

PRINT “Primary wavelength is number”, FORMAT .0 PRINT PWAV(), FORMAT .4

PRINT “which is”,WAVL(PWAV()),“microns.”

PRINT “Estimating RMS spot size for each wavelength.” ! 追迹多少条随机光线来估算? n = 100 ! 初始化时钟 TIMER

! 储存表面数以备后用 ns = NSUR() ! 从波长1 开始 weightsum = 0 wwrms = 0

FOR w = 1,NWAV(),1 rms = 0 FOR i = 1,n,1 hx = 0 hy = 0

angle = 6.283185*RAND(1) ! SQRT 可在瞳孔处产生均匀分布 radius = SQRT(RAND(1)) px = radius*COSI(angle) py = radius*SINE(angle) RAYTRACE hx,hy,px,py,w x = RAYX(ns) y = RAYY(ns)

rms = rms+(x*x)+(y*y)

NEXT

rms = SQRT(rms/n)

wwrms = wwrms+(WWGT(w)*rms) weightsum = weightsum+WWGT(w) FORMAT .4

PRINT “RMS spot size for ”,WAVL(w) FORMAT .6

PRINT “ is ”,rms NEXT

wwrms = wwrms/weightsum

PRINT “Wavelength weighted rms is ”,wwrms FORMAT .2 t = ETIM()

PRINT “Elapsed time was ”,t,“ seconds.”

注意开始两个PRINT 语句中后缀逗号的使用。它们允许从开始三个PRINT 语句打印出来的数据显示在同一行中。中间的FORMAT语句改变了要打印的数值输出的格式,即使它们可能是同一行的。字符“!”用来表明一个注释语句,当程序运行时这些语句将被略过。

第二十五章 ZEMAX 扩展

介 绍

这个特性仅对ZEMAX 的EE 版本有效

ZEMAX 有一个功能非常强大的特性,它允许其他Windows 程序建立一个与ZEMAX 相连的信息传递链,并可以为这个程序从ZEMAX 中获取有关镜头的数据。它的意思是一个其它程序可以使用ZEMAX 来追迹光线通过镜头,然后将数据传输到这个程序中进行进一步的分析和计算。有三种相互紧密联系的方法可以利用这一特性来扩展ZEMAX 的这一性能:

第一,可以设计一个Windows 程序来建立与ZEMAX 相连的链,它被用来获取ZEMAX 提供的有关镜头的数据—有代表性的是光线追迹数据和其他的光学数据。这个程序可以以它认为合适的方法来使用这些数据。

第二,一个程序可以做它自己的由用户“隐藏”的分析,然后在ZEMAX 通常的图表和文本窗口中显示产生的数据。当使用这种模式时,这个程序被称为ZEMAX 的一个“扩展程序”。扩展程序看起来和ZEMAX 程序中的“扩展”菜单下的菜单选项一样。扩展程序必须 放在目录\\Extend 中,以便于ZEMAX 来运行它们。

第三,程序可以用来计算ZEMAX 可以优化的数据。在这种模式里,程序被称为“用户自定义操作数”或者UDO。这些UDO 必须放在目录\\UDO 中,以便于ZEMAX 来运行它们。

那些需要复杂的用户界面,带有许多输入、菜单、按钮、和复杂的输入和输出格式的应用程序比较适合于作为一个程序,它们不需要利用ZEMAX 来显示计算结果。那些可以进行复杂计算,但只需一个简单的对话框类型的用户界面的应用程序比较适合于结合ZEMAX 来

作为一个扩展程序。扩展程序有着和正规的ZEMAX 分析程序十分相象的观察和操作优点。其执行特性,如可以在ZEMAX 内观看扩展程序,更新,改变设置,被打印,被复制到剪贴板上,或者被平移和缩放,和其他的ZEMAX 分析窗口一样。

UDO 作为应用程序,可以计算那些必须由ZEMAX 优化程序优化的数据。UDO 在“优化”一章中的“用户自定义”中被详细介绍。编写得很好的应用程序甚至可以和一个程序或者扩展一样操作,如在范例一节中介绍的那样。

在应用程序和ZEMAX 之间的信息传递可使用动态数据交换(DDE)来完成。DDE 是为了在程序间分享数据而在Windows 操作系统内部定义的一个协议。两个程序可以建立一条DDE 链,其中一个扮演“服务程序”,另一个扮演“客户程序”。客户程序通常向服务程序要求特殊的数据,而服务程序则将这些数据发送给客户程序。

ZEMAX 被作为服务程序,而其他任意一个Windows 程序做一些正确的修改,可以被作为一个客户程序。这一章定义了连到ZEMAX的DDE 界面,以便于用户可以编写软件程序来利用ZEMAX 的光线追迹引擎。 编写扩展程序的要求 这一章和DDE 特性的目的是帮助经验丰富的程序员编写可以与ZEMAX 连接的编码。这一特性允许程序员编写第三种类型的程序,在与ZEMAX 的联系中工作。第三种类型的程序可以将ZEMAX 用作光线追迹引擎,而且提供了界面,图表,输入输出,和扩展计算,这些都作为分析的一个特殊类型被用户化。使用这一特性需要一定的Windows 和C 语言编程的知识,至少要掌握有关信息传递,信息循环,存储器管理,和空间单元,操作,和指示的知识。包含了学习DDE 编程所需的所有的信息的一本很好的书是由微软公司的Charles Petzold 编写的《ProgrammingWindows 95》。在这一章的正文中的范例和编码一节不是一个完整的程序,而是仅用来作为例子的编码片段。虽然编写Windows 应用程序稍微有些复杂,但比较好的是所有的困难编码都已经编好了,而且可以用来学习和利用。关于建立与ZEMAX 相连的信息传递链的详细资料已被设计好,而且可以仅将样本编码做一些必要的修改后再“剪贴”成与特殊计算相关的编码。也由一个C 语言源代码文件,称为ZCLIENT,它通过将所有的信息压缩到函数包中来大大简化和ZEMAX 之间的DDE 信息传递。

ZCLIENT 提供了少量的简单函数,它们可以被调用来从ZEMAX 中获取数据,这不需要有关DDE 编程的知识。ZCLIENT 将在这一章的后面部分进行介绍。ZEMAX 提供了有关客户程序和扩展程序的完整范例,包括源代码,将在这一章的最后说明。

扩展程序的能力在于它的价值,虽然它是合理的。使用DDE 特性要求用户有一个相匹配的编译器或者发展工具,可以用来产生32位的Windows 执行结果。这也是假设用户可以编写所要求的编码,最重要的是要确保编码是可靠的,没有错误的。为了使速度达到最大,ZEMAX 对由客户程序返回的数据不进行错误检查,因此,有错误的扩展程序将使ZEMAX 计算失败,或者使ZEMAX进入一个无限循环。由于这个原因,关于DDE 或者扩展程序的执行的技术支持被严格来阐明提供的范例文件可以正确工作。如果你需要一个ZEMAX 扩展程序,但没有愿望或能力自己来编写它们,请随意和FSI联系,提出开发一个自定义程序来满足你的要求。FSI 在开发这些类型的程序方面有相当丰富的经验,通常可以很快地以非常具有竞争性的价格编

写扩展程序。 传递链的建立 为了建立与ZEMAX 之间的DDE 链,客户程序必须将一条包括有关应用程序名和主题名称的参考的信息传送到所有顶级窗口中。对于ZEMAX 来说,应用程序名是“ZEMAX”,主题名称可以是任意一个非空的字符串。ZEMAX 不使用这个主题名称,只用应用程序名和“项目”。这项目给ZEMAX 指出了哪些数据将被申请。ZEMAX 支持的各种项目将在后面说明。特殊代码的例子可参见许多的样本DDE 客户代码。

一旦建立了DDE 链,服务程序可以执行任意基于光线追迹的分析,而且数据被返回到客户程序中。 传递链的终止 当所有的计算都完成了,DDE 链将由客户程序终止,客户程序将向ZEMAX 服务程序发送一条终止信息。这条信息将仅仅终止ZEMAX 的服务程序部分,而不是ZEMAX 本身。 从ZEMAX 中获取数据 ZEMAX 支持许多DDE 下的许多功能。每个函数都被取了一个名称,被成为“项目”,通过WM-DDE-REQUEST 信息将这个项目传送到ZEMAX 中。在项目名称中通过编码将ZEMAX 需要的数据(例如追迹一条光线)传送到ZEMAX 中。大多数项目有一个简单的名称,不需要进一步编码,但一些项目有编码数值添加到名称中。这个编码数值被添加到项目名称中,用逗号分开。

ZEMAX 将用WM-DDE-DATA 信息对每个项目请求做出回应,这个信息中包含一个指向一块用来存放字符串的存储器的指示器。大多数数据将放在字符串中从ZEMAX 传送到客户应用程序中,这相当于CF-TEXT 格式。这个客户应用程序必须记录这个字符串,并释放字符串的记忆内容。关于特殊编码的例子可参见许多的样本DDE 客户程序编码。 数据项目 这里是被支持的数据项目: CloseUDOData

这个项目用来关闭用户自定义操作数缓冲器,这允许ZEMAX 优化程序继续下去。仅当执行一个用户自定义操作数或者UDO 时,才使用这个项目名。UDO 在“优化”一章中详细说明。详细内容可参见那一章。CloseUDOData 的语法结构是:

CloseUDOData,缓冲器代码

也可参见GetUDOSystem 和SetUDOItem。 DeleteSurface

这个项目用来删除一个已存在的表面。其语法结构为: DeleteSurface,表面编号 也可参见InsertSurface。 FindLabel

这个项目查找一个有与指定表面关联的整数标记的表面。其语法结构为: FindLabel,标记

得到的数据是带有相同整数标记的第一个表面的表面编号,或者如果没有表面有指定的标记,则得到的数据为-1。也可参见SetLabel和GetLabel。 GetAddress

这个项目记录了环境设置中第1,2,3,或者4 行的地址。其语法结构为: GetAddress,1

对于第2,3,和4 行有着类似的命令。如果用户选择了隐藏这个地址栏,则所有字符串都将得到简单的“\\r\\n”。 GetAperture

这个项目记录了表面口径数据。其语法结构为: GetAperture,表面编号 得到的字符串有着如下的格式:

“类型,最小值,最大值,x 偏心,y 偏心”

这个项目得到的类型是一个整数代码;0 代表没有口径,1 代表环形口径,2 代表环形挡光,3 代表星形,4 代表长方形口径,5 代表长方形挡光,6 代表椭圆口径,7 代表椭圆挡光,8 代表用户自定义口径,9 代表用户自定义挡光,以及10 代表浮动口径。这个最小值和最大值对于椭圆、长方形、和星形口径有着与环形口径不一样的意义;详细内容可参见编辑菜单一章。 GetAspect

这个项目记录了显示的图表的外表比率和以当前镜头长度单位表示打印纸的宽度或高度。例如,如果当前的外表比率是3*4,则得到的外表比率将为0.75。当画等大的图表时,需要知道正确的外表比率。得到的数据格式是外表比率,宽度。如果外表比率大于1,那么该图用的是高度,而不是宽度,得到的数据的格式为外表比率,高度。 其语法结构为:

GetAspect,文件名

这里的文件名是与被创建或更新的窗口相联系的临时文件的名称。如果不用临时文件名,则得到默认的外表比率和宽度(或高度)。 GetBuffer

项目GetBuffer 用来从一个被更新的窗口中得到客户程序指定的数据。其语法结构为: GetBuffer,n,tempfile

这里n 是缓冲器编号,它必须是在0 到15 之间,包括这两个数;tempfile 是与被更新的窗口相联系的临时文件的名称。当ZEMAX 调用客户程序时,这个临时文件名将被传送到这个客户程序中;详细内容可参见“ZEMAX 如何调用客户程序”的说明。注意,每个窗口都可能有它自己的缓冲器数据,ZEMAX 使用这个文件名来识别窗口,为此要求得到缓冲器内容。也可参见SetBuffer。 GetComment

无论是什么,这个项目都记录表面的注释。要得到注释数据的表面编号被添加到项目名中,例如,要得到表面5 的注释,项目名应该是“GetComment,5”。

GetConfig

这个项目摘录了当前的结构编号、结构的个数、和多重结构操作数的个数。得到的字符串的格式如下:

“当前结构编号,结构个数,多重结构操作数个数”。 也可参见项目SetConfig。 GetDate

这个项目摘录了当前的日期和时间,这以用户在ZEMAX 环境对话框中选择的格式表示。 GetExtra

这个项目摘录了特殊表面数据。对应于得到的数据的表面被添加到这个项目的名称的后面。例如,为了得到表面8 的特殊数据,这个项目名应该是“GetExtra,8”。得到的字符串的格式如下:

“特殊数据1,特殊数据2,特殊数据3,⋯⋯”

这个项目得到对应的表面编号作为一个证实数据。其它项目是自我说明的。 GetField

这个项目摘录了视场数据。语法结构为 GetField,n

这里n 为零或者视场编号。如果n 为零,则得到的字符串有以下格式: “类型,数量”

类型参数是一个整数,为0、1、或者2 中的一个,分别代表以度表示的角度、物高、或者近轴近轴象高。数量参数是当前定义的视场的个数。如果n 不为零,而是对应于一个有效的视场编号,得到的字符串有以下格式:

“x 视场,y 视场,权重,vdx,vdy,vcx,vcy”

这7 个值是表示不同的视场数据的指数格式的浮点数。也可参见SetField。 GetFile

这个项目摘录了镜头的完整名称,包括驱动器名和路径名。如果要修改这个文件,则要十分小心,因为在任意时刻,ZEMAX 都可能要从这个文件读取数据或者写数据到这个文件中。 GetFirst

这个项目摘录了关于镜头的第一次序数据。得到的数据的格式如下: “焦距,pwfn,rwfn,pima,pmag”

在这个字符串中的值分别是有效焦距、近轴工作F/#、实际工作F/#、近轴象高、和近轴放大率。 GetGlass

这个项目摘录了与任意一个表面使用的玻璃有关的一些数据。语法结构为: GetGlass,表面

如果指定的表面是无效的,不是由玻璃构成的,或者是梯度折射率表面,则得到的字符串是空的。这个数据对于那些在FdC 波带外定义的玻璃来说可能是无意义的,得到的字符串的格式如下:

“名称,nd,vd,dpgf” GetGlobalMatrix

这个项目得到要求的矩阵,将任意当前坐标系(如光线追迹)转化成空间坐标系。关于空间坐标矩阵的详细内容可参见在系统菜单一章中的“空间坐标参考表面”部分。 这个项目的语法结构为:

GetGlobalMatrix,表面 得到的数据字符串有如下格式:

“R11,R12,R13,R21,R22,R23,R31,R32,R33,XO,YO,ZO” GetIndex

这个项目摘录了任意一个表面的折射率数据。语法结构为: GetIndex,表面

如果指定的表面是无效的,或者是梯度折射率表面,则得到的字符串是空的。否则,得到的字符串的格式如下:

“n1,n2,n3,⋯⋯”

这里的折射率数值按顺序对应于每个定义波长的折射率。 GetLabel

这个项目重新得到与指定表面有关的整数标记。语法结构为: GetLabel,表面

得到的数值是表面的标记。也可参见SetLabel 和FindLabel。 GetName

这个项目摘录了镜头的名称。得到的字符串是当前镜头的名称,与在通用数据对话框中输入的一样。 GetPath

这个项目摘录了指向ZEMAX 被安装于其中的目录的完整路径,和指向镜头的默认目录的路径。得到的字符串由一个逗号分开。 GetPolState

这个项目摘录了由用户设置的默认偏振状态。这个数据的格式如下: “nIsPolarized,Ex,Ey,Phax,Phay”

如果nIsPolarized 是不为零的任意值,则默认偏振状态为无偏振。否则,使用Ex、Ey、Phax、和Phay 来定义偏振状态。Ex 和Ey 应该各自被归一化成一个单位数量,尽管这不被要求。Phax 和Phay 以度来表示。可以参见SetPolState。 GetPupil

这个项目摘录了光瞳数据。得到的字符串的格式如下:

“类型,数值,ENPD,ENPP,EXPD,EXPP,变迹类型,变迹因子”

类型参数是一个象征系统孔径类型的整数,是0 和5 之间的一个数,分别代表入瞳直径、象空间F/#、物空间NA、通过光栏尺寸浮动、近轴工作F/#、或者物方锥形角。数值参数是系统的孔径数值,除非使用的是通过光栏尺寸浮动类型,在这种情况中,这个数值是光栏表面

的半口径。接下来的4 个数值是入瞳直径、入瞳位置、出瞳直径、和出瞳位置,这些都是以镜头长度单位表示。变迹类型是一个整数,它被设为0 来代表均匀,1 代表高斯,2 代表正切。变迹因子是在通用数据对话框中显示的数值。 GetPolTrace

这个项目与GetTrace 非常相似,它有一个追迹通过系统的偏振光线的附加功能。详细内容可参见GetTrace 的资料。项目GetPolTrace 的语法结构如下:

GetPolTrace,波长,模式,表面,hx,hy,px,py,Ex,Ey,Phax,Phay

自变量和GetTrace 是一样的,除了那些附加的自变量Ex、Ey、Phax、和Phay。Ex 和Ey 是在x 和y 方向上的归一化的电场幅度。等式Ex*Ex+Ey*Ey 应该有一个为1 的值(有一个重要的例外,这在下面说明),尽管任意一个值都可以接受。Phax 和Phay 是相对相位,以角表示。

如果Ex、Ey、Phax、和Phay 都为零,而且仅在这种情况中,ZEMAX 假设一条“无偏振”的光线是需要的。一条无偏振光线的追迹实际上要求ZEMAX 追迹两条正交的光线,对得到的传递强度求平均值。如果四个数值中的任意一个不为零,则要追迹一条偏振光线。例如,为了在波长编号2 的波长处追迹一条实际的无偏振边缘光线到象面,这个项目字符串为:

GetPolTrace,2,0,-1,0.0,0.0,0.0,1.0,0,0,0,0 对于偏振光线,数据信息将以下面的格式返回:

“error,intensity,Exr,Eyr,Ezr,Exi,Eyi,Ezi”

如果成功地追迹了光线,则整数error 将为零,否则它将是一个正数或负数。如果为正数,则光线避过有error 说明地表面。如果为负数,则光线在由数值error 的绝对值给出的表面上发生全反射(TIR)。在使用字符串的余下部分之前,要始终检查以确保光线数据是有效的。intensity 是传递强度。它总被归一化成一个单位的输入电场强度。这个传递强度计算了表面、薄膜、和总体吸收效果,但是不考虑有无光线被拦住。Ex、Ey、和Ez是电场分量,带着的字母r 和i 代表实部和虚部。对于无偏振光线,得到的数据信息很简单,为:

“error,intensity”

虽然GetPolTrace 很容易用来编程和使用, 但是使用GetPolTrace 有一个重要的缺点:每次DDE 调用,只能追迹一条光线。通过DDE 来传输数据的操作与光线追迹相比较是很多的,因此如果要求追迹大量的光线,则执行过程可能会相应的减慢。关于追迹大量光线的信息可参见在这一章的其它地方的“大量光线的追迹”部分的说明。也可参见GetPolTraceDirect。 GetPolTraceDirect

GetPolTraceDirect 为由GetTraceDirect 所做的ZEMAX 光线追迹引擎提供了同样直接的方法,同样也允许追迹偏振光线。关于GetTrace 直接方法版本的重要细节可参见GetTraceDirect。项目GetPolTraceDirect 的语法结构为:

GetPolTraceDirect,波长,模式,开始表面,停止表面,x,y,z,l,m,n,Ex,Ey,Phax,Phay

参数Ex、Ey、Phax、和Phay 与在GetPolTrace 中定义的一样。返回的数据信息的格式与在GetPolTrace 中说明的一样。

GetRefresh

这个数据项目使ZEMAX 将LDE 中的镜头数据复制到服务程序中储存的副本中。然后更新这个镜头,这意味着ZEMAX 将重新计算所有的光瞳位置、求解、和折射率数据。如果这个镜头可以被更新,则ZEMAX 返回一个字符串“0”,否则返回“-1”。如果GetUpdate 返回“-1”,则不执行任何光线追迹。所有后面的命令都将影响新复制的镜头数据或者在它的基础上被执行。旧的镜头数据不能被恢复,即使这被要求。也可参见GetUpdate 和PushLens。 GetSag

这个项目计算任意一个表面的矢高。这个项目名的格式为“GetSag,表面,x,y”,这里表面是表面编号,x 和y 是表面上计算矢高处的坐标。得到的字符串的格式为“矢高,改变的矢高”。x、y 和矢高的值都是以镜头长度单位表示的。 GetSequence

这个项目得到在服务程序存储器中的镜头的序号,然后是在LDE中的镜头的序号,这两个有一个逗号分开。 GetSerial

这个项目得到ZEMAX 密码锁的序列号。 GetSolve

这个项目得到关于任一表面上的任一求解的数据。它的语法结构为“GetSolve,表面,代码”,这里代码是一个整数代码,指出了这个求解数据是用在哪个表面参数上的。得到的求解数据以下列格式表示,这与代码值有关。 GetSolve 代码 得到的数据的格式

0,曲率 求解类型,参数1,参数2 1,厚度 求解类型,参数1,参数2,参数3 2,玻璃 求解类型,拾取表面编号 3,半口径 求解类型,拾取表面编号 4,圆锥系数 求解类型,拾取表面编号 5-12,参数

1-8,求解类型,拾取表面编号,补偿,比例因子

求解类型是一个整数代码,这些参数有着依赖于求解类型的意义;详细内容可参见“求解”一章。也可参见SetSolve。 GetSurface

这个项目摘录了表面数据。要返回数据的表面编号被附加在项目名称后面,例如,为了得到表面8 的数据,这个项目的名称应该为“GetSurface,8”。得到的字符串的格式如下:

“类型,曲率,厚度,玻璃,半口径,圆锥系数,p1,p2,p3,p4,p5,p6,p7,p8” 这个项目得到一个8 个字母的字符串的表面类型。注意,下一个数据项是曲率,而不是半径。其它项都是自我解释的。也可参见SetSurface。 GetSystem

这个项目摘录了系统数据。得到的字符串的格式如下:

“表面数量,单位代码,光栏表面编号,非轴对称标记,光线定位类型,环境数据,温度,压力,空间参考表面”。

这个项目得到了表面的数量,单位代码(0、1、2、或3 分别代表mm、cm、in、或M),光栏表面编号,用来指明系统是否是非轴对称系统(0 代表假,说明它是一个轴对称系统;或者如果系统是非轴对称的则为1)的非轴对称标记,光线定位类型(0、1、2 分别代表无、近轴光线、实际光线),使用的环境数据标记(0 代表不是,1代表是),当前温度和压力,以及空间坐标的参考表面编号。也可参见SetSystem 和GetSystemAper。 GetSystemAper

这个项目摘录了系统的光圈数据。得到的字符串的格式如下: “类型,光栏表面编号,光圈值”

这个项目得到了系统的光圈类型(0、1、2、3、4、或5 分别代表入瞳直径、象空间F/#、物空间数值孔径、通过光栏尺寸浮动、近轴工作F/#、或物方锥形角),光栏表面的编号,和系统的光圈值。如果光圈类型为通过光栏尺寸浮动,则光圈值为光栏表面的半口径。也可参见GetSystem 和SetSystemAper。 GetTol

这个项目摘录了公差数据。它的语法结构为: GetTol,n

这里n 为0 或者其它公差操作数编号。如果n 为0,得到的字符串的格式如下: “number”

这里number 为定义的公差操作数的数量。如果n 不为0,而是对应于一个有效的操作数的编号,则得到的字符串的格式如下:

“公差类型,int1,int2,min,max” GetTrace

这个项目要求客户程序提供附加数据。为了追迹一条光线,ZEMAX 需要知道相应的视场和光瞳坐标、波长、模式(实际,模式=0;或者近轴,模式=1),以及要追迹光线到其上的表面。所有这些数据都被编码,附加在项目名称的后面。这通过定义由逗号分开的不同参数来实现,如下:

GetTrace,波长,模式,表面编号,hx,hy,px,py

例如,要追迹在波长3 处的实际主光线到表面5,这个项目字符串为

GetTrace,3,0,5,0.0,1.0,0.0,0.0

虽然这看起来麻烦,但是它易于编程,是将数据送进ZEMAX 的最简单的方法。ZEMAX 接受这个项目,辨别在这个名称开头的“GetTrace”,记下这个字符串的其余部分,然后分析它,以及追迹光线。通常,仅仅需要在象面上的光线数据;通过将表面编号设置为-1,可产生在象面上的光线数据。注意,0 被用来代表物面。返回的数据信息有如下格式:

“error,vigcode,x,y,z,l,m,n,l2,m2,n2,intensity”

如果光线追迹成功,则整数error 为零,否则它将是一个正数或者负数。如果是正数,则光线将避过由error 指出的表面,如果是负数,则光线在由数值error 的绝对值给出的表面上

发生全反射(TIR)。在使用这个字符串的余下部分之前,始终要检查以确保光线数据是有效的。参数vigcode 是指光线被拦光的第一个表面。除非在那个面上发生错误或者后来才到那个面,否则这条光线将继续被追迹通过被要求的表面。

x、y、和z 的值是指在被要求的表面上坐标。

l、m、和n 的值是指折射进入跟在被要求的表面以后的介质中以后光线的方向余弦。 l2、m2、和n2 的值是指在被要求的表面上的表面截止点的法线的方向余弦。 intensity 是光线的相对强度,包括定义的任一光瞳或者表面的照度分布。

虽然GetTrace 易于编程和使用,但是使用GetTrace 有一个重要的缺点:每次DDE 调用只能追迹一条光线。通过DDE 传输数据的操作与光线追迹相比要多得多,所以如果要求追迹大量的光线,则执行将相应减慢。关于大量光线的追迹的信息,可参见这一章中其它地方的“大量光线的追迹”部分的说明。也可参见GetTraceDirect。 GetTraceDirect

GetTraceDirect 为ZEMAX 的光线追迹引擎提供了一个比较直接的方法。通常,光线是由归一化的视场和光瞳坐标hx、hy、px、和py。ZEMAX 获得这些归一化坐标,计算物体坐标(x,y,和z)和到入瞳目标点(l,m,和n)的方向余弦(l,m,和n,分别代表x、y、和z 方向余弦)。 然而,有时直接规定x、y、z、l、m、和n 更适合于追迹光线。直接规定对于光学系统中的任意地方的光线有定义起始表面方面的额外的适合性。这个适合性表现在一个特殊的客户程序上,这个程序用来严格确保光线起始坐标是有效的。

与GetTrace 一样,这个项目要求客户程序提供附加数据。为了追迹光线,ZEMAX 必须知道x、y、z、l、m、n、波长、模式(实际光线,模式=0;或者近轴光线,模式=1)以及光线追迹的起始和终止表面。所有这些数据都要被编码,附加在项目名称的后面。这是通过定义由逗号隔开的不同参数来实现的,如下:

GetTraceDirect,波长,模式,起始表面,终止表面,x,y,z,l,m,n 返回的数据信息的有如下格式:

“error,vigcode,x,y,z,l,m,n,l2,m2,n2,intensity”

这里的参数和GetTrace 的参数是完全一样的,除了intensity 之外。Intensity 是光线的相对传递强度,但排除任何定义的光瞳照度分布在外。注意,GetTrace 包括光瞳照度分布,而GetTraceDirect 没有。但两者都包含了表面照度分布。

虽然GetTraceDirect 易于编程和使用,但是使用GetTraceDirect有一个重要的缺点:每次DDE 调用只能追迹一条光线。通过DDE传输数据的操作与光线追迹相比要多得多,所以如果要求追迹大量的光线,则执行将相应减慢。关于大量光线的追迹的信息,可参见这一章中其它地方的“大量光线的追迹”部分的说明。也可参见GetTrace。 GetUDOSystem

这个项目被用从优化程序存储器中载入一个特定镜头,送到ZEMAX 的服务程序存储器中。使用这个项目名的唯一一次机会是在执行一个用户自定义操作数或者UDO 时。UDO 在“优化”一章已详细说明了。其详细内容可参见那一章。GetUDOSystem 的语法结构为:

GetUDOSystem,缓冲器代码

这里的缓冲器代码是一个在命令行中的被传送到UDO 中的整数。也参见SetUDOData。 GetUpdate

这个数据项目使ZEMAX 去更新一个镜头,这意味着ZEMAX 将重新所有的光瞳位置、求解、和折射率数据。如果镜头可以被更新,则ZEMAX 返回字符串“0”,否则,它将返回字符串“-1”。如果GetUpdate 得到“ -1 ”,则将不执行任何光线追迹。可以参见GetRefresh。 GetVersion

这个项目得到ZEMAX 的版本号。 GetWave

这个项目摘录了波长数据。其语法结构为: GetWave,n

这里n 为零或者波长编号。如果n 为零,则得到的字符串的格式如下:

“主波长,数量”

参数主波长是一个整数,它指出了哪个波长是主波长。参数数量是指当前定义的波长的数量。如果n 不为零,而是对应于一个有效的波长编号,则得到的字符串的格式如下:

“波长,权重”

这两个数值都是指数格式的浮点数,它们对应于指定波长的数值和权重。也可参见SetWave。 InsertSurface

这个项目插入了一个新的表面。其语法结构为: InsertSurface,表面

新的表面将被放在由参数表面指定的位置上。也可参见SetSurface 关于新表面的数据定义的内容,以及项目DeleteSurface。 LoadFile

将一个ZEMAX 文件载到服务程序中。注意,文件的载入不会改变在LDE 中显示的数据;服务程序有这个镜头数据的一个副本。要载入的文件名被附加在LoadFile 的项目名称之后,而且必须包括完整的路径名。例如: “ LoadFile ,C:\\ZEMAX\\SAMPLES\\COOKE.ZMX”。在更新这个新载入的镜头文件之后,这个项目得到的字符串和项目GetUpdate 的是相同的。如果得到一个不为零的数值,则更新失败;如果得到-999,则这个文件不能被载入。也可参见GetPath、SaveFile、和PushLens。 LoadMerit

载入一个ZEMAX 的.MF 或者.ZMX 文件,记录它的评价函数,并将它放到在服务程序载入的镜头中。注意,评价函数文件的载入不会改变在LDE 中显示的数据;服务程序有这个镜头数据的一个副本。要载入的文件名被附加在LoadMerit 的项目名称之后,而且必须包括完整的路径名。例如: “ LoadMerit ,C:\\ZEMAX\\SAMPLES\\MyMerit.MF”。得到的字符串的格式如下:

“数量,评价”

这里参数数量是在评价函数中的操作数的数量,参数评价是评价函数的数值。如果这个评价函数的数值为9.00e+009,则这个评价函数不能被评估。也可参见Optimize。

MakeGraphicWindow

这个项目通知ZEMAX 图形数据已被写到一个文件中了,现在可以以一个ZEMAX 子窗口的形式来显示。这个项目的主要目的是在一个客户应用程序中执行一个用户自定义特性,这看起来和实际操作ZEMAX 本来的特性一样。这个项目的字符串必须有以下格式:

MakeGraphicWindow,文件名,模块名,窗口标题,文本标记,设置数据

参数“文件名”是指向一个临时文件的完整路径名和文件名,这个临时文件中包含了这些图形数据。无论如何,这必须与在命令行自变量中的被传送给可执行客户程序的文件有相同的名称。参数“模块名”是产生图形数据的客户程序的完整路径名和执行名称。参数“窗口标题”是一个字符串,它定义了ZEMAX 用来放在这个图形窗口的顶端条栏中的标题。

如果客户程序同时也可以产生这些数据的一个文本版本,则参数“文本标记”应为1。由于当前数据是一个图形显示(如果这个项目是MakeGraphicWindow,则它必须是),所以ZEMAX 想知道“Text”菜单选项对用户是否有效,或者它是否被变灰。如果参数“文本标记”为零,则ZEMAX 将使这个“Text”菜单选项变灰,将不会要求这个客户程序去产生这个数据的一个文本版本。

参数“设置数据”是一个由空格(不是逗号)分开的数值字符串,它被客户程序用来定义如何产生图形数据。这些数值仅由客户程序使用,但不能被ZEMAX 使用。字符串“设置数据”包含了通常在一个ZEMAX 的“设置”类型对话框中显示的选项和数据。如果需要的话,设置数据可以被用来重新产生这些数据。关于设置数据的详细内容可参见“ZEMAX 如何调用客户程序”的说明。一个范例字符串如下:

MakeGraphicWindow , C:\\TEMP\\ZGF001.TMP ,C:\\ZEMAX\\FEATURES\\CLIENT.EXE,ClientWindow,1,0 1 2 12.55

这个项目表明ZEMAX 应该打开一个图形窗口,显示储存在文件C:\\TEMP\\ZGF001.TMP 中的数据, 通过调用客户程序模块C:\\ZEMAX\\FEATURES\\CLIENT.EXE 来做一些更新或者设置改变。 这个客户程序可以产生这个图形的一个文本版本,设置数据字符串(仅被客户程序使用)为“0 1 2 12.55”。 MakeTextWindow

这个项目通知ZEMAX 文本数据已被写到一个文件中了,现在可以以一个ZEMAX 子窗口的形式来显示。这个项目的主要目的是在一个客户应用程序中执行一个用户自定义特性,这看起来和实际操作ZEMAX 本来的特性一样。这个项目的字符串必须有以下格式:

MakeTextWindow,文件名,模块名,窗口标题,设置数据

参数“文件名”是指向一个临时文件的完整路径名和文件名,这个临时文件中包含了这些文本数据。无论如何,这必须与在命令行自变量中的被传送给可执行客户程序的文件有相同的名称。参数“模块名”是产生文本数据的客户程序的完整路径名和执行名称。参数“窗口标题”是一个字符串,它定义了ZEMAX 用来放在这个文本窗口的顶端条栏中的标题。

参数“设置数据”是一个由空格(不是逗号)分开的数值字符串,它被客户程序用来定义如何产生文本数据。这些数值仅由客户程序使用,但不能被ZEMAX 使用。字符串“设置数据”包含了通常在一个ZEMAX 的“设置”类型对话框中显示的选项和数据。如果需要的话,

设置数据可以被用来重新产生这些数据。关于设置数据的详细内容可参见“ZEMAX 如何调用客户程序”的说明。 一个范例字符串如下:

MakeTextWindow , C:\\TEMP\\ZGF002.TMP ,C:\\ZEMAX\\FEATURES\\CLIENT.EXE,ClientWindow,6 5 4 12.55

这个项目表明ZEMAX 应该打开一个文本窗口,显示储存在文件C:\\TEMP\\ZGF002.TMP 中的数据, 通过调用客户程序模块C:\\ZEMAX\\FEATURES\\CLIENT.EXE 来做一些更新或者设置改变。 设置数据字符串(仅被客户程序使用)为“6 5 4 12.55”。 NewLens

这个项目将清除当前的镜头。留下的“最小”镜头与在镜头数据编辑界面中选择“文件,新文件”时的镜头是相同的。不会给出保存这个已存在镜头的提示。 Optimize

Optimize 将调用ZEMAX 阻尼最小二乘法优化。其语法结构为: Optimize,n

这里n 时运行的循环数。得到的数值是最终的评价函数。如果得到的评价函数值为9.0E+009,优化失败,通常这是因为镜头或者评价函数不能被评估。如果n 为零,则以自动模式运行优化。如果n 为小于零的值,则Optimize 得到当前的评价函数值,而不执行优化。 PushLens

PushLens 将获得当前在服务程序存储器中的镜头,并将它放到镜头数据编辑界面中。ZEMAX 主窗口将显示一个对话框,问用户是否允许接受由客户程序放入的镜头数据。如果这个在LDE 中的镜头数据没有被保存,则将出现一个附加对话框,询问旧的镜头数据是否先被保存。在更新这个新放入的镜头文件之后,得到的字符串是项目GetUpdate 得到的是一样的。如果得到一个不为零的数值,则更新失败;如果得到-999,则这个镜头不能被放入到LDE 中。也可参见GetPath、GetRefresh、LoadFile、和SaveFile。 ReleaseWindow

当ZEMAX 调用客户程序去更新或者改变由客户程序函数使用的设置时,在窗口中的菜单条变成灰色,防止同时要求多次更新或者改变设置。通常,在客户程序编码发送了MakeText Window 和MakeGraphicWindow 时,这个菜单选项才被再次激活。然而,如果在一个更新或者设置改变的过程中,不能计算新的数据,则必须释放这个窗口。ReleaseWindow 正好提供了这一个简单的目的。如果在改变设置时用户选择了“取消”,则客户程序编码将发送一个ReleaseWindow 项目来释放菜单条的缩定。如果没有发送这个命令,则不能关闭这个窗口, 这通常可以防止终止ZEMAX 。

ReleaseWindow 项目仅仅使用一个自变量:临时文件的名称。其语法结构为: ReleaseWindow,文件名称

如果没有窗口在使用这个文件名称,则得到的数值为零;如果这个文件被使用则得到的数值为一个正整数。 SaveFile

将当前在服务程序中的镜头保存为一个ZEMAX 文件。被用来保存的文件的名称被附加在SaveFile 项目的名称的后面,而且必须包括这个文件的完整的路径名。例如:“ SaveFile , C:\\ZEMAX\\SAMPLES\\COOKE.ZMX”。在更新这个新被保存的镜头文件之后,得到的字符串与项目GetUpdate 得到的是一样的。如果得到一个不为零的数值,则更新失败;如果得到-999,则不能保存这个文件。也可参见GetPath、GetRefresh、LoadFile、和PushLens。 SetBuffer

项目SetBuffer 被用来储存窗口被创建或者更新的客户程序特定数据。缓冲器数据被用来存放用户选择的选项, 而不是在MakeTextWindow 和MakeGraphicWindow 项目的命令行中使用设置数据。这个数据必须以一个字符串格式表示。其语法结构为:

SetBuffer,1,你想要的任意文本⋯⋯

这里提供了16 个缓冲器,从编号0 到15,每个都可以被设成使用SetBuffer,0,⋯⋯;SetBuffer,1,⋯⋯;等等。跟在“SetBuffer,n,”后面的文本仅仅是那些被存放的文本;它最大可以有240 字符。注意,直到送出MakeTextWindow 或者MakeGraphicWindow,否则缓冲器数据与任意特定的窗口无关。一旦ZEMAX 接受到MakeTextWindow 或者MakeGraphicWindow 项目,则这个缓冲器数据将被复制到适当的窗口存储器中,然后可能通过使用GetBuffer从那个窗口重新得到这个数据。也可参见GetBuffer。 SetCofig

这个项目转换当前的结构编号和更新系统。想要的结构被附加在这个项目名称的后面。例如,为了转换到结构3,这个项目的名称为“SetCofig,3”。得到的字符串的格式如下:

“当前结构编号,结构数量,error”

当前结构编号是新的结构编号,在1 和结构数量值之间。通常,它将是在项目名称中要求的目标结构,只要它是一个有效的结构编号。Error 代码与由项目GetUpdate 得到的是一样的,如果新的当前结构是可被追迹的,则这个代码为零。也可参见GetConfig。 SetField

这个项目设置了视场数据。其语法结构为:

SetField,0,类型,数量或者SetField,n,xf,yf,wgt,vdx,vdy,vcx,vcy

如果n 的值为零,则视场类型和总的视场数量被设为一个新的整数值。如果n 为一个有效的视场编号(在1 和视场数量之间,包括这两个数),则视场x 和y 的值,视场权重,和渐晕因子全都被设置。也可参见GetField。得到的数值与“GetField,n”得到的相同。 SetFloat

这个项目将所有没有表面口径的表面设为有一个浮动口径。浮动口径将挡住在半口径外面追迹的光线。其语法结构为:

SetFloat

得到的数值仅仅是“OK”。 SetLabel

这个项目与指定表面的一个整数标记有关。当在这个目标表面周围增加或删除表面时,ZEMAX 将保留这个标记。其语法结构为:

SetLabel,表面,标记

得到的数值是这个标记。也可参见GetLabel 和FindLabel。 SetPolState

这个项目设置了由用户设置的偏振状态。这个数据的格式如下: SetPolState,nIsPolarized,Ex,Ey,Phax,Phay 可关于完整的说明可参见GetPolState。 SetSolve

这个项目设置了求解数据,得到由于任意表面的新的求解的数据。其语法结构为: SetSolve,表面,代码,数据⋯⋯

这里,代码的定义和“Getsolve”中说明的是一样,“数据⋯⋯”是在GetSove 中定义的同样数据。这些参数根据列出的代码顺序列出。得到的字符串与对新定义的求解数据用GetSolve 得到的是一样的。 SetSurface

这个项目设置了表面数据。这个项目名称的格式如下:

SetSurface,表面,类型,曲率,厚度,玻璃,半口径,圆锥系数,p1,p2,p3,p4,p5,p6,p7,p8

这里的这些参数与在项目GetSurface 中说明的是一样的。得到的字符串是新设置的表面数据,其格式与在项目GetSurface 中说明的一样。也可参见GetSurface。 SetSystem

这个项目设置了系统数据。其语法结构为:

SetSystem,单位代码,光栏表面,光线定位类型,环境数据,温度,压力,空间参考表面 得到的字符串的格式与在GetSystem 中定义的是一样的。关于自变量的详细说明也可参见GetSystem。 SetSystemAper

这个项目设置了系统的光圈数据。其语法结构为: SetSystemAper,类型,光栏表面,光圈值

得到的字符串的格式与在GetSystemAper 中定义的是一样的。关于自变量的详细说明也可参见GetSystemAper。 SetUDOData

这个项目被用来由客户程序将计算好的数据传输给ZEMAX 的优化程序。使用这个项目名称的唯一一次机会是执行一个用户自定义操作数,或者UDO 时。UDO 在“优化”一章中已详细说明。详细内容可参见那一章。SetUDOData 的语法结构为:

SetUDOData,缓冲器代码,数据0,数据1,数据2,⋯⋯,数据50

这里,缓冲器代码是在命令行中的传送给UDO 的一个整数。当ZEMAX 服务程序接受到这个SetUDOData 时,它将这些数据放在缓冲器中,然后关闭缓冲器,不让其它数据输入。这个项目允许一次传送多个数据项给服务程序,然而,在输入行中有一个最大不超过255字符的。为了避免这个(Windows 的),可使用项目SetUDOItem 和CloseUDOData。也可参见

GetUDOSystem。 SetUDOItem

这个项目被用来由客户程序仅仅将一个计算好的资料传输给ZEMAX 的优化程序。使用这个项目名称的唯一一次机会是执行一个用户自定义操作数,或者UDO 时。UDO 在“优化”一章中已详细说明。详细内容可参见那一章。SetUDOItem 的语法结构为:

SetUDOItem,缓冲器代码,数据编号,数据

这里,缓冲器代码是在命令行中的传送给UDO 的一个整数,数据是被传输的数据项的编号。使用这个项目,服务器缓冲器可能一次就被一个数据项充满,这个数据项已远远超出关于数据项内容的255 个字符的。然而,ZEMAX 不知道是否有更多的数据被送过来,所以缓冲器保持打开状态。在最后一个数据项被传送以后,在执行优化之前必须使用CloseUDOData 关闭缓冲器。一个典型的定义包含下列项目信息:

SetUDOItem,缓冲器代码,0,数值0 SetUDOItem,缓冲器代码,1,数值1 SetUDOItem,缓冲器代码,2,数值2 CloseUDOData,缓冲器代码 也可参见GetUDOSystem。 SetWave

这个项目设置了波长数据。其语法结构为:

SetWave,0,主波长,数量或者SetWave,n,波长,权重

如果n 的值为零,则主波长编号和总的波长数量被设成一个新的整数值。如果n 是一个有效的波长编号(在1 和波长数量之间,包括这两个数),则以微米表示的波长和波长的权重都被设置。也可参见GetWave。得到的数据与“GetWave,n”得到的一样。 大量光线的追迹 如果只有少量的光线需要被追迹,则使用DDE 项目是足够容易和快的,如GetTrace 或GetPolTrace。然而,如果需要追迹多于100~500 左右条的光线,则使用数组光线追迹技巧要快得多。与一次追迹一条光线不同,这建立了一个数组,它容纳了一个所有要被追迹的光线的列表,然后一次性将整个数组传送给ZEMAX。

然后ZEMAX 将追迹所有光线,并将这整个数组传回给客户程序。这个方法模仿了GetTrace、GetTraceDirect、GetPolTrace、和GetPolTraceDirect 的运转,但这个方法有一个附加功能,它可以一次性追迹任意多的光线,虽然它编写起来稍微有点复杂。 下面2 个步骤是要求的:

1) 用要求的数据充满一个数组的结构 2) 将这个数据传输给ZEMAX 步骤1:将光线数据放入数组

将定义了要被追迹的光线的列表的数据放到一个数组结构中,其形式如下: typedef struct {

double x,y,z,l,m,n,opd,intensity; int wave,error,vigcode,want_opd; }DDERAYDATA;

在客户程序内部, 将用一个说明来建立一个数组类型DDERAYDATA,这个说明如:

DDERAYDATA MyData[101];

这里支持4 中光线追迹模式,从0 到3 编号,它们对应于GetTrace的操作(模式0)、GetTraceDirect 的操作(模式1)、GetPolTrace的操作(模式2)、和GetPolTraceDirect(模式3)。每种模式要求在这个DDERAYDATA 结构中放入一列稍微不同的数据。这个模式是由在数组位置0 处的参数opd 参数来设置的。

每条光线需要1 个数组分量。如果要追迹“n”条光线,则从1到n 的数组结构将被用来存放这n 条光线的数据。数组位置零被保留给那些需要和数组一起被传送的标题数据。 模式0:

类似于GetTrace与GetTrace 一样,光线是由相对的视场和光瞳坐标、波长、模式(实际光线模式=0,或者近轴光线模式=1)、以及要追迹光线到其上的表面来定义。在追迹光线之前,应修改数组中位置1 到n 的内容,使它们包含了每条光线的定义。视场、光瞳、和波长数据全都如下被存放在数组中:

MyData[i].x = hx; MyData[i].y = hy; MyData[i].z = px; MyData[i].l = py;

MyData[i].m = 0.0; /*对于输入忽略*/ MyData[i].n = 0.0; /*对于输入忽略*/ MyData[i].opd= 0.0; /*对于输入忽略*/ MyData[i].intensity = 1.0; /*初始强度*/ MyData[i].wave = 波长;

MyData[i].error = 0; /*最初必须为零*/ MyData[i].vigcode = 0; /*最初必须为零*/

MyData[i].want_opd = 0; /*如果不需要OPD 数据则为零,如需要则为1*/

注意,自变量i 应该在1 和光线数量n 之间。数组的大小是随意的,然而,一次追迹太多的光线对于编程实践来说是差的,这是因为如果光线追迹被终止,则要接受一个用户中断是困难的。初始强度可以根据发生任意光瞳或表面照度分布来缩放。注意,模式0 承认光瞳照度分布,而模式1 却不承认。

数组位置0 被留给那些应用于所有光线的其它数据。我们用在数组位置0 中的数据来告诉ZEMAX 使用的模式、光线的数量、和要追迹光线到其上的表面。这些数据如下被放入数组中:

MyData[i].x = 0.0; /*忽略*/ MyData[i].y = 0.0; /*忽略*/

MyData[i].z = 0.0; /*忽略*/ MyData[i].l = 0.0; /*忽略*/ MyData[i].m = 0.0; /*忽略*/ MyData[i].n = 0.0; /*忽略*/ MyData[i].opd= 0; /*设置为模式0*/ MyData[i].intensity = 0.0; /*忽略*/

MyData[i].wave = 模式; /*0 代表实际光线,1 代表近轴光线*/ MyData[i].error = 光线数量; /*数组中光线的数量*/ MyData[i].vigcode = 0; /*最初必须为零*/

MyData[i].want_opd = 最后表面编号; /*用-1 代表象面,或者用其它任意的有效表面编号*/

光线的数量必须放在变量error 中。注意,一个DDERAYDATA类型的数组的说明必须比光线的数量大1,这是因为数组位置0 要被留给上面说明的数据。所有在这个数组中的光线必须使用相同的模式被追迹到相同的表面上,但是它们可以有不同的波长以及视场和光瞳坐标。 如果变量want_opd 为0,则计算这条光线的通常的x、y、z、l、m、和n。如果want_opd 为一不为零的数,则和这些通常数据一起将得到这条光线OPD。

计算这条光线的OPD 将花费正规的光线追迹之外的额外时间,而且仅仅在被要求如此做时,ZEMAX 才执行这个额外计算。对于客户程序计算OPD 也比较复杂,这是因为OPD 意味着光程差,这意味着必须追迹两条光线,而不是一条光线。为了计算一条任意光线的OPD,ZEMAX 必须先追迹主光线,再追迹这条任意光线,然后将两条光线的相位相减,得到OPD。这与反复地追迹这条相同的主光线(这是慢的)不同,通常只追迹一次主光线,然后从后面计算的每条光线中减去主光线的相位。ZEMAX 使用参数want_opd 的符号来指定应该使用哪个计算。如果want_opd 小于零(如-1),则主光线和指定光线都要求被追迹,OPD 是两者之间的相位差;如果want_opd大于零,则得到这条光线的“自然”光程,客户程序必须将被条光线都减去主光线的相位。如果从相同视场点出发追迹许多光线,则后面的方法要快得多,许多光学分析计算都是这种情况。如果最后一个表面是象面,则可以计算opd,否则,opd 的值将 为零。

模式1:类似于GetTraceDirect

与GetTraceDirect 一样,光线是由在任意起始面上的坐标x、y、z、l、m、和n,以及波长、模式(实际光线模式=0,或者近轴光线模式=1)、和要追迹光线到其上的表面来定义。在追迹光线之前,应修改数组中位置1 到n 的内容,使它们包含了每条光线的定义。视场、光瞳、和波长数据全都被如下存放在数组中:

MyData[i].x = x; MyData[i].y = y; MyData[i].z = z; MyData[i].l = l; MyData[i].m = m;

MyData[i].n = n;

MyData[i].opd= 0.0; /*对于输入忽略*/ MyData[i].intensity = 1.0; /*初始强度*/ MyData[i].wave = 波长;

MyData[i].error = 0.0; /*最初必须为零*/ MyData[i].vigcode = 0.0; /*最初必须为零*/ MyData[i].want_opd = 0; /*忽略*/

注意,自变量i 是在1 和光线的数量n 之间。数组的大小是随意的,然而,一次追迹太多的光线对于编程实践来说是差的,这是因为如果光线追迹被终止,则要接受一个用户中断是困难的。初始强度可以根据发生任意光瞳或表面照度分布来缩放。注意,模式0 承认光瞳照度分布,而模式1 却不承认。数组位置0 被留给那些应用于所有光线的其它数据。我们用在数组位置0 中的数据来告诉ZEMAX 使用的模式、光线的数量、和要追迹光线到其上的表面。这些数据如下被放入数组中:

MyData[i].x = 0.0; /*忽略*/ MyData[i].y = 0.0; /*忽略*/ MyData[i].z = 0.0; /*忽略*/ MyData[i].l = 0.0; /*忽略*/ MyData[i].m = 0.0; /*忽略*/ MyData[i].n = 0.0; /*忽略*/ MyData[i].opd= 1; /*设置为模式1*/ MyData[i].intensity = 0.0; /*忽略*/

MyData[i].wave = 模式; /*0 代表实际光线,1 代表近轴光线*/ MyData[i].error = 光线数量; /*数组中光线的数量*/ MyData[i].vigcode = 0; /*最初必须为零*/

MyData[i].want_opd = 最后表面编号; /*用-1 代表象面,或者用其它任意的有效表面编号*/

这种模式在其它方面是与模式0 是一样的。但是在这种模式中不允许OPD 的计算。 模式2:类似于GetPolTrace

这种模式与GetPolTrace 非常相似。在追迹光线之前,应修改数组中位置1 到n 的内容,使它们包含了每条光线的定义。视场、光瞳、和波长数据全都被如下存放在数组中:

MyData[i].x = hx; MyData[i].y = hy; MyData[i].z = px; MyData[i].l = py;

MyData[i].m = 0.0; /*忽略*/ MyData[i].n = 0.0; /*忽略*/

MyData[i].opd= 0.0; /*对于输入忽略*/

MyData[i].intensity = 1.0; /*初始强度*/ MyData[i].wave = 波长;

MyData[i].error = 0.0; /*最初必须为零*/ MyData[i].vigcode = 0.0; /*最初必须为零*/ MyData[i].want_opd = 0; /*忽略*/

注意,自变量i 是在1 和光线的数量n 之间。数组的大小是随意的,然而,一次追迹太多的光线对于编程实践来说是差的,这是因为如果光线追迹被终止,则要接受一个用户中断是困难的。参数intensity 被用来得到这条光线的相对传递强度。数组位置0 被留给那些应用于所有光线的其它数据。我们用在数组位置0 中的数据来告诉ZEMAX 使用的模式、光线的数量、和要追迹光线到其上的表面。这些数据如下被放入数组中:

MyData[i].x = Ex; /*x 方向上的电场振幅*/ MyData[i].y = Ey; /*y 方向上的电场振幅*/ MyData[i].z = Phax; /*Ex 的相位,以度表示*/ MyData[i].l = Phay; /*Ey 的相位,以度表示*/ MyData[i].m = 0.0; /*忽略*/ MyData[i].n = 0.0; /*忽略*/ MyData[i].opd= 2; /*设置为模式2*/ MyData[i].intensity = 0.0; /*忽略*/

MyData[i].wave = 模式; /*0 代表实际光线,1 代表近轴光线*/ MyData[i].error = 光线数量; /*数组中光线的数量*/ MyData[i].vigcode = 0; /*最初必须为零*/

MyData[i].want_opd = 最后表面编号; /*用-1 代表象面,或者用其它任意的有效表面编号*/

这种模式在其它方面是与模式0 是一样的。 模式3:类似于GetPolTraceDirect

与GetTracePolDirect 一样,光线是由在任意起始面上的坐标x、y、z、l、m、和n,以及波长、模式(实际光线模式=0,或者近轴光线模式=1)、和要追迹光线到其上的表面来定义。在追迹光线之前,应修改数组中位置1 到n 的内容,使它们包含了每条光线的定义。视场、光瞳、和波长数据全都被如下存放在数组中:

MyData[i].x = x; MyData[i].y = y; MyData[i].z = z; MyData[i].l = l; MyData[i].m = m; MyData[i].n = n;

MyData[i].opd= 0.0; /*忽略*/

MyData[i].intensity = 1.0; /*初始强度*/

MyData[i].wave = 波长;

MyData[i].error = 0.0; /*最初必须为零*/ MyData[i].vigcode = 0.0; /*最初必须为零*/ MyData[i].want_opd = 0; /*忽略*/

注意,自变量i 是在1 和光线的数量n 之间。数组的大小是随意的,然而,一次追迹太多的光线对于编程实践来说是差的,这是因为如果光线追迹被终止,则要接受一个用户中断是困难的。参数intensity 被用来得到这条光线的相对传递强度。数组位置0 被留给那些应用于所有光线的其它数据。我们用在数组位置0 中的数据来告诉ZEMAX 使用的模式、光线的数量、和要追迹光线到其上的表面。这些数据如下被放入数组中:

MyData[i].x = Ex; /*x 方向上的电场振幅*/ MyData[i].y = Ey; /*y 方向上的电场振幅*/ MyData[i].z = Phax; /*Ex 的相位,以度表示*/ MyData[i].l = Phay; /*Ey 的相位,以度表示*/ MyData[i].m = 0.0; /*忽略*/ MyData[i].n = 0.0; /*忽略*/ MyData[i].opd= 3; /*设置为模式3*/ MyData[i].intensity = 0.0; /*忽略*/

MyData[i].wave = 模式; /*0 代表实际光线,1 代表近轴光线*/ MyData[i].error = 光线数量; /*数组中光线的数量*/ MyData[i].vigcode = 起始面; /*坐标开始的表面*/

MyData[i].want_opd = 最后表面编号; /*用-1 代表象面,或者用其它任意的有效表面编号*/

这种模式在其它方面是与模式1 是一样的。 步骤2:传输数组给ZEMAX

一旦所有的光线都被定义完成,数组必须被传输给ZEMAX 服务程序。实现这一目标的简单的方法是使用ZCLIENT PosArrayTraceMessage 函数:

PosArrayTraceMessage(szBuffer,RD);

变量RD 是指向包含光线列表的DDERAYDATA 数组的指针。ZEMAX 将追迹所有的光线,然后将这些数据传回到相同的数组中。有关这个代码例子的详细内容,可参见本章结尾的“一个客户程序例子”部分。 ZEMAX 如何调用客户程序 ZEMAX 在目录\\Extend 中查找扩展执行程序。在这个目录中以普通的.EXE 扩展名结尾的每个程序都被认为是一个有效的ZEMAX 扩展程序。这个可执行程序的名称被放在主菜单栏中的“扩展”下的下拉菜单中。

当从这个菜单中选中任意一个被列出的扩展程序名称时,ZEMAX将一个以下的语法形式来执行这个扩展程序:

programname textflag optionsflag tempfile {settings data}

参数programname 是这个可执行程序的完整路径名,例如,“C:\\ZEMAX\\EXTENSIONS\\ DDE_DEMO.EXE”。

参数textflag 初始总为0。ZEMAX 对于扩展程序使用的约定和对于ZEMAX 内部特性是一样的:如果这个特性同时产生一个图形输出格式和一个文本输出格式,则先显示这个图形版本。如果这个特性没有图形显示,则显示文本窗口。扩展程序必须产生一个图形文件,如果它可以而且被要求这样做的话。用户可以在新窗口中点击“文本”来查看文本版本;如果这种情况发生,则ZEMAX 将把文本标记设为1,再次调用这个扩展程序。如果扩展程序只产生文本,则它可以产生一个文本文件,通过传送项目MakeTextWindow 来打开它。除非一个扩展程序特别规定它可以支持一个文本模式,否则ZEMAX 将永远不会传送一个被设为1 的textflag; 这就是为什么MakeGraphicWindow 要返回一个标记来说明这个特性是否支持文本的原因,以及为什么ZEMAX 总是要先寻找图形模式的原因。

如果用户不想看到“设置”框,则将optionsflag 设为0,或者,如果用户想看的话则设为1。设置这个标记可用两种方法;用户在已打开的图形窗口中点击“设置”,或者,用户从ZEMAX 内部的环境选项中选择“先显示选项”。在后面这种情况中,设置框可以要求在第一次计算之前被显示。如果设置了这个标记,则扩展必须使用一个对话框或者其它界面装置来提示用户设置选项。如果没有用户自定义选项,则将显示一个声明“这个窗口没有选项”的信息框。

参数temfile 是包含由扩展产生的数据的临时文件的完整路径名和文件名。最初,这个文件不存在,需要扩展程序来建立它,将文本或图形数据写到这个文件中,然后按要求调用MakeTextWindow或MakeGraphicWindow如。果用户只是简单地更新一个已存在的窗口,那么这个文件可能已经存在了,它将被覆盖。这个文件不能被打开或者读取,因为它的数据不可能是扩展程序最初放在那里的数据了。

ZEMAX 特别做了一些建立图形文件的扩展的翻译。没有其它文件可被用作输出,因为ZEMAX 认为要被更新的窗口要保留它们的原始文件名。只有一个窗口可以通过一个到扩展程序的简单的调用来建立。当ZEMAX 从扩展程序中接受到一个MakeTextWindow或

MakeGraphicWindow请求时,在基本单元名称中的被编码的自变量之一是一个空格,这个空格用来分开定义数值的扩展程序字符串。这个字符串应被用来包含代表扩展程序需要的设置的“设置数据”,例如表面编号、视场、波长、或者在窗口中要被计算的其它数据。当ZEMAX 更新一个窗口时,它将调用这个扩展程序,而且提供这个设置字符串回到扩展程序。

重要的一点是,扩展不会自己试着将这个设置数据保持或储存在一个文件中。其原因是ZEMAX 可能有同时打开的多个文本或图形窗口,它们全都使用相同的扩展编码来产生显示数据。例如,一个计算和显示单个表面的权重的扩展程序可以同时被几个窗口同时使用,每个窗口代表不同的表面。但是ZEMAX“知道”哪个窗口使用哪个设置数据;因此ZEMAX 将在相应的命令行中传输这个数据。在最初的扩展程序调用中,不提供设置数据字符串,所以扩展程序必须测定它自己的默认设置。 文本窗口的生成 由ZEMAX 生成一个用来显示的文本窗口是十分简单的。首先,使用典型的C 语言fopen 函

数打开要传输到扩展程序的文件名,带着的“wt”代表“写文本”模式。然后,输出数据到这个文件中,关闭文件,然后传送项目MakeTextWindow 到ZEMAX。ZEMAX 将读取这个ASCII 码数据,显示出来,不作任何修改或解释。一个简单的测试编码如下: FILE *out;

out = fopen(szFile,“wt”); fputs(“Write this line\\n”,out); fclose(out); 不要忘记关闭文件! 图形窗口的生成 扩展程序通过将图形格式数据写到在命令行中提供的临时文件中来产生一个图形窗口。使用与由ZPL 宏指令语言或者注释特性使用的相似的命令语言来建立一个图形数据。所有的图形都被写在一个虚拟屏幕上,它的坐标系为宽1.00 乘以高1.00,原点(0,0)在左下角。屏幕的外形比例通常是宽4 乘以高3,或者宽5 乘以高3,这依赖于用户的偏爱(详细内容可参见“文件菜单”一章中的环境部分)。因此,被画出的虚拟的象素的宽度大于高度。在这个命令文件中的每一行中应该跟上一个换行符“\\n”。在将所有的图形命令都写到这个文件中之后,这个文件应该被关闭,禁止写入。 ZEMAX 承认下面的图形命令承认。 ADDRESS 语法:ADDRESS

这个ADDRESS 命令将导致在图框的右下角显示“地址框”,除非用户已选择了这个框不显示。 BOX

语法:BOX x1 y1 x2 y2

这个BOX 命令连接了一个矩形的四个点,画出四条线。这两个坐标是这个矩形的左上点和右下点的坐标。 DATA

语法:DATA n “string”

这个DATA 命令接受一个在0 和5 之间的整数自变量和一个文本字符串。这个整数自变量指出了应该将这个字符串写在这个数据框的哪一行。通常,镜头名称在第0 行,日期在第1 行。命令LENSNAME和DATE 将自动实现这个目的。DATA 命令允许将任一字符串放在任意一行上。 DATE 语法:DATE

当前的日期和时间通常被写在这个数据框中的图表标题的下面的第二行。这个命令没有自变量,将在这第二行上打印日期和时间(根据用户的环境参考)。 FRAME 语法:FRAME

无论是FRAME 命令,还是NOFRAME 命令,都必须放在这个命令文件的第一行。FRAME 将画出一个标准的ZEMAX 图形,整体周围有一个矩形,在y 方向的0.2 左右处有两条划线。可以使

用TITLE 命令将这个图表的标题写在这两条刻度线的中心。也可参见NOFRAME。 LENSNAME 语法:LENSNAME

当前镜头的名称通常被写在这个数据框中的图表标题下面的第一行。这个命令没有自变量,将在这一行打印镜头的名称。 LINE

语法:LINE x1 y1 x2 y2

这是一个最基本的图形命令;它连接两个点,画出一条直线。注意,这个坐标应该在0 和1.0 之间。 NOFRAME 语法:NOFRAME

无论是FRAME 命令,还是NOFRAME 命令,都必须放在这个命令文件的第一行。FRAME 将画出一个标准的ZEMAX 图形,但没有两条划线。也可参见FRAME。 PENSTYLE

语法:PENSTYLE ncolor nstyle nwidth

这个PENSTYLE 命令改变了线条的颜色、类型、和宽度。整数ncolor必须是0,代表黑色,或者1 和12 之间的数,代表相应的线条颜色。这个颜色可以由用户在文件,环境对话框中定义。整数nstyle 可以是0,代表实线,或者1 和4 之间的数,代表相应的虚线。整数nwidth实线条的相应宽度。它的默认值为1。一个为2 的数值将线宽为默认宽度的两倍。如果线条类型不是实线(nstyle=0),则线宽必须是1个象素;Windows 不支持不是实线的粗线。所有后面的文本和画的线条将应用这个新的颜色、类型、和宽度。 TEXT

语法:TEXT “string” x y angle width height

这个TEXT 命令被用来在图形中放置文本数据。坐标x 和y 实字符串的起始坐标。角度angle 是以度为单位的。宽度width和高度height的值影响了字体的尺寸。其默认值为10,表示每个命令将产生与ZEMAX 通常使用的一样的字体尺寸;这是屏幕宽度的1/70,是屏幕高度的1/40。大于或小于10 的数值将产生按比例缩放的字体尺寸。 TITLE

语法:TITLE “string”

如果用FRAME 来定义图形,而不是MOFRAME,则图表标题通常将被放在离图表底部20%的两条划线的中间。TITLE 命令将在这个位置显示提供的字符串“string”。 一个扩展程序的例子 在\\Extend 目录中的是一个被称为DDE_DEMO 的应用程序例子,它举例说明了连接ZEMAX 的DDE 的使用。它包括了源代码。DDE_DEMO 可以在两种模式之一中运行:程序,或者作为一个扩展程序。

如果从一个命令提示、Windows资源管理器、或者通过在DDE_DEMO图标双击来直接运行,则它将被作为一个应用程序,操纵在后台的DDE。它产生的数据将在DDE_DEMO窗口中显示。

为了以模式运行DDE_DEMO,则先要运行ZEMAX,载入一个镜头文件,然后通过在DDE_DEMO图标上双击来运行DDE_DEMO。试着载入不同的镜头文件,或者编辑一个镜头文件,观察这个DDE_DEMO 窗口来监视它的变化。DDE_DEMO 将在屏幕上列出一些系统数据、表面数据、视场数据、和波长数据,追迹少量光线,列出这些光线的x、y、和z 坐标。这个程序每隔几秒钟就自我更新一次。

为了以一个扩展程序模式来运行DDE_DEMO,则运行ZEMAX,载入一个镜头文件,然后选择扩展程序,再选择DDE_DEMO。注意,放在\\Extend目录中的任意一个.EXE应用程序都将在ZEMAX 的扩展菜单中列出,无论它是一个有效的程序,还是一个能与ZEMAX沟通的扩展程序。

DE_DEMO 将在一个“隐藏”窗口中执行,建立与ZEMAX 连接的DDE 链,摘录系统和光线数据,将这些数据写到一个文件中, 通知ZEMAX 这个文件已经准备好了( 使用

MakeTextWindow 项目),然后关闭。一旦客户程序产生了这些数据,则它的工作就结束了;它将在那时自我终止。

当ZEMAX 接受到这个MakeTextWindow 项目,它将读取这个文件的内容,并将在一个标准的ZEMAX 文本窗口中显示这些数据。如果这个窗口现在被“更新”,或者选择了“设置”选项,那么ZEMAX将再次调用这个客户程序,请求再次计算这些数据。注意,完全一样的程序可以作为一个的客户程序,也可作为一个扩展程序。这种双模式运行的诀窍是,如果ZEMAX 调用了这个客户程序,则它将传输命令行自变量给客户程序,告诉它要建立那种类型的数据以及将这些数据写到哪里;如果没有提供命令行自变量,则客户程序认为它是从操作系统中被调用的,因此它将以模式运行。DDE 交换和后来的处理是同样的方法,仅仅需要少量代码行来确定窗口是可见的还是隐藏的,数据是被写到一个文件中还是客户程序自己的屏幕上。

DDE_DEMO 代码 这里提供了DDE_DEMO 源代码。它包含了所有客户程序的基本运算法则、变量、说明、必需的Windows 信息处理。也有一部分代码举例说明了追迹光线数组的WM_DDE_POKE 的使用。DDE_DEMO 作为一个扩展程序的起始点来使用是一个非常困难的程序,虽然它说明了一些高水平的技巧。一个执行ZEMAX 扩展的简单方法说明如下。 执行扩展程序的简单化技巧 显然,为Windows 设计的DDE 不是为那些胆怯者设计的;它包括了大量的程序设计技巧和对信息循环、DDE、指针、基本单元、和全局处理的融会贯通。然而,被用来与ZEMAX 沟通的大部分代码是标准的“锅炉钢板”代码,这对于任意一个客户程序来说都是普通的。这个代码已被全部编写完毕,放在一个被称为ZCLIENT 的单一源代码模块程序中。ZCLIENT 以ZEMAX 的源代码形式被提供,可以自由复制(只要保留著作权),以及在新的扩展程序中使用。

ZCLIENT 程序 ZCLIENT 显然是处理所有与ZEMAX 的信息传送。在ZCLIENT内部嵌入是一个对被称为“用户函数”名称的单一函数的调用。这个函数被放在一个由用户提供的单独的C 语言程序中,和ZCLIENT 一起被编辑,来建立这个可执行扩展程序。

当ZEMAX 调用这个扩展程序时,开始先在ZCLIENT 中执行。ZCLIENT 建立了DDE 传输,然后调用用户函数。在用户函数中,由ZCLIENT 提供的两个函数,PostRequestMessage 和GetString,都是通常被要求用来从ZEMAX 中得到需要的数据的函数。然后这些数据作为一个文本数据或图形数据形式被格式化,再传回ZEMAX,显示出来。 PostRequestMessage 的语法结构如下:

PostRequestMessage(szItemname,szBuffer);

szItemname 包含了要求的项目的名称。可用的项目名称在这一章的前面部分已被说明。然后,将要求的数据传送回字符串szBuffer 中。

ZEMAX 通常提供逗号来分开数据,以及函数GetString 来摘录这些单独的数据项。GetString 的语法结构如下:

GetString(szBuffer,nItem,szSubString);

字符串szBuffer 是由PostRequestMessage 得到的缓冲器。整数nItem 是要求的数据项的编号;0 代表第一个数据项,1 代表第二个数据项,等等。符号szSubString 保存了从nItem 位置得到的字符串。例如,为了得到一个镜头的名称,其代码应该是:

PostRequestMessage(“getname”,szBuffer); GetString(szBuffer,0,szLensName);

现在,字符串szLensName 中包含了这个镜头的名称。因为“GetName”仅仅得到1 个数据项,所以这个代码可以被缩短成只有一行:

PostRequestMessage(“getname”, szLensName);

这里也有PostRequestMessage快速追迹大量光线的一个修改版本。其函数为

PostArrayTraceMessage。这个函数接受两个自变量:缓冲器字符串,和光线数据数组的地址。这里提供了使用PostArrayTraceMessage 的数组光线追迹代码的例子, 被称为ARR_DEMO.C。 为了使用PostArrayTraceMessage 来追迹光线,必须先定义光线列表,然后必须制作一个专门的PostArrayTraceMessage 调用。 这是这个技巧的一个例子:

/*以标题数据填充RD 的数组位置0。*/ RD[0].x = 0.0; RD[0].y = 0.0; RD[0].z = 0.0; RD[0].l = 0.0; RD[0].m =0.0; RD[0].n = 0.0;

RD[0].opd = 0.0; /* 这是我们设置模式的地方,模式0 与GetTrace 一样 */

RD[0].intensity = 0.0; RD[0].wave = 0;

RD[0].error = 25; /* 追迹25 条光线 */

RD[0].vigcode = 0; RD[0].want_opd = -1;

/*定义25 条光线。当然,你可以定义你想要的任意光线⋯⋯*/ k = 0;

for(i=-2;I<=2;I++) {

for(j=-2;j<=2;j++) { k++;

RD[k].x = 0.0; RD[k].y = 0.0;

RD[k].z = (double) j/4.0; RD[k].l = (double) j/4.0; RD[k].m = 0.0; RD[k].n = 0.0; RD[k].opd = 0.0; RD[k].intensity = 0.0; RD[k].wave = 1; RD[k].error = 0; RD[k].vigcode = 0; RD[k].want_opd = 0; } }

/*现在可去得到数据*/

PostArrayTraceMessage(szBuffer,RD); /*输出数据现在被存放在RD 中,准备使用!*/ /*注意,仅仅用一行代码来追迹所有的光线 */

使用ZCLIENT比自己编写所有的DDE 传输代码要容易得多。这个被追迹数组例子可从ARR_DEMO中得到,这个一个使用ZCLIENT得DDE 代码例子。 一个使用ZCLIENT 得扩展程序的例子 这里提供了一个使用ZCLIENT的完整的扩展程序的源代码。这个扩展程序被称为PHASPLOT,它将使用用ZCLIENT.C 和PHASPLOT.C。PHASPLOT 将产生了一个二元光学面2的相位的一个图形或者一个文本列表。这个代码举例说明了如何制作一个图形和文本窗口,如何格式化输出图形和文本显示。

PHASPLOT 也有一个ZEMAX 类型的“设置”框,对于这个“设置”框的源代码被包括在“SurDlgProc”函数中的PHASPLOT.C 中;它使用PHASPLOT.RC 来定义这个对话框的界面。 由PhasPlot 模板编写扩展程序 学习如何去编写扩展程序的最好的方法是从PhasPlot 开始,以及开始编辑!制作PhasPlot.C 和PhasPlot.RC 的一个副本,将副本重新命名成其它名字(MY_CODE.C,MY_CODE.RC)。然后使用任意一个商业性好的、有效的C 语言编辑器(Borland 和MicroSoft 都制造了优秀的工具)来建立一个新的方案,将这3 个文件载入这个方案。重新编辑,将这个方案建成一个测试EXE,来确保所有都是适当的。

然后,在用户函数和设置对话框函数内部编辑代码,使之适合你的要求。

因篇幅问题不能全部显示,请点此查看更多更全内容