Ansys Zemax | 在 MATLAB 中使用 ZOS-API 的技巧

附件下載

聯(lián)系工作人員獲取附件

本文將介紹一些在MATLAB中使用 ZOS-API 的技巧,以提高您的工作效率并充分利用 ZOS-API 的功能。

簡介

OpticStudio開發(fā)了應(yīng)用程序接口 (API) ,用戶可以使用API與不同的腳本環(huán)境進(jìn)行連接和交互。使用API,用戶可以與已打開的OpticStudio例程進(jìn)行通信(交互擴(kuò)展 ( Interactive Extension ) )或在后臺運(yùn)行OpticStudio(獨(dú)立應(yīng)用程序 ( Standalone Application ) )。這對于進(jìn)行重復(fù)計(jì)算或用戶處理OpticStudio生成的數(shù)據(jù)非常實(shí)用。本文只討論ZOS-API與MATLAB相連接,并重點(diǎn)介紹一些技巧。

語法提示

在MATLAB中,可以使用語法提示完成代碼或列出成員(如圖所示):


這對于通過減少拼寫錯(cuò)誤和其他常見錯(cuò)誤來提高編碼的速度特別實(shí)用。但是,當(dāng)MATLAB腳本完成時(shí),不能訪問變量內(nèi)部的內(nèi)容。可以運(yùn)行示例文件的一部分——示例01:創(chuàng)建新文件并使用快速聚焦 ( New File and QuickFocus ) ,以及安裝OpticStudio并進(jìn)行檢查。如果想要在MATLAB腳本已經(jīng)終止時(shí)訪問TheLDE,就會(huì)得到一條消息——“沒有找到已完成文件”。


為了避免這個(gè)問題,必須運(yùn)行MATLAB腳本并插入斷點(diǎn)來阻止腳本運(yùn)行結(jié)束。這適用于獨(dú)立應(yīng)用程序或?qū)⒋a放在用于交互擴(kuò)展的MATLABZOSConnection腳本中。通過在MATLAB中點(diǎn)擊:編輯器 ( Editor ) > 斷點(diǎn) ( Breakpoints ) > 設(shè)置/清除 ( Set/Clear ) 插入斷點(diǎn):


在MATLAB中,斷點(diǎn)由行號旁邊的紅色圓圈表示。本例中,在第44行輸入斷點(diǎn):


現(xiàn)在可以通過在MATLAB的 (.) 語句后按TAB鍵,并在腳本編輯器 ( Script Editor ) 或命令窗口 ( Command Window ) 使用語法提示:


另外,將代碼放在單獨(dú)的腳本中進(jìn)行交互擴(kuò)展,將路徑添加到MATLABZOSConnection腳本中,并將TheApplication定義為相同的MATLABZOSConnection,而不是將代碼放在OpticStudio中生成的交互擴(kuò)展的MATLABZOSConnection腳本中。本例中,連接號是21。如下為可以使用的代碼示例:


    addpath('\\zmefs01\redirectedfolders\alastair.humphrey\Documents\Zemax\ZOS-API Projects\MATLABZOSConnection21\')
    TheApplication = MATLABZOSConnection21;

使用上述的任何一種方法。可以通過OpticStudio進(jìn)行API命令測試,實(shí)時(shí)觀察命令的運(yùn)行結(jié)果。另外,命令窗口可用作實(shí)用的調(diào)試工具。因?yàn)檫@兩種情況下主函數(shù)并沒有運(yùn)行結(jié)束,仍然可以通過點(diǎn)擊工作空間中的任何對象來研究已聲明的對象:


使用帶有'out'參數(shù)的 .NET方法

以下是使用帶有 ' out ' 參數(shù)和GetIndex的 .NET方法的示例:


當(dāng)在MATLAB中使用帶有 ' out ' 參數(shù)的 .NET 方法時(shí),必須確保將方法提供給的對象是正確的類型。在這種情況下,需要長度等于波長數(shù)量的雙數(shù)組。下面的代碼是返回表面 2 在三個(gè)波長下的折射率的示例:


    surf_num = 2;
    num_waves = 3; % probably shouldn't hard code thisindex = NET.createArray('System.Double', 3);
    TheApplication.PrimarySystem.LDE.GetIndex(surf_num, num_waves, index);
    index_data = index.double;

MATLAB 函數(shù) methods 和 methodsview

MATLAB函數(shù)methods和methodsview可以用來查看類方法名稱。例如,代碼可以寫為:

當(dāng)在MATLAB中使用帶有 ' out ' 參數(shù)的 .NET 方法時(shí),必須確保將方法提供給的對象是正確的類型。在這種情況下,需要長度等于波長數(shù)量的雙數(shù)組。下面的代碼是返回表面 2 在三個(gè)波長下的折射率的示例:

MySag=TheApplication.PrimarySystem.Analyses.New_Analysis(ZOSAPI.Analysis.AnalysisIDM.SurfaceSag);methods(MySag)    

運(yùn)行得到的結(jié)果為:


在MATLAB中讀取枚舉

有時(shí)在OpticStudio中,可能需要在MATLAB中循環(huán)枚舉來讀取數(shù)據(jù)。例如,要將偶次非球面(Even Asphere)的系數(shù)讀入MATLAB。

