如何使用 Python 的 COM 组件与 ZOS-API 交互构建和优化单透镜

126 篇文章 75 订阅

ZOS-API 是个功能强大的工具,在 ZOS-API 中,用户可以用编程的方式执行OpticStudio 用户界面中可能实现的所有操作(以及更多操作)。本文将展示如何使用 Python 与 ZOS-API 交互来创建单透镜、添加评价函数 ( Merit Function ) 目标,并优化系统。(联系我们获取文章附件)

简介

此示例使用 COM 接口通过 pywin32 模块将 Python 连接到 ZOS-API。但我们现在不推荐这么做。

本文将通过使用 ZOS-API 中的  Python 连接来逐步建立和优化单透镜系统。利用独立应用程序 ( Standalone Application ) 功能,该功能允许用户在默认 Python 程序中编写代码,然后运行来获得可工作的 OpticStudio 文件。

打开编程模板

本文将重点讨论独立模式 ( Standalone Mode )。第一步是通过单击:编程 ( Programming ) > Python > 独立应用程序 ( Standalone Application ) ,创建模板解决方案。

Windows 资源管理器打开带有解决方案的文件夹  {Zemax}\ZOS-API Projects\PythonStandaloneApplication。

使用以下工具对Python项目和脚本进行测试:

  •  Windows(64位)中安装的 Python 3.7.2 (https://www.python.org/downloads/)-Python编译器

  • 用于 Windows 扩展的 Python (64位, Python 3.7) (https://github.com/mhammond/pywin32/releases) - 支持COM

  • Windows 桌面上的 Microsoft Visual Studio Express 2013 (https://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx) - 易于使用的 IDE

  • Visual Studio 中的 Python工具 (https://pytools.codeplex.com/)- 集成到 Visual Studio 

注意,Visual Studio 和 Python工具使开发变得更容易,但是 Python 脚本应该在没有安装它们的情况下运行。如果安装了 Visual Studio,它将与新解决方案一起打开,该解决方案包含可用作任何独立应用程序基础的模板代码。

创建新文件并应用系统设置

设计规格如下的单透镜:

  • 光线来自无限远,半视场角为5°,单一波长(d光,0.587mm)。

  • 准直的入射光被聚焦为最小的RMS光斑半径,均匀射入视场中。

  • F 数为10,入瞳直径为 40 mm。

  • 材料为 N-BK7。

  • 光阑为位于透镜之后单独的表面,可以自由移动。

  • 至少3片透镜,并且中心厚度不超过15mm。

  • 透镜的边缘厚度最小为3mm,空气间隙最小为 0.5 mm

在脚本中,转到 “# Insert Code Here” 然后输入:

TheSystem = zosapi.TheSystem;
TheSystem.New(False);

上述程序表示完整的光学系统,对应于独立的 . ZMX文件。现在创建包含新文件路径的字符串。为了使脚本更加灵活,将使用 SamplesDir属性来创建文件路径。

fileOut = zosapi.TheApplication.SamplesDir + "\Sequential\Objectives\Single Lens Example wizard+EFFL.zmx";
zosapi.TheSystem.SaveAs(fileOut);

TheSystemData包含系统的所有基本数据,可以用其设置光圈、视场、波长等。

# Aperture
TheSystemData = TheSystem.SystemData;
TheSystemData.Aperture.ApertureValue = 40;

# Fields
TheSystemData.Fields.AddField(0,5.0,1.0);

# Wavelength preset
TheSystemData.Wavelengths.SelectWavelengthPreset(constants.WavelengthPreset_d_0p587);

对于枚举常量,如: WavelengthPreset, Python 将每个常量创建为{enum name}_{enum value}.

设置镜头数据编辑器

在镜头数据编辑器中,每一行表示系统中定义的一个表面:表面0是物面,最后一个表面是像面。对于位于光阑前的单透镜,透镜的前表面是表面1,透镜的后表面是表面2,光阑是表面3。

# Lens data
TheLDE = TheSystem.LDE;
TheLDE.InsertNewSurfaceAt(1);
TheLDE.InsertNewSurfaceAt(1);
Surface_1 = TheLDE.GetSurfaceAt(1);
Surface_2 = TheLDE.GetSurfaceAt(2);
Surface_3 = TheLDE.GetSurfaceAt(3);
Surface_1.Thickness = 10.0;
Surface_1.Comment = 'front of lens';
Surface_1.Material = 'N-BK7';
Surface_2.Thickness = 50.0;
Surface_2.Comment = 'rear of lens';
Surface_3.Comment = 'Stop is free to move';
Surface_3.Thickness = 350.0;

可以用5个自变量来实现设计目标——透镜的前后半径、透镜的厚度、光阑的位置和像的位置。

# Make thicknesses and radii variable
Surface_1.RadiusCell.MakeSolveVariable();
Surface_1.ThicknessCell.MakeSolveVariable();
Surface_2.RadiusCell.MakeSolveVariable();
Surface_2.ThicknessCell.MakeSolveVariable();
Surface_3.ThicknessCell.MakeSolveVariable();

如果想在 OpticStudio 中打开文件来查看当前的进度,首先需要使用以下代码保存镜头文件:

# Save and close
The System.Save();

这段代码需要保留在键入的任何其他内容的末尾,但是现在将使用它来检查系统。确保在此之后添加的任何内容都在编辑器中的此代码之前。

当运行代码后没有收到任何错误提示时,可以通过导航到上面指定的目录来打开镜头文件: {Zemax}\Samples\Sequential\Objectives ,并选择文件。镜头数据编辑器将如下所示:

设置评价函数编辑器

使用序列优化向导 ( Sequential Optimization Wizard ) 在默认的评价函数中指定最小光斑半径 ( Minimum Spot Radius ) 和玻璃/空气的边界条件的目标值。

如上图所示,使用以下代码来设置优化向导:

# Merit functions
TheMFE = TheSystem.MFE;    

wizard = TheMFE.SEQOptimizationWizard;

wizard.Type = 0;        # RMS
wizard.Data = 1;        # Spot Radius
wizard.Reference = 0;   # Centroid
wizard.Ring = 2;        # 3 Rings
wizard.Arm = 0;         # 6 Arms

wizard.IsGlassUsed = True;
wizard.GlassMin = 3;
wizard.GlassMax = 15;
wizard.GlassEdge = 3;

wizard.IsAirUsed = True;
wizard.AirMin = 0.5;
wizard.AirMax = 1000;
wizard.AirEdge = 0.5;

wizard.IsAssumeAxialSymmetryUsed = True;
wizard.CommonSettings.OK();

通过 OpticStudio 中所有可用向导的 CommonSettings 部分,可以实现“OK 按钮”的功能。

由于透镜在光阑之前,不能使用F数求解,我们将不知道哪条光线是边缘光线,直到它到达光阑的边缘。这意味着除了 RMS 点列图默认评价函数外,还必须使用 EFFL 操作数。在评价函数最上面再加一行,把有效焦距的目标值定为400mm,权重设为1。

Operand_1=TheMFE.InsertNewOperandAt(1);
Operand_1.ChangeType(constants.MeritOperandType_EFFL);
Operand_1.Target = 400.0;
Operand_1.Weight = 1.0;

设置完成之后,评价函数如下所示:


 

 

局部优化

现在访问用于运行局部优化的属性和方法,并在图形用户界面中进行如下图所示的设置:

# Local optimisation till completion
LocalOpt = TheSystem.Tools.OpenLocalOptimization();
LocalOpt.Algorithm = constants.OptimizationAlgorithm_DampedLeastSquares;
LocalOpt.Cycles = constants.OptimizationCycles_Automatic;
LocalOpt.NumberOfCores = 8;
baseTool = CastTo(LocalOpt, "ISystemTool")
baseTool.RunAndWaitForCompletion();
baseTool.Close();

由于 Python COM 接口处理继承的方式,OpenLocalOptimization() 返回ILocalOptimization接口,而所有的运行、关闭等等都返回 ISystemTool 接口。因此,需要将派生类对象转换为基类对象,以访问基类中的内容。

最后,在优化完成后保存文件。

# Save and close
TheSystem.Save();

结果

运行脚本之后,在 OpticStudio 中打开. ZMX 文件,并查看优化后的镜头。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值