RevitAPI(一)应用类Application与文档类Document

最近在练习与熟悉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;

           
        }
    }
}

  • 38
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值