Building Coder(Revit 二次开发) - 只加载需要的族类型
来源:互联网 发布:数据侠客行 下载 编辑:程序博客网 时间:2024/06/06 05:08
原文链接:Loading Only Selected Family Types
Revit API 提供两种方法来加载族类型:
1. LoadFamilySymbol - 加载一个族类型
2. LoadFamily - 加载一个族包含的所有族类型
之前我们也讨论过如何使用 Duplicate 来创建一个新的族类型(creating a new family type),以及卸载一个不使用的族类型(unloading an unused type)。
今天我想讨论的是不再加载所有的族类型,而是提供一个族包含类型的列表供用户选择实际需要加载的类型。
提问:
Revit 有多种办法加载族类型,在 Ribbon 面板中就有两种方式:
1. Home > Component > Load Family
加载一个族并放置一个族实例
2. Insert > Loaf Family
加载一个族
如果选定的族有一个关联的TXT文件,并且包含多个族类型,Revit 会弹出一个族类型类表让用户选择需要加载的类型。
如果使用 API 方式,我可以在 LoadFamilySymbol 和 LoadFamily 中选择。不过我找不到能弹出族类型列表的 API。如果这样的 API 不存在的话,是否能用编程方式实现这个行为呢?
回答:
Revit API 不提供显示族中包含类型的 API。不过你可以使用如下方法间接实现:
1. 在一个事务中使用 LoadFamily 加载族
2. 获取该族包含的所有族类型
3. 回滚事务来取消族的加载
上面这些讨论给了我另外一种思路:使用 API 在后台打开族文档,然后通过 FamilyManager 去访问其包含的所有族类型。因为还没有做实验,所以我不清楚这种方法是否需要处理关联的 TXT 文件,以及这样做是否会影响 FamilyManager 返回的族类型信息。
Revit API 提供两种方法来加载族类型:
1. LoadFamilySymbol - 加载一个族类型
2. LoadFamily - 加载一个族包含的所有族类型
之前我们也讨论过如何使用 Duplicate 来创建一个新的族类型(creating a new family type),以及卸载一个不使用的族类型(unloading an unused type)。
今天我想讨论的是不再加载所有的族类型,而是提供一个族包含类型的列表供用户选择实际需要加载的类型。
提问:
Revit 有多种办法加载族类型,在 Ribbon 面板中就有两种方式:
1. Home > Component > Load Family
加载一个族并放置一个族实例
2. Insert > Loaf Family
加载一个族
如果选定的族有一个关联的TXT文件,并且包含多个族类型,Revit 会弹出一个族类型类表让用户选择需要加载的类型。
如果使用 API 方式,我可以在 LoadFamilySymbol 和 LoadFamily 中选择。不过我找不到能弹出族类型列表的 API。如果这样的 API 不存在的话,是否能用编程方式实现这个行为呢?
回答:
Revit API 不提供显示族中包含类型的 API。不过你可以使用如下方法间接实现:
1. 在一个事务中使用 LoadFamily 加载族
2. 获取该族包含的所有族类型
3. 回滚事务来取消族的加载
string filename = @"C:\Documents and Settings" + "\All Users\Application Data\Autodesk" + "\RAC 2011\Metric Library\Columns" + "\M_Round Column.rfa"; UIApplication app = commandData.Application; Document doc = app.ActiveUIDocument.Document; Transaction trans = new Transaction( doc, "FakeLoading" ); trans.Start(); Family family = null; string symbName = String.Empty; int counter = 0; if( doc.LoadFamily( filename, out family ) ) { foreach( FamilySymbol symb in family.Symbols ) { TaskDialog.Show( "Symbol names", symb.Name ); if( counter == 0 ) { symbName = symb.Name; } counter++; } } trans.RollBack(); Transaction transNew = new Transaction( doc, "RealLoading" ); transNew.Start(); if( doc.LoadFamilySymbol( filename, symbName ) ) { TaskDialog.Show( "Status", "We managed to load only one desired symbol!" ); } transNew.Commit();这个办法还有一个变体:既然我们已经通过 LoadFamily 加载了所有类型,其实还可以通过卸载不需要的类型来实现只加载指定类型的目的。卸载族类型可以使用 Document.Delete 方法。
- Delete(ElementSet)
- Delete(ICollection(Of ElementId))
上面这些讨论给了我另外一种思路:使用 API 在后台打开族文档,然后通过 FamilyManager 去访问其包含的所有族类型。因为还没有做实验,所以我不清楚这种方法是否需要处理关联的 TXT 文件,以及这样做是否会影响 FamilyManager 返回的族类型信息。
- Building Coder(Revit 二次开发) - 只加载需要的族类型
- Building Coder(Revit 二次开发) - 族符号与族类型
- Building Coder(Revit 二次开发) - 设置锁定参数的值
- Building Coder(Revit 二次开发) - NewFamilyInstance() 重载版本的选择
- Building Coder(Revit 二次开发) - 临时事务的使用技巧
- Building Coder(Revit 二次开发) - ToElementIds() 的性能
- Building Coder(Revit 二次开发) - 对象关系
- Building Coder(Revit 二次开发) - RevitLoopup 更新
- Building Coder(Revit 二次开发) - 拖放API
- Building Coder(Revit 二次开发) - 组合使用 Revit 和 Vault
- Building Coder(Revit 二次开发) - 翻译 Revit Tooltip
- Building Coder(Revit 二次开发) - 元素层级事件(上)
- Building Coder(Revit 二次开发) - 元素层级事件(下)
- Building Coder(Revit 二次开发) - 失败处理API(上)
- Building Coder(Revit 二次开发) - 失败处理API(下)
- Building Coder(Revit 二次开发) - 复制 Legend 组件
- Building Coder(Revit 二次开发) - 参数访问和计划信息
- Building Coder(Revit 二次开发) - 放置族实例
- 交互设计学习笔记之《如何设计帮助系统》【交互设计】
- 抽象类和接口的区别,使用场景
- 插入mssql数据库是问号
- 汇编
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions(我的水题之路——加i个d后的第几个素数)
- Building Coder(Revit 二次开发) - 只加载需要的族类型
- 用CAJViewer识别图片文字
- 程序设计实践课
- ycsb测试mongo笔记
- C++程序设计实验报告(一)
- Deadlock retry logic will not be implemented
- 关于浮动的前世今生
- apache的两种工作模式
- 关于MPEG-4的Comment读取