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()
});
}
}
}