生姜工作室
Revit中的参数设计插件Dynamo简介
Note:今天的分享是博主在美国工作的同学讲述自己用Revit以及dynamo的工作经验。文章作者就职的公司设计范畴包括了许多Prefab(预制建筑)的工作内容,因此使用Revit及Dynamo介入设计流程。
分享Grasshopper实例的平台,鼓励Grasshopper原创作者
本期作者
MY.W
现就职于洛杉矶建筑设计公司,毕业于USC洛杉矶
前言:
最近两个礼拜,把目前网上能找到的所有Dynamo教程大致看了一遍,除了那些要付费的。发现很多现有的教程都有一些通病。有的教程完全把Dynamo当成Grasshopper来写,把一些初级的GH教程用Dynamo跑一遍,就成了Dynamo教程;有的教程花了大篇幅来讲Python入门,最后并没有落到Revit的实际应用上;还有个别教程把Dynamo官方的英文教程翻译了一下,还要收费才能看。。。
学软件的最终目的是帮助到实际的工作,教程的内容落不到实处就是浪费时间。这个系列把重点放在Dynamo在Revit中的实际应用上,结合在实际工作中碰到的案例来分析Dynamo的实用性。
主要通过几个方面来讲解:
- Dynamo-Revit参数化建模,与Grasshopper-Rhino的比较
- Python在Dynamo中的应用、Revit API的应用
- 利用Dynamo-Python进行BIM数据处理,对实际项目预算以及跨专业合作的帮助
- 利用Dynamo快速出图
第一章:Revit-Dynamo VS. Rhino-Grasshopper
先简单对比一下Dynamo和Grasshopper,然后放一个简单的例子。
单作为可视化编程软件来说,Grasshopper已经发展多年,有很多强大的插件的支持,功能上远比Dynamo强大。尤其在几何处理能力上,Dynamo差了不止一点点。Dynamo之所以可以在近几年逐渐发展,并且接受度不断增加,原因自然是在于搭载的平台。
下面用一个创建曲面墙的例子来比较Dynamo和Grasshopper的建模思路。
Dynamo脚本:
图1.1
这部分和Grasshopper中的思路基本相同,通过几个点创建曲线,通过两条曲线Loft生成曲面。接下来只要加一个厚度,就可以得到一个曲面的体块。
图1.2a,1.2b:
ImportInstance.ByGeometry可以把Dynamo中的模型导入Revit中,类似于GH中Bake的作用。点一下Run,就可以在Revit中生成这个体块。
为了更好的对比,我们在Revit中直接创建一个曲面墙。
图1.3:
对比之下问题来了,通过之前的Dynamo创建的这个体块并没有被Revit归入到墙体的种类(Category)中
图1.4a,1.4b:
它不属于墙这个种类,就意味着在Revit中不能在上面直接放置门窗,也没有属于墙体的族中所有的任何参数。
图1.5a,1.5b:
这个体块就像Rhino里的一个立方体,你可以称它为墙,称它为柱子,称它为家具,但这个体块本身并不具有任何的属性,因此也不能被Revit识别为墙面。在用Dynamo进行建模时,必须要注意与Revit建模原理的相对应。
接下来的修改就可以看出Dynamo有别于Grasshopper的地方。
在之前的例子(图1.3)中可以看到,创建墙面的过程中用到了Revit中“Wall by Face” 这个命令。Dynamo中搜索一下就发现,有一个相同的命令。
图1.6:Dynamo Node: Wall by Face
这个节点分别由三个输入端:墙体的基准线(Location Line),面(Surface),墙类型(Wall Type)。这里要注意,输入端的数据类型必须要匹配。把鼠标停在各输入端就可以看到要求的数据类型。比如Location Line的数据类型是字符串(String),所以直接打字作为输入端也是可以被接受的。
图1.7a,1.7b:
而另两个输入端的数据类型分别是“Surface“和”WallType“,这时就必须用相应的节点来提供相同的数据类型,打字作为输入端是不可行的。
图1.8a,1.8b:
左图是正确的数据类型输入,右图则是错误的类型,出错时可以查看错误信息提示。
当然通过简单Python代码就可以转换数据类型,在一些特殊的位置会用到,在之后的教程中会详细介绍。
图1.9:
照常理说,这样就应该没有问题了。点击一下Run。
图1.10:
发现运行失败了,虽然没有报错,输出的结果却是null,Revit空间里也没有出现墙体。
我们再回想一下之前在Revit中创建曲面墙的过程。运行失败的原因就在于,必须要基于Revit中实际存在的面才可以创建墙体。我们在Dynamo中Loft生成了一个曲面,但这个曲面并不存在于Revit的模型空间,因此创建墙面失败。
要完成整个操作,必须要绕一圈:先把Dynamo中的曲面创建到Revit中,再根据这个曲面创建墙面,最后删除这个曲面。这里用到了一个插件”Springs”:
从这里可以看出,Dynamo存在不完善的地方,报错机制也并不完善。
这里要用到插件springs中的节点“FamilyInstance.ByGeometry”。通过这个节点可以把Dynamo中的图形创建到Revit中,并赋予族的属性,这里给了一个通用模型(Generic Model)的属性。这样这个面就被创建到了Revit的模型空间。
图1.11:
图1.12:
节点的输出端里的instance就是Revit里的曲面模型,提取它的surface,再连接到Wall.ByFace的输入端,再点击运行,就得到了我们想要的结果,这个墙面就像之前通过Revit创建的墙面一样,具有族的各种特征和参数。
图1.13:
图1.14:
最后一步,删除之前创建到Revit中的曲面。再删除命令前加一个PassThrough节点(来自Clockwork插件),保证在墙面创建之后再删除这个曲面。
图1.15:
完成。总结一下,为了完美贴合Revit中的模型结构,Dynamo中必须要经过一些额外的步骤,才能确保最终创建的模型可以再Revit中进行更多的操作。例如更方便的创建门窗,获取各项参数,以及之后会提到的批量的模型数据处理等。类似Grasshopper体块的创建,Dynamo也可以做到,但是得到的结果与Revit的建模思路不符,因此不适合应用到如墙体,楼板,柱子这类建筑的基本组件上。但如果仅仅是一个特殊的构件,仅仅是造型上的表现,通过Dynamo直接创建到Revit中也是可行的。
本章到此结束,下一章将对Dynamo中的数据获取及分析处理进行简单的介绍。
长按识别二维码关注我们
欢迎小伙伴们提供优化的算法,也欢迎愿意分享知识的伙伴们投稿,我们会制作投稿专题