Revit SDK 介绍:PlacementOptions

前言

PlacementOptions 这个例子介绍了 UIDocument::PromptForFamilyInstancePlacement 的用法。它的本质是提供给用户一种介入 Revit 操作的手段。用户可以写一个自己的命令,设定好族类型和放置形式之后,让 Revit 启动族放置,就像是一个原生功能。如果没有这个接口,当用户想要放置一个自己选择的族,有几个地方做不到:1. 无法预览族的几何图形;2. 只能拾取现有的几何或者通过某种形式输入数据,然后启动事务,去创建族实例。
在此之前的实现,参考:Revit SDK 介绍:PlaceFamilyInstanceByFace

内容

运行效果:

运行步骤:

  1. 启动插件命令;
  2. 弹出设置窗口;
  3. 请求Revit启动自定义放置族实例命令。

核心代码逻辑:

  1. 选择合适的选项,OptionsForm
  2. 找到所有合适的族类型,FindProperFamilySymbol
  3. 选择族类型,FacebasedFormSketchbasedForm
  4. 请求Revit 放置族,ActiveUIDocument.PromptForFamilyInstancePlacement

简化的核心代码(仅包含放置基于面的族):

using (OptionsForm optionsForm = new OptionsForm())
{
   if (DialogResult.OK == optionsForm.ShowDialog())
   {
      List<FamilySymbol> famSymbolList = new List<FamilySymbol>();
      if (optionsForm.OptionType == PlacementOptionsEnum.FaceBased)
      {
         famSymbolList = FindProperFamilySymbol(document, BuiltInCategory.OST_GenericModel);
         using (FacebasedForm facebaseForm = new FacebasedForm(famSymbolList))
         {
            if (DialogResult.OK == facebaseForm.ShowDialog())
            {
               commandData.Application.ActiveUIDocument.PromptForFamilyInstancePlacement(facebaseForm.SelectedFamilySymbol, facebaseForm.FIPlacementOptions);
            }
         }
      }
   }     
}            

找到所有合适的族的逻辑,FindProperFamilySymbol,用 ElementCategoryFilter 做了一个过滤:

private List<FamilySymbol> FindProperFamilySymbol(Document document, BuiltInCategory category)
{
   FilteredElementCollector collector = new FilteredElementCollector(document);
   ElementCategoryFilter filter = new ElementCategoryFilter(category);
   collector.WherePasses(filter);
   List<Element> symbollList = collector.ToElements().ToList();
   if (symbollList.Count() == 0)
      return null;

      List<FamilySymbol> famSymbolList = new List<FamilySymbol>();
      foreach (Element elem in symbollList)
      {
         FamilySymbol famSymbol = elem as FamilySymbol;
         if (famSymbol != null)
            famSymbolList.Add(famSymbol);
      }
   return famSymbolList;
}

你可能感兴趣的:(Revit,SDK,介绍,C#)