ZEMAX | 如何使用ZOS-API创建自定义操作数

发布时间:
浏览次数: 798

好酷屋教程网小编为您收集和整理了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

相关推荐

    分享到: