Files
SzmediTools/Szmedi.Test/TestCmd.cs
2026-02-23 11:21:51 +08:00

129 lines
5.7 KiB
C#

using System.Linq;
using System.Text;
using System.Windows;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using EPPlus.Core.Extensions;
using Nice3point.Revit.Toolkit.External;
using Nice3point.Revit.Toolkit.Utils;
namespace Szmedi.Test
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class TestCmd : ExternalCommand
{
public override void Execute()
{
var walls = new FilteredElementCollector(Document).WhereElementIsNotElementType()
.OfClass(typeof(Wall))
.ToElements()
.Cast<Wall>()
.ToList();
foreach (var wall in walls)
{
var inserts = wall.FindInserts(true, false, false, false);
foreach (var id in inserts)
{
var insert = Document.GetElement(id);
if (insert != null)
{
switch (insert)
{
//门窗
case FamilyInstance fi:
{
var symbol = fi.Symbol;
//Revit2018
//宽度
var width = symbol.get_Parameter(BuiltInParameter.DOOR_WIDTH).AsValueString();
//高度
var height = symbol.get_Parameter(BuiltInParameter.GENERIC_HEIGHT).AsValueString();
//Revit2020
var width2020 = symbol.get_Parameter(BuiltInParameter.FURNITURE_WIDTH).AsValueString();
var height2020 = symbol.get_Parameter(BuiltInParameter.FAMILY_HEIGHT_PARAM).AsValueString();
break;
}
//洞口
case Opening o:
{
var minPoint = o.BoundaryRect[0];
var maxPoint = o.BoundaryRect[1];
//高度
var height = Math.Abs(maxPoint.Z - minPoint.Z) * 304.8;
var minPointFlatten = new XYZ(minPoint.X, minPoint.Y, 0);
var maxPointFlatten = new XYZ(maxPoint.X, maxPoint.Y, 0);
//宽度
var width = minPointFlatten.DistanceTo(maxPointFlatten) * 304.8;
MessageBox.Show($"{width} x {height}");
break;
}
default:
break;
}
}
}
}
}
private static void DrawColumnsBoundLines(Document doc, List<Element> selectedColumns)
{
foreach (FamilyInstance column in selectedColumns)
{
// 获取结构柱的几何信息
var geomOptions = new Options();
var geomElement = column.get_Geometry(geomOptions);
foreach (var geomObj in geomElement)
{
var geometryInstance = geomObj as GeometryInstance;
if (geometryInstance != null)
{
// 处理几何实例
var instanceGeomElement = geometryInstance.GetInstanceGeometry();
foreach (var instanceGeomObj in instanceGeomElement)
{
if (instanceGeomObj is Solid solid)
{
foreach (Face face in solid.Faces)
{
if (face is PlanarFace planarFace &&
planarFace.FaceNormal.IsAlmostEqualTo(-XYZ.BasisZ))
{
var edgeLoops = planarFace.EdgeLoops;
foreach (EdgeArray edgeArray in edgeLoops)
{
var curveArray = new CurveArray();
foreach (Edge edge in edgeArray)
{
var curve = edge.AsCurve();
curveArray.Append(curve);
}
if (curveArray.Size > 0)
{
// 获取活动视图的 SketchPlane
var sketchPlane = SketchPlane.Create(
doc,
doc.ActiveView.GenLevel.Id);
// 绘制房间分割线
var lines = doc.Create
.NewRoomBoundaryLines(sketchPlane, curveArray, doc.ActiveView);
}
}
}
}
}
}
}
}
}
}
}
}