学习 Dynamo,如果你把它当成是爱好,学起来定然日进千里。当你能把爱好转化成生产力,那么,你在工作上,也能事半功倍。
既然是从头学起,那么我们写代码,可以先找一些 Dynamo 中已经有了的节点,因为这些节点也是通过 Revit API 实现的,所以我们也可以对应的查看 Revit API 手册,来学习如何使用 API。
这次就从生成墙入手,首先我们打开 API 手册,搜索 Wall 的方法,如下图:
如图,我们可以看到,前面有个 S 标志的,就是创建类的方法,我们先选一种生成墙的方法,例如:
Wall.Create Method (Document, IList(Curve), ElementId, ElementId, Boolean),因为这个和 Dynamo 中生成墙的节点差不多,只差一个顶标高,这个我们后面再解决。
语法如下:
这里 API 需要输入的分别是:当前文档,曲线列表,墙类型 ID, 楼层 ID 和是否为结构。
翻到 API 最底部,我们看到创建墙的上一级是 Wall Class
所以创建墙的语法为:Wall.Create(document, geomline, baseLevel.Id, boolean)
于是我们可以简单尝试编写代码:(这里我们先不管引用的事,可以参考 K 神知乎上的万能模板,把主要的引用都添加进来,避免不必要的错误发生)
__author__ = "九哥BIMer"
import clr
#导入Revit模块
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
#导入 Document and transactions模块
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
#导入 Revit API
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
#获取当前文档
doc = DocumentManager.Instance.CurrentDBDocument
#Dynamo 输入
baseLevel = UnwrapElement(IN[0])
topLevel = UnwrapElement(IN[1])
wallType = UnwrapElement(IN[2])
#创建点
pt1 = XYZ(0, 0, 0)
pt2 = XYZ(10, 0, 0)
TransactionManager.Instance.EnsureInTransaction(doc)
#创建直线
line = Line.CreateBound(pt1, pt2)
#通过API创建墙
wall = Wall.Create(doc, line, wallType.Id, baseLevel.Id, False)
#完成任务
TransactionManager.Instance.TransactionTaskDone()
OUT = wall
但是,我们创建的墙,和 Dynamo 节点还有点不一样,并没有顶部的标高,这里我们同样可以通过 Revit API 来获取墙的内置参数,然后设置相应参数即可,如下:
代码如下:
#获取顶部标高内建参数
#墙顶部标高参数为:WALL_HEIGHT_TYPE
topConstraint = wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE)
#设置顶部标高
topConstraint.Set(topLevel.Id)
这样,我们就在项目中生成了墙,不同版本 Revit API 可能不太一样,需要相应的调整,我这里就不在赘述了。