Revit二次开发学习笔记1

  • 20220314:
    • 概念:Application与Document
    • 接口函数:IExternalCommand、ActiveView与Selection
  • 20220316
    • 事务:Transaction、Category
  • 后续学习笔记全部记录于有道云,需要文档的请联系本人“QQ:1478151426”

20220314:

  将Revit二次开发入门的基本概念、接口使用方法知识点进行整理:

  • 概念:
    UIApplication、Application、UIDocument、Document
  • 接口函数:
    IExternalCommand接口、活动窗口ActiveView、拉进显示要素ShowElements、单选要素Selection.PickObject、多选要素Selection.PickObjects、获取点Selection.PickPoint

概念:Application与Document

1、Revit 应用类:UIApplication 和 ApplicationUIApplication:表示一个活动的Revit会话,提供了对UI定制、事件及活动文档的访问Application:表示一个Revit应用,提供对文档、选项及其他应用范围的数据的访问和设置理解:
2、Revit文档类:UIDocument 和 DocumentUIDocument:包含根UI相关的文档信息和操作,例如:ActiveView 和 ShowElementSelection:用于选择Revit模型ShowElements:显示适当的元素视图管理:①ActiveView:返回或设置当前文档的活动视图②RefershActiveView:刷新当前文档的活动视图Document:对象:用于存储Revit的元素、管理视图和数据类:提供获取管理元素、文件管理等功能理解:UIDocument能get和set Document只能get

接口函数:IExternalCommand、ActiveView与Selection

  • 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);//获取活动视图名及IDUIDocument 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)}}
}

20220316

事务:Transaction、Category

  • 事务介绍:
事务:Transaction
增删改的操作要开启事务,提交事务才能写入文档
事务分为三大类:1、Transaction2、SubTransaction3、TransactionGroup事务主要方法:
1、Start启动事务
2、Commit结束事务并提交所有的修改到文档中
3、RollBack结束事务并撤销对文档的所有的修改
4、GetStatue返回当前事务的状态Started:事务已启动RolltedBack:事务成功撤销Committed:事务成功提交Uninitialized:事务已经初始化Pending:事务试图被提交或撤销。但由于出错,处理还未结束,还在等待用户响应。
5、Assimilate:将多个事务合并(TransactionGroup使用)
  • 创建事务:
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;using (Transaction transaction = new Transaction(document, "新建事务")){transaction.Start();//开启事务//获取参考,类似于Input函数,需要使用者选中对象作为输入Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);//根据参考获取要素FamilyInstance elem = document.GetElement(reference) as FamilyInstance;//得到底部高度参数Parameter parameter = elem.get_Parameter(BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM);//对于自己定义的参数,BuiltInParameter无对应类型,显示无效,我们需要使用lookup获取参数//elem.LookupParameter("pl");//根据参数名称直接获取//revit使用的是英尺,需要转换成需要的单位parameter.Set(ToMM(100));//使用Set还是SetValueString,取决于修改值得数据类型(StorageType)transaction.Commit();//提交并结束事务}}#region 将传入的英尺转化为mm/// <summary>/// 英尺转毫米/// </summary>/// <param name="val">英尺</param>/// <returns>毫米</returns>public static double ToMM(double val){return UnitUtils.ConvertToInternalUnits(val, DisplayUnitType.DUT_MILLIMETERS);}#endregion}
}
  • 创建事务组:
    事务组是事务的集合,事务组内部需要包含事务,但事务组可一次撤销
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;//事务组:用于包含多个事务,可一次撤销事务组using (TransactionGroup transactionGroup = new TransactionGroup(document, "事务组")){transactionGroup.Start();//多个事务或事务循环int i = 0;while (i < 3){using (Transaction transaction = new Transaction(document, "新建事务")){transaction.Start();Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);FamilyInstance elem = document.GetElement(reference) as FamilyInstance;//得到底部高度参数Parameter parameter = elem.get_Parameter(BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM);//我们输入的100是100英尺,绘图单位是mm,需要转换parameter.Set(ToMM(10));//使用Set还是SetValueString,取决于修改值得数据类型(StorageType)transaction.Commit();i++;}}transactionGroup.Assimilate();}return Result.Succeeded;}#region 将传入的英尺转化为mm/// <summary>/// 英尺转毫米/// </summary>/// <param name="val">英尺</param>/// <returns>毫米</returns>public static double ToMM(double val){return UnitUtils.ConvertToInternalUnits(val, DisplayUnitType.DUT_MILLIMETERS);}#endregion}
}
  • 类别Category:
Category:所有基类为Element类的元素都有一个Category属性,用以表示这个元素的类别。Document.Settings提供了Category属性
Categories分类:1、模型类别Model Categories:包括梁、柱、门、窗、墙等2、标注类Annotation CateGories:包括尺寸、网格、标高、文本标注等
BuiltInCategory包含各种类别

后续学习笔记全部记录于有道云,需要文档的请联系本人“QQ:1478151426”

