Revit二次开发学习笔记1
20220314:
将Revit二次开发入门的基本概念、接口使用方法知识点进行整理:
- 概念:
UIApplication、Application、UIDocument、Document - 接口函数:
IExternalCommand接口、活动窗口ActiveView、拉进显示要素ShowElements、单选要素Selection.PickObject、多选要素Selection.PickObjects、获取点Selection.PickPoint
概念:
1、Revit 应用类:UIApplication 和 Application
UIApplication:表示一个活动的Revit会话,提供了对UI定制、事件及活动文档的访问
Application:表示一个Revit应用,提供对文档、选项及其他应用范围的数据的访问和设置
理解:
2、Revit文档类:UIDocument 和 Document
UIDocument:包含根UI相关的文档信息和操作,例如:ActiveView 和 ShowElement
Selection:用于选择Revit模型
ShowElements:显示适当的元素
视图管理:①ActiveView:返回或设置当前文档的活动视图②RefershActiveView:刷新当前文档的活动视图
Document:对象:用于存储Revit的元素、管理视图和数据
类:提供获取管理元素、文件管理等功能
理解:UIDocument能get和set Document只能get
接口函数:
- IExternalCommand接口:
固有格式,只有该结构能将我们的函数与Revit关联起来
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
[Transaction(TransactionMode.Manual)]
public class Class : IExternalCommand //Alt+Enter
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//获取应用
UIApplication uiApp = commandData.Application;
Application App = uiApp.Application;
//获取版本号,弹窗显示
TaskDialog.Show("版本号",App.VersionName);
//获取活动视图名及ID
UIDocument uIDocument = uiApp.ActiveUIDocument;
View view = uIDocument.ActiveView;
TaskDialog.Show("视图名",view.Name + ":" + view.Id.IntegerValue.ToString());
Document document = uIDocument.Document;
return Result.Succeeded;
}
}
}
- 活动窗口ActiveView:
uIDocument获取活动文档和窗口,或者set活动视图
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
[Transaction(TransactionMode.Manual)]
public class Class : IExternalCommand //Alt+Enter
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//获取应用
UIApplication uiApp = commandData.Application;
Application App = uiApp.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
获取要素
ElementId id = new ElementId(13073);
//直接对view修改无效
//view = document.GetElement(id) as View;
uIDocument.ActiveView = document.GetElement(id) as View;
//查看活跃视图是否修改
view = document.ActiveView;
TaskDialog.Show("提示","修改后活跃视图:" + view.Name);
}
}
}
- 拉进显示要素ShowElements:
使用uIDocument.ShowElements方法将要素集拉进显示
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
[Transaction(TransactionMode.Manual)]
public class Class : IExternalCommand //Alt+Enter
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//获取应用
UIApplication uiApp = commandData.Application;
Application App = uiApp.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
// 显示元素,会将选中的要素拉进显示
//创建ElementId集合
List<ElementId> list_id = new List<ElementId>();
list_id.Add(new ElementId(201112));//使用要素id创建ElementId对象
list_id.Add(new ElementId(201166));
list_id.Add(new ElementId(201205));
uIDocument.ShowElements(list_id);
}
}
}
- 单选要素Selection.PickObject:
使用uIDocument.Selection.PickObject()方法,获取选中要素的信息
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
[Transaction(TransactionMode.Manual)]
public class Class : IExternalCommand //Alt+Enter
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//获取应用
UIApplication uiApp = commandData.Application;
Application App = uiApp.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
//选取一个元素【手动选中一个,会弹出对应信息】
Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
//得到要素
Element element = document.GetElement(reference);
//弹出属性
TaskDialog.Show("选中元素ID",element.Id.IntegerValue.ToString() + ":" + element.Name);
}
}
}
- 多选要素Selection.PickObjects:
使用uIDocument.Selection.PickObjects()方法,实例化ISelectionFilter接口,实现多选并筛选要素。
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
[Transaction(TransactionMode.Manual)]
public class Class : IExternalCommand //Alt+Enter
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//获取应用
UIApplication uiApp = commandData.Application;
Application App = uiApp.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
//选择多个元素,并使用过滤器
//需要调用实现了ISelectionFilter接口的DoorFilter类
IList< Reference > list_Reference = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element,new DoorFilter());
StringBuilder stringBuilder = new StringBuilder();
foreach (Reference item in list_Reference)
{
Element elem = document.GetElement(item);
stringBuilder.AppendLine(elem.Name + ":" + elem.Id.IntegerValue.ToString());
}
TaskDialog.Show("多选对象",stringBuilder.ToString());
}
}
}
实现了ISelectionFilter接口的DoorFilter类:
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cls_RevitTest
{
public class DoorFilter : ISelectionFilter
{
//一个个传入所有选中的elem
//由于门窗都是FamilyInstance,需要加深筛选
public bool AllowElement(Element elem)
{
if ((elem is FamilyInstance) && (elem.Category.Name == "门"))
{
return true;//选中
}
return false; //否则不选中
}
public bool AllowReference(Reference reference, XYZ position)
{
throw new NotImplementedException();
}
}
}
- 获取点Selection.PickPoint:
使用uIDocument.Selection.PickPoint()方法,获取点信息。
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
[Transaction(TransactionMode.Manual)]
public class Class : IExternalCommand //Alt+Enter
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//获取应用
UIApplication uiApp = commandData.Application;
Application App = uiApp.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
//使用点Selection,会显示点选点的三维坐标
XYZ xyz = uIDocument.Selection.PickPoint();
TaskDialog.Show("选取点",xyz+"");
//弹窗显示结果(-28.876987593, 165.312076437, 0.000000000)
}
}
}