你好,这里是BIM的乐趣
之前有小伙伴留言,可不可以按房间为每面墙填色,答案是肯定的,我们可以利用填色功能,对每面墙,单独赋予材质,不过搜了下,似乎没找到现成的节点,然后就在API里搜了下,doc下有个paint方法,很容易就能实现,我们来看下:
然后详细看下:
特别注意这个face,是DB下的:
然后很容易就能写出核心代码:
doc.Paint(element.Id, face, material.Id)
那么接下来的问题就是如何获取房间边界墙和墙面的face了。
不过简单搜了下,发现Clockwork里有个现成的节点,可以获取房间的边界墙和face,于是就简单多了。
☆提示:这里有个问题,如果一段墙的相同面,如果同时有两个房间,获取的face就是相同的,这样填色就会有问题,这里我没深入探究,只是在墙交点处均做打断处理。
那么剩下的就简单了。就是获取所有房间并按名称分组,之后再为每一种房间单独赋材质就好了(我就是根据房间种类数量,随便获取了几个材质,这里就不做赘述了,大家按照需求给材质即可),附上完整截图:
并附上我paint节点的完整代码:
# Copyright(c) 2021, 九哥BIMer
import clr
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib')
clr.AddReference('RevitAPI')
clr.AddReference('RevitServices')
import Autodesk
import RevitServices
from Autodesk.Revit.DB import *
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
faces = UnwrapElement(IN[0])
elems = UnwrapElement(IN[1])
material = UnwrapElement(IN[2])
output = []
TransactionManager.Instance.EnsureInTransaction(doc)
for m,n,o in zip(faces, elems,material):
for i,j in zip(m,n):
doc.Paint(j.Id, i, o.Id)
TransactionManager.Instance.TransactionTaskDone()
OUT = elems
好了,今天的分享就到这里,只是回答下之前小伙伴的问题,就不做详细讲解了,快去自己尝试吧~
联系客服