using Autodesk.Revit.DB; using Autodesk.Revit.DB.Events; using Autodesk.Revit.UI; namespace ShrlAlgoToolkit.Revit.Assists; public class FunctionByGuidLine { public static Line GetGuideLine(Document doc, List eleIdsAdded) { var referLineId = eleIdsAdded.FirstOrDefault(); var guideLine = doc.GetElement(referLineId) as FamilyInstance; var line = (guideLine?.Location as LocationCurve)?.Curve as Line; doc.Delete(referLineId); return line; } #region 绘制线操作 private static readonly bool PlaceSingleInstanceAbort = true; //只有一条线 private readonly List eleIdsRefer = new(); private IntPtr revitWindow; public bool PlaceElementsByLine(UIApplication uiapp) { var uidoc = uiapp.ActiveUIDocument; var app = uiapp.Application; var doc = uidoc.Document; #if REVIT2018 revitWindow = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; #else revitWindow = uiapp.MainWindowHandle; #endif var f = new FilteredElementCollector(doc).OfClass(typeof(Family)).Cast().FirstOrDefault(x => x.Name == "LocationCurve"); var symbol = doc.GetElement(f.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; eleIdsRefer.Clear(); using var tg = new TransactionGroup(doc, "创建"); tg.Start(); try { //var x = UiDocument.GetPlacementTypes(symbol, doc.ActiveView); //存在不能切换布置在平面上还是工作平面上的问题(如果族不需要切换,则没问题) app.DocumentChanged += App_DocumentChanged; uidoc.PromptForFamilyInstancePlacement(symbol); app.DocumentChanged -= App_DocumentChanged; //UiDocument.PostRequestForElementTypePlacement(symbol); } catch (OperationCanceledException) { var n = eleIdsRefer.Count; //XYZ place = UiDocument.Selection.PickPoint("请点击布置的一侧"); if (n > 0) { using var ts = new Transaction(doc, "删除"); ts.Start(); var eid = eleIdsRefer.FirstOrDefault(); var l = uidoc.ActiveView.GenLevel; if (doc.GetElement(eid) is FamilyInstance fi) { Wall.Create(doc, (fi.Location as LocationCurve)?.Curve, l.Id, false); } doc.Delete(eid); //Debug.Print(ex.ViewMessage); ts.Commit(); } } tg.Assimilate(); return true; } private void App_DocumentChanged(object sender, DocumentChangedEventArgs e) { var idsAdded = e.GetAddedElementIds(); var n = idsAdded.Count; eleIdsRefer.AddRange(idsAdded); if (PlaceSingleInstanceAbort && 0 < n) { //KeyIntPtrHelper.OneKey(_revit_window, (char)System.Windows.Forms.Keys.Escape); KeyIntPtrHelper.OneKey(revitWindow, '\u001b'); //System.Windows.Forms.SendKeys.SendWait("^{F4}"); //KeyIntPtrHelper.SendKeys(Autodesk.Windows.ComponentManager.ApplicationWindow, System.Windows.Forms.Keys.Escape); } } #endregion }