一 重要的基本设置:

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进行引用。

真的太乱了!还是画图吧!其实最乱的就是Document和UIDocument,其主要区别在于Document中不能用seletion方法,因而其主要用过滤器过滤元素,而UIDocument中出现了大量有交互有关的方法。

三 最后贴一段代码,主要是IExternalCommand的使用,遍历了用seletion选择的元素

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;

namespace chapter2
{
    [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
    public class class1 : IExternalCommand//让class1继承这个接口中的方法,即Execute
    {

public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            try
            {
                
                UIApplication uIApplication = commandData.Application;
                UIDocument uIDocument = uIApplication.ActiveUIDocument;
                Document document = uIDocument.Document;
                List<ElementId> selectedElem = new List<ElementId>();
                List<Element> walls = new List<Element>();
                List<Element> beams = new List<Element>();
                List<ElementId> beamid= new List<ElementId>();
                
                int countW = 0;int countBeam = 0;
                foreach ( var id in uIDocument.Selection.GetElementIds())
                {
                      Element element=uIDocument.Document.GetElement(id);
                    if(element is Wall)
                    {
                        selectedElem.Add(id);
                        walls.Add(element);
                        countW++;
                    }
                    if (element is BeamSystem)
                    {
                        beamid.Add(id);
                        beams.Add(element);
                        countBeam++;
                    }
                    
                }
                TaskDialog.Show("hello revit","模型中共有"+countW.ToString()+"个墙"+countBeam.ToString()+"个柱");
                foreach(var wall in walls)
                { TaskDialog.Show("墙的编号是",wall.Name);}

TaskDialogResult taskDialogResult = TaskDialog.Show(
                    "revit",
                    "TES to continue," + "NO to cancel",
                    TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No);
                if(TaskDialogResult.Yes==taskDialogResult)
                {
                    return Result.Succeeded;
                }
                else if(TaskDialogResult.No == taskDialogResult)
                {
                    return Result.Cancelled;
                }
                else
                {
                    return Result.Failed;
                }
            }
            catch
            {
                message = "unexpected errors";
                return Result.Failed;
            }

//throw new NotImplementedException();
        }
    }

}

1. RevitAPI 基础(上)的更多相关文章

  1. .net在当前日期的基础上加一天

    比如今天是:2015-11-10 18:57:01,在这个基础上加一天,那么就是2015-11-11 18:57:01,代码如下: DateTime now_dt = DateTime.Now; ). ...

  2. 【JavaEE】SSH+Spring Security基础上配置AOP+log4j

    Spring Oauth2大多数情况下还是用不到的,主要使用的还是Spring+SpringMVC+Hibernate,有时候加上SpringSecurity,因此,本文及以后的文章的example中 ...

  3. 在cocos code ide的基础上构建自己的lua开发调试环境

    对于一种语言,其所谓开发调试环境, 大体有以下两方面的内容: 1.开发, 即代码编写, 主要是代码提示.补齐, 更高级一点的如变量名颜色等. 2.调试, 主要是运行状态下断点.查看变量.堆栈等. 现在 ...

  4. Android 工程在4.0基础上混淆

    Android现在对安全方面要求比较高了,我今天要做的对apk进行混淆,用所有的第三方工具都不能反编译,作者的知识产权得到保障了,是不是碉堡了. 一,首先说明我这是在4.0基础上进行的. 先看看pro ...

  5. 框架使用的技术主要是SpringMVC 在此基础上进行扩展

    框架使用的技术主要是SpringMVC 在此基础上进行扩展 1 Web前端使用 2 前段控制器采用SpringMVC零配置 3 IOC容器Spring 4 ORM使用 Mybites或者hiberna ...

  6. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  7. 【Xamarin开发 Android 系列 6】 Android 结构基础(上)

    原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...

  8. 在Livemedia的基础上开发自己的流媒体客户端

    一.背景 二.Livemedia框架介绍 1.总体框架 2.客户端框架 2.1 客户端openRTSP流程 2.2增加一种新的媒体 2.2.1增加媒体的format 2.2.2 新媒体需要考虑的问题 ...

  9. 使用mysqlbinlog工具的基础上及时恢复数据的位置或点

    使用mysqlbinlog工具的基础上及时恢复的位置或点 MySQL备份一般采取完全备份的形式加日志备份.让我们运行一个完整备份,每天.每小时运行二进制日志备份. 这样在MySQL Server故障后 ...

  10. 【转】Android 工程在4.0基础上混淆

    Android现在对安全方面要求比较高了,我今天要做的对apk进行混淆,用所有的第三方工具都不能反编译,作者的知识产权得到保障了,是不是碉堡了.   一,首先说明我这是在4.0基础上进行的.   先看 ...

随机推荐

  1. http://mirror2.openwrt.org/sources/

    http://mirror2.openwrt.org/sources/ Index of /sources/ ../ 1.0.4.3.arm 22-Dec-2008 20:29 93996 2.13. ...

  2. Controller中页面跳转完后页面的样式全消失的解决办法

    问题的原因应该是在controller中进行页面跳转时当前文件的路径变了 解决办法: 1.在jsp页面中<%@ page language="java" contentTyp ...

  3. java引用类型的浅拷贝与深拷贝理解

    1.浅拷贝 只会复制地址值,也就是同一个对象两个引用,只是复制了一个引用而已. 2.深拷贝 重新在堆里创建一个新对象给新引用,连同地址值也不一样. 首先要知道Object的clone()方法, pub ...

  4. CSV 文件的存取

    CSV 文件介绍 CSV(Comma-Separated Values),中文通常叫做逗号分割值.CSV文件由任意数目的记录(行)组成,每条记录由一些字段(列)组成,字段之间通常以逗号分割,当然也可以 ...

  5. 网络知识02:TCP/IP概述

    一  DOD模型 传输控制协议IRI特网协议(TCP/IP)组是由美国国防部(DOD)所创建的,主要用来确保数据的完整性及在毁灭性战争中保持通信 是由一组不同功能的协议组合在一起的协议簇 利用一组协议 ...

  6. CSP201903-2二十四点

    如图所示先处理乘号和除号,再处理加减. #include<bits/stdc++.h> using namespace std; ];int main(){ int n; cin>& ...

  7. QTableWiget的简单使用

    QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到QTableWidget,就必须讲一下它跟QTabelView的区别了.QTableWidge ...

  8. linux mysql 5.7.20 部署脚本+备份脚本

    一.官网下载源码包 源码包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 检查环境,卸载老版本mysql 二.自动部署脚本 进入文件目录,执行脚本 #!/bin ...

  9. 使用EF操作Docker中的Mysql实例

    为啥我会选择mysql呢?因为我的服务器配置较低,而SqlServer在docker中的实例,服务器的运行内存应当保持在2G+,我没有这个条件,它会爆出这样的错误 sqlservr: This pro ...

  10. LibreOJ6279. 数列分块入门 3 题解

    题目链接:https://loj.ac/problem/6279 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的前驱(比其 ...