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

附件下載

聯系工作人員獲取附件

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

簡介

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

語法提示

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


圖片圖片


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


圖片

為了避免這個問題,必須運行MATLAB腳本并插入斷點來阻止腳本運行結束。這適用于獨立應用程序或將代碼放在用于交互擴展的MATLABZOSConnection腳本中。通過在MATLAB中點擊:編輯器 ( Editor ) > 斷點 ( Breakpoints ) > 設置/清除 ( Set/Clear ) 插入斷點:


圖片


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


圖片


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


圖片

圖片


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


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


使用上述的任何一種方法。可以通過OpticStudio進行API命令測試,實時觀察命令的運行結果。另外,命令窗口可用作實用的調試工具。因為這兩種情況下主函數并沒有運行結束,仍然可以通過點擊工作空間中的任何對象來研究已聲明的對象:


圖片

使用帶有'out'參數的 .NET方法


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


圖片

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


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 函數 methods和 methodsview

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


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


運行得到的結果為:


圖片

在MATLAB中讀取枚舉

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

偶數非球面的表面矢高為:


圖片


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

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


圖片


可以使用eval函數并循環枚舉將數據讀入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中的時間性能函數

MATLAB中有一些實用的有關時間的函數,能夠估計代碼或部分代碼運行所需的時間。在使用ZOS-API時,這些函數有助于檢查優化或公差分析所需的時間。


方法一 :使用 timeit 函數,它將多次運行同一個函數并返回執行代碼所需時間的中位數。

方法二:使用 profile 函數,它將返回特定函數執行時間的統計信息。

方法三:使用秒表計時器功能。以下將討論秒表計時器功能,使用 tic 函數啟動秒表, 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;


進行局部優化 ( Local Optimization )……

初始評價函數值為:0.363

最終評價函數值為:0.170

運行時間為:1.765178秒。

MATLAB 實時編輯器 ( Live Editor )

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


圖片


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


圖片


MATLAB 實時編輯器的實用功能是分節符,可以將代碼分節并獨立運行。


圖片


例如,使用庫克三片式鏡頭,可以選中計算每個表面主光線的AOI 的代碼部分,然后單擊“ 分節符 ”圖標。如果點擊“查看每個表面上主光線的AOI”部分(此部分周圍會出現藍色的方框),然后點擊“運行小節 ( Run Section) ”圖標,可以分別計算該節的代碼。


圖片

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
1