跳转到内容

OpenSCAD 教程/第 6 章

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

OpenSCAD 变量

[编辑 | 编辑源代码]

在前面的章节中,您已经使用变量来参数化您的设计并使它们易于定制。具体来说,您已在脚本的某个部分为它们分配数值,然后在脚本的另一个部分使用它们存储的值。例如,您可以将 wheel_radius 变量设置为所需的轮子半径,并在创建汽车轮子的相应语句中使用该变量。这样,您就可以轻松地自定义汽车轮子的半径,而不必搜索和更改多个值,只需直接更改 wheel_radius 变量的值即可。

您还了解了 OpenSCAD 变量的一个重要属性。那就是一个变量只能有一个特定值。如果您为一个变量分配一个值,然后在脚本的后面部分为它分配另一个值,那么您的变量在整个设计执行过程中将只有最终值。以下示例说明了这一点。

代码

two_cylinder_with_same_radius.scad

$fa=1;
$fs=0.4;
height=10;
radius=5;
cylinder(h=height,r=radius);
radius=10;
translate([30,0,0])
    cylinder(h=height,r=radius);

两个圆柱体的半径均为 10 个单位,这是分配给 radius 变量的最后一个值。

当变量存储数值时,它们可用于指定不同对象的尺寸或定义转换命令。数值不是可以分配给变量的唯一类型的值。变量还可以保存布尔值(真或假)以及字符 (a, b, c, d, …) 。正如您将在以下主题中看到的那样,通过使用布尔或字符变量,您可以进一步参数化您的模型和模块。

条件变量赋值

[编辑 | 编辑源代码]

到目前为止,您一直使用适当的赋值命令为变量分配特定值。但是,在某些情况下,您可能更希望赋值本身是参数化的,并且取决于设计的某些方面。

创建汽车车身需要定义各种参数。这些参数可以在调用车身模块时定义,方法是使用在脚本中定义的相应变量。以下是一个示例。

代码

parameterized_car_body.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;
base_length = 60;
top_length = 30;
top_offset = 5;
body(base_length=base_length, top_length=top_length, top_offset=top_offset);

以上版本的汽车车身将被称为短版本。通过选择变量的不同值,也可以创建长版本。

代码

long_car_body.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;
base_length = 80;
top_length = 50;
top_offset = 10;
body(base_length=base_length, top_length=top_length, top_offset=top_offset);

如果这两个版本的汽车车身是您目前感兴趣的唯一版本?有没有一种方法可以快速切换这两个版本,而不必分别修改每个变量?

您可能认为修改三个变量并不多,但对于更复杂的模型,所需的变量数量很容易变得难以管理。幸运的是,这个问题有一个解决方案,那就是条件变量赋值。条件变量赋值是一种指示 OpenSCAD 根据某个条件是否为真或假,为变量分配不同值的方法。在本例中,该条件是汽车车身是否应该很长。您可以通过定义一个 long_body 变量来表示此条件,如果希望车身很长,则将其设置为 true,如果不想让车身很长,则将其设置为 false。

长车身的选项由以下语句表示。

代码
long_body = true;

相应地,短车身的选项由以下语句表示。

代码
long_body = false;

long_body 变量称为布尔变量,因为它被分配了布尔值(真或假)。下一步是定义条件赋值,这些赋值将根据 long_body 变量的值,为 base_length、top_length 和 top_offset 变量分配适当的值。这些条件赋值可以用以下方式定义。

代码
base_length = (long_body) ? 80:60;
top_length = (long_body) ? 50:30;
top_offset = (long_body) ? 10:5;

您应该注意条件赋值定义的以下几点。首先键入变量名称,然后是等号。然后是一对括号,其中包含将用于条件赋值的条件。在本例中,该条件是一个布尔变量。通常,该条件还可以是多个变量之间逻辑和比较运算的组合。在闭合括号之后,是一个问号和两个相应的变量值,用冒号分隔。如果提供的条件为真,则第一个值将是分配给变量的值。如果提供的条件为假,则第二个值将是分配给变量的值。

通过将以上条件赋值合并到您的脚本中,您可以仅通过将 long_body 变量从 false 更改为 true,反之亦然,来在短车身和长车身之间切换。

代码

car_with_normal_conditional_body.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;

