ZEMAX | 如何創(chuàng)建ZOS-API自定義擴展將切比雪夫多項式轉換為擴展多項式

本文描述了如何使用ZOS-API創(chuàng)建自定義擴展 ( User Extension ),將切比雪夫多項式( Chebyshev Polynomial )表面轉換為擴展多項式 ( Extended Polynomial )表面。進行轉換的切比雪夫表面為14階,這是目前OpticStudio中可以設置的最大階數(shù)。

簡介

越來越多的設計者將切比雪夫多項式用于光學設計中,但是很難進行實際加工制作。這些多項式可能無法通過計算機輔助制造 ( Computer-Aided Manufacturing , CAM ) 方程、模具校正和注塑過程中的模具收縮補償實現(xiàn)。然而,擴展多項式表面可以。因此,將切比雪夫多項式轉換成擴展多項式的方法很實用,反之亦然。

什么是自定義擴展?

點擊:編程( Programming )選項卡>關于ZOS-API ( About the ZOS-API ) >插件/擴展( Plug-In/Extension ),打開內置幫助文件,可看到擴展程序 ( ZOS-API Extension )的定義:在概念上非常類似于ZPL宏 ( ZPL Macro )——擴展程序控制當前開啟的OpticStudio實例,在其運行時阻止用戶與界面進行交互,并且可以改變當前鏡頭系統(tǒng)的幾乎所有內容。自定義擴展的初始設置以及與OpticStudio的連接與自定義操作數(shù) ( User Operand )和自定義分析 ( User Analysis ) 模式相同。

對于擴展程序,PrimarySystem(基于TheApplication建立)始終是在OpticStudio中當前顯示的鏡頭系統(tǒng)。但是請注意,擴展程序操作者可以控制是否在用戶界面中實時顯示對PrimarySystem的更改:

// Make all changes (i.e. loading a new lens file) immediately
// display in the User interface
TheApplication.ShowChangesInUI = true;
// Do some work
// Do not show any changes in the User interface
TheApplication.ShowChangesInUI = false;
// Do some more work

在執(zhí)行許多快速更改的任務時(例如:在評價函數(shù)編輯器中插入大量的行),此項設置可能非常重要。請注意,無論這項設置如何,當擴展運行完成時,界面中將始終顯示最終的系統(tǒng)。通過API擴展程序,還有三個附加屬性可以使用:


TheApplication.TerminateRequested: 當用戶單擊“取消 ( Cancel ) ”按鈕時,將返回“ture”。
TheApplication.ProgressMessage: 設置“擴展 ( Extension ) ”對話框中顯示的當前消息。
TheApplication.ProgressPercent: 設置“擴展”對話框中的當前進度 ( 0-100% )。

因此,用戶自定義擴展模式使用戶完全控制鏡頭設計和用戶界面。自定義擴展可以使用 C++ (COM) 或 C# (.NET)來編寫。本文的自定義擴展是用C#編寫的。

打開新的編程模板

點擊:編程 ( Programming ) > C# >自定義擴展 ( User Extension ),用C#創(chuàng)建自定義擴展:

使用Windows資源管理器打開解決方案文件夾:{Zemax}\ZOS-APIProject\CSharpUserExtensionApplication1。Visual Studio 也打開了新的解決方案。該解決方案包含模板代碼——可用作任何自定義擴展基礎的模板。在Visual Studio中,將自定義擴展編譯為可執(zhí)行文件。然后將可執(zhí)行文件復制到 {Zemax)\ZOS-API\Extensions 文件夾,以便OpticStudio可以使用。


打開切比雪夫自由曲面反射鏡示例

本文附件中的 “ChebyshevMirror_optimized.zar” 文件,該文件中包含切比雪夫多項式自由曲面反射鏡,光線聚焦在X和Y方向的+/- 10o視場內。


有關切比雪夫多項式的更多信息,請參閱: 基于切比雪夫多項式的新型自由曲面的設計與實現(xiàn)。

