组
组 #
在软件中,组(Group)是一种用于组织和管理仿真对象的容器。根据用途和功能,组可以分为三类:普通组、结构组和装配组。用户可以根据实际需求选择合适的组类型。
普通组 #
普通组是最基础的组类型,它作为一个简单的容器,用于将多个对象(如几何体、监视器、光源等)逻辑地组织在一起。普通组的主要用途是:
- 在对象树中对相关对象进行分组,使模型结构更加清晰。
- 支持统一移动、旋转、隐藏或删除组内所有对象。
- 可包含大部分类型的对象,没有数量或类型限制。
普通组不提供特殊的性能优化或批量实例化功能,适合对少量、非重复的对象进行管理。您可以通过图形界面或脚本命令 addgroup 来创建普通组。
结构组 #
本节是关于结构组的介绍。
结构组是一组结构的集合,它作为一种管理和编辑组内对象的工具,极大地方便了用户在光学器件建模与设计时的操作。
其特点是:
- 既可以对结构组中的所有结构单元进行统一操作,又能够单独修改组内某个对象的属性;
- 用户能够使用脚本自定义任意结构组,并对其进行整体的优化和扫描。
内置结构组库 #
针对常用的结构类型,本软件内置了一系列预定义的结构组,方便用户高效完成复杂的建模任务。
内置结构组库 #
| Name | Description |
|---|---|
| Cylinders | 圆筒类;如自定义旋转体(Custom revolution)、齿轮圆柱体(Gear cylinder)、粗糙圆柱体(Rough cylinder)、圆角圆柱体(Rounded cylinder)等。 |
| Cylindrical fibers | 光纤;如布拉格光纤(Bragg fiber)、芯包层光纤(Core-cladding fiber)等。 |
| Ellipsoids | 椭球体;如涂层椭圆体(Coated ellipse)、涂层球体(Coated sphere)、二聚体球体(Dimer sphere)等。 |
| Extruded polygons | 拉伸多边形;比如所有边和角都是圆形的结构(All rounded quadrilateral)、十字形结构(Cross)、等腰梯形(Isosceles trapezoid)、圆角等边多边形(N-sided equilateral polygon with rounded corners)、星形多边形(Star polygon)等。 |
| Gratings | 光栅;包括闪耀光栅(Blaze grating)、布拉格光栅(Bragg grating)和光栅耦合器(Grating coupler)。 |
| Integrated optics | 集成光学;如180弯曲波导(180-deg waveguide bend)、交叉波导(Cross waveguide)、定向耦合器(Directional coupler)、环形谐振器(Ring resonator)、Y形分路器(Y-splitter)等。 |
| Photonic crystals | 光子晶体;如体心立方光子晶体(BCC PC lattice)、面心立方光子晶体(FCC PC lattice)、六边形晶格光子晶体H腔(Hexagonal lattice PC H-cavity)、矩形光子晶体(Rectangular PC lattice)、矩形晶格光子晶体阵列(Rectangular lattice PC array)、木堆晶格(Woodpile)等。 |
| Polyhedrons | 多面体;包括六角化八面体(Disdyakis dodecahedron)、正八面体(Regular octahedron)和截角八面体(Truncated octahedron)。 |
| Pyramids and cones | 棱锥和圆锥;如涂层金字塔形结构(Coated pyramid)、圆锥体(Cone)、多面金字塔(N-sided Pyramid)、抛物面锥体(Parabola cone)、正四面体(Tetrahedron)、截锥体(Truncated cone)等。 |
| Random particles | 随机颗粒;包括高斯随机粒子分布(Gaussian random Particle distribution)、线性随机粒子分布(Linear random particle Distribution)和均匀随机粒子分布(Uniform random particle distribution)。 |
| Toroids | 圆环;如圆形环面结构(Circular toroid)、椭圆形环面结构(Ellipse toroid)、等边多边形环面结构(Equilateral n-side polygon toroid)等。 |
| Uncategorized structures | 未分类的结构;比如螺旋结构(Helix)等。 |
添加和修改 #
添加内置结构组 #
本软件内置结构组,打开查看,图示如下,点击Insert即可添加到对象树中:

