Zemax光學設計技術:如何從ZPL宏中調用另一個ZPL宏

通常,在單獨的代碼段中執行計算的每個步驟是一種很好的編程實踐,本文介紹如何從另一個宏中調用 ZPL 宏,以及如何在宏之間來回傳遞數據。

介紹
在編寫執行許多步驟的ZPL宏時,通常在單獨的代碼段中執行每個步驟是一種良好的編程做法。這可以通過ZPL子例程來完成,使用GOSUB,SUB,RETURN和END關鍵字。但是,在某些情況下,在單獨的宏中執行每個步驟,然后從主(父)宏調用這些單獨的(子)宏中的每一個可能更容易。例如,如果要在許多不同的宏中執行相同的計算,則在隨后由各個父宏調用的子宏中執行此計算會更有效。這可以在OpticStudio中使用關鍵字CALLMACRO來完成。

從一個宏中調用另一個宏

可以在本文附帶的.ZIP文件中找到調用兩個單獨子宏的父宏的示例。這些宏文件應放在{Zemax}\Macros 目錄下,并用于位于{Zemax}\Samples\Objectives 目錄中的文件“Cooke 40 degree field.zmx”。

父宏 (CALLMACRO_TEST_PARENT.ZPL)首先定義數組來保存將由子宏返回的數據。然后,父宏使用 CALLSETDBL關鍵字的數值和 CALLSETSTR關鍵字的字符串值填充主宏緩沖區:
n_vals = 49
DECLARE x, DOUBLE, 1, n_vals 
DECLARE y, DOUBLE, 1, n_vals
FOR i, 1, n_vals, 1
CALLSETDBL i, 2*i # Test values to demonstrate use of CALLSETDBL, CALLSETSTR keywords
A$ = call_str$ + $STR(i)
CALLSETSTR i, A$
NEXT i
在這種情況下,數值和字符串值是簡單的測試值,用于演示在父宏和子宏之間來回傳遞數據的方法。
然后,父宏使用關鍵字 CALLMACRO調用第一個子宏(CALLMACRO_TEST_CHILD1.ZPL)。在子宏中,存儲在宏緩沖區中的值使用 CALD$CALLSTR數字函數打印到輸出窗口:
! Print values passed from parent macro
n_vals = 49
FOR i, 1, n_vals, 1
FORMAT 6.4
PRINT "Doule precision value = ", CALD(i)
FORMAT 2 INT
A$ = $CALLSTR(i)
PRINT A$
NEXT i
然后,該宏使用 RAYTRACE關鍵字和 OPDC函數計算弧矢方向光瞳坐標 (Px = 0)和固定視場坐標 (Hx = Hy = 0) 處的各個子午光瞳坐標 (Py)的光程差:
! Calculate OPD
DECLARE x, DOUBLE, 1, n_vals# Variables to store OPD data
DECLARE y, DOUBLE, 1, n_vals
FOR i, 1, n_vals, 1
py = 0.04166*i-1.04166
RAYTRACE 0, 0, 0, py, 1
x(i) = py
y(i) = OPDC()
NEXT i
在此子宏中,光瞳坐標的值(存儲在  x 數組中)使用以下方法傳遞回父宏: CALLSETDBL
! Reset values to normalized pupil coordinates and pass them back to parent macro
call_str$ = "This is the string for variable number "
FOR i, 1, n_vals, 1
CALLSETDBL i, x(i)
A$ = call_str$ + $STR(i+50)
CALLSETSTR i, A$
NEXT i
新字符串值也作為測試放置在宏緩沖區中,以確保將此數據傳遞回父宏。子宏完成后,OpticStudio 將返回到父宏,并且光瞳坐標的值將存儲在相應的數組中:
CALLMACRO CALLMACRO_TEST_CHILD1.ZPL
! Save values passed back from child macro 1
FOR i, 1, n_vals, 1
x(i) = CALD(i)
A$ = $CALLSTR(i)
PRINT A$
NEXT i
然后,父宏調用第二個子宏 (CALLMACRO_TEST_CHILD2.ZPL)。此宏與第一個子宏相同,唯一的區別是OPD數據(存儲在  y 數組中)而不是光瞳坐標被傳遞回父宏:
! Print values passed from parent macro
n_vals = 49
FOR i, 1, n_vals, 1
FORMAT 6.4
PRINT "Doule precision value = ", CALD(i)
FORMAT 2 INT
A$ = $CALLSTR(i)
PRINT A$
NEXT i
! Calculate OPD
DECLARE x, DOUBLE, 1, n_vals  # Variables to store OPD data
DECLARE y, DOUBLE, 1, n_vals
FOR i, 1, n_vals, 1
py = 0.04166*i-1.04166
RAYTRACE 0, 0, 0, py, 1
x(i) = py
y(i) = OPDC()
NEXT i
! Reset values to OPD results and pass them back to parent macro
call_str$ = "This is the string for variable number "
FOR i, 1, n_vals, 1
CALLSETDBL i, y(i)
A$ = call_str$ + $STR(i+100)
CALLSETSTR i, A$
NEXT i
作為測試新的字符串值再次放置在宏緩沖區中,以確保將此數據傳遞回父宏。然后將數字OPD 數據存儲到父宏的數組中:
CALLMACRO CALLMACRO_TEST_CHILD2.ZPL
! Save values passed back from child macro 2
FOR i, 1, n_vals, 1
y(i) = CALD(i)
A$ = $CALLSTR(i)
PRINT A$
NEXT i
最后,父宏使用關鍵字 PLOT繪制 OPD 與光瞳坐標數據:
! Plot data
PLOT NEW
PLOT TITLE, "OPD FOR FIELD POINT 1, WAVELENGTH 1"
PLOT TITLEX, "NORMALIZED PUPIL COORDINATE"
PLOT TITLEY, "OPTICAL PATH DIFFERENCE (WAVES)"
PLOT RANGEX, -1.0, 1.0
PLOT RANGEY, -1.0, 1.0
PLOT DATA, x, y, n_vals, 1, 1, 1
PLOT GO
然后將結果打印到圖形窗口:
Zemax光學設計技術:如何從ZPL宏中調用另一個ZPL宏的圖1


免費線上會議推薦:

Ansys zemax和其它光學解決方案在HUD設計中的應用

掌握一些光學設計的基礎知識是熟練運用光學設計軟件的根基。Ansys Zemax是一套綜合性的光學設計軟件,它能夠快速準確的完成光學成像及照明設計等工作!

Zemax光學設計技術:如何從ZPL宏中調用另一個ZPL宏的圖2

光研科技南京有限公司是國內可靠的Ansys Zemax光學設計軟件代理商!公司已經為廣大企業,研究所以及高校提供了很多優秀的相關產品和服務,在行業內建立了值得信任的口碑。

Ansys Zemax光學軟件

咨詢與訂購方式

聯系人:光研科技南京有限公司 徐保平

手機號:15051861513

微信號:13627124798

Zemax光學設計技術:如何從ZPL宏中調用另一個ZPL宏的圖3

光研科技南京有限公司同時還為廣大有光學設計軟件培訓的需求者提供了一個線下的學習平臺,多年以來為光電圈培養了很多優秀的光學設計工程師等人才。

公司開設的課程包括光學設計標準基礎班,高級實戰班,照明設計班以及薄膜設計班等等。新的一年已經到來,光研科技南京有限公司將繼續為廣大光電圈的朋友帶來各種各樣的實用光學培訓,歡迎大家咨詢和預定!

光學設計培訓

咨詢與預約方式

Zemax光學設計技術:如何從ZPL宏中調用另一個ZPL宏的圖4

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP