核心代码
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取消异常处理