對該系統(tǒng)進行優(yōu)化和公差分析之后,在將自由曲面反射鏡的圖紙發(fā)送給制造商之前,將切比雪夫多項式轉換為擴展多項式,這樣設計的系統(tǒng)就可以通過計算機輔助制造方程、模具校正和注塑過程中的模具收縮補償?shù)裙ぞ邔崿F(xiàn)。

OpticStudio有內置的非球面轉換工具,但是沒有將自由曲面轉換為其他面型的工具。幸運的是,可以使用ZOS-API構建工具。

將切比雪夫多項式轉換為擴展多項式

切比雪夫多項式

切比雪夫多項式由包含X和Y的方程式表示,這使得它們作為直角正交多項式特別實用。


擴展多項式

擴展多項式和切比雪夫多項式的定義之間的主要區(qū)別是:

圓錐常數(shù) k
多項式的每個系數(shù)包含一個歸一化因子,而切比雪夫包含 x0 和 y0
系數(shù)隨 “i ”變化


轉換

利用Mathematica和上述定義,可以計算得出每個擴展多項式的項等于一個包含切比雪夫多項式的項的方程。結果如下:


根據(jù)上述結果,生成用戶自定義擴展,它將通過讀取切比雪夫多項式表面的系數(shù),并計算擴展多項式表面的系數(shù)來自動轉換。

用戶自定義擴展將在切比雪夫多項式之后添加具有計算出的系數(shù)的擴展多項式表面,以及包含兩個多項式表面之間矢高差的網(wǎng)格矢高 ( Grid Sag ) 表面。得出的結果將滿足要求。


自定義擴展代碼


文章附件中包含用戶自定義擴展的代碼,代碼中包含:求切比雪夫多項式表面的循環(huán)

// Loop to find the Chebyshev polynomial surface
int i = 1;
do
{
TheApplication.ProgressMessage = "Chebyshev Surface at line : " + i.ToString();
if (TheSystem.LDE.GetSurfaceAt(i).Type == ZOSAPI.Editors.LDE.SurfaceType.ChebyShv)
{
break;
}
i++;
} while (i <= TheSystem.LDE.NumberOfSurfaces);

檢查切比雪夫表面。如果在第 i 行找到切比雪夫多項式表面,那么代碼將調用名為 ConvertChebyshevToExtended (TheApplication, i) 的轉換函數(shù)。轉換函數(shù)將填充兩個數(shù)據(jù)數(shù)組:切比雪夫系數(shù)數(shù)組和計算得到的擴展多項式的系數(shù)數(shù)組。一旦轉換完成,該函數(shù)將在新計算的系數(shù)用于切比雪夫多項式表面之后,添加新的擴展多項式表面。

//Call the conversion functionConvertChebyshevToExtended(TheApplication, i);

調用矢高函數(shù) ( TheApplication, i ) ,該函數(shù)將返回矢高數(shù)組。調用矢高函數(shù)兩次:一次用于切比雪夫多項式表面,一次用于擴展多項式表面。

//Measure the sag of Chebyshev, Extended
double[,] chebysag = Sag(TheApplication, i);
double[,] extendedsag = Sag(TheApplication, i + 1);

調用名為 SagDifference(chebysag, extendedsag) 的函數(shù),該函數(shù)將返回包含切比雪夫多項式表面和擴展多項式表面之間的矢高差的數(shù)組。

//Make the difference and add a "difference" grid sag surface
double[,] chebyExtendedsagdiff = SagDifference(chebysag, extendedsag);

調用名為RMS_PV_function的函數(shù) (chebyExtendedsagdiff, out RMSConversion, out PVConversion),該函數(shù)將返回矢高差的均方根值 ( RootMean-Square, RMS ) 和峰谷值( Peak-to-Valley, PV )。

//Calculate the RMS and PV of a matrix
RMS_PV_function(chebyExtendedsagdiff, out RMSConversion, out PVConversion);

