今天呢,我们简单聊聊如何把房间名称,变成模型文字,好在三维中能够看到房间名称。
本来吧,我觉得批量创建模型文字应该是个很简单的事,但是我在Dynamo中搜了下ModelText,发现只有一个在族环境中创建模型文字的节点:
我这么多节点包,竟然没有直接创建模型文字的节点?难道还要去写Python代码?没办法,只好去查下API,不查还好,一查,觉得这个更是有意思了,竟然只能在族环境下才允许创建模型文字,这个事就有点扯了。。。
谁能告诉我,这是什么鬼,但是问题有了,总要想办法解决,好在这个问题还有能变通解决的,例如之前我做门窗详图那个例子,我们可以复制模型文字啊,所以“copy element”方法在这里使用正合适,我们可以再搜索下:
所在类为“ElementTransformUtil Class“,所以我们的基本语法为:
copied = ElementTransformUtils.CopyElement(doc,ElementId(elementId),i.ToXyz())
那么我们只要获取所有的房间,然后在房间中心点或者直接获取房间的location,把模型文字复制到这里就可以了,大家可以自己尝试下,我就直接贴出代码和节点了:
# Copyright(c) 2010, 九哥BIMer
import clr
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
app = DocumentManager.Instance.CurrentUIApplication.Application
elementId = IN[0].Id
Pts = UnwrapElement(IN[1])
new = []
copied = []
TransactionManager.Instance.EnsureInTransaction(doc)
for i in Pts:
copied = ElementTransformUtils.CopyElement(doc,ElementId(elementId),i.ToXyz())
new.append(doc.GetElement(copied[0]))
TransactionManager.Instance.TransactionTaskDone()
OUT = new
从上图可以看出,我复制完文字,将模型文字的值改成房间名称,最后又更新了下文字的位置,这是因为,这里复制模型文字,坐标是相对于你放置的那个模型文字的坐标,更新成房间坐标就可以了。
从这里我们也看出,这不是个好的解决办法,于是我又想,既然允许在族环境中创建模型文字,那么我们不如直接做个模型文字的族,直接放置族岂不是来的痛快。
于是我就做了一个模型文字族,添加需要的参数,文字采用中心对齐,如下图,载入项目中就可以用了:
那么这样来的更简单,只需要获取房间的location,然后用FamilyInstance.ByPoint放置模型文字族即可,然后将房间名称设置给对应的族即可,如下图:
这样我们就完成了,房间名称转换为模型文字的操作,可以在三维中看到房间名称了。
好了,今天的分享就到这里了,只是简单的试了下,分享一下,有不对的地方,请指正哈!