using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using Nice3point.Revit.Toolkit.External; using System; namespace Szmedi.RvKits.DrawingTools { [Transaction(TransactionMode.Manual)] public class DimensionPointLineCmd : ExternalCommand { public override void Execute() { using Transaction trans = new(Document, "点线标注"); try { while (true) { ElementReferenceType referenceType1 = ElementReferenceType.REFERENCE_TYPE_LINEAR; ElementReferenceType referenceType2 = ElementReferenceType.REFERENCE_TYPE_NONE; Reference refer = UiDocument.Selection.PickObject( ObjectType.Edge, new ReferenceSelectionFilter(referenceType1), "请选择边" ); Reference refer1 = UiDocument.Selection.PickObject( ObjectType.PointOnElement, new ReferenceSelectionFilter(referenceType2), "请选择点" ); Element e = UiDocument.Document.GetElement(refer); var f = e.GetGeometryObjectFromReference(refer) as Edge; var c1 = f.AsCurve(); var p1 = refer1.GlobalPoint; c1.MakeUnbound(); var p2 = c1.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), p1); 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 ex) { if (ex.Message == "Invalid number of references.") { ErrorMessage = "选择的参考不可用于生成标注"; } if (trans.GetStatus() == TransactionStatus.Started) { trans.Commit(); } Result = Result.Failed; } } } }