ZEMAX | 如何編寫用戶自定義表面
概念
這篇文章介紹了:
■ 什么是用戶自定義表面 (User-Defined Surfaces)
■ 如何使用Microsoft Visual Studio 2017 (VS2017) 編寫用戶自定義表面
■ 如何使用其他編譯器
您可以前往以下鏈接查看并下載VS2017
鏈接: https://visualstudio.microsoft.com/zh-hans/vs/community/
用戶自定義表面
表面用來定義不同光學(xué)介質(zhì)之間的界面。表面可以定義為透射、反射或是衍射的。OpticStudio 18.9版本支持78種表面類型,其中包括非常通用的表面類型,例如多項式表面 (Polynomial surface) 和雙錐Zernike (Biconic Zernikes) 表面等。
但有些時候,用戶會需要滿足特定要求的表面類型,這也是用戶自定義表面類型發(fā)揮作用的時候。您可以隨時將您對新表面的需求發(fā)送給support@zemax.com,但OpticStudio也為您提供了自己實現(xiàn)新表面設(shè)置的途徑。
用戶自定義表面是一個編譯好的函數(shù)(嚴格意義上是Windows的DLL),它可以根據(jù)您的需要實現(xiàn)任意表面形狀、相位、透過率函數(shù)、梯度折射率或這幾種類型的組合。在定義用戶自定義表面時,您可以自行輸入表面參數(shù),或根據(jù)已有的數(shù)據(jù)庫進行定義。
本文以O(shè)pticStudio中自帶的示例文件為基礎(chǔ),介紹了編譯用戶自定義表面的基本步驟。本文不涉及構(gòu)建特定表面的方法,這將在其他文章中介紹。
如果您已經(jīng)擁有基礎(chǔ)的編程經(jīng)驗并且對想要構(gòu)建的表面已經(jīng)有了清晰的數(shù)學(xué)描述規(guī)范,那么定義用戶自定義表面是非常容易的。通過示例文件,本文將帶您快速了解如何定義用戶自定義表面,但是確定所需要的數(shù)學(xué)函數(shù)往往是最難的部分。
我們要做的第一步就是確定表面的定義規(guī)范。首先,在OpticStudio已經(jīng)提供的表面中尋找一個最貼近您需求的表面,閱讀用戶手冊中關(guān)于該表面的描述。然后以該描述為基礎(chǔ),寫出一份符合您需求的定義規(guī)范。用文本描述的方式對您要定義的表面進行描述,給出所需的表面矢高表達式及相位表達式等,給出透鏡數(shù)據(jù)編輯器中額外參數(shù)的用途。最后,我們要確定初次調(diào)用該表面時額外參數(shù)的初始值。例如,當(dāng)您第一次在透鏡數(shù)據(jù)編輯器中插入一個標(biāo)準(zhǔn)面 (Standard surface) 時,曲率半徑的初始值為無窮大,厚度的初始值為零,圓錐系數(shù)的初始值為零。您需要確定什么初始參數(shù)是最“安全”的。
回到手冊中查看關(guān)于用戶自定義表面的描述。您將看到我們提供的多個示例。找到和您的需求最貼近的示例文件,并將其作為構(gòu)建用戶自定義表面的起點。在示例文件的基礎(chǔ)上進行修改的好處在于,您不需要編寫所有的代碼來使文件與OpticStudio進行通信,我們在示例文件中已經(jīng)替您完成了這部分工作。您只需要專注于編寫表面即可。
當(dāng)您在示例文件中找到了和您的需求最貼近的示例文件時,將源文件(擴展名為xxx.c的文件)復(fù)制并重命名。在本文中,我們將使用示例中的us_arrayeven.c文件進行演示,該文件位于Zemax根目錄/DLL/Surfaces文件夾中。該文件定義了一個矩形的非球面陣列表面。我們將把這一文件重命名為myarray.c。
使用VS2017編譯表面

