今天,我们来分享几个简单的代码块,分别是隔离、移动、旋转和删除图元,都是比较简单的代码,可以通过简单的查询API得到我们所需的方法,当然这些操作Dynamo里都有现成的节点,我们主要是为了练习。
一、隔离墙
隔离比较复杂,我们就先以隔离墙为例,简单学习一下这个方法。
首先,我们查询API手册,里面有关于隔离的方法,我们查询Isolae,可以得到View.IsolateCategoriesTemporary Method这个方法,是隔离当前视图里的图元类别,那么我们就通过这个,来隔离墙类别,从底部的方法,我们看到他的类是View Class:
所以基本语法就是:
view.IsolateElementsTemporary(elementIds)
于是我们就通过获取当前激活视图,然后收集所有的图元,隔离出墙类别即可,代码如下:
# Copyright(c) 2019, 九哥BIMer
import clr
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
import System
from System.Collections.Generic import *
doc = DocumentManager.Instance.CurrentDBDocument
ActiveViewElements = FilteredElementCollector(doc, doc.ActiveView.Id).OfClass(Wall).ToElements()
elements = UnwrapElement(ActiveViewElements)
view = UnwrapElement(doc.ActiveView)
ids = list()
for items in elements:
ids.append(items.Id)
idElements = List[ElementId](ids)
TransactionManager.Instance.EnsureInTransaction(doc)
view.IsolateElementsTemporary(idElements)
TransactionManager.Instance.TransactionTaskDone()
注:此处Python Script节点,不需要输入和输出,运行后直接隔离墙图元。
二、移动图元
接下来是移动图元,我们查询API手册,搜索MoveElement,得到Move的方法,参考C#的语法,如下:
import clr
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
doc = DocumentManager.Instance.CurrentDBDocument
clr.AddReference("System")
from System.Collections.Generic import *
elements = UnwrapElement(IN[0])
newLocation = IN[1].ToXyz()
Ids = List[ElementId]()
for e in elements:
Ids.Add(e.Id)
TransactionManager.Instance.EnsureInTransaction(doc)
ElementTransformUtils.MoveElements(doc, Ids, newLocation)
TransactionManager.Instance.TransactionTaskDone()
OUT = Ids
连接方式如下:
三、旋转图元
同样的,我们查询API首层,搜索RotateElement方法,得到参照语法:
对应的类为:
所以所需语法为:
ElementTransformUtils.RotateElement(doc, e.Id, rot_axis, angle)
参考代码如下:
import clr
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
doc = DocumentManager.Instance.CurrentDBDocument
clr.AddReference("System")
from System.Collections.Generic import *
elements = UnwrapElement(IN[0])
angle = IN[1]
for e in elements:
ref_location = e.Location.Point
rot_axis = Line.CreateBound(ref_location, XYZ(ref_location.X, ref_location.Y,ref_location.Z+1.0))
TransactionManager.Instance.EnsureInTransaction(doc)
ElementTransformUtils.RotateElement(doc, e.Id, rot_axis, angle)
TransactionManager.Instance.TransactionTaskDone()
四、删除图元
通过查询API手册,我们得知,删除图元,可以直接删除图元Id,所以我们只需要获取图元,然后删除对应Id就行,代码如下:
# Copyright(c) 2019, 九哥BIMer
import clr
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
els=UnwrapElement(IN[0])
TransactionManager.Instance.EnsureInTransaction(doc)
try:
l = doc.Delete(els.Id)
except:
l = None
TransactionManager.Instance.TransactionTaskDone()
OUT=l
好了,今天得分享就到这里,都是比较简单的代码,参考Dynamo自带的节点,多加练习即可。
python培训班:http://www.baizhiedu.com/python2019