在 Python 中通过 API 控制 OpticStudio

本周为大家奉上


在Python中通过API控制OpticStudio 进行仿真计算


概要

本文讲述了使用Python和其他ZOS-API语言的区别,并回顾了Python(2.x)如何处理枚举变量。文中还提供了一些代码示例哦。


本文主要解释了:
1、pywin32
2、枚举变量
3、代码示例:
· 单根光线追迹
· 建立一个圆形孔径
· 近轴焦点的厚度求解
· 物理光学传播
· 非序列模式下带拟合的光线追迹
· 非序列元件的镀膜和散射


请前往以下链接下载示例文件:

http://customers.zemax.com/ZMXLLC/media/Knowledge-Base/Attachments/12101_enum.zip



在使用代码之前,请优先浏览下述内容来更好的了解ZOS-API:

文章

ZOSAPI.NET: An Overview
(os/resources/learn/knowledgebase/zosapinetanoverview)
How to build and optimize a singlet using ZOS-API with Python
(/os/resources/learn/knowledgebase/how-to-build-and-optimize-a-singlet-using-zos-api)
How to create a User Analysis using ZOS-API
(/os/resources/learn/knowledgebase/how-to-create-a-user-analysis-using-zos-api)


网络研讨会

Matlab & ZOSAPI.NET (/zmx/webinars/opticstudio-recordings/Matlab-zos-api-net)



http://customers.zemax.com/os/resources/learn/knowledgebase/how-to-use-the-zernike-sag-surface-to-model-an-all



基于COM的语言:pywin32

ZOS-API是一个被编写成.NET的库,并使用win32com来直接和基于纯COM的语言通信,例如Python。在Python中有一个叫做pywin32的扩展来实现了win32com。Pywin32模块有两个版本,分别是32位和64位的。由于32位版本在实现一些交互时,会出现一些随机的问题,因此我们推荐大家使用64位的Python和64位的pywin32。只要确保pywin32是64位的,以及正确安装Python环境,你可以使用Python 2.x或Python 3.x来连接ZOS-API。


枚举变量

为了更有效的在Python中应用枚举变量,ZOS-API将所有数值都储存在一个叫“常量(constant)”的单一目录下。虽然Python 3.4已经可以独立支持枚举变量,但ZOS-API为了兼容Python 2.x版本还是会明确的将所有枚举变量储存在单一目录下。枚举变量或枚举值是你需要在OpticStudio用户界面的下拉菜单中设置的一些离散的数值。虽然枚举值在ZOS-API设置任何离散数值时都会出现,但他们更多的还是以一些函数的参数的形式出现。当你看到一个函数的参数以ZOSAPI.xxxx为开头时,你会需要用常量目录来定位这个枚举值。

为了在Python中使用枚举值,你首先需要参考常量目录下正确的属性值。虽然这些名称随着版本的更新应该保持不变,但有时候在不同ZOS-API版本中仍会出现小的变动(例如字母的大小写)或更新。所以,请确保在使用你的ZOS-API时,这些参考属性值是正确的。以下是ZOS-API使用枚举值的示例:


在附件中有枚举值的完整目录可供参考。



接口转型

虽然Python支持接口继承,但衍生的接口并不继承基础接口的函数或属性。因此,许多分析(例如 . GetSettings () 函数)和工具(例如 . RunAndWaitForCompletion () 函数)接口需要Python明确的把包含目标函数或属性的部分转移到正确的接口中。为了获取衍生接口的函数或属性,你必须首先获得正确的接口类型以作参考,这一步由CastTo () 函数完成。检索API文档,我们可以看到IAS_RayTrace接口是从IAS_interface中继承内容的。当你在文档中看完这个规则,并且你想要在特定的接口中进行修改时,你需要使用settings = CastTo (newWin_Settings,”IAS_RayTrace”) 函数。



示例代码

01 运行单根光线追迹


这段代码将对全视场的边缘光线进行单根光线追迹,并且将追迹数据保存在txt格式文件中。注意在OpticStudio16中,你需要使用 . GetTextFile () 函数来读取大部分分析窗口的结果,包括单根光线追迹。



02 创建一个圆形孔径


这段代码将打开一个已经存在的名为sc.zmx的文件。并且将在第一个面上添加一个圆形孔径,随后将这个镜头文件另存为一个新的文件。



03 近轴焦点的厚度求解


这段代码将在草图中创建一个单透镜,并将系统孔径类型设置为“随光阑尺寸浮动”,然后通过设置Hx=1和Px=0在最后一个面上生成一个基于边缘光线高度的厚度求解来寻找透镜的近轴焦点。需要注意的是,如果你想寻找边缘光线的焦点,你需要将孔径区域从0改变为1。为了使程序将透镜文件正确保存,你需要确保路径C:\Temp存在。



04 物理光学


这段代码演示了如何使用ZOS-API实现物理光学分析。它被分解为以下几个部分:1)在透镜编辑器中的物理光学传播分析。2)插入一个幻灯片面。3)修改POP.CFG文件。4)运行POP并保存结果。5)改变孔径类型。在这段代码中,我们假设已经有一个有效的透镜加载到TheSystem中并且“C:\Temp”文件夹已经存在。当使用 . MODIFYSETTINGS () 函数时(例如HasAnalysisSpecificSettings的值为False),你需要在运行这段代码前手动保存一个CFG文件。

你可以通过打开POP设置菜单并点击“保存”按钮来保存一个CFG文件。对于关键词MODIFYSETTINGS,你无法改变“显示-数据”选项,所以如果你想同时得到辐照度和相位数据,你需要设置“显示-数据”选项为辐照度,点击保存按钮,打开Zemax\Config文件夹并将文件POP.CFG重命名为POP_IRRADIANCE.CFG。然后将“显示-数据”选项改变为相位,点击保存按钮,打开Zemax\Config文件夹并将POP.CFG文件重命名为POP_PHASE.CFG。




05 非序列模式下的平滑光线追迹


下面这段代码使用ISystemTool界面来设置非序列模式写的光线追迹。我们将非序列编辑器中的探测器物体的平滑参数设为3,或在探测器查看器的设置中将平滑度设为3。这段代码将首先使用NSDD MFE/ZPL协议或直接使用ClearDetectors函数来清空探测器。随后程序将输出,光线打在物体编号2上的矩形探测器的条数。


06 非序列部件的镀膜和散射


这段代码将修改物体2的镀膜和散射属性以及修改物体3为网格失高物体。它将表面0的属性设置50%的朗伯散射,在表面1的属性设置为I.50镀膜,在表面2的属性设置反射。对于物体3,我们需要将GRD文件“use_this_one.grd”保存到Zemax/Objects/Grid Files目录下。