基于我们公司在今年Autodesk University(AU大师汇2017)上的分享主题:像程序员一样使用Dynamo,我希望有一个系列文章作为演讲内容的修订、深化与延伸。
这是第一篇。
作为一名程序员,BIM工程师,以及Dynamo primer,我在用编程的方式学习Dynamo,也希望帮助AEC行业的设计师们在学习和应用Dynamo的时候,通过这一工具进入程序员的思维空间,理解编程的本质。
在解释Dynamo编程的过程中,我会同步讲解其引擎脚本Design Script
语言的知识,如果能理解Design Script
,即使不直接书写Design Script
脚本仍使用Dynamo图形节点,也有助于写出更快速、目标更明确的程序。
这篇文章假设你的计算机上已经安装了Dynamo,了解如何打开,创建空白程序,以及了解Dynamo设计空间的基本功能布局。
我们先从第一个案例开始:
1. 起步:第一个Dynamo程序
问题1
有一位跑者,有3秒钟的时间,需要跑完300公里,速度应达到多少。
首先,用Dynamo可视化编程模式来解决。
从节点库中的operators中,选择并放置一个/
运算符节点
:
然后,双击空白处,在显示出来的Code Block
节点
中,书写2个数值,300
和3
。
输出点分别连接到/
节点
的x
和y
上。
一般来说,Dynamo编程的工作空间会默认为自动
运行,所以在我们连接导线的过程中,计算已经自动完成了。
如果你的程序不是自动运行,把这个位置改为自动
,或者点击手动
旁边的运行
按钮。
我们从节点库的Core/View
中选择并添加一个Watch
节点来查看计算结果,同样也是用导线
将/
运算符右侧的>
和Watch
左侧的输入端>
相连。运行之后,可以看到结果是符合我们预期的100
。
2.Dynamo节点表达式
这个Dynamo程序可以说是非常简单而直观的,数字像电流一样流入一个运算节点,并且输出结果。
我们注意到:
信息从左侧向右侧流动
节点右侧都有一个输出端,允许结果向后传递
这体现了Dynamo程序的一个基本特征,信息从右端输入,层层处理后,流向最右端,从直觉上来说,这是不可逆的,事实也正是这样。
我们用编程的术语来解读一下:
我们刚才通过把两个直接量
的数字,传递给运算符/
的两个变量
:x
和y
,完成了一次运算,这就形成了一个基本的Dynamo表达式
,可以把表达式
看做是程序执行的基本单位,任何已知的计算行为都可以通过这种方式实现。
其中的/
属于运算符节点
,运算符节点
是一类特殊节点,有别于Dynamo中的三大类基本节点(创建、操作和查询),用于基本运算.
可想而知,如果一个略复杂的公式用运算符节点实现,会显得非常啰嗦。所以/
运算符有另一种实现方式,即Design Script
表示法。
3.Design Script:另一种表达式
上面的程序可以改用以下方式书写:
其中,Code Block
中书写的内容,要遵循Design Script
语言的语法规则,可以把刚才的两个数字300
和3
也看做是Design Script
代码。
Design Script
是和Dynamo图形编程模式具备同等能力的另一种实现,大多数Dynamo的图形编程,在运行前都被转换成Design Script
再运行,可以把Design Script
看作是Dynamo程序的源代码。
作为工程技术人员,没有必要被代码这种形式,或者源代码这种概念吓到,作为领域专用语言
,Design Script
就是为AEC行业工程师、设计师专门打造和准备的。
如果不清楚如何编写,可以通过选择一段Dynamo表达式节点,用节点至代码
功能将其转换为Design Script
代码,并从中学习。
转换结果:
Design Script
代码更加紧凑、清晰,并且,在Dynamo中,确实还存在着一些必须使用Design Script来实现的功能。
4.总结
在这一篇里,我们接触到了以下内容:
编程就是用编程语言解决问题
Dynamo是一种编程工具
程序以表达式的形式书写
变量和函数是表达式的基本元件
Dynamo编程有两种表达式:图形节点和Design Script
5. 额外思考
仔细观察上面自动转换结果和书写代码的区别,不难发现,使用节点至代码
功能生成的Design Script
代码中,多了一个变量t1
。而将鼠标悬停在节点右侧的>
输出端会看到t1
。
再回头观察我们书写300 / 3
的这个Code Block
节点,将鼠标悬停在节点右侧的>
输出端会看到t6BBA4B28C5E54CF89F300D510499A00E_0
。
查看之前的两个直接量300
和3
的输出端,也是t6BBA4B28C5E54CF89F300D510499A00E_0
。
这说明,Dynamo环境自动帮我们把一个单行的数字量(如300
)或计算式(如300 / 3
)转换为一个赋值表达式。
在使用节点至代码
功能时,其形式是:
而我们在Code Block
中手动输入300 / 3;
时,其显示成:
相当于:
其中:
t6BBA4B28C5E54CF89F300D510499A00E_0
和t1
一样,都是Dynamo环境为我们自动分配的临时变量名。
所以,在Dynamo中,一个实际值总是通过变量来保存和传递的,将来还有两个和变量有关的重要概念:作用域
和关联式编程
。