ZOS-API 是個功能強大的工具,在 ZOS-API 中,用戶可以用編程的方式執行OpticStudio 用戶界面中可能實現的所有操作(以及更多操作)。本文將展示如何使用 Python 與 ZOS-API 交互來創建單透鏡、添加評價函數 ( Merit Function ) 目標,並優化系統。(聯系我們獲取文章附件)
此示例使用 COM 接口通過 pywin32 模塊將 Python 連接到 ZOS-API。但我們現在不推薦這麼做。
本文將通過使用 ZOS-API 中的 Python 連接來逐步建立和優化單透鏡系統。利用獨立應用程序 ( Standalone Application ) 功能,該功能允許用戶在默認 Python 程序中編寫代碼,然後運行來獲得可工作的 OpticStudio 文件。
本文將重點討論獨立模式 ( Standalone Mode )。第一步是通過單擊:編程 ( Programming ) > Python > 獨立應用程序 ( Standalone Application ) ,創建模板解決方案。
Windows 資源管理器打開帶有解決方案的文件夾 {Zemax}\ZOS-API Projects\PythonStandaloneApplication。
使用以下工具對Python項目和腳本進行測試:
Windows(64位)中安裝的 Python 3.7.2 (https://www.python.org/downloads/)-Python編譯器
用於 Windows 擴展的 Python (64位, Python 3.7) (https://github.com/mhammond/pywin32/releases) - 支持COM
Windows 桌面上的 Microsoft Visual Studio Express 2013 (https://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx) - 易於使用的 IDE
Visual Studio 中的 Python工具 (https://pytools.codeplex.com/)- 集成到 Visual Studio
注意,Visual Studio 和 Python工具使開發變得更容易,但是 Python 腳本應該在沒有安裝它們的情況下運行。如果安裝了 Visual Studio,它將與新解決方案一起打開,該解決方案包含可用作任何獨立應用程序基礎的模板代碼。
設計規格如下的單透鏡:
光線來自無限遠,半視場角為5°,單一波長(d光,0.587mm)。
准直的入射光被聚焦為最小的RMS光斑半徑,均勻射入視場中。
F 數為10,入瞳直徑為 40 mm。
材料為 N-BK7。
光闌為位於透鏡之後單獨的表面,可以自由移動。
至少3片透鏡,並且中心厚度不超過15mm。
透鏡的邊緣厚度最小為3mm,空氣間隙最小為 0.5 mm
在腳本中,轉到 “# Insert Code Here
” 然後輸入:
TheSystem = zosapi.TheSystem;
TheSystem.New(False);
上述程序表示完整的光學系統,對應於獨立的 . ZMX文件。現在創建包含新文件路徑的字符串。為了使腳本更加靈活,將使用 SamplesDir
屬性來創建文件路徑。
fileOut = zosapi.TheApplication.SamplesDir + "\Sequential\Objectives\Single Lens Example wizard+EFFL.zmx";
zosapi.TheSystem.SaveAs(fileOut);
TheSystemData
包含系統的所有基本數據,可以用其設置光圈、視場、波長等。
# Aperture
TheSystemData = TheSystem.SystemData;
TheSystemData.Aperture.ApertureValue = 40;
# Fields
TheSystemData.Fields.AddField(0,5.0,1.0);
# Wavelength preset
TheSystemData.Wavelengths.SelectWavelengthPreset(constants.WavelengthPreset_d_0p587);
對於枚舉常量,如: WavelengthPreset
, Python 將每個常量創建為{enum name}_{enum value}
.
在鏡頭數據編輯器中,每一行表示系統中定義的一個表面:表面0是物面,最後一個表面是像面。對於位於光闌前的單透鏡,透鏡的前表面是表面1,透鏡的後表面是表面2,光闌是表面3。
# Lens data
TheLDE = TheSystem.LDE;
TheLDE.InsertNewSurfaceAt(1);
TheLDE.InsertNewSurfaceAt(1);
Surface_1 = TheLDE.GetSurfaceAt(1);
Surface_2 = TheLDE.GetSurfaceAt(2);
Surface_3 = TheLDE.GetSurfaceAt(3);
Surface_1.Thickness = 10.0;
Surface_1.Comment = 'front of lens';
Surface_1.Material = 'N-BK7';
Surface_2.Thickness = 50.0;
Surface_2.Comment = 'rear of lens';
Surface_3.Comment = 'Stop is free to move';
Surface_3.Thickness = 350.0;
可以用5個自變量來實現設計目標——透鏡的前後半徑、透鏡的厚度、光闌的位置和像的位置。
# Make thicknesses and radii variable
Surface_1.RadiusCell.MakeSolveVariable();
Surface_1.ThicknessCell.MakeSolveVariable();
Surface_2.RadiusCell.MakeSolveVariable();
Surface_2.ThicknessCell.MakeSolveVariable();
Surface_3.ThicknessCell.MakeSolveVariable();
如果想在 OpticStudio 中打開文件來查看當前的進度,首先需要使用以下代碼保存鏡頭文件:
# Save and close
The System.Save();
這段代碼需要保留在鍵入的任何其他內容的末尾,但是現在將使用它來檢查系統。確保在此之後添加的任何內容都在編輯器中的此代碼之前。
當運行代碼後沒有收到任何錯誤提示時,可以通過導航到上面指定的目錄來打開鏡頭文件: {Zemax}\Samples\Sequential\Objectives ,並選擇文件。鏡頭數據編輯器將如下所示:
使用序列優化向導 ( Sequential Optimization Wizard ) 在默認的評價函數中指定最小光斑半徑 ( Minimum Spot Radius ) 和玻璃/空氣的邊界條件的目標值。
如上圖所示,使用以下代碼來設置優化向導:
# Merit functions
TheMFE = TheSystem.MFE;
wizard = TheMFE.SEQOptimizationWizard;
wizard.Type = 0; # RMS
wizard.Data = 1; # Spot Radius
wizard.Reference = 0; # Centroid
wizard.Ring = 2; # 3 Rings
wizard.Arm = 0; # 6 Arms
wizard.IsGlassUsed = True;
wizard.GlassMin = 3;
wizard.GlassMax = 15;
wizard.GlassEdge = 3;
wizard.IsAirUsed = True;
wizard.AirMin = 0.5;
wizard.AirMax = 1000;
wizard.AirEdge = 0.5;
wizard.IsAssumeAxialSymmetryUsed = True;
wizard.CommonSettings.OK();
通過 OpticStudio 中所有可用向導的 CommonSettings
部分,可以實現“OK 按鈕”的功能。
由於透鏡在光闌之前,不能使用F數求解,我們將不知道哪條光線是邊緣光線,直到它到達光闌的邊緣。這意味著除了 RMS 點列圖默認評價函數外,還必須使用 EFFL 操作數。在評價函數最上面再加一行,把有效焦距的目標值定為400mm,權重設為1。
Operand_1=TheMFE.InsertNewOperandAt(1);
Operand_1.ChangeType(constants.MeritOperandType_EFFL);
Operand_1.Target = 400.0;
Operand_1.Weight = 1.0;
設置完成之後,評價函數如下所示:
現在訪問用於運行局部優化的屬性和方法,並在圖形用戶界面中進行如下圖所示的設置:
# Local optimisation till completion
LocalOpt = TheSystem.Tools.OpenLocalOptimization();
LocalOpt.Algorithm = constants.OptimizationAlgorithm_DampedLeastSquares;
LocalOpt.Cycles = constants.OptimizationCycles_Automatic;
LocalOpt.NumberOfCores = 8;
baseTool = CastTo(LocalOpt, "ISystemTool")
baseTool.RunAndWaitForCompletion();
baseTool.Close();
由於 Python COM 接口處理繼承的方式,OpenLocalOptimization()
返回ILocalOptimization
接口,而所有的運行、關閉等等都返回 ISystemTool
接口。因此,需要將派生類對象轉換為基類對象,以訪問基類中的內容。
最後,在優化完成後保存文件。
# Save and close
TheSystem.Save();
運行腳本之後,在 OpticStudio 中打開. ZMX 文件,並查看優化後的鏡頭。