本帖最后由 伊人在水一方 于 2025-9-12 10:52 编辑

Zemax—Matlab API 交互教程(3) _插入操作数并进行优化
附件:
Zemax—Matlab API 交互教程(1) _初始化:http://www.optzmx.com/thread-42088-1-1.html Zemax—Matlab API 交互教程(2) _插入评价函数操作数:http://www.optzmx.com/thread-42091-1-1.html
1.在ZEMAX中点击“ZOS-API.NET接口”选项卡中的“交互扩展”
2.在MATLAB中打开.m(见附件Interactive_Extension_optimise.m)文件,点击运行:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 通过设置透镜变量,写入操作数进行优化,其中包括局部优化和锤形优化
% 参考官方示例代码:"C:\Users\Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_03_open_file_and_optimise.m"
% 代码已测试成功
% 相关附件已上传
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc; clear; close all;
%% =============== 1. 需要你设置的变量 ===============
% 添加路径,此路径为你的文档\Zemax\ZOS-APIProjects\MATLABZOSConnection1
addpath("C:\Users\quinc\Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1");
% 你的 .zmx 文件路径
zmxPath = "C:\Users\quinc\Desktop\ZEMAX_API教程\test\e01_new_file_and_quickfocus.zmx";
%% =============== 2. 初始化 Zemax 连接===============
TheApplication = MATLABZOSConnection1;
%% =============== 3. 系统初始化 ===============
% 获取当前光学系统对象
TheSystem = TheApplication.PrimarySystem;
% 加载示例文件(参数false表示不保存当前系统,如果是true,zemax会先保存打开的系统,然后进行后续操作)
TheSystem.LoadFile(zmxPath, false);
fprintf(">>>已读取到zemax文件\n");
% 新建文件保存路径,注意,路径后面要填上保存后的文件名称,后缀可为.zmx或者.zos
saveFile = "C:\Users\Desktop\ZEMAX_API教程\test\new.zmx";
% 将系统另存为新文件
TheSystem.SaveAs(saveFile);
%% =============== 4. 镜头数据,设置变量参数 ===============
% 获取镜头数据编辑器(LDE)
TheLDE = TheSystem.LDE;
% 获取前三个表面对象
Surface_1 = TheLDE.GetSurfaceAt(1); % 第1面 (物面是第0面)
Surface_2 = TheLDE.GetSurfaceAt(2); % 第2面,第一个透镜前表面
Surface_3 = TheLDE.GetSurfaceAt(3); % 第3面,第一个透镜后表面
% 设置变量参数
% 表面1的厚度Thickness设为变量
Surface_1.ThicknessCell.MakeSolveVariable();
% 表面2的厚度和曲率Radius设为变量
Surface_2.ThicknessCell.MakeSolveVariable();
Surface_2.RadiusCell.MakeSolveVariable();
% 表面3的厚度设为变量
Surface_3.ThicknessCell.MakeSolveVariable();
%% =============== 5. 设置操作数 ==============
% 获取优化函数编辑器(MFE)接口
TheMFE = TheSystem.MFE;
fprintf(">>>正在写入操作数\n");
% 操作数1设置为ASTI(像散优化)
Operand_1 = TheMFE.GetOperandAt(1);
Operand_1.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.ASTI);
Operand_1.Target = 0.0; % 目标值设为0
Operand_1.Weight = 10.0; % 权重设为10
% 操作数2插入COMA(彗差优化)
Operand_2 = TheMFE.InsertNewOperandAt(2);
Operand_2.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.COMA);
Operand_2.Target = 0.0;
Operand_2.Weight = 1.0;
%% 空气间隙
% 空气最小中心厚度 (MNCA: Minimum Center Air)
Operand_3 = TheMFE.AddOperand();
Operand_3.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNCA);
Operand_3.Target = 0.5; % 设置目标值,最小空气厚度0.5mm
Operand_3.Weight = 1.0; % 设置权重
% 设置参数位置(表面1到3)
Operand_3.GetCellAt(2).IntegerValue = 1; % 起始表面
Operand_3.GetCellAt(3).IntegerValue = 3; % 结束表面
% 空气最大中心厚度 (MXCA: Maximum Center Air)
Operand_4 = TheMFE.AddOperand();
Operand_4.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MXCA);
Operand_4.Target = 1000; % 最大空气厚度1000mm
Operand_4.Weight = 1.0;
Operand_4.GetCellAt(2).IntegerValue = 1;
Operand_4.GetCellAt(3).IntegerValue = 3;
% 空气最小边缘厚度 (MNEA: Minimum Edge Air)
Operand_5 = TheMFE.AddOperand();
Operand_5.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNEA);
Operand_5.Target = 0.5;
Operand_5.Weight = 1.0;
Operand_5.GetCellAt(2).IntegerValue = 1;
Operand_5.GetCellAt(3).IntegerValue = 3;
%% 玻璃
% 玻璃最小中心 (MNCG: Minimum Center Glass)
Operand_6 = TheMFE.AddOperand();
Operand_6.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNCG);
Operand_6.Target = 3.0;
Operand_6.Weight = 1.0;
Operand_6.GetCellAt(2).IntegerValue = 1;
Operand_6.GetCellAt(3).IntegerValue = 3;
% 玻璃最大中心 (MXCG: Maximum Center Glass)
Operand_7 = TheMFE.AddOperand();
Operand_7.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MXCG);
Operand_7.Target = 15.0;
Operand_7.Weight = 1.0;
Operand_7.GetCellAt(2).IntegerValue = 1;
Operand_7.GetCellAt(3).IntegerValue = 3;
% 玻璃最小边缘 (MNEG: Minimum Edge Glass)
Operand_8 = TheMFE.AddOperand();
Operand_8.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNEG);
Operand_8.Target = 3.0;
Operand_8.Weight = 1.0;
Operand_8.GetCellAt(2).IntegerValue = 1;
Operand_8.GetCellAt(3).IntegerValue = 3;
%% =============== 6. 执行优化,先进行局部优化,再进行锤形优化 ==============
tic; % 开始计时
% 1.局部优化设置(阻尼最小二乘法)
fprintf(">>>正在进行局部优化\n");
LocalOpt = TheSystem.Tools.OpenLocalOptimization();
LocalOpt.Algorithm =ZOSAPI.Tools.Optimization.OptimizationAlgorithm.DampedLeastSquares;
LocalOpt.Cycles =ZOSAPI.Tools.Optimization.OptimizationCycles.Automatic; % 自动模式
LocalOpt.NumberOfCores = 8; % 使用8个CPU核心
% 运行优化直到完成
LocalOpt.RunAndWaitForCompletion();
LocalOpt.Close();
fprintf(">>>局部优化完成\n");
% 2.锤形优化全局优化设置
fprintf(">>>正在进行锤形优化\n");
HammerOpt = TheSystem.Tools.OpenHammerOptimization();
% 运行优化10秒(超时设置)
HammerOpt.RunAndWaitWithTimeout(10);
% 终止并等待优化完全停止
HammerOpt.Cancel();
HammerOpt.WaitForCompletion();
HammerOpt.Close();
fprintf(">>>锤形优化完成\n");
fprintf(">>>优化时长:\n");
toc; % 输出耗时
%% =============== 7. 保存文件 ==============
% 保存结果到上面设好的文件路径(testFile2)
TheSystem.Save();
fprintf(">>>文件已另存为:%s\n",saveFile);
|