ZEMAX | 如何创建ZOS-API自定义扩展将切比雪夫多项式转换为扩展多项式

本文描述了如何使用ZOS-API创建自定义扩展 ( User Extension ),将切比雪夫多项式( Chebyshev Polynomial )表面转换为扩展多项式 ( Extended Polynomial )表面。进行转换的切比雪夫表面为14阶,这是目前OpticStudio中可以设置的最大阶数。

简介

越来越多的设计者将切比雪夫多项式用于光学设计中,但是很难进行实际加工制作。这些多项式可能无法通过计算机辅助制造 ( Computer-Aided Manufacturing , CAM ) 方程、模具校正和注塑过程中的模具收缩补偿实现。然而,扩展多项式表面可以。因此,将切比雪夫多项式转换成扩展多项式的方法很实用,反之亦然。

什么是自定义扩展?

点击:编程( Programming )选项卡>关于ZOS-API ( About the ZOS-API ) >插件/扩展( Plug-In/Extension ),打开内置帮助文件,可看到扩展程序 ( ZOS-API Extension )的定义:在概念上非常类似于ZPL宏 ( ZPL Macro )——扩展程序控制当前开启的OpticStudio实例,在其运行时阻止用户与界面进行交互,并且可以改变当前镜头系统的几乎所有内容。自定义扩展的初始设置以及与OpticStudio的连接与自定义操作数 ( User Operand )和自定义分析 ( User Analysis ) 模式相同。

对于扩展程序,PrimarySystem(基于TheApplication建立)始终是在OpticStudio中当前显示的镜头系统。但是请注意,扩展程序操作者可以控制是否在用户界面中实时显示对PrimarySystem的更改:

// Make all changes (i.e. loading a new lens file) immediately
// display in the User interface
TheApplication.ShowChangesInUI = true;
// Do some work
// Do not show any changes in the User interface
TheApplication.ShowChangesInUI = false;
// Do some more work

在执行许多快速更改的任务时(例如:在评价函数编辑器中插入大量的行),此项设置可能非常重要。请注意,无论这项设置如何,当扩展运行完成时,界面中将始终显示最终的系统。通过API扩展程序,还有三个附加属性可以使用:


TheApplication.TerminateRequested: 当用户单击“取消 ( Cancel ) ”按钮时,将返回“ture”。
TheApplication.ProgressMessage: 设置“扩展 ( Extension ) ”对话框中显示的当前消息。
TheApplication.ProgressPercent: 设置“扩展”对话框中的当前进度 ( 0-100% )。

因此,用户自定义扩展模式使用户完全控制镜头设计和用户界面。自定义扩展可以使用 C++ (COM) 或 C# (.NET)来编写。本文的自定义扩展是用C#编写的。

打开新的编程模板

点击:编程 ( Programming ) > C# >自定义扩展 ( User Extension ),用C#创建自定义扩展:

使用Windows资源管理器打开解决方案文件夹:{Zemax}\ZOS-APIProject\CSharpUserExtensionApplication1。Visual Studio 也打开了新的解决方案。该解决方案包含模板代码——可用作任何自定义扩展基础的模板。在Visual Studio中,将自定义扩展编译为可执行文件。然后将可执行文件复制到 {Zemax)\ZOS-API\Extensions 文件夹,以便OpticStudio可以使用。


打开切比雪夫自由曲面反射镜示例

本文附件中的 “ChebyshevMirror_optimized.zar” 文件,该文件中包含切比雪夫多项式自由曲面反射镜,光线聚焦在X和Y方向的+/- 10o视场内。


有关切比雪夫多项式的更多信息,请参阅: 基于切比雪夫多项式的新型自由曲面的设计与实现。

对该系统进行优化和公差分析之后,在将自由曲面反射镜的图纸发送给制造商之前,将切比雪夫多项式转换为扩展多项式,这样设计的系统就可以通过计算机辅助制造方程、模具校正和注塑过程中的模具收缩补偿等工具实现。

OpticStudio有内置的非球面转换工具,但是没有将自由曲面转换为其他面型的工具。幸运的是,可以使用ZOS-API构建工具。

将切比雪夫多项式转换为扩展多项式

切比雪夫多项式

切比雪夫多项式由包含X和Y的方程式表示,这使得它们作为直角正交多项式特别实用。


扩展多项式

扩展多项式和切比雪夫多项式的定义之间的主要区别是:

圆锥常数 k
多项式的每个系数包含一个归一化因子,而切比雪夫包含 x0 和 y0
系数随 “i ”变化


转换

利用Mathematica和上述定义,可以计算得出每个扩展多项式的项等于一个包含切比雪夫多项式的项的方程。结果如下:


根据上述结果,生成用户自定义扩展,它将通过读取切比雪夫多项式表面的系数,并计算扩展多项式表面的系数来自动转换。

用户自定义扩展将在切比雪夫多项式之后添加具有计算出的系数的扩展多项式表面,以及包含两个多项式表面之间矢高差的网格矢高 ( Grid Sag ) 表面。得出的结果将满足要求。


自定义扩展代码


文章附件中包含用户自定义扩展的代码,代码中包含:求切比雪夫多项式表面的循环

