openscad 钻取由 for 创建的组
openscad drill into group created by for
我知道当我使用 for 它时会创建一组生成的子项。
我像这样创建了一个名为 grid 的模块:
module grid(x0,y0,dx,dy,nx,ny) {
for (x=[0:1:nx-1]) {
for(y=[0:1:ny-1]) {
i=x*nx+y;
echo(i);
translate([x0+x*dx,y0+y*dy,0]) children(i);
}
}
}
像这样使用时:
grid(-50,-50,25,25,5,5) {
cube([10,10,10],center=true);
cube([10,10,10],center=true);
cube([10,10,10],center=true);
cube([10,10,10],center=true);
//.. continue to create 25 cubes total
}
将立方体排列成漂亮的网格。
然而我最初的希望和意图是这样使用它:
grid(-50,-50,25,25,5,5) {
for(i=[0:1:24]) {
cube([10,10,10],center=true);
}
}
失败,因为 for 运算符 returns 是一组而不是一组子项。
为什么 for 添加一个组开头? (也导致需要intersection_for)
我的 Grid 运算符模块有没有办法处理组的子项?
我猜你想要这个:
for(x=[...], y=[...]) {
translate([x,y,0]) children();
}
请注意,您只需要一个 for 语句即可遍历 x 和 y 值。
我从您的评论中了解到,您希望网格节点中的对象是参数化的,并且参数取决于索引。原始问题中未提及此要求。在这种情况下,解决方案取决于您的问题上下文,我猜。我看到的两种可能性是:
module grid_of_parametric_modules(other_param)
{
for(i=[0:24])
{
x=_x(i);
y=_y(i);
translate([x,y,0]) parametric_module(i_param(i), other_param);
}
}
但是这可能不适合,尤其是如果您将来要向网格中添加新的形状。那么你可以这样做:
function grid_pos(i) = [_x(i), _y(i), 0];
....
for(i=[0:24])
translate(grid_pos(i)) parametric_module(i);
刚刚更新了我的OpenSCAD知识,有更好的解决方案:
module nice_cube()
{
translate([0,0,$height/2]) cube([9,9,$height], center = true);
}
module nice_cylinder()
{
translate([0,0,$height/2]) cylinder(d=10,h=$height, center = true);
}
module nice_text()
{
linear_extrude(height=$height, center=false) text(str($height), size=5);
}
module nice_grid()
{
for(i=[0:9], j=[0:9])
{
$height=(i+1)*(j+1);
x=10*i;
y=10*j;
translate([x,y,0]) children();
/* let($height=(i+1)*(j+1)) {children();} */
}
}
nice_grid() nice_cube();
translate([0,-110,0]) nice_grid() nice_text();
translate([-110,0,0]) nice_grid() nice_cylinder();
这里的技巧是通过特殊变量(以 $ 开头)控制模块生成的形状,这些变量可以像示例一样使用,使用 let() 的注释行需要 openscad 的开发版本。
我个人希望 for() 中的 grouping/union for 元素在某个时候成为可选的。
如果您不介意从源代码编译 OpenSCAD,您今天就可以尝试了。
有一个持续的问题 Lazy union (aka. no implicit union)
和这里的补丁 Make for() UNION optional
我知道当我使用 for 它时会创建一组生成的子项。 我像这样创建了一个名为 grid 的模块:
module grid(x0,y0,dx,dy,nx,ny) {
for (x=[0:1:nx-1]) {
for(y=[0:1:ny-1]) {
i=x*nx+y;
echo(i);
translate([x0+x*dx,y0+y*dy,0]) children(i);
}
}
}
像这样使用时:
grid(-50,-50,25,25,5,5) {
cube([10,10,10],center=true);
cube([10,10,10],center=true);
cube([10,10,10],center=true);
cube([10,10,10],center=true);
//.. continue to create 25 cubes total
}
将立方体排列成漂亮的网格。
然而我最初的希望和意图是这样使用它:
grid(-50,-50,25,25,5,5) {
for(i=[0:1:24]) {
cube([10,10,10],center=true);
}
}
失败,因为 for 运算符 returns 是一组而不是一组子项。
为什么 for 添加一个组开头? (也导致需要intersection_for)
我的 Grid 运算符模块有没有办法处理组的子项?
我猜你想要这个:
for(x=[...], y=[...]) {
translate([x,y,0]) children();
}
请注意,您只需要一个 for 语句即可遍历 x 和 y 值。
我从您的评论中了解到,您希望网格节点中的对象是参数化的,并且参数取决于索引。原始问题中未提及此要求。在这种情况下,解决方案取决于您的问题上下文,我猜。我看到的两种可能性是:
module grid_of_parametric_modules(other_param)
{
for(i=[0:24])
{
x=_x(i);
y=_y(i);
translate([x,y,0]) parametric_module(i_param(i), other_param);
}
}
但是这可能不适合,尤其是如果您将来要向网格中添加新的形状。那么你可以这样做:
function grid_pos(i) = [_x(i), _y(i), 0];
....
for(i=[0:24])
translate(grid_pos(i)) parametric_module(i);
刚刚更新了我的OpenSCAD知识,有更好的解决方案:
module nice_cube()
{
translate([0,0,$height/2]) cube([9,9,$height], center = true);
}
module nice_cylinder()
{
translate([0,0,$height/2]) cylinder(d=10,h=$height, center = true);
}
module nice_text()
{
linear_extrude(height=$height, center=false) text(str($height), size=5);
}
module nice_grid()
{
for(i=[0:9], j=[0:9])
{
$height=(i+1)*(j+1);
x=10*i;
y=10*j;
translate([x,y,0]) children();
/* let($height=(i+1)*(j+1)) {children();} */
}
}
nice_grid() nice_cube();
translate([0,-110,0]) nice_grid() nice_text();
translate([-110,0,0]) nice_grid() nice_cylinder();
这里的技巧是通过特殊变量(以 $ 开头)控制模块生成的形状,这些变量可以像示例一样使用,使用 let() 的注释行需要 openscad 的开发版本。
我个人希望 for() 中的 grouping/union for 元素在某个时候成为可选的。
如果您不介意从源代码编译 OpenSCAD,您今天就可以尝试了。 有一个持续的问题 Lazy union (aka. no implicit union) 和这里的补丁 Make for() UNION optional