本帖最后由 伊人在水一方 于 2025-10-13 16:14 编辑
Zemax—Matlab API 交互教程(6)_NSC光线追迹
附件:
相关教程:
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
Zemax—Matlab API 交互教程(3) _插入操作数并进行优化:http://www.optzmx.com/thread-42095-1-1.html
Zemax—Matlab API 交互教程(4) _批量添加操作数_从高斯光到平顶光:http://www.optzmx.com/thread-42099-1-1.html
Zemax—Matlab API 交互教程(5)_新文件和快速聚焦:http://www.optzmx.com/thread-42325-1-1.html
下面的代码主要为了修改光线追迹的参数并读取探测器数据绘图:
读取探测器数据并且在MATLAB中绘图:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 代码功能:
% 打开NSC示例文件(…\Non-sequential\Miscellaneous\Digital_projector_flys_eye_homogeni-zer.zmx)
% 修改光线追迹的设置,然后运行光线追迹,并对光线追迹过程进行存储和显示。
% 在光线追迹后,提取探测器参数(宽度、高度、像素数等)和像素数据,重新运行探测器查看器并绘图。
% 参考官方示例代码:"Documents\Zemax\ZOS-APISampleCode\MATLAB\MATLABStandalone_02_NSC_ray_trace.m"
% 代码已测试成功
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc; clear; close all;
%% =============== 1.初始化 Zemax 连接===============
% 添加路径,此路径为你的Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1
addpath("C:\Users\Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1")
TheApplication =MATLABZOSConnection1;
TheSystem =TheApplication.PrimarySystem;
%% =============== 2.打开示例文件 ==============
% 创建API目录路径(用于存储结果)
apiPath =System.String.Concat(TheApplication.SamplesDir, '\API\Matlab');
if (exist(char(apiPath)) == 0)mkdir(char(apiPath)); end;% 检查目录是否存在,不存在则创建
% 加载示例光学系统文件
sampleDir =TheApplication.SamplesDir; % 获取官方示例文件目录路径,SamplesDir表示的路径是 Documents\Zemax\SAMPLES
testFile =System.String.Concat(sampleDir, '\Non-sequential\Miscellaneous\Digital_projector_flys_eye_homogenizer.zos');
TheSystem.LoadFile(testFile, false);% 加载文件(false表示不保存当前系统)
%为了防止改变官方的示例文件,也可以把示例文件复制到到其他路径,改为自定义路径,别忘了路径后面还需要填写文件名和后缀.ZMX
% sampleDir_yours ="C:\Users\Desktop\savefile";% 将sampleDir替换为其他的路径
% testFile = fullfile(sampleDir_yours, 'new2.ZMX');% 路径拼接
%% =============== 3.光线追迹的设置 ==============
% 打开非序列光线追迹工具,在“分析"选项卡里面的“光线追迹"
NSCRayTrace =TheSystem.Tools.OpenNSCRayTrace();
% 设置光线追迹参数
NSCRayTrace.SplitNSCRays = true; % 启用NSC光线分裂
NSCRayTrace.ScatterNSCRays= false; % 禁用NSC光线散射
NSCRayTrace.UsePolarization = true; % 使用偏振
NSCRayTrace.IgnoreErrors = true; % 忽略错误,继续追踪
NSCRayTrace.SaveRays = false; % 不保存光线数据
NSCRayTrace.ClearDetectors(0);% 清除探测器数据(0表示所有探测器)
NSCRayTrace.RunAndWaitForCompletion();% 执行光线追迹并等待完成
NSCRayTrace.Close();% 关闭光线追迹工具
% 获取非序列组件编辑器对象
TheNCE =TheSystem.NCE;
data =NET.createArray('System.Double',TheNCE.GetDetectorSize(4));% 创建.NET数组存储探测器数据(获取探测器4的数据)
TheNCE.GetAllDetectorData(4, 1, TheNCE.GetDetectorSize(4), data);% 读取探测器数据到数组
[~, rows, cols] =TheNCE.GetDetectorDimensions(4);% 获取探测器维度信息(探测器4)
detectorData =flipud(rot90(reshape(data.double, rows, cols)));% 重塑数据为二维矩阵,旋转并翻转以匹配Zemax方向
%% =============== 4.探测器数据绘图 ==============
close all;
figure('position', [50, 150, 700, 600])% 创建新图形窗口
surf(detectorData);% 绘制探测器数据三维曲面图
axis([1 100 1100]);% 设置坐标轴范围
shading flat;% 设置着色方式(平面着色)
xlabel('Column #'); % 添加坐标轴标签
ylabel('Row #');
title('Incoherent Illuminance [lm/cm^2]');% 添加标题
colorbar;% 添加颜色条
✨感谢阅读,您的点赞是我持续分享的动力。喜欢的话麻烦下方点个赞吧!✨

|