[Revit]开始:编写一个简单外部命令
1 创建项目
以Visual Studio作为开发工具,测试平台为Revit 2017
打开VS,创建一个C# .NET Framwork类库项目,选择。.net框架版本为.NET Framwork 4.5.2,确定。

2 项目设置
引用相关
RevitAPI.dll和RevitAPIUI.dll,根据情况设置这两个dll的复制本地属性,并更改项目平台目标为x64。VS自动为你创建的类名为class1,将这个类名更改为和你要实现的命令相关的名字,便于日后维护。这里我改为
ElementInfo。引用相关命名空间:
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
查看API,要在revit内部添加一个外部命令,就必须实现一个
IExternalCommand接口。这个接口定义于RevitAPIUI.dll程序集内的Autodesk.Revit.UI命名空间下,我们已经引用了该命名空间,接下来就是继承这个接口并实现。这个接口只有一个Execute函数需要我们去实现。

继承
IExternalCommand接口,并实现接口。[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class ElementInfo : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
return Result.Succeeded;
}
}
这里我们
Execute函数里面只有一个返回Result.Succeeded的语句,即什么事情也不做直接返回成功,通知Revit我这个命令执行完毕并成功。当然也可以写一些简单的语句进行测试。此时我们右键项目,生成,就会在项目文件夹的
bin\Debug目录下生成我们创建的插件dll。

我们在Revit中使用
Addin Manager加载运行一下。选择我们创建的外部命令类,点击Run,试运行一下。什么也没有发生也没有报错,和我们预期的一样。

3 业务代码编写
上面的工作相当于将前期设置给设置完成,并验证的整个框架的正确性。下面就是根据业务需求实现自己的业务目标。
假定现在我想得到所有选中的构件的一些属性信息。
首先需要从Revit中选择构件,然后需要再用代码拿到这些构件的引用,要拿到这些,我们需要先拿到Revit中一些常用的object的引用。在我们
Execute函数中先添加如下代码:public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApplication = commandData.Application;
UIDocument uiDocument = uiApplication.ActiveUIDocument;
Document document = uiDocument.Document;
return Result.Succeeded;
}
其中
UIApplication、UIDocument、Document这些分别代表什么含义,可查看API中关于这些类的简介。再查找API,发现我们想要的Revit选择集中的内容就在
UIDocument类中,UIDocument类中有一个Selection属性,其具体描述如下:

点击具体介绍,可以看到这是个只读属性,返回一个
Selection对象。

再查看
Selection类,它有一个GetElementIds方法,该方法返回当前选择的Element的Id。有了元素Id,就能根据Id找到这个Element。这个方法的返回一个泛型接口对象,我们可以直接定义一个该类型的对象接收它。

循环访问每个ElementId对象,取出这个对象对代表的Element,再访问该Element的属性。
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApplication = commandData.Application;
UIDocument uiDocument = uiApplication.ActiveUIDocument;
Document document = uiDocument.Document;
ICollection<ElementId> selectedElIds = uiDocument.Selection.GetElementIds();
string info = "";
//判断用户是否选中了构件
if (selectedElIds.Count != 0)
{
//若选择集中至少含有一个构件,则循环访问每个ElementId
foreach (ElementId elementId in selectedElIds)
{
//根据ElementId得到Element
Element element = document.GetElement(elementId);
//将信息添加到info变量中
info += $"Id:{elementId.IntegerValue} Name:{element.Name}\n";
}
//利用Revit内置的对话窗口显示相关info信息
TaskDialog.Show("result", info);
}
else
{
//若选择集中至少含有一个构件,将提示信息返回给用户
TaskDialog.Show("result", "请先选择构件");
}
return Result.Succeeded;
}
重新编译生成,在Revit中用Addin Manager运行。
若没有选择构件:

若选择了构件:

4 结语
这个案例只是一个非常非常简单的外部命令案例,对于复杂的也类似,万变不离其宗,掌握了基本方法和思路,就能编写出复杂度更高的插件。
如有错误,恳请指正。
Murphy.L
Perhaps, we’ve just forgotten that we are still pioneers.
[Revit]开始:编写一个简单外部命令的更多相关文章
- 编写一个简单的C++程序
编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 如何编写一个简单的Linux驱动(二)——设备操作集file_operations
前期知识 如何编写一个简单的Linux驱动(一)--驱动的基本框架 前言 在上一篇文章中,我们学习了驱动的基本框架.这一章,我们会在上一章代码的基础上,继续对驱动的框架进行完善.要下载上一篇文章的全部 ...
- 如何编写一个简单的Linux驱动(二)——完善设备驱动
前期知识 1.如何编写一个简单的Linux驱动(一)——驱动的基本框架 2.如何编写一个简单的Linux驱动(二)——设备操作集file_operations 前言 在上一篇文章中,我们编写设备驱动遇 ...
- 编写一个简单的COM组件
参考网站:编写一个简单的COM组件_a ray of sunshine-CSDN博客 (1) 用MIDL编写.idl文件 //将以下代码保存成 IXIYIZ.idl 文件 //在命令行上进行编译,编译 ...
- 使用CEF(二)— 基于VS2019编写一个简单CEF样例
使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
- javascript编写一个简单的编译器(理解抽象语法树AST)
javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...
随机推荐
- 考试安排查询脚本(CUP)
去年热情高涨的时候心血来潮做了个简易的查询脚本,限于当时技术水平(菜),实现得不是很好,这几天终于想起来填坑了.环境依赖: brew install python3 pip3 install requ ...
- 【Android】INSTALL_FAILED_UPDATE_INCOMPATIBLE
多是因为已经安装过该 apk 文件了,一般卸载了重新运行就 OK 了.
- 使用阿里云对docker拉取镜像加速
使用docker的时候,总是需要去search镜像,使用国外的源下载太慢,还有诸多的限制,无意中发现可以使用阿里云进行加速,实测有用,废话少说,操作如下: 1.打开阿里云控制台,没有的可以用淘宝账号或 ...
- Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353)
Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353) 一.漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中,jenkins利用此通道来接收命令,恶 ...
- S2:ArrayList
1.ArrayList ArrayList非常类似于数组,也有人称它为数组列表,ArrayList可以动态维护. 因为数组的长度是固定的,而SArrayList的容量可以根据需要自动扩充. Arr ...
- C语言编程入门之--第五章C语言基本运算和表达式-part1
导读:程序要完成高级功能,首先要能够做到基本的加减乘除.本章从程序中变量的概念开始,结合之前学的输出函数和新介绍的输入函数制作简单人机交互程序,然后讲解最基础的加减法运算,自制简单计算器程序练手. 5 ...
- 【错误】【vscode】"'#' not expected here"
今天使用vscode发现完整的代码报错了,但依然可以运行
- Scala基础语法学习(一)
1. val和var的区别 val定义的是一个常量,无法改变其内容 scala> val s = 0 s: Int = 0 scala> s = 2 <console>:12: ...
- Oauth2认证模式之授权码模式实现
Oauth2认证模式之授权码模式(authorization code) 本示例实现了Oauth2之授权码模式,授权码模式(authorization code)是功能最完整.流程最严密的授权模式.它 ...
- 深入浅出Apriori关联分析算法(一)
在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加.这家超市的名字叫做沃尔玛. 你会不会觉得有些不可思议?虽然事 ...