《Revit二次开发参数读取》由会员分享,可在线阅读,更多相关《Revit二次开发参数读取(31页珍藏版)》请在金锄头文库上搜索。
1、Revit二次开发小结 VINCENT3 订阅号 “类”是 C#编程的核心概念,类包含构造器、属性、方法; “类”是创建“对象”的模板,“对象”包含了“类”的一系列功能; Revit二次开发中,不论是图元还是处理图元的方法,一律都封装在类中,各种类又分别放置在不同命名空间下; 他们最终以函数库 dll文件存在,通过接口我们可以使用他们; “对象”通过“类”构造,“类”也可以作为参数 传递 我们会使用到“对象”,所以“对象”其实也是一种特殊的参数:泛型的参数; 前言 TransactionMode.Manual是 指,事务更新模式为手动,现在版本只支持手动,所以 修改模型的命令需要加一段 Tra
2、nsaction代码,显式说明更新模型; 类的接口 IExternalCommand; Execute函数,相当于程序的 main函数,是代码运行的入口; 程序入口 对象向下转型 Wall mywall= element as Wall; FamilyInstance mywindow= element as FamilyInstance; FamilySymbol symbol= element as FamilySymbol; WallType type=element as WallType; 对象的向下 转型: Element可以转换成可载入族实例、系统族实例、可载入族类型、系统族类型
3、 /Element转换为墙类型 /Element转换 为可载入族实例 /Element转换 为可载入族类型 /Element转换为 Wall类的实例 疑问: 对象的转型在哪些情况下进行,转型的目的是什么? 获得图元的途径 使用 Document类的方法 Document.GetElement() 配合 图元收集器和过滤器,获得图元集合 Document类的方法 Documen.GetElement一共有三个重载方法,返回值是单个的 Element对象 Document.GetElement(string uniqueId); 参数是 uniqueId Document.GetElement(E
4、lementId id); 参数是 ElementId Document.GetElement(Reference); 参数是 Reference 获得图元之 Documen.GetElement() Document.GetElement(ElementId id); 参数是 ElementId 首先 我们需要构造一个对象 ElementId,然后作为参数传递给Document.GetElement方法 ElementId wallid = new ElementId(170719); Element elem2_wall= Doc.GetElement(wallid); 获得图元之 Doc
5、umen.GetElement() ElementId参数的构造方法有三个 重载: ( 1) int id数字 ( 2) BuiltInCategory ( 3) BuiltInParameter 获得图元之 Documen.GetElement() 其中 ElementId,是这样进行构造的。 Selection choices = new UIDocument(Doc).Selection; Reference refer1 = choices.PickObject(ObjectType.Element, 选择一个构件图元 ); Element elem = Doc.GetElement(
6、refer1); 获得图元之 Documen.GetElement() Document.GetElement(Reference); 参数是 Reference; 这个方法需要配合界面选择交互操作,代码部分需要Selection做配合; 过滤图元,对于构件来讲,主要是过滤出实例图元、类型元素,两者互不包含,但是有相同的 参数。 过滤工具 : FilteredElementCollector类 (收集器) ElementClassFilter类 (类过滤器) ElementCategoryFilter类 (类别过滤器) LogicalAndFilter类 (逻辑过滤器) 以及收集器应用过滤器的
7、方法 .WherePasses() 获得图元之使用过滤器 过滤内容: 过滤属于可载入族的实例图元 过滤属于可载入族的类型图元 过滤属于系统族的实例图元 过滤属于系统族的类型图元 过滤方法: 收集 器应用过滤器,使用 WhereaPass(); 过滤器 之间的连接,使之变成逻辑 过滤器; 有 的过滤器其实不用新建,收集器可以直接调用其快捷 方法; 收集 器之间也可以取并集、交集等等 UnionWith()、 IntersectWith(); 如果需要得到实例,那么需要指定类别、指定为实例 图元; 如果 需要得到类型,那么需要指定类别、指定为类型 图元; 获得图元之使用过滤器 获得图元之使用过滤器
8、 FilteredElementCollector collector1 = new FilteredElementCollector(Doc); ElementClassFilter classFilter1 = new ElementClassFilter(typeof(FamilyInstance); ElementCategoryFilter categoryFilter1 = new ElementCategoryFilter(BuiltInCategory.OST_StructuralColumns); LogicalAndFilter logicalAndFilter1 = ne
9、w LogicalAndFilter(classFilter1, categoryFilter1); collector1.WherePasses(logicalAndFilter1); IList elements1 = collector1.ToElements(); 过滤可载入族实例 以结构柱为例 获得图元之使用过滤器 FilteredElementCollector collector2 = new FilteredElementCollector(Doc); ElementClassFilter classFilter2 = new ElementClassFilter(typeof
10、(FamilySymbol); ElementCategoryFilter categoryFilter2 = new ElementCategoryFilter(BuiltInCategory.OST_StructuralColumns); LogicalAndFilter logicalAndFilter2 = new LogicalAndFilter(classFilter2, categoryFilter2); collector2.WherePasses(logicalAndFilter2); IList elements2 = collector2.ToElements(); 过滤
11、可载入族类型 以结构柱为例 获得图元之使用过滤器 过滤系统族实例 以墙为例 FilteredElementCollector collector3 = new FilteredElementCollector(Doc); ElementClassFilter classFilter3 = new ElementClassFilter(typeof(HostObject); ElementCategoryFilter categoryFilter3 = new ElementCategoryFilter(BuiltInCategory.OST_Walls); LogicalAndFilter l
12、ogicalAndFilter3 = new LogicalAndFilter(classFilter3, categoryFilter3); collector3WherePasses(logicalAndFilter3); IList elements3 = collector3.ToElements(); 演示一次快捷方法:快捷方法就是有的过滤器可以不必构造,收集器里面有相应的方法,然后填入参数即可。 collector.OfClass(typeof(HostObject).OfCategory(BuiltInCategory.OST_Walls); 获得图元之使用过滤器 过滤系统族类型
13、 以墙为例 FilteredElementCollector collector4 = new FilteredElementCollector(Doc); ElementClassFilter classFilter4 = new ElementClassFilter(typeof(WallType); ElementCategoryFilter categoryFilter4 = new ElementCategoryFilter(BuiltInCategory.OST_Walls); LogicalAndFilter logicalAndFilter4 = new LogicalAndF
14、ilter(classFilter4, categoryFilter4); collector4.WherePasses(logicalAndFilter4); IList elements4 = collector4.ToElements(); 注意: 此方法过滤出的墙类型只包括基本墙和幕墙,是无法过滤出叠层墙的。 获得图元之使用过滤器 使用小结: 未完待续 手动事务更新模式 using (Transaction trans = new Transaction(Doc) trans.Start(提示说明语句 ); /代码主体 trans.Commit(); 代码块: 以及: 首先,使用 Tr
15、ansaction更新代码块; 然后,使用 Document.Delete()方法,接收参数是单个ElementId或者 ElementId的集合; IList myElements1 = null;/这是需要删除的元素集合ICollection idcollection = new List(); foreach (Autodesk.Revit.DB.Element elem in myElements1) idcollection.Add(elem.Id); /往集合中添加元素的 id Doc.Delete(idcollection); 图元删除 读写参数 图元 Element的参数保存在其属性参数集合 Parameters里面,可以遍历这个集合得到参数,或者使用其方法 get_Parameter()直接获取指定参数; 参数对象是由 Parameter类构造的, Parameter类包含了各种参数类型转换的方法等等; 我们使用 Parameter来接收 Element的 参数; 系统 族、载入族实例中的实例 参数; 系统族、载入族的类型元素包含的参数 ;