Autodesk Revit

原创 2007年09月12日 15:37:00

Autodesk Revit

07.06 Lee den198@hotmail.com

 

Revit简介... 2

Revit图元分类... 2

Revit名词定义... 2

Revit二次开发... 3

开发环境和语言... 3

如何编写二次开发程序... 3

二次开发讲解... 7

命令扩展... 7

类图结构... 8

对象模型结构... 9

对象模型继承关系... 9

部分RevitAPI 解释... 10

访问数据库API 10

枚举数据库内的对象... 10

3D模型对象的访问... 10

获取柱的类型... 11

获取墙的两端点和中点坐标... 11

插入柱并移动墙... 11

族、族类型、族实例... 12

遍历族... 12

遍历族的类型... 12

加载族和类型... 13

获取对象所属的族和类型... 13

获取已加载的窗户类型(FamilySymbol) 13

获得实例的类别( Category) 13

列出类别(Category)的所有类型(FamilySymbol... 13

列出所有的楼板类型的族名和类别名... 14

修改墙和楼板实例的类型... 14

访问参数... 14

循环Element的所有参数... 14

访问某一个内置参数... 15

用名字访问参数... 15

 

 

Revit简介

Revit是一个系列软件,它包含了:

l       Autodesk Revit Building Suit à 针对建筑;

l       Autodesk Revit Structure Suite à 针对结构;

l       Autodesk Revit MEP Suite à 针对暖通、电、给排水;

 

Revit图元分类

 

Revit名词定义

l        族:具有共同参数(属性)集的、使用相似图形表示的相同、用途的图元集。

n        系统族,标准构件族,内建族

n        参数:参数类型/参数分组方式/规程

n        子类别

l        类型:具有特定参数(属性)值的族。

l        实例:项目中实际使用的单个图元。

l        视图:

n        平面视图:楼层平面视图是新项目的默认视图。大多数项目至少包含一个楼层平面。

n        立面/剖面:项目缺省包含东、西、南、北四个立面视图,用户可以添加立面和剖面。

n        三维:透视图和轴侧视图

n        参照视图

n        详细程度/可见性/视图范围/颜色方案

n        隐藏/隔离,图形替换

l        图纸:

n        文字:静态内容。

n        标签:随项目信息,图纸信息而变的内容。

n        项目信息

n        图纸信息:图纸图元的属性。

 

Revit二次开发

开发环境和语言

l        Microsoft Visual Studio 2005

l        Microsoft .NET Framework 2.0

l        引用组件文件"RevitAPI.dll"

l        C# or VB.NET(或者托管代码下的C++)

l        具有相同的RevitAPI.DLLRevit二次开发的依赖API所有函数均在该DLL内);

l        某些功能仅存在于Revit StructureRevit Architecture中;

l        Revit的各个系列软件的二次开发API库使用的是同一个DLL,即RevitApi.dll

 

如何编写二次开发程序

如何做一个二次开发应用程序:VS2005

新建一个新的C# Windows Control Library工程。点击OK

打开Class1.cs类文件和引用(reference包)

C:/Documents and Settings/Administrator/桌面/Autodesk Revit 培训总结070616李宁.files/image012.png

References右键点击Add Reference,弹出下面的对话框

找到Revit安装目录内的Program/RevitAPI.dll,单击确定将该库加入到程序当中。

此时Reference下会出现 组件块,表明RevitApi已经加入程序当中。

class1.cs文件中加入其它的依赖组件库名称:

using Autodesk.Revit;

using Autodesk.Revit.Elements;

using Autodesk.Revit.Symbols;

using Autodesk.Revit.Parameters;

using System.Collections;

下面为一个程序例子

namespace HelloRevit

{

    public class HelloRv: IExternalCommand

    {

        public IExternalCommand.Result Execute(

            ExternalCommandData elementData,

            ref string message, ElementSet set)

        {

            Autodesk.Revit.Application app = elementData.Application;

            Document doc = app.ActiveDocument;

            string catName = app.ActiveDocument.Settings.Categories.get_Item(BuiltInCategory.OST_Doors).Name;

            ElementSet doorInstances = GetSelectDoorElements(app, catName);

 

            ElementSetIterator set_Itor = doorInstances.ForwardIterator();

            Parameter parBuiltIn;

            while (set_Itor.MoveNext())

            {

                Element elt = set_Itor.Current as Element;

                parBuiltIn = elt.get_Parameter(BuiltInParameter.INSTANCE_HEAD_HEIGHT_PARAM);

                if(parBuiltIn != null)

                    MessageBox.Show(parBuiltIn.AsString());

            }

           return IExternalCommand.Result.Succeeded;

        }

