Revit管线打断
在使用Revit绘制机电管线处理管线翻弯时经常要用到管线拆分图元命令(split),但软件自带的这个拆分工具总是会自动生成管线的连接件,这并不是我们想要的,并且会因此而带来更多的操作步骤。
为此我用Python写了一段脚本将原来打断-打断-框选-删除的操作变成打断一次即可。
主要思路是:选择图元上的点,将其投影在管线的LocationCurve上,作为打断点;对于管道和风管因API中提供了BreakCurve()可供使用,可直接调用此方法;对于桥架和线管由于无类似方法可调用,可曲线救国达到相同的效果:获取到管线LocationCurve的起始点,分别和投影的拆分点做两条直线line1和line2,将管线复制一个出来copy_element,将原element和copy_element的LocationCurve分别设置为line1和line2。
完整代码:
# Revit管线打断
# By I am the one
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Plumbing import PlumbingUtils
from Autodesk.Revit.DB.Mechanical import MechanicalUtils
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI.Selection import *
clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
pt_ref = uidoc.Selection.PickObject(ObjectType.PointOnElement)
TransactionManager.Instance.EnsureInTransaction(doc)
ele = doc.GetElement(pt_ref)
spl_pt = ele.Location.Curve.Project(pt_ref.GlobalPoint).XYZPoint
if ele.Category.Name == "管道" :
PlumbingUtils.BreakCurve(doc,ele.Id,spl_pt)
elif ele.Category.Name == "风管" :
MechanicalUtils.BreakCurve(doc,ele.Id,spl_pt)
elif ele.Category.Name == "电缆桥架" or ele.Category.Name == "线管":
cop_ele = ElementTransformUtils.CopyElement(doc,ele.Id,XYZ())
sta_pt = ele.Location.Curve.GetEndPoint(0)
end_pt = ele.Location.Curve.GetEndPoint(1)
line1 = Line.CreateBound(sta_pt,spl_pt)
line2 = Line.CreateBound(spl_pt,end_pt)
ele.Location.Curve = line1
doc.GetElement(cop_ele[0]).Location.Curve = line2
TransactionManager.Instance.TransactionTaskDone()
OUT = ele
r元akCurve
运行效果:
欢迎阅读,分享,交流,批评指正。
如转载请注明出处,否则追究法律责任(说说而已,全靠自觉)。