OpenSCAD通过循环快速复制几何对象

OpenSCAD支持变量和循环,从而可以快速复制出大量的几何对象并且按照递归的方式进行布局。

循环的变量可以是枚举、区间和矢量对象,循环体支持几何对象构建、坐标平移与旋转、交并差等操作。

循环的递归变量:

    Vector(矢量):

for (variable=<vector>) {
    <do_something> - <variable> is assigned to each successive value in the vector
}

    Range(区间、范围):

for (variable=<range>) {
    <do_something>
}

Nested loops : for ( variable1 = <range or vector>, variable2 = <range or vector> ) <do something, using both variables>
for loops can be nested, just as in normal programs. A shorthand is that both iterations can be given in the same for statement

Usage example 1 - iteration over a vector:
for (z = [-1, 1]) // two iterations, z = -1, z = 1{
    translate([0, 0, z])
    cube(size = 1, center = false);}


OpenSCAD iteration over a vector

Usage example 2a - iteration over a range:
for ( i = [0 : 5] ){
    rotate( i * 360 / 6, [1, 0, 0])
    translate([0, 10, 0])
    sphere(r = 1);}


OpenSCAD iteration over a range)

Usage example 2b - iteration over a range specifying an increment:
// Note: The middle parameter in the range designation // (‘0.2‘ in this case) is the ‘increment-by‘ value// Warning: Depending on the ‘increment-by‘ value, the// real end value may be smaller than the given one.for ( i = [0 : 0.2 : 5] ){
    rotate( i * 360 / 6, [1, 0, 0])
    translate([0, 10, 0])
    sphere(r = 1);}
Usage example 3 - iteration over a vector of vectors (rotation):
for(i = [ [  0,  0,   0],
          [ 10, 20, 300],
          [200, 40,  57],
          [ 20, 88,  57] ]){
    rotate(i)
    cube([100, 20, 20], center = true);}


OpenSCAD for loop (rotation)

Usage example 4 - iteration over a vector of vectors (translation):
 for(i = [ [ 0,  0,  0],
           [10, 12, 10],
           [20, 24, 20],
           [30, 36, 30],
           [20, 48, 40],
           [10, 60, 50] ]){
    translate(i)
    cube([50, 15, 10], center = true);}


OpenSCAD for loop (translation)

Nested loop example

  for (xpos=[0:3], ypos = [2,4,6]) // do twelve iterations, using each xpos with each ypos
   translate([xpos*ypos, ypos, 0]) cube([0.5, 0.5, 0.5]);

Intersection For Loop

Iterate over the values in a vector or range and take an intersection of the contents.

Note: intersection_for() is a work around because of an issue that you cannot get the expected results using a combination of the standard for() and intersection() statements. The reason is that for() do a implicit union() of the contents.

Parameters

  • <loop variable name>
  • Name of the variable to use within the for loop.
Usage example 1 - loop over a range:
intersection_for(n = [1 : 6]){
    rotate([0, 0, n * 60])
    {
        translate([5,0,0])
        sphere(r=12);
    }}


OpenSCAD Intersection for

Usage example 2 - rotation :
 intersection_for(i = [ [  0,  0,   0],
 			[ 10, 20, 300],
 			[200, 40,  57],
 			[ 20, 88,  57] ]){
    rotate(i)
    cube([100, 20, 20], center = true);}

OpenSCAD Intersection for (rotation)

时间: 2024-08-08 10:20:54

OpenSCAD通过循环快速复制几何对象的相关文章

设计模式之原型模式——复制建立对象实例

有一段时间没看书了,之前去参加了一个省上的比赛,马马虎虎吧--得了一个二等奖.不过感觉现在的比赛都有点水啊~哎,废话不多说,切入正题. 当我们在建立一些对象实例时,通常会使用new 关键字来进行实例化. 但有时候不靠指定类名的方式就能产生对象实例,此时不使用类来建立对象实例,而是复制对象实例另建一个新的对象实例. 通常这种需求发生在以下几种情况: 种类过多不方便整理成类时 不容易利用类产生对象实例时 希望把框架和所产生的对象示例分开时 下面我们用一个例子来看看. 需要创建五个JAVA文件: Pr