// Conditional assignment of body variables
long_body = false;
base_length = (long_body) ? 80:60;
top_length = (long_body) ? 50:30;
top_offset = (long_body) ? 10:5;
// Creation of body
body(base_length=base_length, top_length=top_length, top_offset=top_offset);

// Creation of wheels and axles
track = 30;
wheelbase = 40;
wheel_radius = 8;
wheel_width = 4;
// Front left wheel 
translate([-wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
 // Front right wheel 
translate([-wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear left wheel 
translate([wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear right wheel 
translate([wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Front axle 
translate([-wheelbase/2,0,0])
    axle(track=track); 
// Rear axle 
translate([wheelbase/2,0,0])
    axle(track=track);

代码

car_with_long_conditional_body.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;

// Conditional assignment of body variables
long_body = true;
base_length = (long_body) ? 80:60;
top_length = (long_body) ? 50:30;
top_offset = (long_body) ? 10:5;
// Creation of body
body(base_length=base_length, top_length=top_length, top_offset=top_offset);

// Creation of wheels and axles
track = 30;
wheelbase = 40;
wheel_radius = 8;
wheel_width = 4;
// Front left wheel 
translate([-wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
 // Front right wheel 
translate([-wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear left wheel 
translate([wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear right wheel 
translate([wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Front axle 
translate([-wheelbase/2,0,0])
    axle(track=track); 
// Rear axle 
translate([wheelbase/2,0,0])
    axle(track=track);

练习
在前面的示例中添加一个 large_wheels 变量。该变量应该只接受布尔值。添加两个条件赋值,为 wheel_radius 和 wheel_width 变量分配不同的值。large_wheels 变量应该用作两个赋值的条件。如果 large_wheels 变量为 false,则 wheel_radius 和 wheel_width 变量应该分别设置为 8 和 4 个单位。如果 large_wheels 变量为 true,则 wheel_radius 和 wheel_width 变量应该分别设置为 10 和 8 个单位。为 long_body 和 large_wheels 变量设置适当的值,以创建以下版本的汽车:短车身 - 大轮子,短车身 - 小轮子,长车身 - 大轮子,长车身 - 小轮子。
  • 短车身 - 大轮子
代码

car_with_short_body_and_large_wheels.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;

// Conditional assignment of body variables
long_body = false;
base_length = (long_body) ? 80:60;
top_length = (long_body) ? 50:30;
top_offset = (long_body) ? 10:5;
// Creation of body
body(base_length=base_length, top_length=top_length, top_offset=top_offset);

// Creation of wheels and axles
large_wheels = true;
wheel_radius = (large_wheels) ? 10:6;
wheel_width = (large_wheels) ? 8:4;
track = 30;
wheelbase = 40;
// Front left wheel 
translate([-wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
 // Front right wheel 
translate([-wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear left wheel 
translate([wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear right wheel 
translate([wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Front axle 
translate([-wheelbase/2,0,0])
    axle(track=track); 
// Rear axle 
translate([wheelbase/2,0,0])
    axle(track=track);

  • 短车身 - 小轮子
代码

car_with_short_body_and_small_wheels.scad

…
long_body = false;
large_wheels = false;
…

  • 长车身 - 大轮子
代码

car_with_long_body_and_large_wheels.scad

…
long_body = true;
large_wheels = true;
…

  • 长车身 - 小轮子
代码

car_with_long_body_and_small_wheels.scad

…
long_body = true;
large_wheels = false;
…

更多条件变量赋值

[编辑 | 编辑源代码]

条件变量赋值也可以使用适当调整的语法,当您希望在其中进行选择时,有两种以上的情况。在前面的示例中,车身只有两种选择(短或长),并且使用了一个布尔变量 (long_body) 来在这两种选择之间进行选择。

如果您希望能够在四个版本的车身(短、长、矩形和正常)之间进行选择怎么办?布尔变量不能用于表示您的车身版本选择,因为它只能有两个值(真或假)。因此,您将使用一个字符来表示您的车身选择。

短车身的选项将由字符 s 表示。

代码
body_version = "s";

长车身的选项将由字符 l 表示。

代码
body_version = "l";

矩形车身的选项将由字符 r 表示。

代码
body_version = "r";

普通车身的选项将由字符 n 表示。

代码
body_version = "n";

当存在两种以上选项时,条件赋值应采用以下形式。

代码
// base_length
base_length =
(body_version == "l") ? 80:
(body_version == "s") ? 60:
(body_version == "r") ? 65:70;

// top_length
top_length =
(body_version == "l") ? 50:
(body_version == "s") ? 30:
(body_version == "r") ? 65:40;

// top_offset
top_offset =
(body_version == "l") ? 10:
(body_version == "s") ? 5:
(body_version == "r") ? 0:7.5;

您应该注意当存在两种以上选项时,条件赋值定义的以下几点。首先键入变量名称,然后是等号。然后是一对括号,其中包含一个条件,然后是一个问号,然后是如果条件为真将分配的值,然后是一个冒号。根据可用车身版本的数量,前面的序列会重复。最后一个序列略有不同,因为它有一个附加的值,该值将在所有条件都不为真的情况下用作默认值。在本例中,默认值对应于车身的普通版本。这就是为什么对应于车身普通版本的字符 n 不参与任何条件的原因。您应该注意的另一件事是,条件现在是比较运算,特别是相等比较。如果 body_version 变量的值等于双等号后面的字符,则该条件为真,并且该条件后面的相应值将被分配给该变量。

通过将以上条件赋值合并到您的脚本中,您可以仅通过将 body_version 分别设置为字符 s、l、r 或 n 来在短车身、长车身、矩形车身和普通车身之间切换。

代码

car_with_long_body_version.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;

// Conditional assignment of body variables
body_version = "l";

// base_length
base_length =
(body_version == "l") ? 80:
(body_version == "s") ? 60:
(body_version == "r") ? 65:70;

// top_length
top_length =
(body_version == "l") ? 50:
(body_version == "s") ? 30:
(body_version == "r") ? 65:40;

// top_offset
top_offset =
(body_version == "l") ? 10:
(body_version == "s") ? 5:
(body_version == "r") ? 0:7.5;

// Creation of body
body(base_length=base_length, top_length=top_length, top_offset=top_offset);

// Creation of wheels and axles
large_wheels = false;
wheel_radius = (large_wheels) ? 10:6;
wheel_width = (large_wheels) ? 8:4;
track = 30;
wheelbase = 40;
// Front left wheel 
translate([-wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
 // Front right wheel 
translate([-wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear left wheel 
translate([wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear right wheel 
translate([wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Front axle 
translate([-wheelbase/2,0,0])
    axle(track=track); 
// Rear axle 
translate([wheelbase/2,0,0])
    axle(track=track);

代码

car_with_short_body_version.scad

…
body_version = "s";
…

代码

car_with_rectangular_body_version.scad

…
body_version = "r";
…

代码

car_with_normal_body_version.scad

…
body_version = "n";
…

练习
在前面的例子中添加一个 `wheels_version` 变量。该变量只应接受字符值。添加相应的条件赋值语句,根据 `wheels_version` 变量的值为 `wheel_radius` 和 `wheel_width` 变量分配不同的值。`wheels_version` 变量应作为这两个赋值语句的条件。如果 `wheels_version` 变量的值为字符 "s"(小),则 `wheel_radius` 和 `wheel_width` 变量应分别设置为 8 和 4 个单位。如果 `wheels_version` 变量的值为字符 "m"(中),则 `wheel_radius` 和 `wheel_width` 变量应分别设置为 9 和 6 个单位。如果 `wheels_version` 变量的值为字符 "l"(大),则 `wheel_radius` 和 `wheel_width` 变量应分别设置为 10 和 8 个单位。小型轮子的情况应作为条件赋值语句的默认情况。将适当的值分配给 `body_version` 和 `wheels_version` 变量,以创建以下版本的汽车:短车身 - 中型轮子、矩形车身 - 大型轮子、普通车身 - 小型轮子。
  • 短车身 - 中型轮子
代码

car_with_short_body_and_medium_wheels.scad

…
body_version = "s"; //s-short, n-normal, l-large, r-rectangular
…
wheels_version = "m"; //s-small, m-medium, l-large 
wheel_radius =
(wheels_version == "l") ? 10:
(wheels_version == "m") ? 8:6;
wheel_width =
(wheels_version == "l") ? 8:
(wheels_version == "m") ? 6:4;
…

  • 矩形车身 - 大型轮子
代码

car_with_rectangular_body_and_large_wheels.scad

…
body_version = "r"; //s-short, n-normal, l-large, r-rectangular
…
wheels_version = "l"; //s-small, m-medium, l-large 
…

  • 普通车身 - 小型轮子
代码

car_with_normal_body_and_small_wheels.scad

…
body_version = "n"; //s-short, n-normal, l-large, r-rectangular
…
wheels_version = "s"; //s-small, m-medium, l-large 
…

条件创建对象 - if 语句

[edit | edit source]

条件变量赋值是一个强大的工具,可以轻松地在模型的不同但特定的版本之间导航。使用条件赋值,您可以为汽车定义不同的车身和车轮尺寸,并轻松地在它们之间进行选择,而不必每次都手动提供所有相关变量的值。

如果您想要对轮子类型(例如,简单、圆形、复杂)或车身类型(例如,方形、圆形)进行相同的控制,需要怎么做?要实现这一点,您需要进行条件对象创建,这可以使用 if 语句来实现。

在开始定制轮子和车身类型之前,您可以通过一些简短的示例熟悉 if 语句。回想一下您在前面章节中创建的车身模块。该模块具有一些输入参数,用于创建两个立方体,一个用于车身底部,一个用于车身顶部。

代码

car_body_from_module.scad

module body(base_height=10, top_height=14, base_length=60, top_length=30, width=20, top_offset=5) {
    // Car body base 
    cube([base_length,width,base_height],center=true); 
    // Car body top 
    translate([top_offset,0,base_height/2+top_height/2])
        cube([top_length,width,top_height],center=true);
}
$fa = 1;
$fs = 0.4;
body();

使用 if 语句,您将了解如何参数化车身顶部的创建。首先,您需要为模块定义一个额外的输入参数。该参数将被命名为 `top`,并保存布尔值。如果该参数为 `false`,则模块应该只创建车身底部。如果为 `true`,则它还应该创建车身顶部。这可以通过以下方式使用 if 语句来实现。

代码
module body(base_height=10, top_height=14, base_length=60, top_length=30, width=20, top_offset=5, top) {
    // Car body base 
    cube([base_length,width,base_height],center=true); 
    // Car body top
    if (top) {
        translate([top_offset,0,base_height/2+top_height/2])
        cube([top_length,width,top_height],center=true);
    }
}
$fa = 1;
$fs = 0.4;

您应该注意 if 语句的定义中的一些要点。首先是 if 关键字,然后是一对圆括号。在圆括号内,定义了将决定是否执行 if 语句的条件。最后,有一对大括号,其中包含所有将在条件为 `true` 时执行的语句。在本例中,提供的条件是布尔变量 `top`,它代表您选择创建是否有顶部的车身。放在大括号内的语句是创建汽车车身顶部部分的语句。

这种特定形式的 if 语句称为简单 if 语句。这意味着,如果条件为 `true`,则执行相应的命令,否则什么也不发生。if 语句还有另外两种形式,将在后面介绍,但首先花点时间调查一下新的车身模块在实践中是如何工作的。

当输入参数 `top` 设置为 `false` 时,只创建车身底部。

代码

car_body_without_top.scad

…
body(top=false);
…

当它设置为 `true` 时,会创建车身底部和顶部。

代码

car_body_with_top.scad

…
body(top=true);
…

练习
查看以下车身模块。您会注意到该模块已被修改为包含后保险杠的创建。应用于保险杠的 `color` 命令只是在预览时添加了一种视觉效果。在本例中,`color` 命令用于将您的注意力吸引到新添加的部分;它不应该让您除此之外有任何困扰。
代码

car_body_with_rear_bumper.scad

module body(base_height=10, top_height=14, base_length=60, top_length=30, width=20, top_offset=5, top) {
    // Car body base 
    cube([base_length,width,base_height],center=true); 
    // Car body top
    if (top) {
        translate([top_offset,0,base_height/2+top_height/2])
            cube([top_length,width,top_height],center=true);
    }
    // Rear bumper
    color("blue") {
        translate([base_length/2,0,0])rotate([90,0,0]) {
            cylinder(h=width - base_height,r=base_height/2,center=true);
            translate([0,0,(width - base_height)/2])
                sphere(r=base_height/2);
            translate([0,0,-(width - base_height)/2])
                sphere(r=base_height/2);
        }
    }
}
$fa = 1;
$fs = 0.4;
body(top=true);

练习
要创建前保险杠,请复制并粘贴创建后保险杠的语句,并相应地修改 `translate` 语句。
代码

car_body_with_front_and_rear_bumper.scad

module body(base_height=10, top_height=14, base_length=60, top_length=30, width=20, top_offset=5, top) {
    // Car body base 
    cube([base_length,width,base_height],center=true); 
    // Car body top
    if (top) {
        translate([top_offset,0,base_height/2+top_height/2])
            cube([top_length,width,top_height],center=true);
    }
    // Front bumper
    color("blue") {
        translate([-base_length/2,0,0])rotate([90,0,0]) {
            cylinder(h=width - base_height,r=base_height/2,center=true);
            translate([0,0,(width - base_height)/2])
                sphere(r=base_height/2);
            translate([0,0,-(width - base_height)/2])
                sphere(r=base_height/2);
        }
    }
    // Rear bumper
    color("blue") {
        translate([base_length/2,0,0])rotate([90,0,0]) {
            cylinder(h=width - base_height,r=base_height/2,center=true);
            translate([0,0,(width - base_height)/2])
                sphere(r=base_height/2);
            translate([0,0,-(width - base_height)/2])
                sphere(r=base_height/2);
        }
    }
}
$fa = 1;
$fs = 0.4;
body(top=true);

练习
为车身模块定义两个额外的输入参数。一个名为 `front_bumper`,另一个名为 `rear_bumper`。请记住,这些参数应该接受布尔值,定义两个 if 语句,它们有条件地创建前后保险杠。只有当输入参数 `front_bumper` 为 `true` 时,才会创建前保险杠,第二个保险杠也是如此。使用车身模块创建以下车身:仅底部 - 前后保险杠、底部和顶部 - 前保险杠、底部和顶部 - 前后保险杠。
  • 仅底部 - 前后保险杠
代码

body_without_top_with_front_and_rear_bumper.scad

module body(base_height=10, top_height=14, base_length=60, top_length=30, width=20, top_offset=5, top, front_bumper, rear_bumper) {
    // Car body base 
    cube([base_length,width,base_height],center=true); 
    // Car body top
    if (top) {
        translate([top_offset,0,base_height/2+top_height/2])
        cube([top_length,width,top_height],center=true);
    }
    // Front bumper
    if (front_bumper) {
        color("blue") {
            translate([-base_length/2,0,0])rotate([90,0,0]) {
                cylinder(h=width - base_height,r=base_height/2,center=true);
                translate([0,0,(width - base_height)/2])
                    sphere(r=base_height/2);
                translate([0,0,-(width - base_height)/2])
                    sphere(r=base_height/2);
            }
        }
    }
    // Rear bumper
    if (rear_bumper) {
        color("blue") {
            translate([base_length/2,0,0])rotate([90,0,0]) {
                cylinder(h=width - base_height,r=base_height/2,center=true);
                translate([0,0,(width - base_height)/2])
                    sphere(r=base_height/2);
                translate([0,0,-(width - base_height)/2])
                    sphere(r=base_height/2);
            }
        }
    }
}
$fa = 1;
$fs = 0.4;
body(top=false,front_bumper=true,rear_bumper=true);

  • 底部和顶部 - 前保险杠
代码

body_with_top_with_front_bumper.scad

…
body(top=true,front_bumper=true,rear_bumper=false);
…

  • 底部和顶部 - 前后保险杠
代码

body_with_top_with_front_and_rear_bumper.scad

…
body(top=true,front_bumper=true,rear_bumper=true);
…

挑战

[edit | edit source]

在本节中,您学习了条件变量赋值和简单的 if 语句。具体来说,您学习了如何有条件地修改设计的各个部分的尺寸和变换,以及如何有条件地包含或排除部分。现在,是将这两者结合到一个汽车模型中的时候了。

练习
如果您一直在按照本教程进行操作,那么您应该在计算机上有一个来自前面章节的 `vehicle_parts.scad` 脚本。打开此脚本,并根据最后一个示例更新车身模块,使其能够有条件地创建车身顶部以及前后保险杠。为新添加的输入参数设置默认值。具体来说,分别将 `true`、`false` 和 `false` 作为 `top`、`front_bumper` 和 `rear_bumper` 变量的默认值。保存更改并关闭脚本。
代码
…
module body(base_height=10, top_height=14, base_length=60, top_length=30, width=20, top_offset=5, top=true, front_bumper=false, rear_bumper=false) {
    // Car body base 
    cube([base_length,width,base_height],center=true); 
    // Car body top
    if (top) {
        translate([top_offset,0,base_height/2+top_height/2])
            cube([top_length,width,top_height],center=true);
    }
    // Front bumper
    if (front_bumper) {
        color("blue") {
            translate([-base_length/2,0,0])rotate([90,0,0]) {
                cylinder(h=width - base_height,r=base_height/2,center=true);
                translate([0,0,(width - base_height)/2])
                    sphere(r=base_height/2);
                translate([0,0,-(width - base_height)/2])
                    sphere(r=base_height/2);
            }
        }
    }
    // Rear bumper
    if (rear_bumper) {
        color("blue") {
            translate([base_length/2,0,0])rotate([90,0,0]) {
                cylinder(h=width - base_height,r=base_height/2,center=true);
                translate([0,0,(width - base_height)/2])
                    sphere(r=base_height/2);
                translate([0,0,-(width - base_height)/2])
                    sphere(r=base_height/2);
            }
        }
    }
}
…
练习
给定以下创建汽车的脚本,请对脚本进行适当的添加和修改,以便对汽车的设计进行参数化。具体来说,您需要定义一个 `body_version`、一个 `wheels_version`、一个 `top`、一个 `front_bumper` 和一个 `rear_bumper` 变量,这些变量将用于做出有关汽车设计的决策。如有必要,请查看本章前面的示例和练习,以记住这些变量应该对汽车设计产生什么影响以及如何实现它们。使用生成的脚本创建一个您喜欢的汽车版本。
  • 给定脚本
代码

basic_car_script.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;

// Variables
track = 30;
wheelbase=40;

// Body
body();
// Front left wheel 
translate([-wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel();
 // Front right wheel 
translate([-wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel();
// Rear left wheel 
translate([wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel();
// Rear right wheel 
translate([wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel();
// Front axle 
translate([-wheelbase/2,0,0])
    axle(); 
// Rear axle 
translate([wheelbase/2,0,0])
    axle();
  • 修改后的脚本
代码

car_from_highly_parameterized_script.scad

use <vehicle_parts.scad>
$fa=1;
$fs=0.4;

// Variables
body_version = "l"; //s-short, n-normal, l-large, r-rectangular
wheels_version = "l"; //s-small, m-medium, l-large
top = true;
front_bumper = true;
rear_bumper = true;
track = 30;
wheelbase=40;

// Conditional assignments
// Body: base_length
base_length =
(body_version == "l") ? 80:
(body_version == "s") ? 60:
(body_version == "r") ? 65:70;

// Body: top_length
top_length =
(body_version == "l") ? 50:
(body_version == "s") ? 30:
(body_version == "r") ? 65:40;

// Body: top_offset
top_offset =
(body_version == "l") ? 10:
(body_version == "s") ? 5:
(body_version == "r") ? 0:7.5;

// Wheels: radius
wheel_radius =
(wheels_version == "l") ? 10:
(wheels_version == "m") ? 8:6;

// Wheels: width
wheel_width =
(wheels_version == "l") ? 8:
(wheels_version == "m") ? 6:4;

// Body
body(base_length=base_length, top_length=top_length, top_offset=top_offset, top=top, front_bumper=front_bumper, rear_bumper=rear_bumper);
// Front left wheel 
translate([-wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
 // Front right wheel 
translate([-wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear left wheel 
translate([wheelbase/2,-track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Rear right wheel 
translate([wheelbase/2,track/2,0])
    rotate([0,0,0])
    simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width);
// Front axle 
translate([-wheelbase/2,0,0])
    axle(track=track); 
// Rear axle 
translate([wheelbase/2,0,0])
    axle(track=track);

华夏公益教科书