原文链接:http://dynamobim.org/cbns-for-dummies
简单地说,Code Block就是个大杀器。如果你在关注最近半年的Dynamo开发状态,就知道我在说什么了。那一个个小方块里头名堂可大了。以下是一篇关于它的速成宝典。
“这东西从哪来的?”你问道。Dynamo和DesignScript,一个是可视化编程工具,一个是计算式设计语言。两者强强联合,结果就是,我已经算不清楚有多少种创建三维点阵的方法了。当然还有更多其它的好东西。
这两样好东西放在一块儿,就好像把巧克力和花生酱放在一块儿,又好像布拉德·皮特和安吉丽娜·朱莉的孩子,反正就是配的好!
在0.7.0或以后的版本中,你都可以在工作区中双击创建Code Block。
数字,字符串和公式
Code Block里可以放数字,字符串或者公式。以后你再也不需要那些很早以前老师教过的结点了。就像在Number结点中输入数字一样,在Code Block里输入同样的数字。如果要输入字符串,则需要在两头加上引号。在Code Block里可以进行Forumula结点能做的所有数学运算。当然这其中会有一些差别,详细的比较请参阅这篇文章。
在Code Block中,所有的声明或者代码都必须以分号结尾。你可以偷懒略掉最后一行的分号。Dynamo会自动帮你加上。调用其它结点
在Code Block中,你可以调用Dynamo工具库里的任何普通结点,只要那个结点没有特殊UI:有些结点需要特定的用户交互操作才能正常工作。比如,你可以调用Circle.ByCenterPointRadius,但是调用一个Watch 3D结点就没什么意义了。
普通结点(工具库里大部分都是)通常分为三类:
- 创建 新建某个东西
- 操作 对某个东西进行操作
- 查询 从某个已经存在的东西取它的属性
你会发现,工具库就是按这个分类方式组织的。这三种不同的结点或者方法,在Code Block中的用法是不一样的。
创建
如果你想用某个现有的结点在Code Block中创建一个东西,只要直接调用结点名称,然后按结点输入端的顺序依次指定参数值就行了。
如果结点本身并没有输入参数,那么只需在结点名称后面加一对小括号就行了。
操作
一个操作是指你对某个东西做的事。在Dynamo里我们使用点号来表达这个关系,即对某个东西应用某种操作。这跟许多其它编程语言是一样的(译注:如C,C++,C#,Java,VB等)。这里的格式为:被操作物 + 点号 + 操作方法。如果操作方法需要输入参数,那么跟创建方法的调用一样,也放在操作方法后面的小括号里。这里有一个区别是,你不需要指定操作型结点的第一个参数,因为那个是被操作物,而这已经在点号前面的部分指定了。
例如,假设我们想在Code Block里调用结点Point.Add方法,注意这就是一个操作型的结点。它有两个输入参数,(1)是被操作的点,(2)是希望在其之上添加的偏移向量。在Code Block里,我已经把这个点全名为“pt”了。为了在“pt”上添加偏移向量“vec”,只需写成pt.Add(vec),或者说:被操作物,点号,操作方法。Add方法只需要传入一个输入参数,或者说只需要传入Point.Add结点的传入参数数量减一。这是因为第一个参数就是需要被操作的点,而你已经在点号之前指定了。
查询
查询型的方法会从某个东西上得出一个属性值。通常情况下你不需要指定任何输入参数,而且连那对小括号都不需要。
灵活性
有了Code Block,用户现在可以灵活决定用哪种方法指定输入值。以下就是各种可以创建三维点(10,5,0)的方法。
随着你对工具库了解越来越深入,也越来越清楚每一步想要生成什么东西,可能最后你会发现,直接在Code Block里输入Point.ByCoordinates比在搜索框里找到对应结点还要快一点。
创建数组和在数组中取值
数组用大括号加数组各项内容来创建。在数组中取值用中括号加索引值。
如果需要对嵌套数组(即二维数组)进行操作,那其实是对一维数组很自然的推广。这时候数组内容是一个个一维数组。而数组中的各项值也是一维数组。在获取一维数组的同时,可以继续对它进行取值操作(例如图中的连续两次中括号)。
数组同步策略(Replication Guides)
同步策略用来确定如何匹配多个一维数组。这跟数组的编织方式(lacing)有些类似,但是可控性更好。使用方法是在输入参数后面加上尖括号,尖括号中填入数字。最后输出的嵌套数组的层次关系,将会由尖括号中填入的数字大小来决定。
在这个例子中,我有两个数组,一个存了2个X值,另一个存了5个Y值。如果不使用同步策略,那我只会得到两个点,这跟编织方式里的最短数组结果相同。使用同步策略,我就可以指定所有可能的组合方式。而且还可以指定哪个数组作为嵌套数组的顶层:2个5项的子数组,或者5个2项的子数组。
你可以创建自己的方法库,真的。
Code Block里可以直接定义自己的方法,还能在其它结点中使用它们。
第一行需要使用关键字“def”,然后是方法名,加上小括号中的输入参数名。大括号定义了方法主体。如果方法需要返回值,用“return =”的格式输出。这样定义的方法,在Code Block里不会自动生成输入输出结点,因为这个方法是专门为其它地方调用而准备的。
只要在同一个Dynamo文件中,你就可以在其它Code Block里调用这个方法。这跟调用其它结点方法完全一样。
** 这张图可没有被P过!右侧的Code Block调用了左侧Code Block里定义的方法。多整洁,完全看不到杂乱的连线!
在 CodeBlocksForDummies.dyn 里可以找到所有上面提到的例子。