using System; using Autodesk.Revit.UI; using Autodesk.Revit.DB; using System.Collections.Generic; using System.Windows.Forms; using System.Linq; using Autodesk.Revit.UI.Selection; using KDCS.Utils; using Autodesk.Revit.DB.Structure; using KMBIM.Revit.Tools.Cmd.SprinklerConnect; using Autodesk.Revit.DB.Mechanical; using KMBIM.Revit.Tools; using Autodesk.Revit.DB.Plumbing; namespace KMBIM { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] public class ElementTrim : IExternalCommand { UIApplication uiapp; UIDocument uidoc; Autodesk.Revit.DB.Document doc; Autodesk.Revit.Creation.Application creApp; Autodesk.Revit.Creation.Document creDoc; Autodesk.Revit.UI.ExternalCommandData m_commandData; public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { m_commandData = commandData; uiapp = commandData.Application; uidoc = uiapp.ActiveUIDocument; doc = uidoc.Document; creApp = uiapp.Application.Create; creDoc = doc.Create; List m_ElemLst = new List(); try { if (!WorkMain.GetInstance().IsValid) return Autodesk.Revit.UI.Result.Succeeded; while (true) { Reference pickRef = commandData.Application.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, new SelectionFilter(), "절단할 배관 또는 덕트 선택 : "); XYZ Gpt = pickRef.GlobalPoint; Element pickElem = doc.GetElement(pickRef); using(Transaction trans = new Transaction(doc)) { trans.Start("cutting"); XYZ sp = null, ep = null; Line ElemLine = null; if(pickElem is Pipe) { Util.GetStartEndPoint(pickElem as Pipe, ref sp, ref ep); ElemLine = ((pickElem as Pipe).Location as LocationCurve).Curve as Line; //선택점과 파이프 교차점 찾기. IntersectionResult interRes = ElemLine.Project(Gpt); XYZ DivPt = interRes.XYZPoint; List ElemIdLst = new List(); ElemIdLst = Util.DivideElement(doc, pickElem as Pipe, DivPt); } else if(pickElem is Duct) { Util.GetStartEndPoint(pickElem as Duct, ref sp, ref ep); ElemLine = ((pickElem as Duct).Location as LocationCurve).Curve as Line; //선택점과 덕트 교차점 찾기. IntersectionResult interRes = ElemLine.Project(Gpt); XYZ DivPt = interRes.XYZPoint; List ElemIdLst = new List(); ElemIdLst = Util.DivideElement(doc, pickElem as Duct, DivPt); } trans.Commit(); } }//while end } catch (Exception e) { //MessageBox.Show("" + e); } return Result.Succeeded; } public class SelectionFilter : ISelectionFilter { public bool AllowElement(Element element) { if (element.Category == null) return false; if (element.Category.Id.IntegerValue == (int)BuiltInCategory.OST_PipeCurves || element.Category.Id.IntegerValue == (int)BuiltInCategory.OST_DuctCurves) { return true; } return false; } public bool AllowReference(Reference refer, XYZ point) { return false; } } } }