程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

如何使用 Python 的 COM 組件與 ZOS-API 交互構建和優化單透鏡

編輯:Python

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 文件,並查看優化後的鏡頭。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved