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 list = uidoc.Selection .PickElementsByRectangle(new GenericFilter(), "框选尺寸标注") .OfType() .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) { } } }