ZEMAX | 如何用 ZOS-API 创建用户自定义分析
OpticStudio可用的应用程序接口 (ZOS-API) 允许使用最新的软件技术连接和定制应用程序。本文展示了如何使用ZOS-API创建定制的用户分析。
作者 Thomas Pickering
附件下载
联系工作人员获取附件
简介
ZOS-API是一个基于COM,来源于.NET库的接口,为用户提供了用多种语言编程的能力,包括C++、Python和Matlab。
在本文中,我们将重点讨论有限访问类型的自定义分析模式。此模式链接到单个分析窗口,并用于填充自定义分析所需的数据。数据将被显示在OpticStudio图形窗口中。与自定义操作数模式类似,该模式只允许更改当前系统的副本。用户分析可以使用C++ (COM) 或 C# (.NET)编写——这取决于用户使用这两种语言的偏好。
新建样本模板
为了用 C# 编写自定义分析,我们需要选择 编程 (Programming) ... C# ...自定义分析 (User Analysis) 。
Windows资源管理器会打开文件夹 {Zemax}\ZOS-API Projects\CSharpUserAnalysisApplication1。您的默认 C# 开发程序也将打开,该程序包含一个样板代码,可以作为任何用户自定义分析的基础。
修改镜头数据编辑器
我们将为位于 {Zemax}\Samples\Sequential\Objectives\Double Gauss 28 degree field.zmx 的示例文件创建此用户分析。
计划以每次增加 10 um 的步骤变化表面 6 的表面厚度+/- 1mm,并研究在30、40和 50 cycles/mm 时调制传递函数 (MTF) 的改变。
首先,在代码的顶部添加3行。我们需要设置名称空间,然后在不指定完整路径的情况下使用内部接口。
using ZOSAPI.Editors.MFE;
using ZOSAPI.Editors;
using ZOSAPI.Tools.General;
然后找到“//Add your custom code here... ”,并开始编码。更改窗口标题,读入镜头数据编辑器 (LDE) 并声明数组来保存数据。
// Add your custom code here...
TheAnalysisData.WindowTitle = "MTF vs. Thickness";
ILensDataEditor TheLDE = TheSystem.LDE;
ILDERow surf6 = TheLDE.GetSurfaceAt(6);
double[] MTFs30 = new double[201];
double[] MTFs40 = new double[201];
double[] MTFs50 = new double[201];
double[] surf6Thic = new double[201];
请记住,C# 是强类型的,这表明我们必须在声明变量时指定它的数据类型。
设置评价函数编辑器
接下来,添加3个操作数,将其改为MTFS(调制传递函数,矢状面),将采样(参数1)设置为 64 x 64,频率(参数4)设置为 30、40 和 50 cycles/mm 。由于这些代码指令非常相似,使用复制和粘贴 (Ctrl+C, Ctrl+V) 来减少作业量。
IMeritFunctionEditor TheMFE = TheSystem.MFE;
IMFERow Operand_1 = TheMFE.AddOperand();
Operand_1.ChangeType(MeritOperandType.MTFS);
IEditorCell Op1Samp = Operand_1.GetOperandCell(MeritColumn.Param1);
Op1Samp.IntegerValue = 2;
IEditorCell Op1Freq = Operand_1.GetOperandCell(MeritColumn.Param4);
Op1Freq.DoubleValue = 30;
IMFERow Operand_2 = TheMFE.AddOperand();
Operand_2.ChangeType(MeritOperandType.MTFS);
IEditorCell Op2Samp = Operand_2.GetOperandCell(MeritColumn.Param1);
Op2Samp.IntegerValue = 2;
IEditorCell Op2Freq = Operand_2.GetOperandCell(MeritColumn.Param4);
Op2Freq.DoubleValue = 40;
IMFERow Operand_3 = TheMFE.AddOperand();
Operand_3.ChangeType(MeritOperandType.MTFS);
IEditorCell Op3Samp = Operand_3.GetOperandCell(MeritColumn.Param1);
Op3Samp.IntegerValue = 2;
IEditorCell Op3Freq = Operand_3.GetOperandCell(MeritColumn.Param4);
Op3Freq.DoubleValue = 50;
用循环来计算分析数据点
在计算评价函数之前,要用数据填充阵列,改变表面 6 的厚度并运行快速对焦。然后我们可以在其各自的数据数组中写入每个操作数值。
double step = 0.01;
surf6.Thickness = surf6.Thickness - 100 * step;
for (int i = 0; i < 201; i++)
{
surf6.Thickness = surf6.Thickness + step;
surf6Thic[i] = surf6.Thickness;
quickFocus = TheSystem.Tools.OpenQuickFocus();
quickFocus.Criterion = QuickFocusCriterion.SpotSizeRadial;
quickFocus.UseCentroid = true;
quickFocus.RunAndWaitForCompletion();
quickFocus.Close();
TheMFE.CalculateMeritFunction();
MTFs30[i] = Operand_1.Value;
MTFs40[i] = Operand_2.Value;
MTFs50[i] = Operand_3.Value;
}
为结果绘图
最后,使用TheAnalysisData创建一个特定的图形类型并填充数据。如果您曾经使用DDE创建过用户分析,那么您会发现通过ZOS-API进行绘图会更加直接和灵活。
IUser2DLineData linePlot = TheAnalysisData.Make2DLinePlot
("MTF vs. Surface 6 Thickness", 201, surf6Thic);
linePlot.AddSeries("MTF 30 cycles/mm", ZemaxColor.Color1, 201, MTFs30);
linePlot.AddSeries("MTF 40 cycles/mm", ZemaxColor.Color2, 201, MTFs40);
linePlot.AddSeries("MTF 50 cycles/mm", ZemaxColor.Color3, 201, MTFs50);
linePlot.XLabel = "Surface 6 Thickness [mm]";
linePlot.YLabel = "MTF";
目前有四种类型的数据可以计算和显示:
二维线图
二维网格图
二维RGB网格图
文本数据注意
每个用户分析只允许使用一种数据格式。
保存,创建和移动激活
我们将发表解决方案,在调试时能够使用调试模式,但是在发布插件时应该始终使用发布模式,因为调试库是不能再发布的。因此,让我们切换到发布模式并重新发布。
我们需要找到我们的解决方案文件夹 ({Zemax}\ZOS-API Projects\…) ,找到项目文件夹,然后将完成的应用程序移动到 {Zemax}\ZOS-API\TheAnalysisData 。
运行自定义分析
为了检查我们的新自定义分析,我们现在可以启动OpticStudio并打开透镜文件 {Zemax}\Samples\Sequential\Objectives\Double Gauss 28 degree field.zmx。
在编程 (Programming) 标签下,我们找到自定义分析 (User Analyses),这里应该是我们刚刚做的分析。
当我们点击它时,就会得到自定义分析的结果!
其他可能性
在本例中,表面变化、变化范围和步长以及报告MTF的空间频率都是编死的,但是可以简单地添加对话框允许用户输入数值来改变硬编程。这样们可以创建一个可以更通用的自定义分析。设置存储在由键-值对组成的简单字典中。当您的第一次启动分析时,字典是空的,但是添加到设置字典中的任何条目都将在更新时保存。
以下类型可以存储在设置中:
整数型 Integer<
浮点型 Float (32位)
双浮点型 (64位)
布尔 Boolean
字符串 String
字节 Byte