Skip to main content

ZPL Nuances & Best Practices

  • September 21, 2022
  • 2 replies
  • 365 views

MichaelH
Ansys Staff
Forum|alt.badge.img+2

Hey Community,

I’m starting this thread as a place to document some of the “pitfalls” of the ZPL language.  The ZPL is extremely powerful but since OpticStudio is trying to create a new language, the parsing is sometimes problematic.

Variable Names

You can actually assign a value to a number (the ZPL treats the number as a variable name).  So while OpticStudio won’t throw an error, you should be very careful when picking variable names:

PRINT 1 + 2		# answer is 3
1 = 2
PRINT 1 + 2		# answer is 4

FOR Loops

There is always round-off when dealing with decimals and this becomes especially true when trying to use a decimal step size in a FOR loop.  Rather than using decimals as either the startend or step size, you should keep these as integers and convert to decimals inside the FOR loop:

Recommended

FOR i = 0, 10, 1
    px = i / 10
NEXT

 Not Recommended

FOR i = 0, 1, 0.1
    px = i
NEXT

Speed Up Calculations

All calculations via the ZPL force an update to both the GUI and the core code.  Pushing data to the GUI can be extremely expensive.  To get around this, I always recommend using SUSPENDUPDATES and RESUMEUPDATES:

SUSPENDUPDATES

# some really long running calculations

RESUMEUPDATES

# all subsequent code will force a core & GUI update

SWITCH Statement

The ZPL doesn’t have a built in SWITCH statement but you can mimic one by using a series of GOTO and LABEL keywords:

code$ = "grape"

GOTO code$
   ! default calculations go here
   fruit$ = "not recognized"
   GOTO END_SWITCH
   LABEL apple	! note: no double quotes
      fruit$ = "apples are red"
      GOTO END_SWITCH
   LABEL banana ! note: labels are NOT case sensitive
      fruit$ = "bananas are yellow"
      GOTO END_SWITCH
   LABEL grape
      fruit$ = "grapes are purple"
      GOTO END_SWITCH
LABEL END_SWITCH

PRINT fruit$

PRINT 2D Data

By default the PRINT command will always end in a new line.  If you want to continue printing on the same line, simply end the PRINT command with a comma.  You can print 2D data with 2 FOR loops:

FOR i = 1, 5, 1
	FOR j = 1, 5, 1
		PRINT $STR(i * j), $TAB(), 
	NEXT
	PRINT
NEXT

# output
# 1	  2	  3	  4	  5	
# 2	  4	  6	  8	 10	
# 3	  6	  9	 12	 15	
# 4	  8	 12	 16	 20	
# 5	 10	 15	 20	 25

If you have any other recommendations for the ZPL, please leave them in the comments.  It always nice to learn something new :D

Did this topic help you find an answer to your question?

2 replies

achatte01
  • 1 reply
  • September 21, 2022

Hello, 

how do I write a ZPL code that will tile all the plots? I realize I can do that using the GUIs by going to windows → tile all windows. But trying to learn the language. If you can post it, it will  be great. 

-AC


MichaelH
Ansys Staff
Forum|alt.badge.img+2
  • Author
  • Ansys Staff
  • 342 replies
  • September 21, 2022

Hi AC,

The ZPL only gives limited functionality for interacting with built-in windows.  You can change some settings with MODIFYSETTINGS, you can open a new window with OPENANALYSISWINDOW, you can save an image with EXPORTBMP/EXPORTJPG, and you can extract the text with GETTEXTFILE. 

Outside of these basic functions, you cannot interact with the native windows, including tiling all the plots.


Reply


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings