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

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

簡(jiǎn)介

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

什么是自定義擴(kuò)展?

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

對(duì)于擴(kuò)展程序,PrimarySystem(基于TheApplication建立)始終是在OpticStudio中當(dāng)前顯示的鏡頭系統(tǒng)。但是請(qǐng)注意,擴(kuò)展程序操作者可以控制是否在用戶(hù)界面中實(shí)時(shí)顯示對(duì)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í)行許多快速更改的任務(wù)時(shí)(例如:在評(píng)價(jià)函數(shù)編輯器中插入大量的行),此項(xiàng)設(shè)置可能非常重要。請(qǐng)注意,無(wú)論這項(xiàng)設(shè)置如何,當(dāng)擴(kuò)展運(yùn)行完成時(shí),界面中將始終顯示最終的系統(tǒng)。通過(guò)API擴(kuò)展程序,還有三個(gè)附加屬性可以使用:


TheApplication.TerminateRequested: 當(dāng)用戶(hù)單擊“取消 ( Cancel ) ”按鈕時(shí),將返回“ture”。
TheApplication.ProgressMessage: 設(shè)置“擴(kuò)展 ( Extension ) ”對(duì)話框中顯示的當(dāng)前消息。
TheApplication.ProgressPercent: 設(shè)置“擴(kuò)展”對(duì)話框中的當(dāng)前進(jìn)度 ( 0-100% )。

因此,用戶(hù)自定義擴(kuò)展模式使用戶(hù)完全控制鏡頭設(shè)計(jì)和用戶(hù)界面。自定義擴(kuò)展可以使用 C++ (COM) 或 C# (.NET)來(lái)編寫(xiě)。本文的自定義擴(kuò)展是用C#編寫(xiě)的。

打開(kāi)新的編程模板

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

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


打開(kāi)切比雪夫自由曲面反射鏡示例

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


有關(guān)切比雪夫多項(xiàng)式的更多信息,請(qǐng)參閱: 基于切比雪夫多項(xiàng)式的新型自由曲面的設(shè)計(jì)與實(shí)現(xiàn)。

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

OpticStudio有內(nèi)置的非球面轉(zhuǎn)換工具,但是沒(méi)有將自由曲面轉(zhuǎn)換為其他面型的工具。幸運(yùn)的是,可以使用ZOS-API構(gòu)建工具。

將切比雪夫多項(xiàng)式轉(zhuǎn)換為擴(kuò)展多項(xiàng)式

切比雪夫多項(xiàng)式

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


擴(kuò)展多項(xiàng)式

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

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


轉(zhuǎn)換

利用Mathematica和上述定義,可以計(jì)算得出每個(gè)擴(kuò)展多項(xiàng)式的項(xiàng)等于一個(gè)包含切比雪夫多項(xiàng)式的項(xiàng)的方程。結(jié)果如下:


根據(jù)上述結(jié)果,生成用戶(hù)自定義擴(kuò)展,它將通過(guò)讀取切比雪夫多項(xiàng)式表面的系數(shù),并計(jì)算擴(kuò)展多項(xiàng)式表面的系數(shù)來(lái)自動(dòng)轉(zhuǎn)換。

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


自定義擴(kuò)展代碼


文章附件中包含用戶(hù)自定義擴(kuò)展的代碼,代碼中包含:求切比雪夫多項(xiàng)式表面的循環(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 行找到切比雪夫多項(xiàng)式表面,那么代碼將調(diào)用名為 ConvertChebyshevToExtended (TheApplication, i) 的轉(zhuǎn)換函數(shù)。轉(zhuǎn)換函數(shù)將填充兩個(gè)數(shù)據(jù)數(shù)組:切比雪夫系數(shù)數(shù)組和計(jì)算得到的擴(kuò)展多項(xiàng)式的系數(shù)數(shù)組。一旦轉(zhuǎn)換完成,該函數(shù)將在新計(jì)算的系數(shù)用于切比雪夫多項(xiàng)式表面之后,添加新的擴(kuò)展多項(xiàng)式表面。

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

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

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

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

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

調(diào)用名為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);

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

//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);

保存、構(gòu)建和移動(dòng)可執(zhí)行文件

然后可以在發(fā)布模式 ( Release Mode ) 中構(gòu)建解決方案。要將用戶(hù)自定義擴(kuò)展作為插件分配,請(qǐng)將其設(shè)置為發(fā)布模式,因?yàn)檎{(diào)試庫(kù)是不可重新分配的。


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

運(yùn)行自定義擴(kuò)展

啟動(dòng) OpticStudio 并打開(kāi)鏡頭文件“ChebyshevMirror_optimized.zar”,檢查 ConvertChebyToExtended 自定義擴(kuò)展。

點(diǎn)擊:分析 ( Analyze )> 波前( Wavefront ),打開(kāi)波前圖 ( Wavefront Map )。使用波前圖來(lái)比較轉(zhuǎn)換前后的結(jié)果。開(kāi)始時(shí),波前圖顯示均方根值為1.7423波數(shù),PV值為6.9820波數(shù)。

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


運(yùn)行擴(kuò)展,計(jì)算擴(kuò)展多項(xiàng)式系數(shù):


顯示運(yùn)行擴(kuò)展后的指標(biāo):


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


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

關(guān)于自定義擴(kuò)展的相關(guān)信息:速度、設(shè)置和其他技巧

問(wèn):UserExtension 是否可以改變文件選項(xiàng),使軟件在每個(gè)系數(shù)轉(zhuǎn)換后不保存文件?

答:不可以。

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

問(wèn):有什么方法可以加快 UserExtension 的運(yùn)行速度嗎?

答:有!

將 IZOSAPI_Application.ShowChangesInUI 設(shè)置為“false”。這不會(huì)影響撤消行為,但是會(huì)使擴(kuò)展運(yùn)行得更快,例如:調(diào)用矢高分析,但并不顯示分析結(jié)果。
將 IOpticalSystem.UpdateMode 設(shè)置為 ‘LensUpdateMode.EditorsOnly’。
點(diǎn)擊:配置選項(xiàng)( Project Preferences )>常規(guī)( General )>撤銷(xiāo)( Undo ),手動(dòng)將撤銷(xiāo)更改為“無(wú) ( None )”。

問(wèn):可以對(duì) UserExtension 進(jìn)行設(shè)置,以選擇要轉(zhuǎn)換的表面嗎?

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

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

問(wèn):當(dāng)運(yùn)行 UserExtension 時(shí),彈出帶有控制臺(tái)應(yīng)用程序格式的黑色窗口 ,可以移除它嗎?

答:可以!

對(duì)于自定義擴(kuò)展,默認(rèn)的輸出格式是控制臺(tái)應(yīng)用程序,可以將其更改為windows應(yīng)用程序。