偶數(shù)非球面的表面矢高為:


可以使用偶次非球面示例文件

"{Zemax}\Samples\Sequential\Objectives\Even Asphere.zmx" 讀取系數(shù):


可以使用eval函數(shù)并循環(huán)枚舉將數(shù)據(jù)讀入MATLAB:


    TheSystem = TheApplication.PrimarySystem;
    TheLDE = TheSystem.LDE;
    for no_coeff=1:8
    EA_coeff(no_coeff) = eval(['TheLDE.GetSurfaceAt(2).GetSurfaceCell(ZOSAPI.Editors.LDE.SurfaceColumn.Par' num2str(no_coeff) ').DoubleValue']);
    end

MATLAB中的時(shí)間性能函數(shù)

MATLAB中有一些實(shí)用的有關(guān)時(shí)間的函數(shù),能夠估計(jì)代碼或部分代碼運(yùn)行所需的時(shí)間。在使用ZOS-API時(shí),這些函數(shù)有助于檢查優(yōu)化或公差分析所需的時(shí)間。

方法一 :使用 timeit 函數(shù),它將多次運(yùn)行同一個(gè)函數(shù)并返回執(zhí)行代碼所需時(shí)間的中位數(shù)。

方法二:使用 profile 函數(shù),它將返回特定函數(shù)執(zhí)行時(shí)間的統(tǒng)計(jì)信息。

方法三:使用秒表計(jì)時(shí)器功能。以下將討論秒表計(jì)時(shí)器功能,使用 tic 函數(shù)啟動(dòng)秒表, toc 停止秒表:

如下代碼摘錄自示例代碼:"{Zemax}\ZOS-API SampleCode\MATLAB\MATLABStandalone_15_Seq_Optimization.m"。


    tic
    TheMFE = TheSystem.MFE;
    OptWizard = TheMFE.SEQOptimizationWizard;
    %Optimize for smallest RMS Spot, which is "Data" = 1
    OptWizard.Data = 1;
    OptWizard.OverallWeight = 1;
    %Gaussian Quadrature with 3 rings (refers to index number = 2)
    OptWizard.Ring = 2;
    %Set air & glass boundaries
    OptWizard.IsGlassUsed = true;
    OptWizard.GlassMin = 3.0;
    OptWizard.GlassMax = 15.0;
    OptWizard.GlassEdge = 3.0;
    OptWizard.IsAirUsed = true;
    OptWizard.AirMin = 0.5;
    OptWizard.AirMax = 1000.0;
    OptWizard.AirEdge = 0.5;
    %And click OK!
    OptWizard.Apply();
    toc
    tic;
        LocalOpt = TheSystem.Tools.OpenLocalOptimization();
        if ~isempty(LocalOpt)
            LocalOpt.Algorithm = ZOSAPI.Tools.Optimization.OptimizationAlgorithm.DampedLeastSquares;
            LocalOpt.Cycles = ZOSAPI.Tools.Optimization.OptimizationCycles.Automatic;
            LocalOpt.NumberOfCores = 8;
            fprintf('Local Optimization...\n');
            fprintf('Initial Merit Function %6.3f\n', LocalOpt.InitialMeritFunction);
            LocalOpt.RunAndWaitForCompletion();
            fprintf('Final Merit Function %6.3f\n', LocalOpt.CurrentMeritFunction);
            LocalOpt.Close();
        end  
        % Get the elapsed time as a TimeSpan value.
        toc;

進(jìn)行局部優(yōu)化 ( Local Optimization )……

初始評價(jià)函數(shù)值為:0.363

最終評價(jià)函數(shù)值為:0.170

運(yùn)行時(shí)間為:1.765178秒。

MATLAB 實(shí)時(shí)編輯器 ( Live Editor )

MATLAB實(shí)時(shí)編輯器是很實(shí)用的工具,可以在其中創(chuàng)建實(shí)時(shí)腳本,該腳本可以與代碼并行顯示輸出。此外,還可以添加文本、方程、圖像和超鏈接。關(guān)于MATLAB實(shí)時(shí)編輯器的更多信息可以聯(lián)系我們工作人員獲取。


已經(jīng)從OpticStudio中檢索出如下示例中的庫克三片式鏡頭的波前圖(Wavefront Map)和FFTMTF,并繪制成MATLAB圖形。本例中使用的MLX文件(MATLAB實(shí)時(shí)腳本文件格式)在本文的附件中。


MATLAB 實(shí)時(shí)編輯器的實(shí)用功能是分節(jié)符,可以將代碼分節(jié)并獨(dú)立運(yùn)行。


例如,使用庫克三片式鏡頭,可以選中計(jì)算每個(gè)表面主光線的AOI 的代碼部分,然后單擊“ 分節(jié)符 ”圖標(biāo)。如果點(diǎn)擊“查看每個(gè)表面上主光線的AOI”部分(此部分周圍會(huì)出現(xiàn)藍(lán)色的方框),然后點(diǎn)擊“運(yùn)行小節(jié) ( Run Section) ”圖標(biāo),可以分別計(jì)算該節(jié)的代碼。