Files
SzmediTools/Szmedi.RvKits/Drawing/SplitDimensionsCmd.cs
2025-09-16 16:06:41 +08:00

118 lines
5.5 KiB
C#

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External;
using System;
using System.Linq;
namespace Szmedi.RvKits.DrawingTools;
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
public class SplitDimensionsCmd : ExternalCommand
{
public override void Execute()
{
SplitExecute(UiDocument);
}
public void SplitExecute(UIDocument uidoc)
{
var doc = uidoc.Document;
try
{
List<Dimension> list = uidoc.Selection
.PickElementsByRectangle(new GenericFilter<Dimension>(), "框选尺寸标注")
.OfType<Dimension>()
.ToList();
bool flag = !list.Any();
if (!flag)
{
doc.InvokeGroup(
transactionGroup =>
{
foreach (Dimension dimension in list)
{
try
{
Line line = dimension.Curve as Line;
if (line != null)
{
doc.Invoke(ts =>
{
for (int i = 0; i < dimension.NumberOfSegments; i++)
{
DimensionSegment dimensionSegment = dimension.Segments.get_Item(i);
Reference reference = dimension.References.get_Item(i);
if (reference.ElementId != ElementId.InvalidElementId)
{
if (doc.GetElement(reference.ElementId) is Grid grid)
{
reference = new Reference(grid);
}
}
if (reference.ElementId != ElementId.InvalidElementId)
{
if (doc.GetElement(reference.ElementId) is Level level)
{
reference = new Reference(level);
}
}
Reference reference2 = dimension.References.get_Item(i + 1);
if (reference2.ElementId != ElementId.InvalidElementId)
{
if (doc.GetElement(reference2.ElementId) is Grid grid2)
{
reference2 = new Reference(grid2);
}
}
if (reference2.ElementId != ElementId.InvalidElementId)
{
if (doc.GetElement(reference2.ElementId) is Level level2)
{
reference2 = new Reference(level2);
}
}
ReferenceArray referenceArray = new();
referenceArray.Append(reference);
referenceArray.Append(reference2);
Dimension dimension2 = doc.Create.NewDimension(
dimension.View,
line,
referenceArray,
dimension.DimensionType
);
if (dimension2 != null)
{
dimension2.Prefix = dimensionSegment.Prefix;
dimension2.Suffix = dimensionSegment.Suffix;
dimension2.Above = dimensionSegment.Above;
dimension2.Below = dimensionSegment.Below;
dimension2.TextPosition = dimensionSegment.TextPosition;
}
}
doc.Delete(dimension.Id);
});
}
}
catch (Exception)
{
// ignored
}
}
},
"拆分尺寸标注"
);
}
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException) { }
}
}