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;
}
}
}