Source code for ansys_optical_automation.zemax_process.base
import os
from itertools import islice
[docs]class BaseZOS:
"""
Basic Class structure to start Zemax Opticstudio
"""
[docs] class LicenseException(Exception):
pass
[docs] class ConnectionException(Exception):
pass
[docs] class InitializationException(Exception):
pass
[docs] class SystemNotPresentException(Exception):
pass
def __init__(self, path=None):
"""
function that initializes the connection to OpticStudio
Parameters
----------
path
Returns
-------
None
"""
# determine location of ZOSAPI_NetHelper.dll & add as reference
import clr
program_data = os.environ["Programdata"]
net_helper = os.path.join(program_data, "Zemax", r"ZOS-API\Libraries\ZOSAPI_NetHelper.dll")
clr.AddReference(net_helper)
import ZOSAPI_NetHelper
# Find the installed version of OpticStudio
if path is None:
is_initialized = ZOSAPI_NetHelper.ZOSAPI_Initializer.Initialize()
else:
# Note -- uncomment the following line to use a custom initialization path
is_initialized = ZOSAPI_NetHelper.ZOSAPI_Initializer.Initialize(path)
# determine the ZOS root directory
if is_initialized:
zemax_directory = ZOSAPI_NetHelper.ZOSAPI_Initializer.GetZemaxDirectory()
else:
raise BaseZOS.InitializationException("Unable to locate Zemax OpticStudio. Try using a hard-coded path.")
# add ZOS-API referencecs
clr.AddReference(os.path.join(os.sep, zemax_directory, "ZOSAPI.dll"))
clr.AddReference(os.path.join(os.sep, zemax_directory, "ZOSAPI_Interfaces.dll"))
import ZOSAPI
# create a reference to the API namespace
self.zosapi = ZOSAPI
# Create the initial connection class
self.the_connection = ZOSAPI.ZOSAPI_Connection()
if self.the_connection is None:
raise BaseZOS.ConnectionException("Unable to initialize .NET connection to ZOSAPI")
self.the_application = self.the_connection.CreateNewApplication()
if self.the_application is None:
raise BaseZOS.InitializationException("Unable to acquire ZOSAPI application")
if not self.the_application.IsValidLicenseForAPI:
raise BaseZOS.LicenseException("License is not valid for ZOSAPI use")
self.the_system = self.the_application.PrimarySystem
if self.the_system is None:
raise BaseZOS.SystemNotPresentException("Unable to acquire Primary system")
def __del__(self):
"""
function to shut down the OpticStudio process
It cleans up the connection to OpticStudio.
Returns
-------
None
"""
if self.the_application is not None:
self.the_application.CloseApplication()
self.the_application = None
self.the_connection = None
[docs] def open_file(self, file_path, save_if_needed):
"""
function to open a file
Parameters
----------
file_path : str
String to the zemax zos file
save_if_needed : boolean
distinguish if to save already opened file before open a new one
Returns
-------
"""
if self.the_system is None:
raise BaseZOS.SystemNotPresentException("Unable to acquire Primary system")
self.the_system.LoadFile(file_path, save_if_needed)
[docs] def close_file(self, save):
"""
close open file
Parameters
----------
save : bool
defines if to save already open file
Returns
-------
None
"""
if self.the_system is None:
raise BaseZOS.SystemNotPresentException("Unable to acquire Primary system")
self.the_system.Close(save)
[docs] def samples_dir(self):
"""
gets the full path for the current user's samples directory
by default: in the "My Documents\\Zemax\\Samples\\folder"
Parameters
----------
None
Returns
-------
The user's samples files directory
"""
if self.the_application is None:
raise BaseZOS.InitializationException("Unable to acquire ZOSAPI application")
return self.the_application.SamplesDir
[docs] def example_constants(self):
"""
gets the license status type
Returns
-------
the license type
It can be premium, professional, standard or invalid.
"""
if self.the_application.LicenseStatus == self.zosapi.LicenseStatusType.PremiumEdition:
return "Premium"
elif self.the_application.LicenseStatus == self.zosapi.LicenseStatusTypeProfessionalEdition:
return "Professional"
elif self.the_application.LicenseStatus == self.zosapi.LicenseStatusTypeStandardEdition:
return "Standard"
else:
return "Invalid"
[docs] def reshape(self, data, x, y, transpose=False):
"""Converts a System.Double[,] to a 2D list for plotting or post processing
Parameters
----------
data : System.Double[,] data directly from ZOS-API
x : x width of new 2D list [use var.GetLength(0) for dimension]
y : y width of new 2D list [use var.GetLength(1) for dimension]
transpose : transposes data; needed for some multi-dimensional line series data
Returns
-------
res : 2D list; can be directly used with Matplotlib or converted to
a numpy array using numpy.asarray(res)
"""
if type(data) is not list:
data = list(data)
var_lst = [y] * x
it = iter(data)
res = [list(islice(it, i)) for i in var_lst]
if transpose:
return self.transpose(res)
return res
[docs] def transpose(self, data):
"""Transposes a 2D list (Python3.x or greater).
Useful for converting mutli-dimensional line series (i.e. FFT PSF)
Parameters
----------
data : Python native list (if using System.Data[,] object reshape first)
Returns
-------
res : transposed 2D list
"""
if type(data) is not list:
data = list(data)
return list(map(list, zip(*data)))