ZEMAX | 如何用 ZOS-API 創(chuàng)建用戶自定義分析
OpticStudio可用的應(yīng)用程序接口 (ZOS-API) 允許使用最新的軟件技術(shù)連接和定制應(yīng)用程序。本文展示了如何使用ZOS-API創(chuàng)建定制的用戶分析。
作者 Thomas Pickering
附件下載
聯(lián)系工作人員獲取附件
簡(jiǎn)介
ZOS-API是一個(gè)基于COM,來(lái)源于.NET庫(kù)的接口,為用戶提供了用多種語(yǔ)言編程的能力,包括C++、Python和Matlab。
在本文中,我們將重點(diǎn)討論有限訪問(wèn)類(lèi)型的自定義分析模式。此模式鏈接到單個(gè)分析窗口,并用于填充自定義分析所需的數(shù)據(jù)。數(shù)據(jù)將被顯示在OpticStudio圖形窗口中。與自定義操作數(shù)模式類(lèi)似,該模式只允許更改當(dāng)前系統(tǒng)的副本。用戶分析可以使用C++ (COM) 或 C# (.NET)編寫(xiě)——這取決于用戶使用這兩種語(yǔ)言的偏好。
新建樣本模板
為了用 C# 編寫(xiě)自定義分析,我們需要選擇 編程 (Programming) ... C# ...自定義分析 (User Analysis) 。
Windows資源管理器會(huì)打開(kāi)文件夾 {Zemax}\ZOS-API Projects\CSharpUserAnalysisApplication1。您的默認(rèn) C# 開(kāi)發(fā)程序也將打開(kāi),該程序包含一個(gè)樣板代碼,可以作為任何用戶自定義分析的基礎(chǔ)。
修改鏡頭數(shù)據(jù)編輯器
我們將為位于 {Zemax}\Samples\Sequential\Objectives\Double Gauss 28 degree field.zmx 的示例文件創(chuàng)建此用戶分析。
計(jì)劃以每次增加 10 um 的步驟變化表面 6 的表面厚度+/- 1mm,并研究在30、40和 50 cycles/mm 時(shí)調(diào)制傳遞函數(shù) (MTF) 的改變。
首先,在代碼的頂部添加3行。我們需要設(shè)置名稱空間,然后在不指定完整路徑的情況下使用內(nèi)部接口。
using ZOSAPI.Editors.MFE;
using ZOSAPI.Editors;
using ZOSAPI.Tools.General;
然后找到“//Add your custom code here... ”,并開(kāi)始編碼。更改窗口標(biāo)題,讀入鏡頭數(shù)據(jù)編輯器 (LDE) 并聲明數(shù)組來(lái)保存數(shù)據(jù)。
// 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];
請(qǐng)記住,C# 是強(qiáng)類(lèi)型的,這表明我們必須在聲明變量時(shí)指定它的數(shù)據(jù)類(lèi)型。
設(shè)置評(píng)價(jià)函數(shù)編輯器
接下來(lái),添加3個(gè)操作數(shù),將其改為MTFS(調(diào)制傳遞函數(shù),矢狀面),將采樣(參數(shù)1)設(shè)置為 64 x 64,頻率(參數(shù)4)設(shè)置為 30、40 和 50 cycles/mm 。由于這些代碼指令非常相似,使用復(fù)制和粘貼 (Ctrl+C, Ctrl+V) 來(lái)減少作業(yè)量。
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;
用循環(huán)來(lái)計(jì)算分析數(shù)據(jù)點(diǎn)
在計(jì)算評(píng)價(jià)函數(shù)之前,要用數(shù)據(jù)填充陣列,改變表面 6 的厚度并運(yùn)行快速對(duì)焦。然后我們可以在其各自的數(shù)據(jù)數(shù)組中寫(xiě)入每個(gè)操作數(shù)值。
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;
}
為結(jié)果繪圖
最后,使用TheAnalysisData創(chuàng)建一個(gè)特定的圖形類(lèi)型并填充數(shù)據(jù)。如果您曾經(jīng)使用DDE創(chuàng)建過(guò)用戶分析,那么您會(huì)發(fā)現(xiàn)通過(guò)ZOS-API進(jìn)行繪圖會(huì)更加直接和靈活。
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";
目前有四種類(lèi)型的數(shù)據(jù)可以計(jì)算和顯示:
二維線圖
二維網(wǎng)格圖
二維RGB網(wǎng)格圖
文本數(shù)據(jù)注意
每個(gè)用戶分析只允許使用一種數(shù)據(jù)格式。
保存,創(chuàng)建和移動(dòng)激活
我們將發(fā)表解決方案,在調(diào)試時(shí)能夠使用調(diào)試模式,但是在發(fā)布插件時(shí)應(yīng)該始終使用發(fā)布模式,因?yàn)檎{(diào)試庫(kù)是不能再發(fā)布的。因此,讓我們切換到發(fā)布模式并重新發(fā)布。
我們需要找到我們的解決方案文件夾 ({Zemax}\ZOS-API Projects\…) ,找到項(xiàng)目文件夾,然后將完成的應(yīng)用程序移動(dòng)到 {Zemax}\ZOS-API\TheAnalysisData 。
運(yùn)行自定義分析
為了檢查我們的新自定義分析,我們現(xiàn)在可以啟動(dòng)OpticStudio并打開(kāi)透鏡文件 {Zemax}\Samples\Sequential\Objectives\Double Gauss 28 degree field.zmx。
在編程 (Programming) 標(biāo)簽下,我們找到自定義分析 (User Analyses),這里應(yīng)該是我們剛剛做的分析。
當(dāng)我們點(diǎn)擊它時(shí),就會(huì)得到自定義分析的結(jié)果!
其他可能性
在本例中,表面變化、變化范圍和步長(zhǎng)以及報(bào)告MTF的空間頻率都是編死的,但是可以簡(jiǎn)單地添加對(duì)話框允許用戶輸入數(shù)值來(lái)改變硬編程。這樣們可以創(chuàng)建一個(gè)可以更通用的自定義分析。設(shè)置存儲(chǔ)在由鍵-值對(duì)組成的簡(jiǎn)單字典中。當(dāng)您的第一次啟動(dòng)分析時(shí),字典是空的,但是添加到設(shè)置字典中的任何條目都將在更新時(shí)保存。
以下類(lèi)型可以存儲(chǔ)在設(shè)置中:
整數(shù)型 Integer<
浮點(diǎn)型 Float (32位)
雙浮點(diǎn)型 (64位)
布爾 Boolean
字符串 String
字節(jié) Byte