Building Coder(Revit 二次开发) - 缺少层(Level)属性的族实例
来源:互联网 发布:国内家具品牌 知乎 编辑:程序博客网 时间:2024/05/17 23:37
Building Coder 链接:http://thebuildingcoder.typepad.com/blog/2011/01/family-instance-missing-level-property.html
Revit二次开发论坛链接:http://revit.5d6d.com/viewthread.php?tid=1280&page=1&extra=#pid1782
这个主题由acadGraph CADstudio GmbH(http://www.acadgraph.de/)的Rudolf Honke提供。
有时候我们会需要取得位于指定层的所有元素,比方说窗族的所有实例。下面我使用的一个辅助函数:
List<Element> GetWindowsByLevel( Document doc, Level level ){ List<Element> elementList = new List<Element>(); FilteredElementCollector collector = new FilteredElementCollector( doc ) .OfCategory( BuiltInCategory.OST_Windows ); ParameterValueProvider provider = new ParameterValueProvider( new ElementId( BuiltInParameter.FAMILY_LEVEL_PARAM ) ); FilterNumericRuleEvaluator evaluator = new FilterNumericEquals(); ElementId idRuleValue = level.Id; FilterElementIdRule rule = new FilterElementIdRule( provider, evaluator, idRuleValue ); ElementParameterFilter filter = new ElementParameterFilter( rule ); elementList.AddRange( collector.WherePasses( filter ).ToElements() ); return elementList;}
但是很奇怪,这样做有时候会遗漏一些元素。问题出在这些元素的层属性没有被正确设置。这一点可以通过打开元素的属性视图来验证。对于那些没有设置层属性的元素,你无法在其属性窗口中找到“层”这一项。进一步使用RevitLookup的”snoop built-in enums”命令,你会发现原来是这些族实例的原生参数集合中不存在FAMILY_LEVEL_PARAM参数,或是虽然存在但是值为null。
有时候我们可以通过设置一个参数来影响一个属性。比方说通过移动或者旋转一个元素来改变它的位置和曲线。另外一些情况下,属性和那些“应该”与其相关的参数之间实际上没有关联。不过这是另外一个话题了。
回到我们讨论的问题上。由于层属性没有出现在属性视图中,所以我们无法手工设置它的值。这样一个罕见的情况出现了:我们只能通过调用Revit API编程的方式解决这个问题。而无法通过Revit操作的方式解决。(译者注:绝大多数情况下,通过Revit API实现的功能是通过Revit操作实现的功能的子集。但是显然,这个主题讨论的是一个特例)
现在让我们来看看利用Revit API解决这个问题的具体步骤:
1. 首先获取当前文档中所有层;
2. 提供一个合适的GUI方式让用户选择目标层;
3. 使用如下代码为缺少层属性的族实例设置层属性。
windowWithoutLevelParam. get_Parameter(BuiltInParameter.FAMILY_LEVEL_PARAM). Set(levels[levelDialogSelectedIndex].Id);
为所有缺少层属性的族实例执行以上操作。然后GetWindowsByLevel()方法就可以正常工作了。
- Building Coder(Revit 二次开发) - 缺少层(Level)属性的族实例
- Building Coder(Revit 二次开发) - 放置族实例
- Building Coder(Revit 二次开发) - 对象关系
- Building Coder(Revit 二次开发) - RevitLoopup 更新
- Building Coder(Revit 二次开发) - 拖放API
- Building Coder(Revit 二次开发) - 设置锁定参数的值
- Building Coder(Revit 二次开发) - NewFamilyInstance() 重载版本的选择
- Building Coder(Revit 二次开发) - 临时事务的使用技巧
- Building Coder(Revit 二次开发) - ToElementIds() 的性能
- Building Coder(Revit 二次开发) - 族元素可见性
- Building Coder(Revit 二次开发) - 族符号与族类型
- Building Coder(Revit 二次开发) - 组合使用 Revit 和 Vault
- Building Coder(Revit 二次开发) - 翻译 Revit Tooltip
- Building Coder(Revit 二次开发) - 提高针对族的元素过滤器的性能
- Building Coder(Revit 二次开发) - 元素层级事件(上)
- Building Coder(Revit 二次开发) - 元素层级事件(下)
- Building Coder(Revit 二次开发) - 失败处理API(上)
- Building Coder(Revit 二次开发) - 失败处理API(下)
- java InputStream 相关类详细说明 1
- dojo3笔记
- 操作系统 任务管理 调度
- win7下不能替换系统文件的解决办法
- NTKO word在线文本编辑控件写页眉页脚
- Building Coder(Revit 二次开发) - 缺少层(Level)属性的族实例
- SQL Server在存储过程中编写事务处理代码的方法
- java InputStream 关于read阻塞的问题讨论
- 网络管理员:如何保护FTP服务器口令安全
- 函数指针
- zoj 1914 Arctic Network
- Kernel中断处理模型
- eclipse 无法启动 报错
- Oracle中union 和 order by 的联用