using Autodesk.Revit.DB; using Autodesk.Revit.UI.Selection; using Nice3point.Revit.Toolkit.External; using System; namespace Szmedi.RvKits.DrawingTools { [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) { ElementReferenceType referenceType1 = ElementReferenceType.REFERENCE_TYPE_LINEAR; Reference refer = UiDocument.Selection.PickObject( ObjectType.Edge, new ReferenceSelectionFilter(referenceType1), "请选择第一条边" ); Reference refer1 = UiDocument.Selection.PickObject( ObjectType.Edge, new ReferenceSelectionFilter(referenceType1), "请选择第二条边" ); Element e = UiDocument.Document.GetElement(refer); Element 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; Line 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(); } } } 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(); } } #endregion RepeatExecute } } }