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

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

簡介

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

語法提示

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖1ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖2


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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖3


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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖4


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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖5

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖6

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖7


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

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

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖8

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

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖9

當在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)

運行得到的結果為:

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖10

在MATLAB中讀取枚舉

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

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖11

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

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖12

可以使用eval函數并循環枚舉將數據讀入MATLAB:

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


ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖13


MATLAB中的時間性能函數

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

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

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

  • 方法三:使用秒表計時器功能。以下將討論秒表計時器功能,使用 tic 函數啟動秒表, toc 停止秒表:

如下代碼摘錄自示例代碼:

"{Zemax}\ZOS-API SampleCode\MATLAB\MATLABStandalone_15_Seq_Optimization.m"。

ticTheMFE = TheSystem.MFE;OptWizard = TheMFE.SEQOptimizationWizard;%Optimize for smallest RMS Spot, which is "Data" = 1OptWizard.Data = 1;OptWizard.OverallWeight = 1;%Gaussian Quadrature with 3 rings (refers to index number = 2)OptWizard.Ring = 2;%Set air & glass boundariesOptWizard.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();toctic;    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實時編輯器的更多信息可以聯系我們獲取

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖14

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖15


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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖16

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

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖17



Zemax 全新 22.1 版本產品現已發布!

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖18

點擊圖片查看課程詳情

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖19

點擊圖片查看培訓詳情

相關閱讀 - 編程

在 MATLAB 或 Python 中使用 ZOS-API 進行光線追跡的批次處理

ZEMAX  | 了解 ZOS-API 的主要接口——MATLAB

ZEMAX | 使用 ZPL 宏進行優化:ZPLM 操作數

ZEMAX | 如何編寫 ZPL 宏:計算環帶垂軸色差

ZEMAX | ZOS-API、ZPL 和 DLL 之間的區別

ZEMAX  | 如何使用 ZOS-API 創建飛行時間自定義分析

ZEMAX | 如何使用 ZPL 創建用戶自定義求解



歡迎掃碼添加宇熠工作人員微信,

進入 zemax 微信交流群。

一起來學習光學設計吧!

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖20

掃碼邀您入群


如果您對產品感興趣,或需要技術支持,歡迎致電垂詢!

電話:027-87878386

郵箱:market@ueotek.com

關注武漢宇熠視頻號 查看更多精彩視頻 


ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖21
ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖22

武漢宇熠科技是 ZEMAX 中國區官方指定代理商,提供 ZEMAX 光學設計軟件的培訓、銷售、技術支持、二次開發、解決方案及 ZEMAX 軟件相關全方位定制服務。有關 ZEMAX ,您可以點擊文末“閱讀原文”了解更多信息,或致電垂詢武漢宇熠工作人員:

銷售熱線:027-87878386

咨詢郵箱:sales@ueotek.com

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖23
ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖24


ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖25

ZEMAX | 在MATLAB中使用ZOS-API的技巧的圖26


??點擊閱讀原文咨詢產品或技術支持。

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

TOP