using System.Linq; using System.Text; using System.Windows; using ACadSharp.Entities; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Architecture; using Autodesk.Revit.UI; using Nice3point.Revit.Toolkit.External; namespace Szmedi.RvKits.Civil { /// /// Revit执行命令 /// [Transaction(TransactionMode.Manual)] public class Room3D : ExternalCommand { public override void Execute() { var result=MessageBox.Show("请确保已已放置房间,是否继续?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Information); if (result != MessageBoxResult.OK) { Result = Result.Cancelled; return; } var rooms = new FilteredElementCollector(Document).OfCategory(BuiltInCategory.OST_Rooms) .Cast() .ToList(); if (!rooms.Any()) { MessageBox.Show("未发现房间", "提示", MessageBoxButton.OK, MessageBoxImage.Information); Result = Result.Cancelled; return; } Document.InvokeGroup( tg => { var sb = new StringBuilder(); //Dictionary> pairs = new(); using Transaction trans = new(Document, "房间实体"); foreach (var room in rooms) { try { trans.Start(); List curveLoops = []; var segments = room.GetBoundarySegments(new SpatialElementBoundaryOptions()); foreach (var segment in segments) { CurveLoop curveLoop = new(); foreach (var boundary in segment) { curveLoop.Append(boundary.GetCurve()); } curveLoops.Add(curveLoop); } var geos = new List(); if (curveLoops.Count > 0) { var baseElev = room.Level.Elevation; var lowerOffset = room.get_Parameter(BuiltInParameter.ROOM_LOWER_OFFSET).AsDouble(); var upperOffset = room.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET).AsDouble(); var extrusionDist = upperOffset - lowerOffset; var solid = GeometryCreationUtilities.CreateExtrusionGeometry( curveLoops, XYZ.BasisZ, extrusionDist); geos.Add(solid); } //var directShape = DirectShape.CreateElement( // Document, // Category.GetCategory(Document, BuiltInCategory.OST_GenericModel).Id); //directShape.Name = room.Name; var category = Category.GetCategory(Document, BuiltInCategory.OST_GenericModel); var directShape = Document.CreateDirectShapeInstance( "房间实体", BuiltInCategory.OST_GenericModel, geos); directShape.get_Parameter(BuiltInParameter.DOOR_NUMBER).Set(room.Name); trans.Commit(); } catch (Exception ex) { sb.AppendLine($"{ex.Message}"); } } var x = sb.Length > 0 ? MessageBox.Show(sb.ToString(), "错误") : MessageBox.Show("创建完成", "提示"); //doc.FamilyCreate.NewModelText() }); } } }