using Autodesk.Revit.DB; using Autodesk.Revit.UI; using HStation.RevitDev.RevitDataExport.Common; using HStation.RevitDev.RevitDataExport.Service; using System; using System.IO; using System.Linq; using System.Windows; namespace HStation.RevitDev.RevitDataExport.Entity { public class ExternalEvent_CreateInstance : IExternalEventHandler { public string RfaPath { get; set; } = null; private bool m_isFirstTrigger = true; private UIApplication m_app = null; public void Execute(UIApplication app) { if (app == null || RfaPath == null || !File.Exists(RfaPath)) { return; } m_app = app; m_app.Idling += App_Idling; UIDocument uiDoc = app.ActiveUIDocument; Document doc = uiDoc.Document; Family family = null; FamilySymbol symbol = null; LoadFamilyFile(doc, ref family, ref symbol); if (family == null || symbol == null) { return; } PlacementFamilyInstance(uiDoc, symbol); } private void App_Idling(object sender, Autodesk.Revit.UI.Events.IdlingEventArgs e) { if (m_isFirstTrigger) { m_isFirstTrigger = false; } else { GlobalResource.PlacingType = Model.ModelEnum.RevitType.RFT_Unknown; m_app.Idling -= App_Idling; m_isFirstTrigger = true; } } private static void PlacementFamilyInstance(UIDocument uiDoc, FamilySymbol symbol) { if (uiDoc.CanPlaceElementType(symbol)) { try { uiDoc.PromptForFamilyInstancePlacement(symbol, new PromptForFamilyInstancePlacementOptions()); } catch (Autodesk.Revit.Exceptions.OperationCanceledException e) { return; } } else { MessageBox.Show("无法放置此类族!"); } } private void LoadFamilyFile(Document doc, ref Family family, ref FamilySymbol symbol) { using (Transaction trans = new Transaction(doc, "创建族实例")) { trans.Start(); try { if (!doc.LoadFamily(RfaPath, new FamilyLoadOption(), out family)) { //说明文档中已经存在, 需要搜索整个文档 var elems = SearchService.SearchElements(doc, typeof(Family), Path.GetFileNameWithoutExtension(RfaPath)); if (elems != null && elems.Count > 0) { family = elems[0] as Family; } } if (family == null) { trans.Commit(); return; } var symbolId = family.GetFamilySymbolIds().FirstOrDefault(); symbol = doc.GetElement(symbolId) as FamilySymbol; if (symbol == null) { trans.Commit(); return; } symbol.Activate(); } catch (Exception ex) { } trans.Commit(); } } public string GetName() { return "Create Family Instance"; } } public class ExternalEvent_CreatePipe : IExternalEventHandler { UIApplication m_app = null; bool m_isFirstTrigger = true; public void Execute(UIApplication app) { m_app = app; app.Idling += App_Idling; RevitCommandId id = RevitCommandId.LookupPostableCommandId(PostableCommand.Pipe); if (m_app.CanPostCommand(id)) { m_app.PostCommand(id); } } private void App_Idling(object sender, Autodesk.Revit.UI.Events.IdlingEventArgs e) { if (m_isFirstTrigger) { m_isFirstTrigger = false; } else { GlobalResource.PlacingType = Model.ModelEnum.RevitType.RFT_Unknown; m_app.Idling -= App_Idling; m_isFirstTrigger = true; } } public string GetName() { return "Create Pipe"; } } }