标签:tool att manager forms das nts 输入 初始 点击
方式一:外部命令(External Command)
功能:添加一个Revit命令
描述:由用户点击按钮来启动命令
使用最频繁
方式二:外部应用(External Application)
功能:可以添加菜单和工具条,或其他初始化命令
描述:在启动和关闭Revit.exe时自动执行
一般会用到,用量不多
功能:运行命令后,弹出消息框,显示Hello World
步骤:使用C#语言创建一个类库
演示
using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace RevitDevTV { [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class DevTVHelloWorld : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { MessageBox.Show("Hello World"); return Result.Succeeded; } } [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class ArgumentUsage : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //获取uiapp信息 UIApplication uiApp = commandData.Application; //获取文档级的application信息 Autodesk.Revit.ApplicationServices.Application app = uiApp.Application; //获取当前模型 Document doc = uiApp.ActiveUIDocument.Document; string strAppInfo = app.VersionBuild+";"+app.VersionName+";"+app.VersionNumber; //获取当前选择集 Autodesk.Revit.UI.Selection.Selection sel = uiApp.ActiveUIDocument.Selection; message = "当前选择集中包含如下对象"; //为了显示错误信息框,需要返回Failled return Result.Failed; } } }
Revit运行时调试
方法:Tools->attach to process->Attach to Revit.exe
特点:可以随时在VS中Detach调试,此时Revit不退出,灵活方便,可以在Revit不退出的情况下调试多个程序
用Detach中断调试,继续修改代码,再次绑定来调试
演示
演示使用Execute的输入输出参数
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
传入参数
ExternCommandData
由此获取应用程序对象和文档对象
传出参数
ref string:传出提示字符串,提示用户存在的问题
ElementSet:传出一个对象集合,用户可查看其中的对象
命令前面的两个属性:事务和更新属性
两种事务模式
实现的功能
在Revit启动时,弹出对话框
在Revit退出时,弹出一个对话框
实现类:IExternalApplication接口派生
实现OnStartup()和OnShutdown()方法
using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace RevitDevTV { [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class DevTVApplication : IExternalApplication { /// <summary> /// 应用关闭实现的功能 /// </summary> /// <param name="application"></param> /// <returns></returns> public Result OnShutdown(UIControlledApplication application) { MessageBox.Show("Revit is stop"); return Result.Failed; } /// <summary> /// 应用启动实现功能 /// </summary> /// <param name="application"></param> /// <returns></returns> public Result OnStartup(UIControlledApplication application) { MessageBox.Show("Revit is starting"); return Result.Succeeded; } } }
方式一:通过addin文件
*.addin文件
可用任意文件名,只要扩展名是addin即可
只能存放在指定的目录中
C:\Documents and Settings\All Users\Application Data\Autodesk\REVIT\Addins\201*
在该文件夹下可有多个*.addin文件并存,Revit依次加载其中设置的加载项目
<?xml version="1.0" encoding="utf‐8"?> <RevitAddIns> <AddIn Type="Application"> <Name>External Tool</Name> <Assembly>C:\SDK\RevitLookup\CS\bin\Debug\RevitLookup.dll</Assembly> <ClientId>9631d07b‐ade1‐4ea1‐b566‐049161afcc4c</ClientId> <FullClassName>RvtMgdDbg.App</FullClassName> </AddIn> </RevitAddIns>
方式二:通过Revit.ini文件
Revit.ini 文件
该文件位于产品安装目录的Program子文件夹中
可以加载外部命令和外部应用
在2012中,不再支持这个方法
[ExternalApplications]
EACount=2
EAClassName1=RvtMgdDbg.App
EAAssembly1=C:\a\lib\revit\2011\SDK\RevitLookup\CS\bin\Debug\RevitLookup.dll
EAClassName2=RvtSamples.Application
EAAssembly2=C:\a\lib\revit\2011\SDK\Samples\RvtSamples\CS\RvtSamples.dll
构建类型,即构件定义
存储在数据库中,作为插入到建筑模型中的对象的模板使用。在建筑模型中不可见
把相同的数据只保存一份
一个定义,多次使用
例如:柱类型
构件实例
已经插入到建筑模型中,在视图中可见。
时构件定义的引用,如果构件定义改变,实例跟着改变
例如:插入到建筑模型中的柱。
2011版提供新的对象过滤方法
找出符合条件的对象集合
找出模型中窗户的数量
using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace RevitDevTV { [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class GetAllWindows : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //获取uiapp信息 UIApplication uiApp = commandData.Application; //获取文档级的application信息 Autodesk.Revit.ApplicationServices.Application app = uiApp.Application; //获取当前模型 Document doc = uiApp.ActiveUIDocument.Document; //方式一:获得所有窗户 FilteredElementCollector collector = new FilteredElementCollector(doc); collector.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Windows); //添加限制,找窗户OST_Windows IList<Element> lists = collector.ToElements(); string strMsg = string.Format("there are {0} windows in current model",lists.Count); MessageBox.Show(strMsg); //方式二:过滤器来获取所有的门 FilteredElementCollector collector2 = new FilteredElementCollector(doc); ElementClassFilter classFilter = new ElementClassFilter(typeof(FamilyInstance)); ElementCategoryFilter catFilter = new ElementCategoryFilter(BuiltInCategory.OST_Doors); LogicalAndFilter logicalFilter = new LogicalAndFilter(classFilter, catFilter); collector2.WherePasses(logicalFilter); IList<Element> lists2 = collector2.ToElements(); string strMsg2 = string.Format("there are {0} doors in current model", lists2.Count); MessageBox.Show(strMsg2); return Result.Succeeded; } } }
找出一层中有多少个窗户
using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace RevitDevTV { [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class GetAllWindowsInLevel : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //获取uiapp信息 UIApplication uiApp = commandData.Application; //获取文档级的application信息 Autodesk.Revit.ApplicationServices.Application app = uiApp.Application; //获取当前模型 Document doc = uiApp.ActiveUIDocument.Document; //方式一:获得所有窗户 FilteredElementCollector collector = new FilteredElementCollector(doc); collector.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Windows); //添加限制,找窗户OST_Windows IList<Element> lists = collector.ToElements(); //获得一层窗户 var windowInLevel1 = from element in collector where element.Name == "Level 1" select element; string strMsg = string.Format("there are {0} windows in level 1", windowInLevel1.Count()); MessageBox.Show(strMsg); return Result.Succeeded; } } }
直接添加过滤条件
过滤器
使用LINQ
演示
SDK的根目录下
读取Revit对象属性和此参数
提供源代码和工具类
快速查查看对象数据
说明性文档
开发参考文档
需要时阅读
重要工具
标签:tool att manager forms das nts 输入 初始 点击
原文地址:https://www.cnblogs.com/chenyanbin/p/13274982.html