1 创建项目

以Visual Studio作为开发工具,测试平台为Revit 2017

打开VS,创建一个C# .NET Framwork类库项目,选择。.net框架版本为.NET Framwork 4.5.2,确定。


2 项目设置

  1. 引用相关RevitAPI.dllRevitAPIUI.dll,根据情况设置这两个dll的复制本地属性,并更改项目平台目标x64

  2. VS自动为你创建的类名为class1,将这个类名更改为和你要实现的命令相关的名字,便于日后维护。这里我改为ElementInfo

  3. 引用相关命名空间:

    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
  4. 查看API,要在revit内部添加一个外部命令,就必须实现一个IExternalCommand接口。这个接口定义于RevitAPIUI.dll程序集内的Autodesk.Revit.UI命名空间下,我们已经引用了该命名空间,接下来就是继承这个接口并实现。这个接口只有一个Execute函数需要我们去实现。

  5. 继承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我这个命令执行完毕并成功。当然也可以写一些简单的语句进行测试。

  6. 此时我们右键项目,生成,就会在项目文件夹的bin\Debug目录下生成我们创建的插件dll。

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


3 业务代码编写

上面的工作相当于将前期设置给设置完成,并验证的整个框架的正确性。下面就是根据业务需求实现自己的业务目标。

假定现在我想得到所有选中的构件的一些属性信息。

  1. 首先需要从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;
    }

    其中UIApplicationUIDocumentDocument这些分别代表什么含义,可查看API中关于这些类的简介。

  2. 再查找API,发现我们想要的Revit选择集中的内容就在UIDocument类中,UIDocument类中有一个Selection属性,其具体描述如下:

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

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

  3. 循环访问每个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;
    }
  4. 重新编译生成,在Revit中用Addin Manager运行。

    若没有选择构件:

    若选择了构件:


4 结语

这个案例只是一个非常非常简单的外部命令案例,对于复杂的也类似,万变不离其宗,掌握了基本方法和思路,就能编写出复杂度更高的插件。

如有错误,恳请指正。


Murphy.L


Perhaps, we’ve just forgotten that we are still pioneers.

[Revit]开始:编写一个简单外部命令的更多相关文章

  1. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  2. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  3. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  4. 如何编写一个简单的Linux驱动(二)——设备操作集file_operations

    前期知识 如何编写一个简单的Linux驱动(一)--驱动的基本框架 前言 在上一篇文章中,我们学习了驱动的基本框架.这一章,我们会在上一章代码的基础上,继续对驱动的框架进行完善.要下载上一篇文章的全部 ...

  5. 如何编写一个简单的Linux驱动(二)——完善设备驱动

    前期知识 1.如何编写一个简单的Linux驱动(一)——驱动的基本框架 2.如何编写一个简单的Linux驱动(二)——设备操作集file_operations 前言 在上一篇文章中,我们编写设备驱动遇 ...

  6. 编写一个简单的COM组件

    参考网站:编写一个简单的COM组件_a ray of sunshine-CSDN博客 (1) 用MIDL编写.idl文件 //将以下代码保存成 IXIYIZ.idl 文件 //在命令行上进行编译,编译 ...

  7. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  8. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  9. javascript编写一个简单的编译器(理解抽象语法树AST)

    javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...

随机推荐

  1. ES6--变量

    声明变量 首先我们来回顾一下 es6 之前声明变量的方法:通常情况下,在 JavaScript 中,我们只有一种声明变量的关键字--var,我们使用 var 声明变量,使用 = 给变量赋值.在es6中 ...

  2. 2019年一半已过,这些大前端技术你都GET了吗?- 上篇

    一晃眼2019年已过大半,年初信誓旦旦要学习新技能的小伙伴们立的flag都完成的怎样了?2019年对于大前端技术领域而言变化不算太大,目前三大技术框架日趋成熟,短期内不大可能出现颠覆性的前端框架(内心 ...

  3. "A valid provisioning profile for this executable was not found"问题

    时间:2015年8月14日 初接触iOS,这两天真机调试的时候遇到了这个问题.如图所示: 上网查后发现,解决方法大致有以下两种: 1. provisioning profile没有被找到,需要重新导入 ...

  4. Core CLR Host 源码简单分析

    在定制 CLR Host的时候,可以通过调用如下代码,来获取当前需要被宿主的程序调用入口: hr = Host->CreateDelegate( domainId, L"Main,Ve ...

  5. 【部分转载】:【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)、最长下降子序列模版】

    二分 lower_bound lower_bound()在一个区间内进行二分查找,返回第一个大于等于目标值的位置(地址) upper_bound upper_bound()与lower_bound() ...

  6. Web容器启动中执行某个Java类

    1.监听(Listener) <!-- 配置监听 --> <listener> <listener-class>com.xian.jdbc.GetPropertie ...

  7. 开发一个Spring Boot Starter!

    在上一篇文章中,我们已经了解了一个starter实现自动配置的基本流程,在这一小结我们将复现上一过程,实现一个自定义的starter. 先来分析starter的需求: 在项目中添加自定义的starte ...

  8. Ubuntu 磁盘挂载错误

    一.错误 报错原因: 在删除或者复制移动时,磁盘或者u盘等外接硬件设备,忽然掉落(断掉,接口松动),在次挂载磁盘时就会出现错误 错误日志: $MFTMirr does not match $MFT ( ...

  9. 扩展欧几里德算法(递归及非递归实现c++版)

    今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就 ...

  10. Tomcat源码分析 (三)----- 生命周期机制 Lifecycle

    Tomcat里面有各种各样的组件,每个组件各司其职,组件之间又相互协作共同完成web服务器这样的工程.在这些组件之上,Lifecycle(生命周期机制)至关重要!在学习各个组件之前,我们需要看看Lif ...