吾爱光设

 找回密码
 注册
会员须知
会员须知
实用帮助
实用帮助
查看: 126|回复: 0

[技术文章] Zemax—Matlab API 交互教程(6)_NSC光线追迹

[复制链接]
  • TA的每日心情
    慵懒
    2025-10-13 09:48
  • 签到天数: 310 天

    [LV.8]以坛为家I

    26

    主题

    46

    回帖

    5

    积分

    小白

    积分
    5
    发表于 2025-10-13 11:28 | 显示全部楼层 |阅读模式
    本帖最后由 伊人在水一方 于 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;% 添加颜色条



    ✨感谢阅读,您的点赞是我持续分享的动力。喜欢的话麻烦下方点个赞吧!✨






    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?注册

    ×
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    联系我们|本论坛只支持PC端注册|手机版|小黑屋|吾爱光设 ( 粤ICP备15067533号 )

    GMT+8, 2025-10-14 08:08 , Processed in 0.093750 second(s), 24 queries .

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表