ZEMAX | 如何使用 ZPL 創(chuàng)建用戶自定義求解
本文使用兩個示例演示了如何使用 ZPL 創(chuàng)建用戶自定義解。第一個示例介紹了如何創(chuàng)建 ZPL 解以確保序列文件中像面的曲率半徑等于系統(tǒng)的 Petzval 曲率。第二個示例介紹了如何在非序列元件編輯器 ( Non-Sequential Component Editor ) 中基于其他物體的參數(shù)來約束的物體位置。
簡介
求解 ( Solve ) 是可以在諸如鏡頭數(shù)據(jù)編輯器或非序列元件編輯器之類的編輯器中主動調(diào)整特定值的功能。例如,可以在曲率半徑,圓錐系數(shù)或 TCE 上指定求解類型,并通過單擊要放置的求解單元的求解框進行設(shè)置。盡管 OpticStudio 提供了許多默認的求解類型,但用戶有可能希望自定義求解類型,這可以通過使用Zemax 編程語言( Zemax Programming Language ,ZPL)來實現(xiàn)。
ZPL 宏求解可用于任何編輯器中的幾乎所有單元(曲率半徑,厚度,參數(shù),多重結(jié)構(gòu)等)。可以像任何其他求解類型一樣,通過在編輯器中單擊參數(shù)單元格右側(cè)的小框來設(shè)置 ZPL 宏求解。
ZPL 宏求解通過執(zhí)行 ZPL 宏來確定解的值,并使用 SOLVERETURN 關(guān)鍵字將其返回給編輯器。一旦創(chuàng)建了用于求解的宏,并將其放置在

請注意,在求解框中輸入的宏名稱不區(qū)分大小寫,并且不需要其擴展名(.ZPL)。
為確保宏求解按照預(yù)期的方式工作,需要遵循一些規(guī)則,請參閱“技巧和陷阱”部分以獲取更多信息。
Petzval 曲率求解示例
本文用于公差分析的光譜儀是一個透鏡-光柵-透鏡 (LGL) 光譜儀,在880 nm波長下帶寬為50 nm。它被設(shè)計用于光學相干層析成像 (OCT) 應(yīng)用。光譜儀的結(jié)構(gòu)如下:
假設(shè)我們想要能夠自動將像面的曲率半徑設(shè)置為等于 Petzval 曲率的解。當然,在編寫宏之前,請始終先檢查一下仍不支持的解!
加載文件:

宏求解需要計算系統(tǒng)的 Petzval 曲率,然后將值返回給 OpticStudio。系統(tǒng)的 Petzval 曲率是通過 PETC 優(yōu)化操作數(shù)獲得的,也可以通過 OPEV() 和 OCOD() 函數(shù)直接在宏中調(diào)用:
· OCOD() 提取與優(yōu)化操作數(shù)類型相對應(yīng)的唯一數(shù)字代碼
· OPEV() 計算操作數(shù)的值,以 OCOD() 提取的唯一代碼作為第一個參數(shù),然后是優(yōu)化操作數(shù)的參數(shù)。
在本例中:

請注意, SOLVERETURN 關(guān)鍵字用于將數(shù)據(jù)傳遞回編輯器。將該宏另存為 Macros 文件夾中的 PETC.zpl。曲率求解值必須以曲率 (1/R) 的形式返回,而不是曲率半徑。所有其他求解直接返回值。
要應(yīng)用宏,請在像面的曲率半徑單元中選擇求解框,然后選擇 ZPL 宏求解類型,然后在單元格中鍵入宏名稱:

瞧!OpticStudio 自動更新求解,并在“求解類型 ( Solve Type )”框中放置“Z”,以指示其處于激活狀態(tài):

物體位置求解示例
第二個示例,我們將要使一個非序列物體在另一個非序列物體的末端之后10 mm。為此,需要計算前一個物體的長度,并用它來定位第二個物體。
文章附件里的非序列文件中,第一個物體是矩形的復(fù)合拋物線聚光鏡 (Compound Parabolic Concentrator,CPC ) 物體。將此物體的最大長度定義為非序列元件編輯器中的參數(shù)。如果可以保證該物體始終是最大長度,則可以簡單地使用帶有偏移量的拾取求解來定位物體2。但是,實際長度有可能小于最大長度參數(shù),因此必須計算實際長度并使用此值。同樣,由于這是 CPC 矩形 (Rectangular CPC) 物體,因此 x 和 y 截面的實際長度可能會有所不同:必須選擇兩者中較小的一個。這是宏求解中的理想問題!
CPC的長度“ L”由幫助文件:“設(shè)置 ( Setup ) 選項卡 > 編輯器 ( Editors ) 組 > 非序列元件編輯器 ( Non-Sequential Component Editor ) > 非序列幾何物體 ( Non-Sequential Geometry Objects ) > 復(fù)合拋物線聚光鏡(Compound Parabolic Concentrator , CPC)”部分中的公式給出:

