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