如何通过Revit API实现自动放置房间?求相关示例
借助Revit API自动放置房间的实现方案
核心前提
Revit中创建房间的必要条件:存在闭合的边界环(可由墙体围合,或手动创建房间边界线生成),且需在指定的平面视图中创建(房间仅在平面视图中可见并可编辑)。
实现步骤与代码示例
以下是C#实现自动创建房间的核心代码,包含边界创建、事务处理等关键环节:
using Autodesk.Revit.DB; using Autodesk.Revit.UI; public void AutoCreateRooms(UIApplication uiApp) { UIDocument uiDoc = uiApp.ActiveUIDocument; Document doc = uiDoc.Document; // 筛选目标平面视图(示例取第一个楼层平面,实际可按名称/ID筛选) ViewPlan targetFloorPlan = new FilteredElementCollector(doc) .OfClass(typeof(ViewPlan)) .Cast<ViewPlan>() .FirstOrDefault(v => v.ViewType == ViewType.FloorPlan); if (targetFloorPlan == null) { TaskDialog.Show("提示", "未找到可用的楼层平面视图"); return; } // 示例:手动构建闭合矩形边界(实际场景可从现有墙体提取曲线) XYZ[] points = new XYZ[] { new XYZ(0, 0, 0), new XYZ(12, 0, 0), new XYZ(12, 10, 0), new XYZ(0, 10, 0) }; CurveLoop boundaryLoop = new CurveLoop(); for (int i = 0; i < points.Length; i++) { int nextIndex = (i + 1) % points.Length; boundaryLoop.Append(Line.CreateBound(points[i], points[nextIndex])); } // 事务内执行创建操作(Revit API修改必须在事务中) using (Transaction trans = new Transaction(doc, "自动生成房间")) { trans.Start(); Room createdRoom = Room.Create(doc, targetFloorPlan.Id, boundaryLoop); if (createdRoom != null) { // 设置房间属性 createdRoom.Name = "办公区"; createdRoom.Number = "R-001"; } trans.Commit(); } }
关键注意事项
- 事务强制要求:所有修改Revit文档的操作必须包裹在
Transaction中,否则会抛出异常。 - 边界有效性:
CurveLoop必须完全闭合、无自交,且处于同一平面内,否则Room.Create会返回null。 - 从墙体提取边界:如果需要基于现有墙体自动识别空间,可通过
Wall.LocationCurve获取墙体曲线,组合成闭合环;或使用SpaceBoundaryUtils类提取已有的空间边界(需注意空间边界的类别设置)。 - 视图与标高:房间的标高由目标平面视图的标高决定,创建后若需调整,可修改
Room.LevelId属性。
内容的提问来源于stack exchange,提问作者user16918900
相关产品推荐
相关产品推荐