// Loop to find the Chebyshev polynomial surface
int i = 1;
do
{
TheApplication.ProgressMessage = "Chebyshev Surface at line : " + i.ToString();
if (TheSystem.LDE.GetSurfaceAt(i).Type == ZOSAPI.Editors.LDE.SurfaceType.ChebyShv)
{
break;
}
i++;
} while (i <= TheSystem.LDE.NumberOfSurfaces);

检查切比雪夫表面。如果在第 i 行找到切比雪夫多项式表面,那么代码将调用名为 ConvertChebyshevToExtended (TheApplication, i) 的转换函数。转换函数将填充两个数据数组:切比雪夫系数数组和计算得到的扩展多项式的系数数组。一旦转换完成,该函数将在新计算的系数用于切比雪夫多项式表面之后,添加新的扩展多项式表面。

//Call the conversion functionConvertChebyshevToExtended(TheApplication, i);

调用矢高函数 ( TheApplication, i ) ,该函数将返回矢高数组。调用矢高函数两次:一次用于切比雪夫多项式表面,一次用于扩展多项式表面。

//Measure the sag of Chebyshev, Extended
double[,] chebysag = Sag(TheApplication, i);
double[,] extendedsag = Sag(TheApplication, i + 1);

调用名为 SagDifference(chebysag, extendedsag) 的函数,该函数将返回包含切比雪夫多项式表面和扩展多项式表面之间的矢高差的数组。

//Make the difference and add a "difference" grid sag surface
double[,] chebyExtendedsagdiff = SagDifference(chebysag, extendedsag);

调用名为RMS_PV_function的函数 (chebyExtendedsagdiff, out RMSConversion, out PVConversion),该函数将返回矢高差的均方根值 ( RootMean-Square, RMS ) 和峰谷值( Peak-to-Valley, PV )。

//Calculate the RMS and PV of a matrix
RMS_PV_function(chebyExtendedsagdiff, out RMSConversion, out PVConversion);

最后,调用名为 CreateGridSag 的函数,将创建带有矢高差的网格矢高表面。得出的结果将满足要求。

//Make a grid sag of the difference
//The arguments are the semi-diameter because we need to know the spacing / interval between the sag points
//the surface number is also an argument: we will add a grid sag below the extended surface
double semidiameter = TheSystem.LDE.GetSurfaceAt(i).SemiDiameter;
CreateGridSag(TheApplication, chebyExtendedsagdiff, semidiameter, i);

保存、构建和移动可执行文件

然后可以在发布模式 ( Release Mode ) 中构建解决方案。要将用户自定义扩展作为插件分配,请将其设置为发布模式,因为调试库是不可重新分配的。


然后可以将可执行文件从解决方案文件夹 ( {Zemax}\ZOS-API Projects\...) 复制到 {Zemax}\ZOS-API\User Extension 中。

运行自定义扩展

启动 OpticStudio 并打开镜头文件“ChebyshevMirror_optimized.zar”,检查 ConvertChebyToExtended 自定义扩展。

点击:分析 ( Analyze )> 波前( Wavefront ),打开波前图 ( Wavefront Map )。使用波前图来比较转换前后的结果。开始时,波前图显示均方根值为1.7423波数,PV值为6.9820波数。

点击:编程 ( Programming )>自定义扩展 ( User Extensions )创建新的扩展。


运行扩展,计算扩展多项式系数:


显示运行扩展后的指标:


然后在切比雪夫多项式表面之后添加两个新的表面:扩展多项式和包含矢高差的网格矢高表面。


在波前图上,转换后的结果为:RMS为1.7423波数,PV为6.9820波数。转换后运行正常!

关于自定义扩展的相关信息:速度、设置和其他技巧

问:UserExtension 是否可以改变文件选项,使软件在每个系数转换后不保存文件?

答:不可以。

目前无法从自定义扩展中更改文件选项。当运行用户自定义扩展,即转换系数,如果通过点击:配置选项 ( Project Preferences ) > 常规( General ) > 撤销 ( Undo ),将撤销设置为“磁盘多步存储 ( Disk Multi-Step ) ”,OpticStudio将保存每一步的转换。因此,每次修改新系数(超过200次)时,软件都会保存UNDO文件,这会降低执行速度。惟一的解决方法是在运行扩展之前手动更改该设置。

问:有什么方法可以加快 UserExtension 的运行速度吗?

答:有!

将 IZOSAPI_Application.ShowChangesInUI 设置为“false”。这不会影响撤消行为,但是会使扩展运行得更快,例如:调用矢高分析,但并不显示分析结果。
将 IOpticalSystem.UpdateMode 设置为 ‘LensUpdateMode.EditorsOnly’。
点击:配置选项( Project Preferences )>常规( General )>撤销( Undo ),手动将撤销更改为“无 ( None )”。

问:可以对 UserExtension 进行设置,以选择要转换的表面吗?

答:用户自定义扩展是可执行的,因此可以显示设置窗口。

最简单的添加设置的方法是创建新的空Windows窗体项目,然后集成到用户自定义扩展代码中。需要将STA线程特性添加到界面的入口点才能工作。有关设置的更多信息,请参阅文章:"如何使用ZOS-API创建飞行时间自定义分析" 。

问:当运行 UserExtension 时,弹出带有控制台应用程序格式的黑色窗口 ,可以移除它吗?

答:可以!

对于自定义扩展,默认的输出格式是控制台应用程序,可以将其更改为windows应用程序。