OpticStudio是64位的軟件,因此為了正常工作,DLL必須編譯為64位。您需要進行如下兩項設(shè)置來編譯64位的代碼:
■ 點擊生成 (Build) - 配置管理器 (Configuration Manager),選擇活動解決方案配置 (Active solution configuration) 為:Release
■ 選擇活動解決方案平臺 (Active solution platform) 為:x64

現(xiàn)在,該項目的狀態(tài)為一個空項目,等待我們在其中填充文件。在左側(cè)的解決方案資源管理器 (Solution Explorer) 中,您將看到項目包含的所有文件。右鍵點擊資源文件 (Source Files) 選擇添加 (Add) – 現(xiàn)有項 (Existing Items):

選擇前文中我們復(fù)制并重命名過的my_array.c文件,該文件是示例文件us_arrayeven.c文件的副本。在您編寫自己的表面時只需要基于該文件進行修改即可。
然后,右鍵點擊頭文件 (Header Files),選擇添加 (Add) – 現(xiàn)有項 (Existing Items),添加usersurf.h文件,該文件同樣位于Zemax根目錄/DLL/Surfaces文件夾中?,F(xiàn)在,解決方案資源管理器如下圖所示:

在開始編譯我們自己的表面前,您必須做的最后一件事是設(shè)置VS2017的代碼生成格式。右鍵點擊“My_asphere”選擇屬性 (Properties):

我們要做的第一個改變是在常規(guī) (General) 選項卡下將配置類型 (Configuration Type) 更改為動態(tài)庫(.dll) (Dynamic Library (.dll)),并將字符集 (Character Set) 更改為使用Unicode字符集 (Use Unicode Character Set):

們建議您將C/C++選項卡下代碼生成 (Code Generation) 一欄中的運行庫 (Runtime Library) 更改為多線程(/MT) (Multi-threaded(/MT)),這項設(shè)置可以確保用戶在沒有C語言庫函數(shù)的電腦上運行DLL。
多線程(/MT) 與 多線程DLL(/MD) 的區(qū)別:
對于多線程(/MT)和多線程DLL(/MD)的選擇有時是很復(fù)雜的,這主要取決于對使用的兼容性或易用性的選擇。如果您編寫的DLL不需要與其他庫函數(shù)交互,使用多線程(/MT)意味著您不需要擔(dān)心其他使用DLL的計算機是否安裝了C語言運行庫。如果在您編寫的DLL中使用了其他庫函數(shù),則您需要使用與其他庫函數(shù)相同的運行庫,大多數(shù)情況下都是多線程DLL(/MD)。
對于大多數(shù)不需要使用其他庫函數(shù)的簡單的DLL來說,選擇多線程(/MT)通常是最好的選擇。

以上就是您需要設(shè)置的全部內(nèi)容!
您可以點擊生成 (Build) – 重新生成解決方案 (Rebuild Solution) 來進行測試。此時DLL編譯結(jié)果應(yīng)該顯示沒有錯誤:

將您指定的項目路徑中My_asphere/x64/Release文件夾中的My_asphere.dll文件拷貝到Zemax根目錄/DLL/Surfaces文件夾中。

重新啟動OpticStudio,在序列模式下選擇表面類型為用戶自定義表面,并選擇數(shù)據(jù)文件(Data File)為My_asphere.dll:

祝賀!您已經(jīng)成功編譯完成了一個用戶自定義表面!
使用其他編譯器
您也可以使用其他任意可以生成多線程DLL項目的64位編譯器。符合要求的編譯器有非常多種,我們無法做到為全部編譯器提供技術(shù)支持。如果您在使用其他編譯器時遇到問題,您可以按如下格式詢問編譯器軟件的技術(shù)支持工作人員:如何創(chuàng)建一個多線程的Win32 DLL空項目。前文中所述的步驟也為您創(chuàng)建DLL提供了幫助信息。
小結(jié)
這篇文章介紹了如何使用Microsoft Visual Studio 2017編譯用戶自定義表面。有關(guān)VS2017的使用信息,請參考以下內(nèi)容:
鏈接: https://visualstudio.microsoft.com/zh-hans/vs/community/