Building Coder(Revit 二次开发) - 只加载需要的族类型

本文探讨了Revit API提供的两种方法来加载族类型:LoadFamilySymbol与LoadFamily。重点讨论了如何在Ribbon面板中通过加载家族并选择实际需要的类型,以及使用API方式实现这一功能。介绍了通过事务、获取族类型和卸载不必要的类型的方法,最终实现了仅加载所需族类型的编程解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值