ZEMAX | 如何使用ZOS-API创建自定义操作数
本文将使用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”循环求取定义的表面范围内的所有表面中心厚度之和。如果表面范围输入是有效的,那么自定义操作数将返回厚度的总和。否则将返回无穷大的数,这意味着输入是无效的。
double Hx = TheApplication.OperandArgument1;
double Hy = TheApplication.OperandArgument2;
double Px = TheApplication.OperandArgument3;
double Py = TheApplication.OperandArgument4;
现在,示例自定义操作数的编码已经完成。请注意,在本例中,使用operandResult[0] 将厚度值的和存入数据字段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 全新 22.1 版本产品现已发布!
ZEMAX | 如何使用ZOS-API创建自定义操作数相关推荐
- 用maya的api创建自定义的节点Creating Custom Locator
原文地址 http://www.fevrierdorian.com/blog/post/2010/02/12/Creating-custom-locator-with-Maya-s-Python-AP ...
- 【百度地图API·javascriptapi】地图定位、创建自定义图标、获取用户点击位置
引言 地图在网页上的应用远不止于展示,我们可以借助百度地图定位用户的当前位置,在地图上创建自定义的标记,或者在用户点击地图的时候,获取用户点击位置的经纬度. 定位 百度地图给用户提供了专门的定位api ...
- reddit_如何使用Python创建自定义Reddit通知系统
reddit by Kelsey Wang 王凯西 如何使用Python创建自定义Reddit通知系统 (How to make a custom Reddit notification system ...
- php创建菜单_php实现微信公众号创建自定义菜单功能的实例代码
目的 创建自定义菜单,实现菜单事件. 首先获取Access_Token 接口: 我用的是测试号,修改APPID和APPSECRET,然后浏览器访问上面这个Url即可生成Access_Token 然后配 ...
- 如何在android中创建自定义对话框?
本文翻译自:How to create a Custom Dialog box in android? I want to create a custom dialog box like below ...
- 4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]
2019独角兽企业重金招聘Python工程师标准>>> 创建自定义指令 注意:本指南是针对已经熟悉AngularJS基础的开发者.如果您只是想要开始,建议您先去看教程.如果你在寻找指 ...
- java邮件中添加excel_使用java api 创建excel内容并发送邮件
https://github.com/auguszero/javaToolRepsitory 利用java api 创建excel 内容并发送邮件 主要实现功能: 1.通过配置文件设置发送邮件发送方, ...
- 在ASP.NET Core中创建自定义端点可视化图
在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...
- 使用 .NET Core模板引擎创建自定义的模板和项目
本文要点 .NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项.这就是"dotnet new"命令. 默认模板集涵盖了默认控制台和基于 ASP.NET 的应 ...
最新文章
- laravel ajax vue6,详解用vue.js和laravel实现微信支付
- 神经网络和深度学习各类概念名词解析
- 探究php底层运行机制
- hadoop(05)、使用Eclipse连接远程Hadoop集群
- python物体跟着鼠标走_用Python写一个跟随鼠标运动的自定义窗口
- 网络分析shell脚本(实时流量+连接统计)
- 数字图像隐写术之卡方分布
- 使用matplotlib修改字体之Times New Roman
- vim光速开发,你值得拥有
- win10怎么将计算机放桌面壁纸,Win10专业版无法设置电脑桌面壁纸怎么办?
- 【NLP自然语言处理】文本特征提取
- Linux系统shell脚本之打印系统的IP信息
- 腾讯、新浪、淘宝、搜狐的IP库接口,根据IP显示当地的天气功能
- 几款超好用的PDF转换软件推荐
- 大象又要跳舞了,中国移动的用户再度加速增长
- Android自定义软键盘的实现
- 研发过程中的质量把控环节要点
- windows server 2012 R2 安装 Intel Wireless-AC 7260 无线网卡
- MySQL深入学习(十四):视图
- mui 原生jsH5预览图片
热门文章
- Ruby学习之文件的写入和读取
- pc服务器e7系列,浪潮服务器领跑多路高端市场
- python 参数后面加冒号:, 函数后面的添加箭头 None
- openlayers之ZXY转换为BBox
- XML解析神器JAXB
- 《Introduction to Linux》——Linux Fundation (10~14/18章)
- ai中如何插入签名_如何在微信公众号文章排版中插入趣味问答互动样式?
- python3爬虫源代码_爬虫代理池源代码测试-Python3WebSpider
- 深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(三)-路由与隧道...
- 今日金融词汇---品牌溢价