文章目录
核心代码问题一:按esc取消放置时报错问题二:如何在放置一个族实例之后退出放置问题三:已存在所载入族时,如何正常放置参考资料核心代码
using (Transaction tx = new Transaction(doc)){tx.Start("Transaction Name");Family family = null;var str = "xxx.rfa";doc.LoadFamily(str, out family);mit();// 交互式放置之前需要结束事务if (family != null){var symbol = doc.GetElement(family.GetFamilySymbolIds().FirstOrDefault()) as FamilySymboluidoc.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取消异常处理