OpenSCAD 教程/第 6 章
在前面的章节中,您已经使用变量来参数化您的设计并使它们易于定制。具体来说,您已在脚本的某个部分为它们分配数值,然后在脚本的另一个部分使用它们存储的值。例如,您可以将 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); |