修改内置结构组 #
添加一个结构组,比如Cylinders>Gear Cylinder,并打开编辑窗口,如下图所示:

软件内置结构组不但允许修改全局参数(相对位置、旋转)或脚本变量等,而且允许单独修改某个单元的参数或删除/添加某个结构单元。
自定义结构组 #
创建 #
软件支持自建结构组,创建结构组的一般流程为:

案例:圆孔光阑 #
基于上述的创建流程,下面将进行实际操作,构建一个普通光阑结构组。
-
分析组件的组成,将复杂结构拆分为许多基本单元的组合,比如圆孔光阑,其结构通常为平板上挖出的圆形通光孔。因此建立光阑选择2D polygon结构。
-
添加一个空结构组,操作如图:

-
定义光阑的参数:

-
在结构组Script页面书写脚本,代码如下:
deleteall; # setup variables Rin = 0.5e-6; Lout = 2e-6; res = 100; # setup script xin = Rin.*cos(linspace(0,2*pi,res)); yin = Rin.*sin(linspace(0,2*pi,res)); xout = [Lout,Lout,-Lout,-Lout,Lout,Lout,Rin]; yout = [0,Lout,Lout,-Lout,-Lout,0,0]; V = [xout,xin; yout, yin]; add2dpolygon; set("name","2d ring"); set("vertices",V); -
创建的结构组如下图所示(图片已做适当处理):

装配组 #
装配组(Assembly Group)是一种特殊组类型,专为高效创建由大量重复或相似对象构成的复杂结构(如超透镜阵列)而设计。其核心思想是“定义一次,重复使用”,通过一个原型对象和参数映射表来批量生成多个实例,可极大提升几何构建和网格划分的速度。
一个装配组由以下要素构成:
- 原型:组内唯一的子对象,可以是基本几何体(如长方体、圆柱体)或结构组。所有实例均基于此原型生成。原型不能是另一个装配组,且不能包含空间变化材料。
- 参数列表:元胞数组,列出原型中需要变化的参数名称,例如
{"x", "y", "radius"}。 - 映射表:矩阵,为每个实例的具体参数提供数值。行数等于参数个数,列数等于实例总数。每列依次对应参数列表中各参数的值。
配置时通过脚本定义参数列表与映射表,并使用 setnamed 赋予装配组。以下代码片段展示了参数列表与映射表的定义方式,如需运行完整示例,请参考本页的“案例”部分。
# 仅用于功能展示
# 定义参数列表和映射表
params = {"x", "y", "radius"};
mapping = [x_1,x_2;
y_1,y_2;
R_1,R_2];
# 将参数和映射表赋予装配组
setnamed("assembly_group", "parameters", params);
setnamed("assembly_group", "mapping", mapping);
装配组的主要特点包括:
- 原型 + 映射表:组内仅包含一个原型(基本几何体或结构组),并通过映射表为每个实例指定不同的参数值。
- 变体管理:旋转和平移作为自由变量,不占用变体名额。
- 脚本驱动:装配组的创建和配置主要依靠脚本命令(如
addassemblygroup、addtogroup、setnamed等),不需要复杂的图形界面操作。
案例 #
本案例演示如何通过装配组快速创建 4 个圆柱体构成的阵列,每个圆柱体的位置与半径各不相同。
deleteall;
switchtorightview;
# 创建装配组并命名
addassemblygroup;
set('name', 'assembly_grp');
# 创建圆柱体原型
addcircle;
set('radius', 0.5e-6);
set('z span', 2e-6);
set('x', 0);
set('y', 0);
# 将原型添加至装配组
addtogroup('assembly_grp');
# 定义参数列表:X位移、Y位移、半径
setnamed('assembly_grp', 'parameters', ['x pos', 'y pos', 'radius']);
# 定义映射表
mapping = [0, -2, 2, 0; # 每个实例的x坐标(um): 0, -2, 2, 0
0, 3.5, 3.5, 5; # 每个实例的y坐标(um): 0, 3.5, 3.5, 5
4, 1, 1, 2] * 1e-6; # 每个实例的半径(um): 4, 1, 1, 2
setnamed('assembly_grp', 'mapping', mapping);

