using System.Collections.Generic; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using KDCS.Utils; using KMBIM.Revit.Tools.Properties; using KMBIM.Revit.Tools.Cmd.Hanger; using System.Windows.Forms; using System; using KMBIM.Revit.Tools.Utils; using Autodesk.Revit.UI.Selection; namespace KMBIM.Revit.Tools.Cmd.Hanger { /// /// Çà°Å ¼öµ¿ ¹èÄ¡ /// [Regeneration(RegenerationOption.Manual)] [Transaction(TransactionMode.Manual)] public class PlaceHangerCommandManual : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { if (!WorkMain.GetInstance().IsValid) return Autodesk.Revit.UI.Result.Succeeded; // Verify active document if (null == commandData.Application.ActiveUIDocument.Document) { message = KMBIM.Revit.Tools.Properties.Resources.ActiveViewIsNull; // "ÇöÀç Ȱ¼ºÈ­µÈ ºä°¡ ¾ø½À´Ï´Ù."; //"Active view is null."; return Autodesk.Revit.UI.Result.Failed; } var uiapp = commandData.Application; var uidoc = uiapp.ActiveUIDocument; var app = uiapp.Application; var doc = uidoc.Document; var createDoc = uidoc.Document.Create; //var lst=FamilyInstanceCreator.FindFamilyCandidates(doc, "libraries\\Hanger", "Hanger_Rec_Channel_C"); HangerSchema.SetAddInId(app.ActiveAddInId); HangerSchema.Init(); List list = new List(); FormHangerPlacement frmHanger = new FormHangerPlacement(doc); if (frmHanger.ShowDialog() != DialogResult.OK) return Autodesk.Revit.UI.Result.Succeeded; SinglePlacement(ref commandData, ref message, ref frmHanger); return Autodesk.Revit.UI.Result.Succeeded; } Result SinglePlacement(ref ExternalCommandData commandData, ref string message, ref FormHangerPlacement frmHanger) { var uiapp = commandData.Application; var uidoc = uiapp.ActiveUIDocument; var document = uidoc.Document; var createDoc = uidoc.Document.Create; // ¼³Ä¡ ¿É¼Ç InstallOption installOption = new InstallOption("Çà°Å ¹èÄ¡-´Üµ¶", DisplayUnit.METRIC); installOption.AnchorInstallBase = frmHanger.AnchorInstallBase; installOption.SetAnchorLevel(frmHanger.Level); string hanger_family = frmHanger.PathFamily; installOption.addOption(new UnitInstallOption(hanger_family, -1, frmHanger.HangerSpacing, frmHanger.DistanceFromJoint)); // 3.28084 ft = 1m try { HangerFamily hangerFamily = new HangerFamily(installOption.GetAnchorLevel()); var newView3d = new View3DHanger(document); hangerFamily.SetView3dHanger(newView3d); HangerSettings settings = HangerSettings.GetSettings(); settings.InstallOptions = new List(); settings.InstallOptions.Add(installOption); Autodesk.Revit.UI.Selection.Selection selection = uidoc.Selection; while (true) { Reference reference = null; try { reference = selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.PointOnElement, new MEPCurveSelectionFilter(), "Çà°Å À§Ä¡ ÁöÁ¤."); if (reference == null) { break; } } catch (Exception ex) { message = ex.Message; break; } Autodesk.Revit.DB.MEPCurve mep_curve = document.GetElement(reference.ElementId) as Autodesk.Revit.DB.MEPCurve; // ¼±ÅÃÇÑ Ä¿ºê°¡ Çà°Å¸¦ ¹èÄ¡ÇÒ ¼ö ÀÖ´Â Ä¿ºêÀΰ¡? if (!PlaceableCurve(mep_curve)) { return Result.Succeeded; } Autodesk.Revit.DB.Transaction transaction = new Autodesk.Revit.DB.Transaction(document, "Place Hanger"); transaction.Start(); if (!hangerFamily.getSize((Autodesk.Revit.DB.Element)mep_curve, settings)) { return Result.Succeeded; } var fs = HangerFamilySymbol.GetFamilysymbol(document, hangerFamily.GetKMBIMMEPCurveType(), hanger_family); hangerFamily.SetFamilySymbol(fs); if (hangerFamily.GetFamilySymbol() == null) { transaction.RollBack(); return Result.Failed; } // Çà°Å À§Ä¡ ¹× ¾ÞÄ¿ Elevation if (!hangerFamily.GetElevation(reference.GlobalPoint, installOption.AnchorInstallBase)) { transaction.RollBack(); return Result.Failed; } if (!HangerSchema.CreateFamilyInstance(document, hangerFamily, installOption.AnchorInstallBase, ref message)) { transaction.RollBack(); return Result.Failed; } document.Regenerate(); transaction.Commit(); } return Result.Succeeded; } catch (Exception ex) { message = ex.Message; return Result.Failed; } return Autodesk.Revit.UI.Result.Succeeded; } /// /// ÁÖ¾îÁø ¿ä¼Ò°¡ ¹èÄ¡ °¡´ÉÇÑ °î¼±Àΰ¡? /// /// /// private bool PlaceableCurve(Autodesk.Revit.DB.Element element) { if (element == null) { return false; } if (!(element is MEPCurve)) { return false; } if (element is Autodesk.Revit.DB.Plumbing.FlexPipe) { return false; } if (element is Autodesk.Revit.DB.Mechanical.FlexDuct) { return false; } return true; } } /// /// Çà°Å ÀÚµ¿ ¹èÄ¡ /// [Regeneration(RegenerationOption.Manual)] [Transaction(TransactionMode.Manual)] public class PlaceHangerCommandMulti : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { if (!WorkMain.GetInstance().IsValid) return Autodesk.Revit.UI.Result.Succeeded; // Verify active document if (null == commandData.Application.ActiveUIDocument.Document) { message = KMBIM.Revit.Tools.Properties.Resources.ActiveViewIsNull; // "ÇöÀç Ȱ¼ºÈ­µÈ ºä°¡ ¾ø½À´Ï´Ù."; //"Active view is null."; return Autodesk.Revit.UI.Result.Failed; } var uiapp = commandData.Application; var uidoc = uiapp.ActiveUIDocument; var app = uiapp.Application; var doc = uidoc.Document; var createDoc = uidoc.Document.Create; HangerSchema.SetAddInId(app.ActiveAddInId); HangerSchema.Init(); List list = new List(); var lstElement = Util.GetSelectedElements(uidoc); if (lstElement.Count == 0) { TaskDialog.Show(Properties.Resources.Warning, "ÀÌ ¸í·ÉÀ» ½ÇÇàÇϱâ Àü¿¡ ¹èÄ¡ÇÒ ¿ä¼Ò(´öÆ®,ÆÄÀÌÇÁ,ÄÉÀÌºíÆ®·¹ÀÌ)¸¦ ¼±ÅÃÇØ¾ß ÇÕ´Ï´Ù."); return Autodesk.Revit.UI.Result.Succeeded; } else { foreach (var e in lstElement) { MEPCurve mc = e as MEPCurve; if (mc != null) list.Add(mc); } } if (list.Count > 0) { FormHangerPlacement frmHanger = new FormHangerPlacement(doc); if (frmHanger.ShowDialog() != DialogResult.OK) return Autodesk.Revit.UI.Result.Succeeded; MultiPlacement(ref commandData, ref message, ref list, ref frmHanger); } return Autodesk.Revit.UI.Result.Succeeded; } Result MultiPlacement(ref ExternalCommandData commandData, ref string message, ref List lst, ref FormHangerPlacement frmHanger) { var uiapp = commandData.Application; var uidoc = uiapp.ActiveUIDocument; var doc = uidoc.Document; var createDoc = uidoc.Document.Create; Autodesk.Revit.UI.Selection.Selection selection = uidoc.Selection; // ¹èÄ¡ ½ÃÀÛÁ¡ ÁöÁ¤ Reference refStart = null; try { refStart = selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.PointOnElement, new MEPCurveSelectionFilter(), "Çà°Å ¹èÄ¡ ½ÃÀÛÁ¡ ÁöÁ¤."); if (refStart == null) { return Autodesk.Revit.UI.Result.Failed; } } catch (Exception ex) { message = ex.Message; return Autodesk.Revit.UI.Result.Failed; } if (lst.Count > 0) { // ¼³Ä¡ ¿É¼Ç InstallOption installOption = new InstallOption("Çà°Å ¹èÄ¡-´ÙÁß", DisplayUnit.METRIC); installOption.AnchorInstallBase = frmHanger.AnchorInstallBase; installOption.SetAnchorLevel(frmHanger.Level); string strFamily = frmHanger.PathFamily; installOption.addOption(new UnitInstallOption(strFamily, -1, frmHanger.HangerSpacing, frmHanger.DistanceFromJoint)); // 3.28084 ft = 1m Autodesk.Revit.DB.Transaction transaction = new Autodesk.Revit.DB.Transaction(doc, "Çà°Å ¹èÄ¡-´ÙÁß"); transaction.Start(); string mainInstruction = ""; var automaticHangerPlacement = new AutomaticHangerPlacement(doc, lst); if (!automaticHangerPlacement.Place(ref mainInstruction, installOption, refStart.GlobalPoint)) { if (!string.IsNullOrEmpty(mainInstruction)) { TaskDialog.Show(Properties.Resources.Error, mainInstruction); } transaction.RollBack(); } else { transaction.Commit(); } } return Autodesk.Revit.UI.Result.Succeeded; } } }