对于新手第一次做Revit二开来讲,有时候搞不清楚怎么选点。别人是不是这样我不知道,至少我当时是这样的。
如上图所示,这是Revit的选择器Api,位于Autodesk.Revit.UI.Selection.Selection中,从上面可以看到,不仅是选点,还可以选物选框选盒子。
另外中国程序员通常不太注意的一件事:该选择器是非托管资源,也就是你不释放的话,是会使得内存不断提升的。即所谓的内存泄露。使用Selection选择器后,要及时释放。
本文仅以选点来举例说明,选点是最常用的,相对而言也较简单。
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
namespace Create3DView
{
/// <summary>
/// 创建3d视图
/// </summary>
/// <creator>marc</creator>
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
public class DefaultCommand : IExternalCommand
{
/// <summary>
/// 执行指令
/// </summary>
/// <param name="commandData"></param>
/// <param name="message"></param>
/// <param name="elements"></param>
/// <returns></returns>
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var activeDocument = commandData.Application.ActiveUIDocument;
XYZ[] points = new XYZ[2];
using (var selection = activeDocument.Selection)
{
ObjectSnapTypes snapTypes = ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections;
for (var i = 0; i < 2; i++)
{
points[i] = selection.PickPoint(snapTypes, "请选择一个端点或者交点");
}
}
string text = $"您选择的第1个点是 {points[0]},\r\n第2个点是 {points[1]}";
TaskDialog.Show("提示", text);
return Result.Succeeded;
}
}
}
上述代码运行结果如下:
源码下载地址:https://download.csdn.net/download/mazhiyuan1981/12881361