结构组装配组

在软件中,组(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即可添加到对象树中:

structure_add_structure1.png

修改内置结构组

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

structure_group_structure.png

软件内置结构组不但允许修改全局参数(相对位置、旋转)或脚本变量等,而且允许单独修改某个单元的参数或删除/添加某个结构单元。

自定义结构组

创建

软件支持自建结构组,创建结构组的一般流程为:

Description

案例:圆孔光阑

基于上述的创建流程,下面将进行实际操作,构建一个普通光阑结构组。

  1. 分析组件的组成,将复杂结构拆分为许多基本单元的组合,比如圆孔光阑,其结构通常为平板上挖出的圆形通光孔。因此建立光阑选择2D polygon结构。

  2. 添加一个空结构组,操作如图:
    Description

  3. 定义光阑的参数:
    Description

  4. 在结构组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);
    
    
  5. 创建的结构组如下图所示(图片已做适当处理):
    structure_groupusers

装配组

装配组(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);

装配组的主要特点包括:

  • 原型 + 映射表:组内仅包含一个原型(基本几何体或结构组),并通过映射表为每个实例指定不同的参数值。
  • 变体管理:旋转和平移作为自由变量,不占用变体名额。
  • 脚本驱动:装配组的创建和配置主要依靠脚本命令(如 addassemblygroupaddtogroupsetnamed 等),不需要复杂的图形界面操作。

案例

本案例演示如何通过装配组快速创建 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);