Revit二次开发学习笔记相关推荐

  1. 关于Revit 二次开发学习书籍

    经常有朋友问到Revit学习书籍的事,说网上或书店都找不到Revit二次开发的书籍.确实现在尚没有一本比较系统介绍Revit二次开发的中文书籍. 随着Revit SDK2012 有一个 Revit开发 ...

  2. Revit 及 Revit二次开发入门笔记

    加入BIM相关行业后,虽然是个门外汉,但是还是下决心好好钻研,尽快创造些价值. BIM中很关键的软件Revit已下载.我下载的是2017版本,看了几节Revit视频教程,算是有了初步的了解.因为我的工 ...

  3. 基于C#的中望CAD二次开发学习笔记(1)环境测试

    目录 前言 一.ZRXSDK的安装使用 二.创建项目 三.编写环境测试代码 四.在ZWCAD中测试 参考资料 总结 前言 作为一个设计院搬砖人,和各种CAD打交道是必不可少的.当然,其中最为正统的是A ...

  4. 引用:基于C#的中望CAD二次开发学习笔记

    目录 前言 一.ZRXSDK的安装使用 二.创建项目 三.编写环境测试代码 四.在ZWCAD中测试 参考资料 总结 前言 作为一个设计院搬砖人,和各种CAD打交道是必不可少的.当然,其中最为正统的是A ...

  5. AUTOCAD 二次开发学习笔记

    图层处理: ​​​​​​(16条消息) C#之CAD二次开发实例 (13) 图层操作_yzk1062913581的博客-CSDN博客 (16条消息) .NET AutoCAD二次开发之路(二.直线篇) ...

  6. C#进行CAD二次开发学习笔记--02

    目录 Editor 拖动类EntityJig 选择集 Editor 在C#进行CAD二次开发时,Editor类是一个特别有用的类.它提供了大量常用的接口函数,比如: // 拖动相关接口 public ...

  7. arcgis 二次开发学习笔记(一):了解二次开发有关的软件及其之间的关系

    [废话篇]今天是大三开学的第一天课,终于意识到我口中念念不忘却没付出实际行动的"考研"来了.考研目标现在为止还没有很明确,只是不甘屈于人后.周围太多生活得很辛苦的人,只是不愿意我这 ...

  8. AutoCAD2019+vs2019+C# 二次开发学习笔记day01(持续更新)

    目录 一.新建项目 1.应用程序 目标框架 选择 4.7.2版 2.生成 目标平台选择x64 3.调试 启动外部程序 选择 acad.exe 二.添加autocad类库 三.如何运用命名空间 1.[C ...

  9. C#进行CAD二次开发学习笔记-01

    一些基础知识 需要引用CAD的库文件 常用接口和类 与C++ ---- ObjectArx库的一些区别 需要引用CAD的库文件 accoremad.dll acdbmgd.dll acmgd.dll ...

最新文章

  1. Linux 操作系统原理 — 进程与线程管理
  2. 十分简洁的手机浏览器 lydiabox
  3. 李嘉诚亲自指导:阿尔法狗战何洁
  4. 利用OracleCommandBuilder实现 datatable与数据库的增删改
  5. Yoga710笔记本Win10和Ubuntu系统共存
  6. 服务器连接硬盘出错,在服务器上使物理磁盘资源联机时出错 - Windows Server | Microsoft Docs...
  7. 使用logdashboard进行可视化的日志追踪
  8. 多线程篇-NSThread-简单使用
  9. 赋值运算符、逻辑运算符、表达式
  10. 循环神经网络-Recurrent Neural Networks
  11. 【学习笔记】白盒及黑盒测试方法简介
  12. mysql 不允许保存修改_解决SQL SERVER 2014 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或者启用了阻止保存要求重新创建表的更改选项...
  13. Android航海航线地图,航海王热血航线东南之海宝藏一览
  14. linux触摸屏应用程序开发,linux触摸屏(一)编写触摸屏应用
  15. 从tushare pro获取上证指数内成分股权重排序分出等级
  16. mysql 分离和附加数据库_分离数据库和附加数据库有什么区别
  17. Cut-Off Wavelength in fiber(光纤的截止波长)
  18. 大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
  19. 计算机网络实验之Cisco Packet Tracer 实验
  20. 西安电子科技大学-信号与线性系统大作业-歌曲人声消除

热门文章

  1. java毕业生设计校园易购二手交易平台计算机源码+系统+mysql+调试部署+lw
  2. 记自己发现的—SM2国密算法应用的高危漏洞—CVE-2021-3711
  3. 招投标(政府采购) 流程及注意事项
  4. 最新最全论文合集——ISCA 历年最佳论文汇总
  5. 用友u8修改服务器id,用友u8服务器地址修改
  6. 百度百科词条怎么做?百度百科词条创建攻略分享
  7. android 数据显示成功,android如何将从数据库读取的数据显示在listview中?
  8. 用计算机做初中模拟物理实验,利用虚拟实验室提高初中生物理实验的兴趣.docx...
  9. 各国国旗知识学习,你认识多少,快来看看吧
  10. RF3401M蓝牙对讲无线音频发射接收串口数据透传芯片模块方案--KT3401B芯片