Revit API布置喷头(放置任何元素的方法类似)

本文介绍了如何在Revit中利用FilteredElementCollector筛选族符号,特别是喷头,通过指定参数找到系统族,并使用选择的点创建族实例。
FilteredElementCollector 可以过滤到系统或者文档中包含的族符号。
比如喷头,只要知道内参就可以找到。
// 放置族实例
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public  class cmdSetFamily : IExternalCommand
{
     public Result Execute(ExternalCommandData cmdData,  ref  string msg, ElementSet elements)
    {
        UIDocument uiDoc = cmdData.Application.ActiveUIDocument;

        Transaction ts =  new Transaction(uiDoc.Document,  " SetFamily ");
        ts.Start();

        FilteredElementCollector collector =  new FilteredElementCollector(uiDoc.Document);
         // 喷头,根据内参可以得到系统族符号,内参可以通过选择元素得到: http://revit.5d6d.com/thread-1261-1-1.html
        collector.OfCategory(BuiltInCategory.OST_Sprinklers);
        FamilySymbol fs =  null;
         foreach (Element el  in collector)
        {
            fs = el  as FamilySymbol;
             break;
        }
        XYZ xyz = uiDoc.Selection.PickPoint(); // 选择一个点
        
// 根据族符号放置族实例的方法
        FamilyInstance fi = uiDoc.Document.Create.NewFamilyInstance(xyz, fs, StructuralType.NonStructural);

        ts.Commit();

         return Result.Succeeded;
    }
}
from: http://revit.5d6d.com/thread-1355-1-1.html
### 使用 Revit API 进行族的布置 在使用 Revit API 实现族的布置过程中,`PromptForFamilyInstancePlacementOptions` 方法提供了交互式的族实例放置选项[^3]。此方法允许开发者创建自定义命令来引导用户选择位置并放置族实例。 为了更好地理解和应用这一过程,下面是一个简单的例子,展示如何编写一段 C# 代码以实现族的布置: ```csharp public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiapp = commandData.Application; UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; // 获取族类别下的所有可用族类型 FilteredElementCollector collector = new FilteredElementCollector(doc); IList<Element> familySymbols = collector.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilySymbol)).ToElements(); using (Transaction trans = new Transaction(doc)) { trans.Start("Place Window"); foreach (var symbol in familySymbols) { FamilySymbol fsymbol = symbol as FamilySymbol; if (!fsymbol.IsActive) continue; PromptForFamilyInstancePlacementOptions options = new PromptForFamilyInstancePlacementOptions(fsymbol); Reference reference = uidoc.Selection.PickObject(ObjectType.Element, "Select a location to place the window."); XYZ pointOnRef = uidoc.Document.GetElement(reference).Location.Point; fsymbol.Activate(); doc.Create.NewFamilyInstance(pointOnRef, fsymbol, StructuralType.NonStructural); } trans.Commit(); } return Result.Succeeded; } ``` 这段代码展示了如何遍历特定分类中的所有族符号(这里是以窗户为例),并通过 `PromptForFamilyInstancePlacementOptions` 来让用户指定放置的位置。注意这里的事务处理机制确保了所有的修改都在一个安全可控的状态下完成。 对于系统族而言,虽然其行为和属性可能有所不同,但基本的操作模式仍然适用。例如墙壁(Wall) 或柱(Column),这些是由Revit内部预定义的对象,可以通过相似的方式进行管理和操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值