Files
Shrlalgo.RvKits/Sai.RvKits/RvView/DimensionBy2LineCmd.cs
2024-09-22 11:05:41 +08:00

87 lines
2.5 KiB
C#

using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using Nice3point.Revit.Toolkit.External;
using Sai.Toolkit.Revit.Helpers;
namespace Sai.RvKits.RvView;
[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
}
}