欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[Revit]开始:编写一个简单外部命令

程序员文章站 2023-11-14 17:07:22
1 创建项目 以Visual Studio作为开发工具,测试平台为Revit 2017 打开VS,创建一个C .NET Framwork类库项目,选择。.net框架版本为 ,确定。 2 项目设置 1. 引用相关 和`RevitAPIUI.dll 复制本地 平台目标 x64`。 2. VS自动为你创建 ......

1 创建项目

以visual studio作为开发工具,测试平台为revit 2017

打开vs,创建一个c# .net framwork类库项目,选择。.net框架版本为.net framwork 4.5.2,确定。
[Revit]开始:编写一个简单外部命令


2 项目设置

  1. 引用相关revitapi.dllrevitapiui.dll,根据情况设置这两个dll的复制本地属性,并更改项目平台目标x64
  2. vs自动为你创建的类名为class1,将这个类名更改为和你要实现的命令相关的名字,便于日后维护。这里我改为elementinfo
  3. 引用相关命名空间:
    csharp using autodesk.revit.db; using autodesk.revit.ui;
  4. 查看api,要在revit内部添加一个外部命令,就必须实现一个iexternalcommand接口。这个接口定义于revitapiui.dll程序集内的autodesk.revit.ui命名空间下,我们已经引用了该命名空间,接下来就是继承这个接口并实现。这个接口只有一个execute函数需要我们去实现。
    [Revit]开始:编写一个简单外部命令

  5. 继承iexternalcommand接口,并实现接口。
    csharp [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。
    [Revit]开始:编写一个简单外部命令

  7. 我们在revit中使用addin manager加载运行一下。选择我们创建的外部命令类,点击run,试运行一下。什么也没有发生也没有报错,和我们预期的一样。
    [Revit]开始:编写一个简单外部命令


3 业务代码编写

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

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

  1. 首先需要从revit中选择构件,然后需要再用代码拿到这些构件的引用,要拿到这些,我们需要先拿到revit中一些常用的object的引用。在我们execute函数中先添加如下代码:
    ```csharp
    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属性,其具体描述如下:
    [Revit]开始:编写一个简单外部命令

    点击具体介绍,可以看到这是个只读属性,返回一个selection对象。
    [Revit]开始:编写一个简单外部命令

    再查看selection类,它有一个getelementids方法,该方法返回当前选择的element的id。有了元素id,就能根据id找到这个element。这个方法的返回一个泛型接口对象,我们可以直接定义一个该类型的对象接收它。
    [Revit]开始:编写一个简单外部命令

  3. 循环访问每个elementid对象,取出这个对象对代表的element,再访问该element的属性。
    ```csharp
    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运行。
    若没有选择构件:
    [Revit]开始:编写一个简单外部命令

    若选择了构件:
    [Revit]开始:编写一个简单外部命令


4 结语

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

如有错误,恳请指正。


murphy.l

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