        public ElementSet GetSelectDoorElements(Autodesk.Revit.Application revitApp, string catName)

        {

            ElementSet elems = revitApp.ActiveDocument.Selection.Elements;

            ElementSetIterator iter = elems.ForwardIterator();

            while (iter.MoveNext())

            {

                Element elem = iter.Current as Element;

                // First check for the class, then for specific category name

                if (elem is FamilyInstance)

                {

                    try

                    {

                        if (elem.Category.Name.Equals(catName))

                        {

                            elems.Insert(elem);

                        }

                    }

                    catch (System.Exception)

                    {

                    }

                }

            }

            return elems;

        }

    }

    public class AppMenu : IExternalApplication

    {

        public IExternalApplication.Result OnStartup(ControlledApplication application)

        {

            return IExternalApplication.Result.Succeeded;

        }

 

        public IExternalApplication.Result OnShutdown(ControlledApplication application)

        {

            return IExternalApplication.Result.Succeeded;

        }

 

    }

}

C:/Documents and Settings/Administrator/桌面/Autodesk Revit 培训总结070616李宁.files/image018.png

编写完成后右键点击Build菜单,找到编译后DEBUGdll文件地址。

Revit安装目录下找到Revit.INI文件,加入扩展命令的注册。

[ExternalCommands]

ECCount=1

 

ECName1=HelloRevit

ECDescription1=Revir Program

ECAssembly1=H:/Revit/MySample/HelloRevit/HelloRevit/bin/Debug/hellorevit.dll

ECClassName1=HelloRevit.HelloRv

 

l       ECCountà表示外部扩展命令的条数

l       ECNameà要在工具箱内显示的名称

l       ECDescriptionà表示要在状态栏下显示的名字

l       ECAssemblyà表示要加载的扩展dll文件地址

l       ECClassNameà表示要加载的命令的namespace.class

当该条目配置完毕后再Revit的外部工具下就可以使用该命令了,如下图所示:

 

二次开发讲解

命令扩展

扩展Revit程序必须实现

1.       Autodesk.Revit.IExternalCommand 接口

2.       IExternalCommand.Execute 方法

中的一个,具体的实现方法为:

public class HelloWorld : IExternalCommand

{

public IExternalCommand.Result Execute(

                                                               ExternalCommandData commandData,

                                                               ref string message,

                                                               ElementSet elements )

{

…….. // 在此输入你的代码.

返回值为

return IExternalCommand.Result.…;

}

}

CommandRevit下的扩展名词为:

[ExternalCommands]

ECCount=<n>

ECName<i> = Export Fire Rating

ECDescription<i> = Export fire rating values to an Excel file

ECClassName<i> = Revit.SDK.Samples.FireRating.VB.NET.ExportFireRating

ECAssembly<i> = C:/Revit/SDK/Samples/FireRating/VB.NET/bin/Debug/FireRating.dll

实现Autodesk.Revit.IExternalApplication 接口

实现

l        OnStartup()程序启动时调用

l        OnShutdown() 程序结束时调用

public class App : IExternalApplication

{

 public IExternalApplication.Result

 OnStartup( ControlledApplication application )

 {

 AddMenu( application );

 AddToolbar( application );

 return IExternalApplication.Result.Succeeded;

 }

 public IExternalApplication.Result

 OnShutdown( ControlledApplication application )

 { return IExternalApplication.Result.Succeeded;

 }

}

ApplicationRevit下的扩展名词为:

[ExternalApplications]

EACount=2

EAName1=Revit Structure Link

EAClassName1=RSLinkRevitApp.RsApp

EAAssembly1=C:/a/j/adn/rst/rst_api/RSLinkRevitApp/bin/Debug/RSLinkRevitApp.dll

EADescription1=Revit Structure Link Sample

EAClassName2=RvtMgdDbg.App

EAAssembly2=C:/Program Files/Revit Architecture 2008/Program/RvtMgdDbg.dll

 

类图结构

对象模型结构

对象模型继承关系

 

部分RevitAPI 解释

访问数据库API

l        ExternalCommandData-> Application->Document->Elements/Selection->ElementDocument对象有Elements, Selection属性ExternalCommandData对象来自于接口传入参数。

l        所有的Element对象都被包在Elements 集合中,只能通过Document.Elements集合和Document.Selection集合来访问Element对象

l        遍历器:用来遍历集合的类

枚举数据库内的对象

