Files
SzmediTools/Szmedi.RvKits/Drawing/DimensionPointLineCmd.cs

89 lines
3.2 KiB
C#
Raw Permalink Normal View History

2025-09-16 16:06:41 +08:00
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;
}
}
}
}