Eclipse用法和技巧十二:快速复制一行

写代码的总有那么个时候需要Ctrl+c,Ctrl+v,在eclipse中如果遇到需要快速在一行代码的上下复制一行的话,有很方便的快捷键可以使用.将光标放到某一行,按住Ctrl+Alt+Down,即可以在下面快速复制一行,按住Ctrl+Alt+Up,即可以在上面快速复制一行.        这里有一点需要注意:intel的显示器,其显示方向的快捷键也是Ctrl+Alt+方向键,而且其响应的优先级比较高.这个时候你需要找到显示器设置的地方,去关闭快捷键响应.如果不好找的话,也可以修改eclipse的

通过序列化复制整个对象

用到的所有的类都要实现Serializable接口 public class Address implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String state; private String province; private String city; public Address(String s,String p,String c){ this.sta

MySQL中快速复制数据表方法汇总

本文将着重介绍两个MySQL命令的组合,它将以原有数据表为基础,创建相同结构和数据的新数据表. 这可以帮助你在开发过程中快速的复制表格作为测试数据,而不必冒险直接操作正在运行 的数据表. 示例如下: 将 production 数据库中的 mytbl 表快速复制为 mytbl_new,2个命令如下: CREATE TABLE mytbl_new LIKE production.mytbl; INSERT mytbl_new SELECT * FROM production.mytbl; 第一个命令

KVC方法快速为数据对象赋值

利用KVC方法快速为数据对象赋值,如下例 在.h文件中声明如下形式方法: - (id)initWithDic:(NSDictionary *)dic; 在对应.m文件中 - (id)initWithDic:(NSDictionary *)dic { self = [super init]; if (self) { [self setValuesForKeysWithDictionary:dic]; } return self; } 同时实现下面方法 ,实现内容一般不写(必须实现,否则无法使用KV

C#创建Oracle中的几何对象:点、线、面

最初写这个程序是应老大的要求解决“更新Oracle中的空间数据时会因为wkt字符串太长而报错”这个问题,之前的更新都是在程序中插入一条SQL语句来进行更新,由于SQL语句本身的一些限制,在wkt字符串中包含几万个以上的点时就会报“ORA-01074:字符串文字太长”错误,这里提出了两种解决方法: 第一种:将之前传入简单的SQL更新语句,改为传入存储过程: DECLARE geom sdo_geometry; BEGIN geom:=sdo_geometry (2003, null, null,

[转]AS3复制可视对象

一,复制舞台上的影片剪 方法1——反射方法: var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class; var clone_mc:DisplayObject = new ClassRef(); addChild(clone_mc); 方法2——构造器方法: var ClassRef:Class = t_mc.constructor; var clone_mc:MovieClip = new Cl

(Eclipse快捷键)Win8下快速复制一行

Eclipse自带的快速复制下一行的快捷键copy line 是Ctrl+Alt+Down,但是有时由于我们的电脑安装了音乐播放器,视频播放器之类的,倒置快捷键冲突,按了这些组合键会出现屏幕倒置,很蛋疼的.我的acer电脑还出现了显卡快捷键冲突,只有禁用显卡快捷键了.总之,不同的电脑会出现各种各样奇奇怪怪的问题,所以,我干脆改变Eclipse的快捷键算了,虽然刚刚开始用的不是很习惯,渐渐的也就好了. Eclipse下---window--preference下,左边搜索keys,点击进去,在输入

快速复制电脑C盘——轻松备份系统

快速复制电脑C盘--轻松备份系统 怎么样能够快速且安全的复制电脑C盘,保证C盘文件数据安全呢?首先我们就应该对我们的电脑C盘进行备份.复制是一种途径,但是C盘是我们电脑的系统盘,有的数据是对复制操作受限的,想要完全复制C盘那么选择对C盘备份是最佳解决方案. 通常来说一款好的备份软件就可以几个步骤全部搞定,快速且安全的复制电脑C盘,我们来看看下面这个操作图解: 第一步:下载轻松备份专业版,然后安装并运行.在"备份"栏下点击"系统备份". 第二步:选择一个镜像文件的保存