Revit二开——翻转喷头
Revit绘制喷淋时,有时需要翻转喷头调整喷头的方向,有的插件已经有此功能,不过是收费的,今天分享一下这个功能的实现思路及源代码。
- 实现过程:
1.通过喷头递归找到喷头连接件方向的三通弯头 或者 一端开放的管道。
2.将递归查找过的元素打包。
3.通过递归查找到的末端元素的相关信息,建立 旋转轴。
4.在revit事务中将打包的元素,绕着第3部的旋转轴,旋转180°。
5.代码中封装的方法请参照唐僧解瓦项目。 - 代码如下
/// <summary>
/// 上下喷转换
/// </summary>
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
[Journaling(JournalingMode.UsingCommandData)]
public class Cmd_ModifySprinkler : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
Selection sel = uidoc.Selection;
View acview = uidoc.ActiveView;
//UIView acuivew = uidoc.Activeuiview();
var collector = new FilteredElementCollector(doc);
var elementGroup = new List<Element>();
//1 select sprinkler
var sprinkler = sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is FamilyInstance && m.Category.Id.IntegerValue == (int)BuiltInCategory.OST_Sprinklers)).GetElement(doc) as FamilyInstance;
var mepmodel = sprinkler.MEPModel;
var sprinklerCon = mepmodel.ConnectorManager.Connectors.Cast<Connector>().First(m => m.ConnectorType == ConnectorType.End);
var backendEle = GetBackEndElement(sprinklerCon, ref elementGroup);
var rotationAnxis = default(Line);
if(backendEle is FamilyInstance ins)
{
var location = (backendEle.Location as LocationPoint).Point;
var temmodel = ins.MEPModel;
var dir = temmodel.ConnectorManager.Connectors.Cast<Connector>().Where(m=>m.CoordinateSystem.BasisZ.IsPerpendicular(sprinklerCon.CoordinateSystem.BasisZ)).First().CoordinateSystem.BasisZ;
rotationAnxis = Line.CreateUnbound(location, dir);
}
else if(backendEle is Pipe p)
{
var opencon = p.ConnectorManager.Connectors.Cast<Connector>().First(m => !m.IsConnected);
var location = opencon.Origin;
var originalDir = opencon.CoordinateSystem.BasisZ;
var anxisDir = opencon.CoordinateSystem.BasisX;
rotationAnxis = Line.CreateUnbound(location, anxisDir);
}
Transaction ts = new Transaction(doc, "翻转喷头");
ts.Start();
ElementTransformUtils.RotateElements(doc, elementGroup.Select(m=>m.Id).ToList(), rotationAnxis, Math.PI );
ts.Commit();
//sel.SetElementIds(new List<ElementId>() { (backendEle.Id) });
return Result.Succeeded;
}
public Element GetBackEndElement(Connector con ,ref List<Element> elegroup)
{
Element result = default(Element);
elegroup.Add(con.Owner);
var connectedCon = con.GetConnectedCon(); //ele1
if (connectedCon is null || connectedCon.ConnectorType == ConnectorType.Logical)
{
result = con.Owner;
return result;
}
var backCon = connectedCon.GetBackConInStraight();//ele1
if (backCon == null) { result = connectedCon.Owner; elegroup.Add(result); }
else
{
result = GetBackEndElement(backCon, ref elegroup);
}
return result;
}
}