Revit API 开发 (5):找到房间里的所有构件

简介

在使用 Dynamo 的过程,想把房间里的所有的构建都找出来,发现如果构件数量较多的话,性能上有很大的问题。于是还是使用API来找房间里的构件。
思路也很简单:

  1. 找到房间(可以单选,你也可以把所有房间都过滤出来)
  2. 把房间的几何图形找出来,这个就需要你自己确保房间是有几何形体的了
  3. 使用ElementIntersectsSolidFilter去求交,得到所有相交的构件

代码

可以单选,你也可以把所有房间都过滤出来。

namespace ElementInRoom
{
    // 所有房间
	[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
	public class ElementInRoomCommand : IExternalCommand
	{
		public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
		{
			UIDocument uiDoc = commandData.Application.ActiveUIDocument;
			Document doc = uiDoc.Document;

			// Get all rooms
			FilteredElementCollector roomCollector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms);
			IList<Element> rooms = roomCollector.ToElements();

			// Find elements in rooms
			Dictionary<string, int> room2elements = new Dictionary<string, int>();
			foreach(Room room in rooms)
			{
				if (room.Volume <= 0.01)
					continue;

				GeometryElement geomElement = room.get_Geometry(new Options());
				Solid solid = null;
				foreach (GeometryObject geomObj in geomElement)
				{
					solid = geomObj as Solid;
					if (solid != null) break;
				}
				if (solid == null)
					continue;

				FilteredElementCollector collector = new FilteredElementCollector(doc);
				collector.OfClass(typeof(FamilyInstance));
				collector.WherePasses(new ElementIntersectsSolidFilter(solid));
				room2elements.Add(room.Name, collector.ToElementIds().Count);
			}

			// Make string
			string result = "Result:\n";
			foreach(KeyValuePair<string, int> keyValuePair in room2elements)
			{
				result += keyValuePair.Key + " has " + keyValuePair.Value + " elements.\n";
			}

			TaskDialog.Show("Elements in Room", result);

			return Result.Succeeded;
		}
	}

    // 单个房间
	[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
	public class ElementInOneRoomCommand : IExternalCommand
	{
		public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
		{
			UIDocument uiDoc = commandData.Application.ActiveUIDocument;
			Document doc = uiDoc.Document;

			// Select a room
			Reference refer = uiDoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
			Room room = doc.GetElement(refer.ElementId) as Room;
			if(room == null)
			{
				TaskDialog.Show("Invalid room", "Please select a room!");
				return Result.Succeeded;
			}

			// Find elements in rooms
			GeometryElement geomElement = room.get_Geometry(new Options());
			Solid solid = null;
			foreach (GeometryObject geomObj in geomElement)
			{
				solid = geomObj as Solid;
				if (solid != null) break;
			}
			if (solid == null)
			{
				TaskDialog.Show("Invalid room", "Please select a room!");
				return Result.Succeeded;
			}


			FilteredElementCollector collector = new FilteredElementCollector(doc);
			collector.OfClass(typeof(FamilyInstance));
			collector.WherePasses(new ElementIntersectsSolidFilter(solid));
			uiDoc.ShowElements(collector.ToElementIds());
			uiDoc.Selection.SetElementIds(collector.ToElementIds());

			return Result.Succeeded;
		}
	}
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值