using Autodesk.Revit.DB; using Autodesk.Revit.UI.Selection; using Nice3point.Revit.Toolkit.External; namespace ShrlAlgoToolkit.RevitAddins.DrawSheet; [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)] public class DimensionBy2LineCmd : ExternalCommand { public override void Execute() { #region RepeatExecute using Transaction trans = new(Document, "标注"); try { while (true) { var referenceType1 = ElementReferenceType.REFERENCE_TYPE_LINEAR; var refer = UiDocument.Selection.PickObject( ObjectType.Edge, new FuncFilter(_ => true, (reference, _) => referenceType1 == reference.ElementReferenceType), "请选择第一条边" ); var refer1 = UiDocument.Selection.PickObject( ObjectType.Edge, new FuncFilter(_ => true, (reference, _) => referenceType1 == reference.ElementReferenceType), "请选择第二条边" ); var e = UiDocument.Document.GetElement(refer); var e1 = UiDocument.Document.GetElement(refer1); var f = e.GetGeometryObjectFromReference(refer) as Edge; var f1 = e1.GetGeometryObjectFromReference(refer1) as Edge; var c1 = f.AsCurve(); var c2 = f1.AsCurve(); var p1 = c1.GetEndPoint(0); c2.MakeUnbound(); var p2 = c2.Project(p1).XYZPoint; var l = Line.CreateBound(p1, p2); ReferenceArray array = new(); array.Append(refer); array.Append(refer1); try { trans.Start(); Document.Create.NewDimension(Document.ActiveView, l, array); trans.Commit(); } catch (Autodesk.Revit.Exceptions.InvalidOperationException) { var plane = Plane.CreateByThreePoints(f.AsCurve().GetEndPoint(0), f.AsCurve().GetEndPoint(1), f1.AsCurve().GetEndPoint(0)); var originSketch = Document.ActiveView.SketchPlane; Document.ActiveView.SketchPlane = SketchPlane.Create(Document, plane); Document.Create.NewDimension(Document.ActiveView, l, array); Document.ActiveView.SketchPlane = originSketch; trans.Commit(); return; } } } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { if (trans.GetStatus() == TransactionStatus.Started) { trans.Commit(); } } catch (Exception) { //message = ex.InnerException.ToString(); if (trans.GetStatus() == TransactionStatus.Started) { trans.Commit(); } return; } #endregion RepeatExecute } }