小白教程
所有教程
关于
Search
172.71.254.8
172.71.254.8
参数设置
贡献
退出
操作
编辑
移动
保护
信息
历史
删除
查看“OpenSCAD 使用单独的脚本和库”的源代码
本页内容
上一节:
OpenSCAD_用模块来组织代码
下一节:
OpenSCAD_条件及循环控制
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
== 创建和使用模块作为单独的脚本 == 在上一章中,了解了 OpenSCAD 最强大的功能之一,模块,以及如何将其用于参数化设计。将汽车分成不同的模块,然后将它们重新组合以创建不同类型的车辆。使用模块也可以被视为一种组织的创作和构建自己的对象库的方式。轮子模块可能会用于大量设计,无需在当前设计的脚本中重新定义它,就可以随时轻松使用它会很棒。为此,需要将轮子模块定义并保存为单独的脚本。 <sample title="simple_wheel.scad" desc="在单独的脚本文件中定义以下 simple_wheel 模块。在同一脚本中调用 simple_wheel 模块,以便您直观地看到该模块创建的对象。将脚本文件另存为名为 simple_wheel.scad 的 scad 文件。 "> $fa = 1; $fs = 0.4; module simple_wheel(wheel_radius=10, wheel_width=6) { rotate([90,0,0]) cylinder(h=wheel_width,r=wheel_radius,center=true); } simple_wheel(); </sample> [[文件:Simple wheel.jpg]] 接下来创建一个新的小车项目 <sample title="car_with_simple_wheels.scad " desc="为小车设计创建一个新脚本。给脚本起个喜欢的名称,但需要将脚本保存在与 simple_wheel 模块相同的工作目录中。 "> $fa = 1; $fs = 0.4; wheel_radius = 8; base_height = 10; top_height = 10; track = 30; // Car body base cube([60,20,base_height],center=true); // Car body top translate([5,0,base_height/2+top_height/2 - 0.001]) cube([30,20,top_height],center=true); // Front left wheel translate([-20,-track/2,0]) rotate([90,0,0]) cylinder(h=3,r=wheel_radius,center=true); // Front right wheel translate([-20,track/2,0]) rotate([90,0,0]) cylinder(h=3,r=wheel_radius,center=true); // Rear left wheel translate([20,-track/2,0]) rotate([90,0,0]) cylinder(h=3,r=wheel_radius,center=true); // Rear right wheel translate([20,track/2,0]) rotate([90,0,0]) cylinder(h=3,r=wheel_radius,center=true); // Front axle translate([-20,0,0]) rotate([90,0,0]) cylinder(h=track,r=2,center=true); // Rear axle translate([20,0,0]) rotate([90,0,0]) cylinder(h=track,r=2,center=true); </sample> [[文件:Car with simple wheels.jpg]] 有两种方法可以在汽车设计中使用 simple_wheel.scad 脚本。使用use或者include。 <sample title="" desc="下面的例子是使用include同时设置wheel_radius,wheel_width"> include <simple_wheel.scad> $fa = 1; $fs = 0.4; wheel_radius = 8; wheel_width = 4; base_height = 10; top_height = 10; track = 30; // Car body base cube([60,20,base_height],center=true); // Car body top translate([5,0,base_height/2+top_height/2 - 0.001]) cube([30,20,top_height],center=true); // Front left wheel translate([-20,-track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); // Front right wheel translate([-20,track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); // Rear left wheel translate([20,-track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); // Rear right wheel translate([20,track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); // Front axle translate([-20,0,0]) rotate([90,0,0]) cylinder(h=track,r=2,center=true); // Rear axle translate([20,0,0]) rotate([90,0,0]) cylinder(h=track,r=2,center=true); </sample> [[文件:Car with narrower wheels created by included module.jpg]] 可以发现小车中间有个轮子,这是因为include的时候会创建对象,而use不会。 <sample title="" desc="将include换为use试试看,发现中间不会有轮子"> use <simple_wheel.scad> </sample> use和include的区别就在这里,use不会创建对象,只是引入。所以大多数时候都是用use。 == 使用具有多个模块的脚本 == 在前面的示例中,simple_wheel.scad 脚本只有一个模块。simple_wheel 模块。 <sample title="" desc="在 simple_wheel.scad 脚本中添加以下模块。将 simple_wheel.scad 脚本重命名为 Wheels.scad。 "> module complex_wheel(wheel_radius=10, side_spheres_radius=50, hub_thickness=4, cylinder_radius=2) { cylinder_height=2*wheel_radius; difference() { // Wheel sphere sphere(r=wheel_radius); // Side sphere 1 translate([0,side_spheres_radius + hub_thickness/2,0]) sphere(r=side_spheres_radius); // Side sphere 2 translate([0,- (side_spheres_radius + hub_thickness/2),0]) sphere(r=side_spheres_radius); // Cylinder 1 translate([wheel_radius/2,0,0]) rotate([90,0,0]) cylinder(h=cylinder_height,r=cylinder_radius,center=true); // Cylinder 2 translate([0,0,wheel_radius/2]) rotate([90,0,0]) cylinder(h=cylinder_height,r=cylinder_radius,center=true); // Cylinder 3 translate([-wheel_radius/2,0,0]) rotate([90,0,0]) cylinder(h=cylinder_height,r=cylinder_radius,center=true); // Cylinder 4 translate([0,0,-wheel_radius/2]) rotate([90,0,0]) cylinder(h=cylinder_height,r=cylinder_radius,center=true); } } </sample> <sample title="" desc="小车脚本中use wheels.scad 脚本。使用 simple_wheel 模块创建前轮,使用 complex_wheel 模块创建后轮。 "> use <wheels.scad> wheel_radius = 8; wheel_width = 4; base_height = 10; top_height = 10; track = 30; // Car body base cube([60,20,base_height],center=true); // Car body top translate([5,0,base_height/2+top_height/2 - 0.001]) cube([30,20,top_height],center=true); // Front left wheel translate([-20,-track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); // Front right wheel translate([-20,track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); // Rear left wheel translate([20,-track/2,0]) complex_wheel(); // Rear right wheel translate([20,track/2,0]) complex_wheel(); // Front axle translate([-20,0,0]) rotate([90,0,0]) cylinder(h=track,r=2,center=true); // Rear axle translate([20,0,0]) rotate([90,0,0]) cylinder(h=track,r=2,center=true); </sample> [[文件:Car with different wheels from used modules.jpg]] 通过这个例子,可以看出脚本的名称不必与模块的名称相同,并且一个脚本可以包含多个模块。关于如何组织模块库没有正确或错误的方法。可以使用了定义不同车轮模块的 wheel.scad 脚本。或者可以将每个模块保存为单独的 *.scad 脚本。 == 使用 MCAD 库 == MCAD 库 ( https://github.com/openscad/MCAD ) 是 OpenSCAD 自带的常用的组件库。可以通过使用相应的 OpenSCAD 脚本并调用所需的模块来使用 MCAD 库的对象。例如,有一个 box.scad 脚本,其中包含一个圆角盒子的模型。box.scad 脚本包含一个模块,可用于创建相应的盒子。你可以打开这个脚本来检查这个模块的参数是什么,然后用它在你的设计中添加圆角框。您可以使用以下脚本创建一个边长为 10、20 和 30 个单位以及圆角半径为 3 个单位的全圆框。这个非常有用,如果你玩3D打印就会发现这样做出来的模型不会划手。 <sample title="complete_rounded_box.scad " desc=""> use <MCAD/boxes.scad> $fa=1; $fs=0.4; roundedBox(size=[10,20,30],radius=3,sidesonly=false); </sample> [[文件:Completely rounded box.jpg]] 通过将sidesonly 参数设置为true,您可以创建一个只有4 个圆形边的类似尺寸的盒子。 <sample title="" desc=""> use <MCAD/boxes.scad> $fa=1; $fs=0.4; roundedBox(size=[10,20,30],radius=3,sidesonly=true); </sample> [[文件:Sides only rounded box.jpg]] box.scad 脚本位于库目录下的 MCAD 目录中。后者可以在 OpenSCAD 的安装文件夹中找到。如果希望从任何目录访问您自己的任何库,可以将其添加到库目录中。您还可以在https://www.openscad.org/libraries.html浏览其他可用的 OpenSCAD 库。GitHub<ref>https://github.com/search?l=OpenSCAD&q=scad&type=Repositories</ref> 和 Thingiverse<ref>https://thingiverse.com/</ref> 上有大量可用的库。 == 创建更多可参数化的模块 == 之前的小车轮子都是连着一根轴,因此我们可以抽象出来这个模块将其组合在一起。 <sample title="axle_with_simple_wheelset_from_module.scad " desc=""> use <vehicle_parts.scad> $fa = 1; $fs = 0.4; module axle_wheelset(wheel_radius=10, wheel_width=6, track=35, radius=2) { translate([0,track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); axle(track=track, radius=radius); translate([0,-track/2,0]) simple_wheel(wheel_radius=wheel_radius, wheel_width=wheel_width); } axle_wheelset(); </sample> 不过如果我们想把轮子换一下的话,又要重新顶一个模块比如像这样 <sample title="axle_with_complex_wheelset_from_module.scad " desc=""> use <vehicle_parts.scad> $fa = 1; $fs = 0.4; module axle_wheelset_complex(wheel_radius=10, side_spheres_radius=50, hub_thickness=4, cylinder_radius=2, track=35, radius=2) { translate([0,track/2,0]) complex_wheel(wheel_radius=10, side_spheres_radius=50, hub_thickness=4, cylinder_radius=2); axle(track=track, radius=radius); translate([0,-track/2,0]) complex_wheel(wheel_radius=10, side_spheres_radius=50, hub_thickness=4, cylinder_radius=2); } axle_wheelset_complex(); </sample> 可以看出这个代码有很多重复的部分,好在openscad支持这种抽象。 <sample title="axle_with_simple_wheelset_from_parameterized_module.scad " desc=""> use <vehicle_parts.scad> $fa = 1; $fs = 0.4; module axle_wheelset(track=35, radius=2) { translate([0,track/2,0]) children(0); axle(track=track, radius=radius); translate([0,-track/2,0]) children(0); } axle_wheelset() { simple_wheel(); } </sample> [[文件:Axle with simple wheelset from parameterized module.jpg]] <sample title="axle_with_large_complex_wheelset_from_parameterized_module.scad " desc=""> axle_wheelset(radius=5) { complex_wheel(wheel_radius=20); } </sample> [[文件:Axle with large complex wheelset from parameterized module.jpg]] 可以看出children(0)是将{}中的模块传递到了另外一个模块里面去,children(N)就代表了第N个模块。这也SCAD的魅力实在。 <sample title="" desc=""> module axle_wheelset(track=35, radius=2) { translate([0,track/2,0]) children(0); axle(track=track, radius=radius); translate([0,-track/2,0]) children(1); } axle_wheelset() { complex_wheel(); simple_wheel(); } </sample> [[文件:Axle with different wheels from parameterized module.jpg]]
返回至“
OpenSCAD 使用单独的脚本和库
”。
上一节:
OpenSCAD_用模块来组织代码
下一节:
OpenSCAD_条件及循环控制