跳转到内容

OpenSCAD 用户手册/WIP/模块字面量

来自维基教科书,开放世界中的开放书籍

模块字面量/模块引用

[编辑 | 编辑源代码]

模块引用是一种类型的 变量,它引用一个 模块

模块字面量和模块引用语法

[编辑 | 编辑源代码]

模块引用使用模块字面量进行初始化。在以下代码片段中,my_cube 是模块引用,而 module cube([2,3,4]) 是模块字面量。模块字面量是一个表达式,其语法特征是它以 module 关键字为前缀。

语法详解

[编辑 | 编辑源代码]

根据你的需要,定义模块引用有几种不同的方法。

简单语法
[编辑 | 编辑源代码]

在此语法中,你定义的模块与你期望看到其输出完全相同。

// Create a reference to a cube module
my_cube = module cube([2,3,4]);

以上代码创建了变量 my_cube但不会实例化它,因此在图形窗口中不会有任何输出。若要实例化模块,你使用与模块相同的语法。

// Instantiate the module through the module reference
my_cube();
实例化的模块引用
别名语法
[编辑 | 编辑源代码]

在此变体中,模块引用的名称只是模块的另一个名称。

my_cylinder = module cylinder;

要实例化模块,别名接受与它所引用的模块完全相同的参数。

my_cylinder(h=20, r=10, center=true);
实例化的模块引用
参数转发语法
[编辑 | 编辑源代码]

在另一种形式中,你向模块字面量提供参数。这些参数被转发到原始模块。

my_cylinder = module(height) cylinder(h = height, r=10, center=true);

在这种情况下,你使用修改后的参数调用引用。

my_cylinder(20);
实例化的模块引用
无参数的匿名模块语法
[编辑 | 编辑源代码]

在最后的几种形式中,你可以创建一个匿名模块字面量,并将引用初始化到它。
( 请注意,在此形式中,在右花括号后面必须有一个分号 )

my_shapes = module {
  cube(2,center = true); 
  translate([5,0,0]) 
    sphere(1,center = true);
};

模块可以使用通常的方式实例化。

my_shapes();
实例化的模块引用
带参数的匿名模块语法
[编辑 | 编辑源代码]

匿名模块形式当然也可以接受参数。

my_rotated_square  = module ( r, s) { rotate(r) square(s);};

模块引用可以使用通常的方式实例化。

my_rotated_square(45,10);
实例化的模块引用
通过表达式实例化模块
[编辑 | 编辑源代码]

模块字面量可以存储在数组中,并从函数中返回。在这些情况下,在调用它们之前将它们分配给符号可能会很不方便。可以通过在实例化参数之前用括号括起解析为模块字面量的表达式来实例化表达式。

 //-------------
 // n is an integer index between 0 and 3
 // choose_shape returns the shape given by the index
function choose_shape(n) = 
    let (ar = [
         module cube([5,20,30]),
         module sphere(r = 6 , $fn = 20),
         module cylinder(d = 15, h = 20, $fn = 30)
     ])
     ar[n];
  //--------------
  // instantiate the chosen module
  (choose_shape(2))();  // choose the cylinder

更多示例

[编辑 | 编辑源代码]

有关模块字面量和模块引用的更高级用法,请参见 https://github.com/kwikius/openscad/tree/module_literal_v3/examples/ModuleLiterals

华夏公益教科书