因為這是 CPC 矩形 物體,所以有兩個相關(guān)的長度值:X 和 Y,兩個長度中較小的將被 OpticStudio 用作 CPC的長度,除非該長度大于“長度 ( Length )”參數(shù)。本例中的長度是“長度”參數(shù)的值。因此,宏應(yīng)使用上面的公式計算 CPC 物體的 X 和 Y 長度,選擇兩個值中較小的,添加10 mm偏移,并將該值返回給矩形物體的 Z 位置 ( Z Position )參數(shù)。如果 X 和 Y 之間的較小長度仍大于“長度”參數(shù)值,則宏應(yīng)在“長度”參數(shù)值上添加10 mm偏移,然后返回該值。
可以在文章附件中找到執(zhí)行上述操作的 REC_CPC.ZPL 宏:【請聯(lián)系我們領(lǐng)取文章的附件】

如前所述,關(guān)鍵字 SOLVERETURN 用于將所需值傳遞回 NSCE。將宏放置在
在物體2(矩形)的參數(shù) “Z 位置”的求解框中,選擇“ ZPL 宏”,然后鍵入宏名稱:

就像前面的示例一樣,NSCE 將在參數(shù)旁邊顯示 “ Z”,表明已在該參數(shù)上設(shè)置了 ZPL 解:

請注意,如果使用 Ctrl-A 在文件中定義的2個組態(tài)之間切換會發(fā)生什么。CPC 矩形物體的 Y 角(度)參數(shù)在20到40度之間更改,因此物體的長度也會更改。發(fā)生這種情況時,應(yīng)用于物體2的 “Z 位置” ZPL 求解將自動更改,以根據(jù)對應(yīng)操作將此物體始終放置在 CPC 物體末端的10毫米后。

技巧和陷阱
宏求解非常普遍,幾乎可以使用任何計算來確定求解值。ZPL 支持的所有函數(shù)和關(guān)鍵字均可用。從宏菜單執(zhí)行或作為求解執(zhí)行的 ZPL 宏之間沒有區(qū)別。但是,編寫 ZPL 求解時應(yīng)認真仔細:
· 許多 ZPL 關(guān)鍵字和某些函數(shù)不應(yīng)在宏求解中使用。例如,從求解中調(diào)用 UPDATE 會更新所有求解,這將再次調(diào)用宏,從而導(dǎo)致無限循環(huán),會使其他關(guān)鍵字無法使用(例如:,在每次調(diào)用求解時都要求用戶輸入數(shù)據(jù))。僅更新應(yīng)用了求解的單元格。宏不應(yīng)更新其他單元格或以其他方式修改系統(tǒng)(例如,不應(yīng)優(yōu)化)。
· 宏求解永遠不要依賴求解之后的編輯器中的數(shù)據(jù),因為如果先調(diào)用解,然后再通過單獨的后續(xù)解修改源數(shù)據(jù),這也可能會產(chǎn)生錯誤的數(shù)據(jù)。
· 僅當宏中的計算不是基于任何光線數(shù)據(jù)時,宏求解才可以放置在光闌面之前。有關(guān)更多信息,請參閱幫助文件的“編程 (Programming) 選項卡 > 關(guān)于ZPL ( About the ZPL ) >關(guān)鍵字 ( KEYWORDS ) > SOLVEBEFORESTOP” 部分。
· 為了使求解更強且盡可能通用,建議在需要進行表面參考時使用 SURC() 和 SOSO() 函數(shù):
? SURC() 通過其(特殊的)注釋字符串參考表面
? SOSO() 獲取要設(shè)置求解的表面/物體編號
請記住,如果在鏡頭數(shù)據(jù)編輯器中的任何曲率半徑單元上使用ZPL宏求解,則此參數(shù)的所有求解都將計算曲率 (1/R),而不是曲率半徑(R)。這意味著應(yīng)用于此參數(shù)的求解應(yīng)返回曲率半徑的倒數(shù),而不是曲率半徑本身。
用戶負責對宏返回的數(shù)據(jù)進行錯誤檢查。例如,如果宏調(diào)用 RAYTRACE 來計算光線參數(shù),則應(yīng)使用 RAYE() 來確保沒有發(fā)生任何錯誤(例如漸暈或全內(nèi)反射)。如果發(fā)生錯誤,則宏應(yīng)在未調(diào)用 SOLVERETURN 的情況下退出,以確保沒有值返回到單元格。這在優(yōu)化過程中尤其重要。以下代碼給出了如何測試錯誤的示例。

· 通常,宏求解應(yīng)保持簡短,簡單,并避免冗長的計算。
· 最后,請注意,OpticStudio 不會嘗試限定或驗證求解宏。此功能很強大,且具有靈活性,但必須謹慎使用。