最近在练习与熟悉Revit API,开始整理总结一些常用的API与用法
一 应用类Application
应用类包括UIApplication和Application两大类
1.Application
Application表示一个Revit应用,提供对文档、选项及其它应用范围的数据的访问和设置。
2.UIApplication
表示一个活动的Revit会话,提供了对UI定制、事件以及活动文档的访问。
二 文档类Document
文档类主要分为UIDocument和Document两大类
1.Document
· Document对象用于存储Revit的元素、管理视图和数据
· Document类主要提供获取管理元素、文件管理等功能
2.UIDocument
· 主要包含了跟UI相关的文档信息和操作,比如ActiveView和ShowElement
· Selection属性用来选择Revit模型
· ShowElements方法显示适当的元素
· 视图管理
· ActuveView属性可以返回或设置当前的文档的活动视图
·RefershActiveView()方法可一用来刷新当前文档的活动视图
以上是《AUTODESK REVIT二次开发基础教程》里对Application与Document的一些介绍,作为初学者还是有些一头雾水的。
三 重要的基本设置
1. 类库:revitAPI.DLL, revitAPIUI.DLL,个人认为前者包括了revit软件所特有的数据类型及软件中存在的全部后台数据,而后者是包含了大量与实现UI交互相关的接口,主要IExternalCommand, IExternalApplication, Seletion选择功能, 菜单制作与任务对话框的制作
2. IExternalCommand:规定了外部命令扩展功能的接口供类(class)使用,只有一个抽象函数Execute,其有三个参数,commandData(输入参数,主要是Application, View, JournalData三种类型),message(输出参数,以string类为主,主要用来返回错误信息),elements(错误发生后高亮显示的元素)。
3.IExternalApplication:个人理解这个接口主要用于实现已有解决方案的拼接。这个接口本身定义了OnStartup和OnShutdown两个函数用于拼接已存在的dll以及定制UI,其不提供直接操作软件后台数据的方法。
4.IExternalDBApplication:这个口用于处理数据库级别的事件(即不涉及UI交互的后台数据增删改查),本质是3的一种特殊形式,其也通过上述两个方法拼接解决方案,但未提供定制UI的方法。
5.在继承IExternalCommand接口之前,必须定义事务Transaction的处理方式[Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]。除mannual外还有两个readonly与Automatic两种。
四 Revit文档的获取
commandData, UIApplication, Application, DocumentSet, Documents, Document, ActiveDocument之间的关系。
commandData:
revit后台数据的集合及相关的属性信息
UIApplication:
后台数据的集合,只能通过Application方法引用,commandData和两种document都包含UIApplication。
UIDocument:
个人理解其表示可交互的文档中包含信息的集合,并提供了通过不同UI交互过程提取信息的方法,如seletion交互获取文档,只能通过uiapplication进行引用。
ActiveDocument:当前的活动文档,只能通过uidocument进行引用,是UIdocument的一部分。
Document:代表一个独立的工程文件,不一定是最顶级的。ActiveUIDocument.Document代表引用了当前活动文档。Documents代表后台中的全部文档,只能用Application.Documents进行引用。
五 事务主要方法
1.Start启动事务
2.Commit结束事务并是交所有的修改到文档中
3.RollBack结束事务并撤销对文档的所有的修改
4.GetStatue返回当前事务的状态
· Started事务已经启动
· RolltedBack事务成功撤销
· Committed事务成功提交
· Uninitialized事务已经初始化
· Pending事务试图被提交或撤销。但由于出错,处理还未结束,还在等待用户响应。一但错误处理完状态会更新为已提交或撤销(Committed或RolltedBack)
5.Assimilate方法将多个事务合并TransactionGroup用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.UI.Selection;
namespace Selection
{
[Transaction(TransactionMode.Manual)]
public class SelectionTest : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//UIApplication表示一个活动的Revit@会话,提供了对UI定制、事件以及活动文档的访问。
UIApplication uIApplication = commandData.Application;
//Application类表示一个Revit应用,提供对文档、选项以及其他应用范围的数据的访问和设置。
Application app = uIApplication.Application;
LanguageType languageType = app.Language;
TaskDialog.Show("语言类型",languageType.ToString());
//主要包含了跟UI相关的文档信息和操作,比如Active View和ShowElement
UIDocument uIDocument = uIApplication.ActiveUIDocument;
//用与存储Revit的元素、管理视图和数据
Document doc = uIDocument.Document;
//视图
View view = uIDocument.ActiveView;
TaskDialog.Show("当前视图", view.Name);
uIDocument.ActiveView = doc.GetElement(new ElementId(70032)) as View;
view = uIDocument.ActiveView;
TaskDialog.Show("当前视图", view.Name);
//UIDocument的Selection属性
Reference reference = uIDocument.Selection.PickObject(ObjectType.Element);
Element element=doc.GetElement(reference);
TaskDialog.Show("选中的属性", element.Name);
//带过滤器的批量选中
IList<Reference> references = uIDocument.Selection.PickObjects(ObjectType.Element,new SelectionFilter());
StringBuilder stringBuilder = new StringBuilder();
foreach(Reference reference1 in references)
{
Element ele= doc.GetElement(reference1);
stringBuilder.AppendLine(ele.Name.ToString());
}
TaskDialog.Show("选中的属性", stringBuilder.ToString());
//选中点
XYZ xyz=uIDocument.Selection.PickPoint();
TaskDialog.Show("坐标", "XYZ" + xyz);
//事务状态与参数设置
using (Transaction transaction = new Transaction(doc, "事务测试"))
{
//开启事务
transaction.Start();
TransactionStatus transactionStatus =transaction.GetStatus();
TaskDialog.Show("事务状态", transactionStatus.ToString());
Reference reference1 = uIDocument.Selection.PickObject(ObjectType.Element);
Element ele= doc.GetElement(reference1);
//通过参数类别获得参数
Parameter parameter = ele.get_Parameter(BuiltInParameter.DOOR_NUMBER);
//无参数类别时通过lookup获取
Parameter parameter1 = ele.LookupParameter("顶部偏移");
parameter.Set("测试");
//扩展方法完成单位转换
parameter1.Set(1000.0.Tofoot());
transaction.Commit();
TaskDialog.Show("事务状态", transaction.GetStatus().ToString());
}
//事务组,.Assimilate()能合并多个事务为一个事务组,多个事务可作为一个事务同时回滚撤销
using (TransactionGroup transactiongroup = new TransactionGroup(doc, "事务组"))
{
//开启事务
transactiongroup.Start();
int i = 0;
while(i++<2)
{
using (Transaction transaction = new Transaction(doc, "事务测试"))
{
//开启事务
transaction.Start();
Reference reference1 = uIDocument.Selection.PickObject(ObjectType.Element);
Element ele = doc.GetElement(reference1);
Parameter parameter = ele.get_Parameter(BuiltInParameter.DOOR_NUMBER);
parameter.Set("测试");
transaction.Commit();
}
}
//合并多个事务并关闭
transactiongroup.Assimilate();
}
return Result.Succeeded;
}
}
}