Revit API使用PromptForFamilyInstancePlacement放置细节组件

本文关键字:细节 组件 PromptForFamilyInstancePlacement API 使用 Revit | 更新日期: 2023-09-27 18:04:11

我试图使用PromptForFamilyInstancePlacement放置一个细节组件,但我有困难正确定义FamilySymbol

我发现的例子显示了如何使用FilteredElementCollector来实现这一点,但我正试图通过名称定义FamilySymbol

Revit API使用PromptForFamilyInstancePlacement放置细节组件

试试这段代码(需要System.Linq)和。net

FamilySymbol symbol = GetElements<FamilySymbol>(commandData.Application.ActiveUIDocument.Document)
                          .Where(item => item.Name == "NameYouWant")
                          .First();
commandData.Application.ActiveUIDocument.PromptForFamilyInstancePlacement(symbol);

    /// <summary>
    /// Get the collection of elements of the specified type.
    /// <para>The specified type must derive from Element, or you can use Element but you get everything :)</para>
    /// </summary>
    /// <typeparam name="T">The type of element to get</typeparam>
    /// <returns>The list of elements of the specified type</returns>
    public IEnumerable<T> GetElements<T>(Document document) where T : Element
    {
        FilteredElementCollector collector = new FilteredElementCollector(document);
        collector.OfClass(typeof(T));
        return collector.Cast<T>();
    }

您已经将Family文档加载到您正在处理的项目中了吗?如果没有,那么您可以使用Document.LoadFamilySymbolDocument.LoadFamily将家族加载到项目中。否则,要找到您正在寻找的家族符号,您可以使用类似于下面代码的东西:

UIApplication application = commandData.Application;
UIDocument uiDocument = application.ActiveUIDocument;
Document document = application.ActiveUIDocument.Document;
FilteredElementCollector familyCollector = new FilteredElementCollector(document);
familyCollector.OfClass(typeof(FamilySymbol));
FamilySymbol familySymbolToFind = null;
foreach (FamilySymbol familySymbol in familyCollector)
{
  //To search by FamilySymbol name
  if (familySymbol.Name == "[Name of FamilySymbol to find]")
    familySymbolToFind = familySymbol;
  //To search by Family name
  else if (familySymbol.Family.Name = "[Name of Family to find]")
    familySymbolToFind = familySymbol;
}
uiDocument.PromptForFamilyInstancePlacement(familySymbolToFind);

他们都工作,即使在Revit 2017。(在第二个解决方案中,else if行需要==而不是=。)

在第二个解决方案中,我使用这个来确保我有正确的家族名称和家族符号名称:

foreach (FamilySymbol familySymbol in familyCollector)
{
  if (familySymbol.Name == "Put your Family Name here" && familySymbol.Family.Name == "Put your Family Symbol Name here")
                        familySymbolToFind = familySymbol;
}