最后,調用名為 CreateGridSag 的函數(shù),將創(chuàng)建帶有矢高差的網(wǎng)格矢高表面。得出的結果將滿足要求。

//Make a grid sag of the difference
//The arguments are the semi-diameter because we need to know the spacing / interval between the sag points
//the surface number is also an argument: we will add a grid sag below the extended surface
double semidiameter = TheSystem.LDE.GetSurfaceAt(i).SemiDiameter;
CreateGridSag(TheApplication, chebyExtendedsagdiff, semidiameter, i);

保存、構建和移動可執(zhí)行文件

然后可以在發(fā)布模式 ( Release Mode ) 中構建解決方案。要將用戶自定義擴展作為插件分配,請將其設置為發(fā)布模式,因為調試庫是不可重新分配的。


然后可以將可執(zhí)行文件從解決方案文件夾 ( {Zemax}\ZOS-API Projects\...) 復制到 {Zemax}\ZOS-API\User Extension 中。

運行自定義擴展

啟動 OpticStudio 并打開鏡頭文件“ChebyshevMirror_optimized.zar”,檢查 ConvertChebyToExtended 自定義擴展。

點擊:分析 ( Analyze )> 波前( Wavefront ),打開波前圖 ( Wavefront Map )。使用波前圖來比較轉換前后的結果。開始時,波前圖顯示均方根值為1.7423波數(shù),PV值為6.9820波數(shù)。

點擊:編程 ( Programming )>自定義擴展 ( User Extensions )創(chuàng)建新的擴展。


運行擴展,計算擴展多項式系數(shù):


顯示運行擴展后的指標:


然后在切比雪夫多項式表面之后添加兩個新的表面:擴展多項式和包含矢高差的網(wǎng)格矢高表面。


在波前圖上,轉換后的結果為:RMS為1.7423波數(shù),PV為6.9820波數(shù)。轉換后運行正常!

關于自定義擴展的相關信息:速度、設置和其他技巧

問:UserExtension 是否可以改變文件選項,使軟件在每個系數(shù)轉換后不保存文件?

答:不可以。

目前無法從自定義擴展中更改文件選項。當運行用戶自定義擴展,即轉換系數(shù),如果通過點擊:配置選項 ( Project Preferences ) > 常規(guī)( General ) > 撤銷 ( Undo ),將撤銷設置為“磁盤多步存儲 ( Disk Multi-Step ) ”,OpticStudio將保存每一步的轉換。因此,每次修改新系數(shù)(超過200次)時,軟件都會保存UNDO文件,這會降低執(zhí)行速度。惟一的解決方法是在運行擴展之前手動更改該設置。

問:有什么方法可以加快 UserExtension 的運行速度嗎?

答:有!

將 IZOSAPI_Application.ShowChangesInUI 設置為“false”。這不會影響撤消行為,但是會使擴展運行得更快,例如:調用矢高分析,但并不顯示分析結果。
將 IOpticalSystem.UpdateMode 設置為 ‘LensUpdateMode.EditorsOnly’。
點擊:配置選項( Project Preferences )>常規(guī)( General )>撤銷( Undo ),手動將撤銷更改為“無 ( None )”。

問:可以對 UserExtension 進行設置,以選擇要轉換的表面嗎?

答:用戶自定義擴展是可執(zhí)行的,因此可以顯示設置窗口。

最簡單的添加設置的方法是創(chuàng)建新的空Windows窗體項目,然后集成到用戶自定義擴展代碼中。需要將STA線程特性添加到界面的入口點才能工作。有關設置的更多信息,請參閱文章:"如何使用ZOS-API創(chuàng)建飛行時間自定義分析" 。

問:當運行 UserExtension 時,彈出帶有控制臺應用程序格式的黑色窗口 ,可以移除它嗎?

答:可以!

對于自定義擴展,默認的輸出格式是控制臺應用程序,可以將其更改為windows應用程序。