Revit二次开发—载入族并交互式放置

本文探讨了Revit中放置族实例时遇到的问题,如取消放置时的错误处理、放置后退出交互、以及处理已存在的族实例。通过示例代码和技巧,解决在Revit开发中关于族实例放置的常见挑战。

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

image-20201219153551001

核心代码

using (Transaction tx = new Transaction(doc))
{
    tx.Start("Transaction Name");
    Family family = null;
    var str = "xxx.rfa";
    doc.LoadFamily(str, out family);
    tx.Commit();
    // 交互式放置之前需要结束事务
    if (family != null)
    {
    	var symbol = doc.GetElement(family.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol
        uidoc.PromptForFamilyInstancePlacement(symbol);
    }
}

问题一:按esc取消放置时报错

在这里插入图片描述

利用 try-catch 捕获异常,并设置该异常不予处理,代码如下:

try
{
}
catch (Exception ex)
{
    //用户取消异常,不抛出异常信息
    if (!(ex is Autodesk.Revit.Exceptions.OperationCanceledException))
    {
        throw ex;
    }
}

问题二:如何在放置一个族实例之后退出放置

思路:注册文档更新事件,事情响应时给Revit窗口发送两次ESC

问题三:已存在所载入族时,如何正常放置

Family family = null;
// 过滤当前文档是否存在该族
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(Family));
IList<Element> CollectorList = collector.ToElements();
foreach (var elem in CollectorList)
{
    var familyItem = elem as Family;
    // str是要载入族的名称
    if (familyItem.Name == Path.GetFileNameWithoutExtension(str))
    {
        family = familyItem;
        break;
    }
}
// 如果未载入过,则载入该族
if (family == null)
{
    doc.LoadFamily(str, out family);
}
// 交互式放置
uidoc.PromptForFamilyInstancePlacement(
doc.GetElement(family.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol);

参考资料

Send Keys to Application Programmatically Using C#
Building Coder(Revit 二次开发) - 放置族实例
Revit二次开发知识分享(十一)放置实例
Revit二次开发知识分享(十二)给Revit发送Esc按键
Revit二次开发 用户Esc取消异常处理
请添加图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬核小青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值