ZEMAX | 如何使用ZOS-API创建自定义操作数
好酷屋教程网小编为您收集和整理了ZEMAX | 如何使用ZOS-API创建自定义操作数的相关教程:本文将使用ZOS-API创建自定义操作数 (UserOperand) 来计算各表面之间距离的绝对值之和,该操作数与TTHI操作数的功能相同。可以使用UDOC操作数将该自定义操作数添加到评价函数 (M
本文将使用ZOS-API创建
自定义操作数
(
User Operand
)
来计算各表面之间距离的绝对值之和,该操作数与TTHI操作数的功能相同。可以使用UDOC操作数将该自定义操作数添加到评价函数
(
Merit Function
)
中,以控制参数并执行优化。(联系
我们获取文章附件
)
引言
OpticStudio开发了一个应用程序接口(ZOS-API),可以使用最新的软件技术连接和定制应用程序。虽然ZOS-API依赖于COM接口,但是它来源于.NET 库,并且通过使用C++或C# (.NET) 来实现API的编程,具体使用取决于用户对两种语言的熟练程度。
应用程序与OpticStudio之间的连接有四种程序模式。这些模式通常可以分为两个类别:
1) 完全控制(独立模式和自定义扩展模式),这种情况下,用户通常完全控制镜头设计和用户界面;
2) 有限访问(自定义操作数模式和自定义分析模式),这种情况下,用户使用现有镜头文件的副本进行处理和分析。
本文的主要目标是讨论
自定义操作数
模式。此模式几乎与自定义分析
(
User Analysis
)
模式相同,只是它常创建用户自定义操作数来进行自定义数据计算。通过在评价函数编辑器
(
Merit Function Editor
)
中使用UDOC操作数添加自定义操作数。与自定义分析
模式一样,该模式不允许对当前镜头系统或用户界面进行更改(即:在这种模式下只允许对系统的副本进行更改)。自定义操作数
可以使用C++(COM)或C# (.NET)编写——具体使用取决于用户对这两种语言的熟悉程度。打开新的编程模板
单击
C# >自定义操作数
(
User Operand
)
,使用C#创建自定义操作数
。使用Windows资源管理器打开解决方案文件夹
{Zemax}\ZOS-API Projects\CSharpUserOperandApplication1。
Visual Studio也会打开新的解决方案。该解决方案包含可以用作任何
自定义操作数
的基础模板代码。读取镜
头数据
编辑器
在双高斯示例文件中使用此
自定义操作数
来计算定义范围内所有表面的总厚度。该示例文件位于:{Zemax}\Samples\Sequential\Objectives\Double Gauss 28 degree field.zmx 。
先使用
自定义操作数
读取位于物面与光阑面之间的表面的中心厚度值,然后将这些值相加来计算双高斯系统前组的总长度,也可以使用内置的操作数TTHI来完成。代码顶部的两行列出了应用程序中经常使用的名称空间,然后可以在不指定完整路径的情况下使用名称空间中的接口。
using System;using ZOSAPI;
在模板中,有如下四个参数可用:
double Hx = TheApplication.OperandArgument1;double Hy = TheApplication.OperandArgument2;double Px = TheApplication.OperandArgument3;double Py = TheApplication.OperandArgument4;参数的名称不能自定义。在计算中,将使用其中两个参数来定义表面范围。
在模板范本中找到”// Add your custom code here...” ,并开始编写代码。
通过定义surf1和surf2来定义表面范围,并链接到上述模板中的前两个参数。注意,在本例中未使用参数3和4。
int surf1 = (int)TheApplication.OperandArgument1;int surf2 = (int)TheApplication.OperandArgument2;
定义对象“surf”为接口ZOSAPI.Editors.LDE 的实例,用其读取
镜头数据编辑器
中的参数值。请记住,C# 是强类型语言,这意味着在声明变量时必须指定它的数据类型。ZOSAPI.Editors.LDE.ILDERow surf;double thic = 0;求厚度绝对值之和
使用“if”循环求取定义的表面范围内的所有表面中心厚度之和。如果表面范围输入是有效的,那么自定义操作数将返回厚度的总和。否则将返回无穷大的数,这意味着输入是无效的。
if (surf1 <= surf2){ for (int i = surf1; i <= surf2; i++) { surf = TheSystem.LDE.GetSurfaceAt(i); thic = thic + Math.Abs(surf.Thickness); } operandResults = thic;}else{ operandResults = 1e9;}现在,示例
自定义操作数
的编码已经完成。请注意,在本例中,使用operandResult 将厚度值的和存入数据字段0。如果需要存放多个计算值,则可以将这些值存入不同的数据字段中,并使用UDOC操作数中的“Data”参数来控制确切的返回值。保存、构建和移动可执行文件
将解决方案构建为发布版本。在调试时使用调试模式,但是在分配插件时,应该始终使用发布模式,因为调试库不是可以重新分配的。因此,切换到发布模式。
与作为
控制台应用程序
(
Console application
)
编译的自定义分析
不同,自定义操作数
应该作为Windows应用程序编译。否则,在使用用户自定义操作数进行优化时,控制台窗口将不断弹出,因为在优化期间会多次调用已编译的.exe文件。
在Visual Studio中,打开项目属性,并将自定义操作数应用程序的
输出类型
(
Output Type
)
更改为Windows应用程序。注意,编译后的自定义操作数
应用程序作为客户端程序,由评价函数
操作数UDOC调用,由UDOC的prog#参数中的程序编号定义。因此,应用程序的程序集名称
(
Assembly Name
)
应该定义为UDOCXX,XX表示从00到99的数字。
然后,构建解决方案。
具有已定义
程序集名称
的Exe应用程序将存储在Visual Studio的项目属性中已选择的输出路径中:找到已完成的应用程序的位置并将其复制到文件夹 {Zemax}\ZOS-API\Operands 中。
使用自定义操作数优化系统
为了检查新的
自定义操作数
,先打开OpticStudio,并打开镜头文件 {Zemax}\Samples\Sequential\Objectives\Double Gauss 28 degree field.zmx 。打开
评价函数编辑器
,并在评价函数编辑器
中插入操作数UDOC:Prog# 用来指定客户端程序名称的编号,必须是整数值。
Data = 0 将执行客户端程序并返回
当前
值
(value)
列中的值。超时(Timeout)
定义了OpticStudio等待UDOC计算所需数据并将控制权返回给OpticStudio的最长时间(以毫秒为单位),在本例中设置为50000。然后,操作数UDOC就像任何内置的评价函数操作数一样工作。
Hx=1 和 Hy=5 是定义表面范围的参数。
当前值为前组的总长度(从表面1到表面6的厚度)。
目标值将控制该值的目标量。
设置好所有参数后,点击
评价函数编辑器
的更新按钮,计算出的值会显示在当前
值
列中,如下图所示:除了执行计算之外,操作数UDOC还可以像其他任何评价函数操作数一样用来执行优化。
例如,将前组的总长度限制为40mm,并将每个表面的中心厚度保持在合理的范围内。在操作数UDOC中将
目标值
设置为40mm。添加操作数MNCT和MXCT来限制中心厚度。如果需要,还可以将其他优化标准添加到评价函数编辑器
中,比如RMS光斑半径大小或波前差。在只控制厚度的情况下执行优化。
优化后,第一组总长度正好为40mm,且各表面中心厚度符合要求。
以上就是好酷屋教程网小编为您收集和整理的ZEMAX | 如何使用ZOS-API创建自定义操作数相关内容,如果对您有帮助,请帮忙分享这篇文章^_^
本文来源: https://www.haoku5.com/IT/63a6544bf7ebe076380ddd4a.html
相关推荐