Element elem;

ElementIterator iter =commandData.Application.ActiveDocument.Elements;

while( iter.MoveNext() )

{

         elem = iter.Current as Element;

         //elem的操作代码

         …….

}

3D模型对象的访问

public static ElementSet GetAllModelElements( Autodesk.Revit.Application

revitApp )

{

……..

ElementIterator iter = revitApp.ActiveDocument.Elements;

while( iter.MoveNext() )

{

Autodesk.Revit.Element elem = iter.Current as

Autodesk.Revit.Element;

if( !( elem is Symbol || elem is FamilyBase ) )

if( null != elem.Category )

if( null != elem.get_Geometry( opt ) )

elems.Insert( elem );

return elems;

}

获取柱的类型

public static FamilySymbol GetFamilySymbol( Document doc, string familyName, string

typeName )

{

ElementIterator iter = doc.Elements;

while (iter.MoveNext())

{

Element elem = iter.Current as Element;

if( elem is Family )

{

Family fam = elem as Family;

if( fam.Name.Equals( familyName ) )

{

foreach( FamilySymbol sym in fam.Symbols )

{

if( sym.Name.Equals( typeName ) )

{

return sym;

} } } } }}

获取墙的两端点和中点坐标

XYZArray locations = new XYZArray();

LocationCurve locCurve = wall.Location as LocationCurve;

XYZ ptStart = locCurve.Curve.get_EndPoint( 0 );

XYZ ptEnd = locCurve.Curve.get_EndPoint( 1 );

XYZ ptMid = new XYZ( 0.5 * (ptStart.X + ptEnd.X), 0.5 * (ptStart.Y +

ptEnd.Y), 0.5 * (ptStart.Z + ptEnd.Z) );

插入柱并移动

l        在墙两端和中点处插入柱,并将柱顶约束到墙的顶楼层

XYZ p = new XYZ( pt.X, pt.Y, pt.Z );

FamilyInstance column = doc.Create.NewFamilyInstance( ref p, symbol,

botLev, Autodesk.Revit.Structural.Enums.StructuralType.NonStuctural );

Parameter paramTopLevel = column.get_Parameter(

BuiltInParameter.FAMILY_TOP_LEVEL_PARAM );

ElementId id = topLev.Id;

paramTopLevel.Set( ref id );

l        移动墙

XYZ wallPerpAxis = new XYZ( -(ptEnd.Y - ptStart.Y), ptEnd.X - ptStart.X,

0 );

wall.Location.Move( ref wallPerpAxis )

创建与编辑Revit对象

族、族类型、族实例

——Family

族类型——FamilySymbol

族实例——FamilyInstance

遍历族

while( iter.MoveNext() ){

elem = iter.Current as Element;

if( elem is Family ){

Family fam = elem as Family;

string famCatName;

try {

famCatName = fam.Category.Name;}

catch( Exception ) {

famCatName = "?";}

sMsg += "/r/n Name=" + fam.Name + "; Category=" +

famCatName;}}

遍历族的类型

foreach( FamilySymbol symb in fam.Symbols ) {

 if( first ) {

 first = false;

 try {

 catName = symb.Category.Name; }

 catch( Exception ) {

 catName = "?"; }

 sMsg = "Family: Name=" + fam.Name

 + "; Id=" + fam.Id.Value.ToString()

 + "; Category=" + catName

 + "/r/nContains Types:"; }

 sMsg += "/r/n " + symb.Name + "; Id=" +

symb.Id.Value.ToString();

加载族和类型

Document.LoadFamily()

Document.LoadFamilySymbol()

获取对象所属的族和类型

获取已加载的窗户类型(FamilySymbol)

 Category catWindows = doc.Settings.Categories.get_Item(

 BuiltInCategory.OST_Windows );

 while( iter.MoveNext() ) {

 elem = iter.Current as Element;

 if( elem is FamilySymbol ) {

 FamilySymbol symb = elem as FamilySymbol;

 try {

 Category catFS = symb.Category; // for "Profiles" it fails

 if( null != catFS ) {

 if( catFS.Equals( catWindows ) ) {

 if( elem2 is FamilyInstance ) {

 FamilyInstance inst = elem2 as FamilyInstance;

 Category catInst = null;

 try {

 catInst = inst.Category; }

 catch( Exception ){}

 if( null != catInst && catInst.Equals( catWindows ) ) {

 sMsg = "Selected Window Id=" + elem2.Id.Value.ToString() +

"/r/n"; ………….. } }

 LabUtils.InfoMsg( sMsg );

获得实例的类别( Category)

Category instCat = FamilyInstance.Category;

列出类别Category的所有类型FamilySymbol

foreach( FamilySymbol symb in fam.Symbols ){

try {

if( symb.Category.Equals( instCat )){

ifCatMatch = true;}}

catch( Exception ) { }

break; // only first one needed}

列出所有的楼板类型的族名和类别名

ElementIterator iter = doc.Elements;

while( iter.MoveNext() ) {

Element elem = iter.Current as Element;

if( elem is FloorType ){

famName = ft.get_Parameter( BuiltInParameter.SYMBOL_FAMILY_NAME_PARAM

).AsString(); //获得类型的族名}

Category cat = ft.Category;

sMsg += ", Family=" + famName + ", Category=" + cat.Name;

// store only if proper Floors category

if( doc.Settings.Categories.get_Item( BuiltInCategory.OST_Floors ).Equals( cat ) ){

newFloorType = ft;}}}

修改墙和楼板实例的类型

修改墙的类型

WallType oldWallType = wall.WallType;

wall.WallType = newWallType;

修改楼板的类型

Floor f;

FloorType oldFloorType = f.FloorType;

f.FloorType = newFloorType;

访问参数

如何访问对象的参数:

l        循环遍历Element.Parameters集合

l        若是内置参数, 已知definition or GUID, 可从如下的三个重载函数获得Element.Parameter

         Parameter( parameterId As Parameters.BuiltInParameter )

         Parameter( definition As Parameters.Definition )

         Parameter( guid As System.Guid )

l        通过属性名称来获得属性.对所有参数进行遍历查找获得.

         LabUtils.GetElemParam()

l        共享参数的GUID 可以通过它的外部定义external definition 获得

         LabUtils.SharedParamGUID()

循环Element的所有参数

foreach( Parameter param in elem.Parameters )

 {

 string paramName = param.Definition.Name;

 string paramType = LabUtils.GetParamStorageType( param ).ToString();

 string paramValue = LabUtils.GetParamAsString( param );

 sMsg += "/r/n Name=" + (paramName + "; Type=" + paramType

 + "; Value=" + paramValue );

 }

访问某一个内置参数

Parameter parBuiltIn;

try{

parBuiltIn = elem.get_Parameter(

BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM );

if( null == parBuiltIn ){

LabUtils.InfoMsg( "FAMILY_BASE_LEVEL_OFFSET_PARAM is NOTavailablefor this element." );}}

用名字访问参数

 public static Parameter GetElemParam( Element elem, string name ) {

 ParameterSet parameters = elem.Parameters;

 foreach( Parameter parameter in parameters ) {

 if( parameter.Definition.Name == name ) {

 return parameter; } }

 return null; }

 

 

 

 

 

Autodesk Revit LT 2018 官方免费版下载附安装教程

软件功能:Autodesk Revit LT 2018 官方免费版下载附安装教程 Revit LT 2018免费版是由autodesk官方推出的一款经济高效的BIM软件,是Revit 201...

Autodesk_Revit_MEP_2011应用宝典

  • 2017年12月07日 16:07
  • 30.37MB
  • 下载

Autodesk Revit 2013位注册机

  • 2015年06月04日 17:31
  • 2.88MB
  • 下载

Autodesk 招聘Revit二次开发咨询顾问,与Autodesk全球团队紧密合作,提高职业生涯的好机会

This is the ad. for AEC API evangelist. Could you help evangelize in your blogs and social circle? T...

Autodesk Revit MEP 2011应用宝典.pdf

  • 2015年06月28日 10:40
  • 55.09MB
  • 下载

Autodesk.Revit2012族达人速成

  • 2017年12月08日 15:40
  • 50.89MB
  • 下载

如何将万能地图下载器下载的卫星地图加载到Autodesk InfraWorks 360内进行道路规划设计

最近有遇到朋友想要将万能地图下载器内下载的卫星地图加载到Autodesk InfraWorks 360内进行道路规划设计,查找了相关的资料,找到了如何加载进入的方法,给大家分享一下,希望对大家能够有所...
  • mrib
  • mrib
  • 2017年10月30日 16:21
  • 106

Autodesk Vault在PDM领域中的优势

Autodesk Vault作为Autodesk公司所提供出来的数据管理平台,和Autodesk所提供的面向制造业和建筑行业的设计工具完美集成在一起,对设计数据的管理和有效利用有其独特的优势。下面从几...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Autodesk Revit
举报原因:
原因补充:

(最多只允许输入30个字)