原文链接:
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 返回的族类型信息。