
1.12 例题11:应用Dynamo批量放置阶梯座椅
1.解题思路
如图1-112所示,根据要求创建5行7列的阶梯座椅。要达到这个效果,需要两个步骤:
(1)在Revit中按要求插入座椅。
(2)让每行座椅Z轴方向发生偏移。
涉及Revit中构件的调用,很容易就可以想到前面讲的FamilyInstance.ByPoint(通过点放置族)这个节点。有关方向的问题,回顾已有的数学知识,可以猜到和向量有关。

图1-112
2.知识点
● 连缀
● Geometry. Translate(direction)
● Vector. ByCoordinates
● List. Transpose
3.例题详解
生成5行7列的点阵,并将其输入FamilyInstance.ByPoint(通过点放置族)节点即可完成阶梯座椅的放置。
接下来主要研究如何生成点阵。
假定间距为2个单位,Revit中的项目单位为“m”,这样X方向需要有7个点,Y方向需要有5个点;结合列表的知识,输入Point.ByCoordinates(通过坐标系生成点)节点,得到点阵,如图1-113所示。

图1-113
从结果看,7个X坐标只与5个Y坐标进行了运算。但这并不符合题目要求,符合题目要求的结果应该是7个X坐标与5个Y坐标一一运算,形成35个点。
这里就要引入连缀的概念。Dynamo中多数节点都有三种运算方式:最短、最长和叉积。
为了表述更加清楚,创建两组平行的点阵,并用Line.ByStartPointEndPoint(通过两点生成直线)节点连接两点,让大家更容易理解,如图1-114所示。
在最终进行运算的Line.ByStartPointEndPoint(通过两点生成直线)节点上,单击鼠标右键,分别选择连缀的三种运算方式,观察效果,如图1-115所示。

图1-114

图1-115
提示
默认连缀方式为“自动”,而“自动”即为“最短”。
连缀的三种运算效果如图1-116所示。具体应用时,可以视项目情况进行选择。

图1-116
提示
“最短”为按索引序列对应运算,运算到索引长度最短的列表时终止运算。
“最长”为按索引序列对应运算,运算到索引长度最短的列表时,以最短列表的最后一项,与索引长度较长的列表的剩余项,一一运算,以确保索引最长的列表每项数据都有运算。
“叉积”为两列表项一一对应运算,以确保列表的每一项都与其他列表的所有项一一运算。
很明显,5行7列的点阵中,需要使用“叉积”进行处理。运算完成后,切换到Revit界面,即完成5行7列椅子的放置,如图1-117所示。
接下来就是处理“阶梯”的问题。

图1-117
回到Dynamo中,对点进行处理(即把点阵处理成阶梯状),最后再在对应点处放置椅子。
对几何图元的处理,选择Geometry(几何学)→Modifiers(修改)→Geometry(几何学)→Translate(direction)(通过向量移动几何图形)节点,如图1-118所示,通过向量移动几何图元。

图1-118
寻找合适的向量,并输入direction(方向)接口即可。
利用Geometry(几何学)→Abstract(抽象的)→Vector(向量)→ByCoordinates(通过坐标系生成向量)节点,如图1-119所示,根据点创建向量。

图1-119
将5行点阵沿Z轴方向移动一定的距离。
这里假定高度间隔差为0.5个单位。创建5个间距为0.5的列表,接入Vector.ByCoordinates(通过坐标系生成向量)节点的z口,如图1-120所示。

图1-120
可以看到出问题了,希望的结果是沿Y轴方向递增,而目前的结果恰恰相反,是沿X轴方向递增,所以只有5列。这是因为Point.ByCoordinates(通过坐标系生成点)节点生成的列表行列分组反了,如图1-121所示,此时需要转换行和列。

图1-121
在线性代数中有行列式的转置,在Dynamo中也有这样的节点。
如图1-122所示,在List(列表)→Organize(组织)中选择Transpose(列表转置),List.Transpose(列表转置)节点用于列表的转置。
转换列表的行与列后,连入原有节点中,即可完成对点的修改,如图1-123所示。
将视图切换到Revit界面,即可看到完成的5行7列阶梯座椅,如图1-124所示。

图1-122

图1-123

图1-124
提示
应用该脚本放置软件自带的座椅族时,并不能按阶梯放置。是因为软件自带的座椅族默认是基于标高的族,不能设置其标高偏移量。
解决方案:将放置的族更换为可设置标高偏移量的族。应用“公制常规模型”或“公制家具”族样板新建的族均可设置其标高偏移量。