Dynamo For Revit: Basic & Core Samples

前言

使用Dynamo多年,最近想做一套教程,但是Dynamo主要的用户是建筑师,并且本人程序员出身,对建筑业也并不是特别了解。所以打算从 Dynamo 自带的 Samples 入手,试试写点笔记,以后做点****。如果对 Dynamo 有什么疑问,可以留言和私信。

Basics 例子

Help > Samples > Basics

Basics 1

Dynamo 可视化编程的基本单位称作 Node(节点),如图中的 Number, “+”,和 Watch。
Number 顾名思义,代表一个数字。“+”,即数学中的加号。下面这幅图,可以用数学语言来表示:
假设 x = 2.000,y = 6.000,那么 x + y = 2.000 + 6.000 = 8。
Watch 这个节点,用来显示和它相连的节点的计算结果。
Dynamo For Revit: Basic & Core Samples

Basics 2

用 Dynamo 画一条线,同时在 Revit 中画一条对应的模型线。
节点 Number Slider 的功能和 Number 类似,但它可以通过拖动下面的滚动条来动态改变输入的值,而 Number 只能通过编辑数字。
节点 Point.ByCoordinates 表示一个三维的点。节点 Line.ByStartPointEndPoint 表示一条直线,它需要两个 Point 作为输入,因为两个点可以决定一条直线。
节点 ReferencePoint.ByPoint,是通过输入一个 Point, 在Revit 中创建一个 ReferencePoint。注意 ReferencePoint 必须在 Mass 族文件中才能创建。
节点 ModelCurve.ByCurve, 是通过输入一条 Curve在Revit 中创建一条模型线,可以是直线或者某些曲线,这里输入的是直线,其它类型的线暂不作介绍。
Dynamo For Revit: Basic & Core Samples

Basics 3

很多时候,需要创建一串有规律的数字,可以将之称为序列。
节点 Range 可以创建一个序列。如图,创建一个从 0 到 9,相邻两个数字相差1的序列。
节点 List.LastItem 可以得到一个序列最后一个数字。
节点 List.Chop 可以把一个大的序列分成一系列小序列。如把一个长度为10的序列,分成三个长度为3的序列,和一个长度为1的序列。
Dynamo For Revit: Basic & Core Samples

Core 例子

AttractorPoint

例子运行的效果如下。
Dynamo For Revit: Basic & Core Samples
这个例子的逻辑:
- 定义一个控制点;
- 创建100个圆柱体;
- 根据控制点到圆柱体的距离来决定圆柱体的高度和半径,离得越近,高度和半径越小。
节点总览,右击在新的标签页打开可以看得更清楚:
Dynamo For Revit: Basic & Core Samples

定义控制点

为了方便改变点的位置,这里用 Number Slider 作为输入。
Dynamo For Revit: Basic & Core Samples

创建100个圆柱体

计算圆柱体底面的圆心:
1. Number 中的字符串 1..50..5是一种脚本语言,它得到的是从1到50之间,相邻两个数字相差5的序列。
2. Dynamo的节点,当输入为多个序列的时候,可以控制他们的组合方式,即 lacing。当有两个输入序列的时候,如果选择 shortest,那么组合的结果以短的那个序列为标准,如果为longest,则以长的那个序列为标准。如果是Cross Product,则输出的是一个全排列,即短的序列的个数乘以长的序列的个数。组合的结果是一个二维数组。
3. 节点 Flatten 的作用是把数组压平,即降维,二维变成一维。
Dynamo For Revit: Basic & Core Samples
用这些原型作为圆柱体的起始点:
Dynamo For Revit: Basic & Core Samples

根据控制点到圆柱体的距离来决定圆柱体的高度和半径

  1. 节点 Geometry.DistanceTo 有两个输入,一个是控制点,另一个是圆柱的起始点,它的输出是这两个点之间的距离。
  2. 节点 Code Block 里面是一句脚本语言,x/15,即将距离除以15,作为圆柱体的半径。因此,离得越近,半径越小。
  3. 节点 Code Block 里面是一句脚本语言,x/2,即将距离除以2,作为圆柱体的高度。但是,这个高度不能直接输入到 Cylinder.ByPointsRadius,需要先把这个高度转化为一个向量,Vector.ByCoordinates,结果(0,0,x/2),然后把这个点加到圆柱的起始点上,作为endPoint。
    Dynamo For Revit: Basic & Core Samples

CodeBlocks 例子

Code Block 在使用 Dynamo 的过程中很常用。Dynamo 本身是一种可视化编程工具,所有的节点本身就是代码,所以 Code Block 里面是脚本语言,它可以表示任何节点。

作为输入节点

可以表示 Number,String,Formula等输入节点。
Dynamo For Revit: Basic & Core Samples

模拟Point节点

Point.Bycoordinates

Dynamo For Revit: Basic & Core Samples

Point.Origin

Dynamo For Revit: Basic & Core Samples

Point.Add

Dynamo For Revit: Basic & Core Samples

读取Point属性

Dynamo For Revit: Basic & Core Samples

普通节点和Code Block 混合使用

Dynamo For Revit: Basic & Core Samples

用 Code Block 实现数组和序列

可以直接写一个序列,或者先定义一些元素,然后把这些元素合并成一个序列。可以查询序列中的单个元素,也可以查询序列中一定范围内的元素。
Dynamo For Revit: Basic & Core Samples
可以定义二维的序列:
Dynamo For Revit: Basic & Core Samples
直接定义序列并用 Point.ByCoordinates 使用:
Dynamo For Revit: Basic & Core Samples
Dynamo For Revit: Basic & Core Samples

直接编写函数

各种语言都会把可以重复利用的代码组合成一个函数,然后可以在各个地方调用。Dynamo 同样可以如此。
定义一个 function:
Dynamo For Revit: Basic & Core Samples
使用这个 function:
Dynamo For Revit: Basic & Core Samples

复杂 + 综合

Dynamo For Revit: Basic & Core Samples

具体运行效果,请自己运行例子文件。

Lacing

什么是 Lacing?如下:
Dynamo For Revit: Basic & Core Samples

未详细介绍例子:

  1. Core_ListAtLevel,控制多维数组(序列)的展开。例如,四维可以被控制展开成三维,二维或者一维。
  2. Core_Math,数学节点的使用,以及通过节点,Python,Script等多种方式使用数学节点。
  3. Core_PassingFunctions,通过 Level,控制选中的元素。
  4. Core_Python,直接用Python写代码。
  5. Core_RangeSyntax,如何生成序列。
  6. Core_Strings,字符串的操作。

总结

要想学会使用Dynamo,还是需要自己多动手练习。