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. 回滚事务来取消族的加载
  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)
              将需要卸载的族类型实例添加入一个 ElementSet 对象
  • Delete(ICollection(Of ElementId))
              将需要卸载的族类型实例对应的 ElementId 实例添加入一个 ICollection

上面这些讨论给了我另外一种思路:使用 API 在后台打开族文档,然后通过 FamilyManager 去访问其包含的所有族类型。因为还没有做实验,所以我不清楚这种方法是否需要处理关联的 TXT 文件,以及这样做是否会影响 FamilyManager 返回的族类型信息。


原创粉丝点击