吾爱光设

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

[我分享] ZEMAX中如何使用自定义面型(UDS)?(一)

    [复制链接]
  • TA的每日心情

    2024-3-9 22:44
  • 签到天数: 2636 天

    [LV.Master]伴坛终老

    19

    主题

    295

    回帖

    454

    积分

    初级

    积分
    454

    论坛忠实支持者

    发表于 2016-6-16 11:17 | 显示全部楼层 |阅读模式
    ZEMAX中如何使用自定义面型(UDS)?(一)

    前言:

    尽管ZEMAX提供了很多种面型供使用,可是有些时候总觉得不够用。

    比如:新的面型,面型参数不够,自定义不够灵活。这时候就需要自定义面型了。

    针对自定义面型,ZEMAX提供了完善的接口,如果软件本身提供的面型不够用,只需要按照指定格式编写一个DLL即可。
    前段时间,在ZEMAX中开发PW法的插件,利用到了自定义面型。网上也比较缺乏这方面的资料,在此写一篇教程,希望能够帮助大家加深对ZEMAX中自定义面型的理解。欢迎有兴趣的朋友与作者进行交流。


    这是一个介绍自定义面型的基础教程,包含两部分:

    一、ZEMAX自定义面型简介
    a)        对于程序来说面型是什么?
    b)       什么是自定义面型?
    c)        自定义面型的DLL文件怎么工作?
    d)       一个标准球面的源代码详解


    二、自定义带PW参数的理想面实例。
    本文为第一部分,第二部分后续推出。




    ZEMAX自定义面型简介

    1.      对于程序来说面型是什么?

    在ZEMAX程序中,面型只不过是一个抽象概念,包含一堆数据的一个对象。常见的比如:r(曲率半径)、d(透镜直径)、n(透镜折射率),面型名称,t(厚度)等。不同的面型有不同的参数,不同的软件也有些不一样。

    2.      什么是自定义面型?

    ZEMAX为了拓展面型功能,允许用户自定义。就是写一个应用程序拓展(DLL),里面包含了很多函数,这些函数(也就一个)会被ZEMAX调用。自定义面型的核心算法就被放在这些函数内部。
    切记:ZEMAX调用这些函数是按指定格式的。
    位宽:这个要跟ZEMAX统一,操作手册上说64位的软件就用64位的DLL,32位的软件就用32位的DLL,貌似在实际操作中64位程序必须使用32位DLL。

    那么到底ZEMAX会从这个DLL中调用哪些函数,或者说到底哪些东西是可以自定义的?ZEMAX规定,用户需要在DLL中自定义包含用于绘制这个面,光线追迹(包括近轴和实际),梯度折射率的数据。

    REF: The DLLmust contain functions which return to ZEMAX all the data required to draw thesurface, trace rays, compute refraction angles, and for gradient index, todetermine the index as a function of position within the media following thesurface.

           实际上就是ZEMAX挖了很多坑,将对应的坑填上对应的计算公式就行了。

    3.      自定义面型的DLL文件怎么工作?

    比如ZEMAX主程序要追迹光线,如果这个面是自定义面型,那么主程序就跳转到这个DLL(DLL函数的地址)。这个DLL包含自定义内容,那么就实现了这个面型的自定义化。



    DLL就是一个封装了一些函数的文件,ZEMAX让用户把自己的算法写在这个函数里面,在使用这个面型的时候,ZEMAX会按规定格式调用这个函数。
    在早期的ZEMAX,这个函数的函数名为UserDefinedSurface,UserDefinedSurface2。后面的数字是保留更新用的,ZEMAX 09可以使用UserDefinedSurface3,ZEMAX 16(Optic Studio)使用到了UserDefinedSurface4。

    接下来看一下这个入口函数,找到UserDefinedSurface3的声明:
    int _declspec(dllexport)APIENTRY UserDefinedSurface3(USER_DATA *UD, FIXED_DATA3 *FD);

    从中可以看出zemax调用这个函数的时候会传给它两个指针。UD 和FD,UD是USER_DATA的指针类型,包含一些基本光线数据,比如入射光线的坐标、方向。

    1. typedef struct
    2.         {
    3.         double x, y, z;     /* the coordinates */
    4.         double l, m, n;     /* the ray direction cosines */
    5.         double ln, mn, nn;  /* the surface normals */
    6.         double path;        /* the path change */
    7.         double sag1, sag2;  /* the sag and alternate hyperhemispheric sag */
    8.         double index, dndx, dndy, dndz; /* for GRIN surfaces only */
    9.         double rel_surf_tran; /* for relative surface transmission data, if any */
    10.         double udreserved1, udreserved2, udreserved3, udreserved4; /* for future expansion */
    11.         char string[20];    /* for returning string data */
    12.         }USER_DATA;
    复制代码

    FD是FIXED_DATA3的指针类型,包含一些结构数据,比如n(入射面介质折射率)、n’(出射面介质折射率)等。
    1. typedef struct
    2.         {
    3.         int type, numb;     /* the requested data type and number */
    4.         int surf, wave;     /* the surface number and wavelength number */
    5.         double wavelength, pwavelength;      /* the wavelength and primary wavelength */
    6.         double n1, n2;      /* the index before and after */
    7.         double cv, thic, sdia, k; /* the curvature, thickness, semi-diameter, and conic */
    8.         double param[9];    /* the parameters 1-8 */
    9.         double fdreserved1, fdreserved2, fdreserved3, fdreserved4; /* for future expansion */
    10.         double xdata[201];  /* the extra data 1-200 */
    11.         char glass[21];     /* the glass name on the surface */
    12.         }FIXED_DATA;


    13. typedef struct
    14.         {
    15.         int type, numb;     /* the requested data type and number */
    16.         int surf, wave;     /* the surface number and wavelength number */
    17.         int unit;           /* the unit flag */
    18.         double wavelength, pwavelength;      /* the wavelength and primary wavelength */
    19.         double n1, n2;      /* the index before and after */
    20.         double cv, thic, sdia, k; /* the curvature, thickness, semi-diameter, and conic */
    21.         int ireserved[20]; /* for future expansion */
    22.         double dbreserved[20]; /* for future expansion */
    23.         double param[51];    /* the parameters 0-50 */
    24.         double xdata[201];  /* the extra data 1-200 */
    25.         char glass[21];     /* the glass name on the surface */
    26.         }FIXED_DATA2;
    复制代码

    这两个结构体在USERSURF.H中声明。FIXED_DATA3也是从FIXED_DATA一路走来的,不断拓展。


    FIXED_DATA中有个两个变量int type, numb,这两个变量一起控制着ZEMAX要计算的内容。

    1. typedef struct
    2.         {
    3.         int type, numb;     /* the requested data type and number */
    复制代码

    其一为int type,是计算类型,Type与计算类型的关系:

      
    Type
      
      
    计算类型
      
      
    0
      
      
    The  surface name, radial symmetry status, and grin status
      
      
    1
      
      
    The name of the parameter columns
      
      
    2
      
      
    The  name of the extra data columns
      
      
    3
      
      
    The sag and alternate sag of the surface
      
      
    4
      
      
    A  paraxial ray trace to and refraction through the surface
      
      
    5
      
      
    A real ray trace to and refraction through the surface, including  transmittance and polarization data if any
      
      
    6
      
      
    The  index and first derivatives for gradient index propagation
      
      
    7
      
      
    The default data when the user first selects the surface type
      
      
    8
      
      
    The  initialization of the DLL, if required. 在这里可以初始化静态数据,申请内存,加载文件,类似于构造函数,每次加载执行一次。切记:一台机器可以同时运行多个ZEMAX,一个ZEMAX可以运行多个系统的副本(比如DDE),那么他们每一个副本都会执行这个函数。
      
      
    9
      
      
    The termination of the DLL, if required. 与上一个相反,类似于析构函数,清理战场用的。
      
      
    10
      
      
    The  scaling of parameter and extra data values used by the DLL. The scale factor  is stored in the USER_DATA structure in the path argument(double path;)
      

    其二为intnumb,为辅助用,常见的用途为:
        1. 当有多个计算内容的时候用它来切换。比如type=0时,如果numb= 0,ZEMAX请求返回面的名称,如果numb为1,ZEMAX请求返回该系统是否为旋转对称系统。
        2. 指示栏目数,当type为1或2时,numb表示请求的栏目数
        3. 干脆没用

    4.      一个标准球面的源代码详解
    下面是一个中文注释的源代码文件。
    这个代码来自OpticStudio16自带的us_stand.c文件,us_stand.c是us_stand.dll的源代码,us_stand.dll是标准球面面型的DLL文件。

    截图:



    09版ZEMAX自带一个C++的工程文件,16的好像找不到了。
    最后,ZEMAX自带大量计算源代码,涉及:
      
    Refractive and  reflective UDS DLLs
      
      
    折反射DLL
      
      
    Gradient index  UDS DLLs
      
      
    渐变折射率DLL
      
      
    Diffractive UDS  DLLs
      
      
    衍射DLL
      
      
    Lenslet arrays  using DLLs
      
      
    透镜阵列DLL
      
      
    User defined  surface apodization using DLLs
      
      
    自定切趾DLL
      
    想要写相关的自定义面型,从这些例子开始方便多了。

    文件:


    版权申明:
    本文发布的目的就是为了结交更多的光学设计朋友,版权归原作者所有。
    本文首发于ZEMAX中文论坛。
    任何个人或网站均可部分或全文转载,但转载必须保留本版权申明。
    作者联系方式:
    QQ ->260021863
    ZEMAX赞助:
    上海理工大学

    本帖子中包含更多资源

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

    ×

    评分

    参与人数 5金币 +5 贡献值 +10 Z币 +11 收起 理由
    oy87188 + 1 希望出下一个专题
    learner + 1 + 3 + 3
    aidenna + 1 + 2 + 3 赞一个!
    lyardan + 1 + 2 + 2 赞一个!
    天空很蓝 + 1 + 3 + 3 原创

    查看全部评分

    2018-1-23 00:46 大吉大利,今晚吃鸡!
    回复

    使用道具 举报

  • TA的每日心情

    2023-8-18 08:55
  • 签到天数: 647 天

    [LV.9]以坛为家II

    47

    主题

    636

    回帖

    1179

    积分

    中级

    积分
    1179

    突出贡献优秀版主论坛忠实支持者

    发表于 2016-7-3 12:27 | 显示全部楼层
    zemax中自定义面型的使用(一)


    本帖子中包含更多资源

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-3-26 10:52
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    1

    主题

    5

    回帖

    1

    积分

    小白

    积分
    1
    发表于 2017-12-8 11:52 | 显示全部楼层
    写得很好,比较少见的参考文档。
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-4-24 09:54
  • 签到天数: 1253 天

    [LV.10]以坛为家III

    14

    主题

    138

    回帖

    14

    积分

    小白

    积分
    14
    发表于 2018-1-22 15:08 | 显示全部楼层
    请教一下,我点进去之后,找到C语言文档,结果在记事本里打开,而不是在ZEMAX里打开,想问问楼主怎么操作的

    本帖子中包含更多资源

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

    ×
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

    2024-3-9 22:44
  • 签到天数: 2636 天

    [LV.Master]伴坛终老

    19

    主题

    295

    回帖

    454

    积分

    初级

    积分
    454

    论坛忠实支持者

     楼主| 发表于 2018-1-22 23:04 | 显示全部楼层
    你点进去,是进哪里去?  编程菜单进不去的,用户自定义面型,使用的时候是在面型里面选择它,等光线追迹的时候,它会加载你指定的那个。

    2018-1-23 00:46 大吉大利,今晚吃鸡!
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2021-8-18 11:15
  • 签到天数: 249 天

    [LV.8]以坛为家I

    10

    主题

    121

    回帖

    58

    积分

    入门

    积分
    58
    发表于 2018-3-19 10:35 | 显示全部楼层
    楼主好,我是Zemax中文学习小组的,你的这个分享内容很棒,我这边想把你的这篇分享加入到ZEMAX简明教程当中,不知道可以不可以?
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情

    2024-3-9 22:44
  • 签到天数: 2636 天

    [LV.Master]伴坛终老

    19

    主题

    295

    回帖

    454

    积分

    初级

    积分
    454

    论坛忠实支持者

     楼主| 发表于 2018-3-19 11:06 | 显示全部楼层
    sure, of cource,
    转载附出处作者即可
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    6

    回帖

    3

    积分

    小白

    积分
    3
    发表于 2018-3-28 11:21 | 显示全部楼层
    楼主,非常赞的工作,不过我代码中有些问题:
            a = (UD->n) * (UD->n) * FD->k + 1;
                    b = ((UD->n)/FD->cv) - (UD->x) * (UD->l) - (UD->y) * (UD->m);
                    c = (UD->x) * (UD->x) + (UD->y) * (UD->y);
                    rad = b * b - a * c;
                    if (rad < 0) return(FD->surf);  /* 光线与该面不相交 */
                    if (FD->cv > 0) t = c / (b + sqrt(rad));
                    else           t = c / (b - sqrt(rad));
                    (UD->x) = (UD->l) * t + (UD->x);
                    (UD->y) = (UD->m) * t + (UD->y);
                    (UD->z) = (UD->n) * t + (UD->z);
                    UD->path = t;
                    zc = (UD->z) * FD->cv;
                    rad = zc * FD->k * (zc * (FD->k + 1) - 2) + 1;
                    casp = FD->cv / sqrt(rad);
                    UD->ln = (UD->x) * casp;
                    UD->mn = (UD->y) * casp;
                    UD->nn = ((UD->z) - ((1/FD->cv) - (UD->z) * FD->k)) * casp;
    ====================
    a我推导出来一样,但b,c,推导出来不一样;还有按我的解法t= (b - sqrt(rad))/c,与代码中成倒数,不知楼主有没有推导过?
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情

    2022-5-13 22:08
  • 签到天数: 335 天

    [LV.8]以坛为家I

    44

    主题

    68

    回帖

    4

    积分

    小白

    积分
    4
    发表于 2019-5-22 15:57 | 显示全部楼层
    楼主,请问第二部分出了吗??
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-12-12 15:36
  • 签到天数: 824 天

    [LV.10]以坛为家III

    34

    主题

    358

    回帖

    128

    积分

    入门

    积分
    128
    发表于 2019-8-15 09:37 | 显示全部楼层
    请问备用矢高是什么意思
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-26 06:41 , Processed in 0.140625 second(s), 28 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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