2.2 案例2:地下车位按设计路径自动排序编码

1.案例背景

在BIM施工应用中,地下车位优化的前提是根据设计指定路径给车位编码。手动给车位编码的工作较为烦琐,编码方案也会随着设计行车路线的变化而变化,这使得工作量成倍增加。应用Dynamo自动给地下车位编号,高效准确。

案例1中讲解了给构件编码的方法,但是没有提及编码的顺序;默认的编码规则是构件生成的先后顺序,如果需要自定义编码规则顺序,案例1的知识点显然不够,本案例着重讲述按设计路径编码。

2.解决方案

根据设计行车路线,通过绘制样条曲线表示该行车路线。选择需要编码的车位,获取距该样条曲线上最近的车位;然后将车位根据样条曲线的绘制方向排序,并按行车路线编码,即获取沿样条曲线放置车位的编码;最后将编码写入构件的“注释”实例参数中。

3.案例知识点

● NurbsCurve. ControlPoints

● Geometry. ClosestPointTo

● Curve. ParameterAtPoint

● PolyCurve. ByPoints

● List. SortByKey

4.案例详解

(1)项目前期准备。首先打开案例文件,项目中已经放置了一系列车位;然后用模型线绘制一条样条曲线比拟的车位的编码顺序,如图2-23所示,按图示箭头顺序由小到大编码。

图2-23

注意绘制样条曲线的方向:样条曲线的起始点为编码的起点。本案例编码顺序是从左下角到左上角,因此绘制样条曲线时,要以左下角为起点绘制蛇形线。

回顾第2.1节“案例1幕墙嵌板编号”所学知识点,运用Element.SetParameterByName(根据参数名设置参数值)节点,将最终处理的编码数据,写入构件的“注释”实例参数中。

进入Dynamo界面,应用节点对Categories(族类别)和All Elements of Category(选择该族类别的所有族实例),按类别选择车位。

提示

如果车位所属类别有其他构件,可以参照案例1的方法,通过All Elements of Family Type(在项目中获取该族类型的所有构件)这个节点来选择所有车位。

应用节点对Select Model Element(选择Revit实例)和Element.Geometry(获取Revit图元的几何图形),选择样条曲线。

(2)获取车位在样条曲线上的对应点。要按路线先后来排序,需要找到车位对应于样条曲线上的点,然后对这些点进行排序即完成对车位的排序。而车位对应于样条曲线上的点,可以提取车位的插入点,并通过节点找到样条曲线上距离此插入点最近的点。

首先提取构件的插入点,利用Revit→Elements(Revit图元)→Element(实例)→GetLocation(获取族实例位置)节点,如图2-24所示。

图2-24

然后在曲线上找到车位插入点距离曲线最近的点,在Geometry(几何学)→Modifiers(修改)→Geometry(几何图形)中选择ClosestPointTo(获取距离另一几何图形最近的点),Geometry.ClosestPointTo(获取距离另一几何图形最近的点)节点用于找到距图元最近的点,如图2-25所示。

图2-25

这里需要注意的是,Geometry.ClosestPointTo(获取距离另一几何图形最近的点)节点的连缀应该设置为“最长”或者是“叉积”,如图2-26所示。

图2-26

运行之后结果并不对,如图2-27所示,Geometry.ClosestPointTo(获取距离另一几何图形最近的点)节点在曲线上所获取的最近距离的点,全部是曲线的起点和终点位置。

图2-27

样条曲线作为一个整体存在,对最近点的判定产生干扰,此时需要优化节点。

样条曲线由多个控制点生成,可以找到控制点,并将其重新连线,从而再判断取点。在Geometry(几何学)→Curves(线)→NurbsCurve(样条曲线)中选择ControlPoints(获取样条曲线的控制点),NurbsCurve.ControlPoints(获取样条曲线的控制点)节点用于找到样条曲线的控制点,如图2-28所示。

图2-28

控制点找到之后,利用PolyCurve(复合曲线)节点连接各点,并生成多段线曲线。

PolyCurve(复合曲线)一般是指多段线或者多重曲线,由多条曲线拼接而成。在Geometry(几何学)→Curves(线)→PolyCurve(复合曲线)中选择ByPoints(通过点形成多段线),利用PolyCurve.ByPoints(通过点形成多段线)节点串联各控制点,生成多段线曲线;然后利用Geometry.ClosestPointTo(获取距离另一几何图形最近的点)节点进行最近距离的取点,如图2-29所示。

(3)编码和多段线曲线上的点一一对应。由于是多段线组成的一条曲线,回顾Curve. PointAtParameter(获取曲线上参数处的点)节点,可以考虑反过来,确定点在曲线上的位置参数,最后根据位置参数进行排序。

图2-29

在Geometry(几何学)→Curves(线)→Curve(线)中选择ParameterAtPoint(获取曲线上点的参数),连接已有节点,如图2-30所示。同样,Curve.ParameterAtPoint(获取曲线上点的参数)节点的连缀也应该设置为“最长”或者是“叉积”。

图2-30

Curve.ParameterAtPoint(获取曲线上点的参数)节点输出的是位置参数,通过[0,1]的取值来表示曲线上的位置,这样就可以按位置参数对构件进行排序。List(列表)→Organize(组织)下有多种排序节点,这里使用List.SortByKey(根据关键字给列表排序)节点,如图2-31所示。

图2-31

最终需要排序编码的是构件,即车位族。所以List.SortByKey(根据关键字给列表排序)节点中的排序列表是All Elements of Category(获取项目中该族类别的所有构件)中的元素,排序的关键字即为Curve.ParameterAtPoint(获取曲线上点的参数)节点的位置参数,如图2-32所示。

图2-32

List.SortByKey(根据关键字给列表排序)节点输出的“sorted list”(排序列表)即为已按关键字排序后的图元。

(4)生成编码数据。应用节点List.Count(列表项数)获取车位的总数;然后再通过Cold Block节点获取编码数列(起始为1,间隔为1),如图2-33所示。

图2-33

参照案例1,增加一个格式转换节点String from Object(将对象类型转化为字符串),如图2-34所示。

图2-34

结合Element.SetParameterByName(根据参数名设置参数值)节点的相关知识,便完成了车位的编码工作,如图2-35所示。

完成后,制作一个车位所属类别的标记族,标签为“注释”;将标记族载入项目中,通过命名“全部标记”对已经编码后的车位进行标记,检查编码是否正确,如图2-36所示。

图2-35

图2-36