Zemax and Python联用

透镜面的厚度与材料

单透镜:两个面组成,第一个面赋予材料和厚度——即该透镜的材料和厚度;第二个面不需要赋予材料,其厚度为下一个透镜的空气间隔——即下一个物体的起始点以此厚度末端为原点

胶合透镜:三个面组成,第一个面和第二个面赋予材料和厚度——即该胶合透镜第一个和第二个的材料和厚度;第三个面不需要赋予材料,其厚度为下一个透镜的空气间隔

所以,当一个表面被赋予材料后,说明其下一个表面与其共属于同一个透镜,连续n个表面被赋予材料,则就是n胶合透镜;当一个表面没有赋予材料,说明该表面后面是空气层

曲率半径:无限大为平面,正值表示曲率圆心在该表面的右边,负值表示曲率圆心在该表面的左边

光阑:视作一个表面,一般为平面

像面:没有厚度,曲率一般为无限大

净口径:通过口径,例如光阑(光圈),用半径表示,clear radius

机械半直径:edge radius,大于等于clear radius

使用COM组件控制Zemax

COM控制Zemax,会有模板,参考

images/Zemax and Python联用-20240628095319630.webp

|独立应用程序(Standalone Application )|在此模式下,应用程序会启动全新的OpticStudio例程(其他模式依赖于已经打开的现有例程而存在)。因此,在以这种模式启动应用程序之前,必须注意确保OpticStudio已打开至少一个例程(以满足OpticStudio的许可证验证)。在此模式下,OpticStudio实际上是作为服务器运行的,没有自定义界面。
|交互扩展(Interactive Extension)|交互扩展模式连接到OpticStudio的已经打开的例程。在此模式下运行时,OpticStudio界面随着程序的变化进行实时更新。它几乎与自定义扩展相同,除了这个功能可以从脚本环境(如MATLAB或Python)进行连接,这些脚本环境中没有可编译的可执行文件来使OpticStudio启动。

序列模式下,启动独立应用程序然后会自动生成一个模板,文件名称为(xxx数字)PythonStandaloneApplicationxxx.py

C:\Users\Administrator\Documents\Zemax\ZOS-API Projects

前期准备-依赖包和环境

使用Vscode打开编辑该文件

看到文件开头需要win32com包,你需要win+r执行cmd命名,启动conda,通过pip安装pywin32

pip install pywin32

编辑python独立交互程序

程序中的zosapi.TheApplication.SamplesDir的地址为:

C:\Users\Administrator\Documents\Zemax\Samples

第95行处有注释:

# Insert Code Here;

在下面插入代码,控制Zemax的COM组件

设计规格如下的单透镜:

  • 光线来自无限远,半视场角为5°,单一波长(d光,0.587mm)。
  • 准直的入射光被聚焦为最小的RMS光斑半径,均匀射入视场中。
  • F 数为10,入瞳直径为 40 mm。
  • 材料为 N-BK7。
  • 光阑为位于透镜之后单独的表面,可以自由移动。
  • 至少3片透镜,并且中心厚度不超过15mm。
  • 透镜的边缘厚度最小为3mm,空气间隙最小为 0.5 mm

系统基本数据

系统:新建文件,视场,光圈,波长

接下来,前期文件设置

# Insert Code Here;从这开始

    # Example code to create a new system
    TheSystem = zosapi.TheSystem;
    # Create a new system
    TheSystem.New(False);    # False表示不保存文件

    # Example code to save a file
    fileOut = zosapi.TheApplication.SamplesDir + "\\Sequential\\Objectives\\SEFFL002.zmx";

    # Save the current system as a new file;TheSystemData包含系统的所有基本数据,可以用其设置光圈、视场、波长等。

    zosapi.TheSystem.SaveAs(fileOut); #对同一个文件,不能多次保存SaveAs(fileOut);如需,则应另存为名字不同的文件
    # Set the aperture of the system to 40mm
    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}.

    # Lens data and surfaces editor
    # 每一行表示系统中定义的一个表面:表面0是物面,最后一个表面是像面。
    # 对于位于光阑前的单透镜,透镜的前表面是表面1,透镜的后表面是表面2,光阑是表面3。

    TheLDE = TheSystem.LDE;     # 打开Lens Data Editor
    TheLDE.InsertNewSurfaceAt(1);    # 在第1个位置插入一个表面
    TheLDE.InsertNewSurfaceAt(1);    # 在第1个位置插入一个表面
    Surface_1 = TheLDE.GetSurfaceAt(1);      # 获取第1个表面
    Surface_2 = TheLDE.GetSurfaceAt(2);
    Surface_3 = TheLDE.GetSurfaceAt(3);
    Surface_1.Thickness = 10.0;      # 前透镜厚度为10mm
    Surface_1.Comment = 'front of lens';    
    Surface_1.Material = 'N-BK7';
    Surface_2.Thickness = 50.0;      # 后透镜厚度为50mm
    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();      # 光阑厚度
    # Set the initial values for the variables  

    # 如果想在OpticStudio中打开文件来查看当前的进度,首先需要使用以下代码保存镜头文件:
    # Save and close
    TheSystem.Save(); # 最后会保存,中间可以多次保存
    TheSystem.Close(True); # True表示保存文件;

孔径,入瞳直径40mm

视场和权重

镜头数据结果,该系统的光阑前面有镜头,曲率、厚度和备注,设置材料和变量参数

初始系统,2D视图

设置评价函数编辑器

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

作者:invo

出处:https://www.cnblogs.com/invo/p/18230251

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Invo1  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示