using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Plumbing; using Autodesk.Revit.UI.Selection; using Nice3point.Revit.Toolkit.External; namespace ShrlAlgoToolkit.RevitAddins.Mep { /// /// TODO 连接喷头 /// [Transaction(TransactionMode.Manual)] internal class ConnectSprinklerCmd:ExternalCommand { public override void Execute() { var fittings = Document.ActiveView .OfClass() .OfCategory(BuiltInCategory.OST_PipeFitting) .Where(e => e.GetConnectors(true).Size == 1); var spks = Document.ActiveView .OfClass() .OfCategory(BuiltInCategory.OST_Sprinklers) .Where(e => e.GetConnectors(true).Size == 1); var refer = UiDocument.Selection.PickObject(ObjectType.Element); var pipe = Document.GetElement(refer) as Pipe; Document.Invoke( ts => { foreach (var ins in spks) { var temp = double.MaxValue; Element instance = null; foreach (var ins1 in fittings) { if (ins.Id == ins1.Id) { continue; } var current = ins.GetLocXYZ().DistanceTo(ins1.GetLocXYZ()); if (current < temp && Math.Abs(current - Math.Abs(ins.GetLocXYZ().Z - ins1.GetLocXYZ().Z)) < 10E-5) { temp = current; instance = ins1; } } try { var connector = ins.GetConnectors(true).OfType().FirstOrDefault(); var connector1 = instance.GetConnectors(true).OfType().FirstOrDefault(); var id = ElementTransformUtils.CopyElement(Document, pipe.Id, XYZ.Zero).FirstOrDefault(); var newPipe = Document.GetElement(id) as Pipe; newPipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM).SetValueString("15"); (newPipe.Location as LocationCurve).Curve = Line.CreateBound( connector.Origin, connector1.Origin); Document.Regenerate(); connector.ConnectTo(newPipe.ConnectorManager.Connectors.GetNearestConnector(connector.Origin)); connector1.ConnectTo(newPipe.ConnectorManager.Connectors.GetNearestConnector(connector1.Origin)); } catch (Exception) { continue; } } }); } private void ConnectToStandPipe() { var pipes = Document.ActiveView .OfClass() .Where(e => e.GetConnectors(true).Size == 1 && (e.GetCurve() as Line).Direction.IsParallelTo(XYZ.BasisZ)); var spks = Document.ActiveView .OfClass() .OfCategory(BuiltInCategory.OST_Sprinklers) .Where(e => e.GetConnectors(true).Size == 1); Document.Invoke( ts => { foreach (var ins in spks) { //Element instance = null; var conn1 = ins.GetConnectors(true).OfType().FirstOrDefault(); foreach (var p in pipes) { var conn = p.GetConnectors(true).OfType().FirstOrDefault(); if (conn.Origin.IsAlmostEqualTo(conn1.Origin)) { conn.ConnectTo(conn1); break; } } //try //{ // var connector = ins.GetConnectors(true).OfType().FirstOrDefault(); // var connector1 = instance.GetConnectors(true).OfType().FirstOrDefault(); // var id = ElementTransformUtils.CopyElement(Document, pipe.Id, XYZ.Zero).FirstOrDefault(); // Document.Regenerate(); // connector.ConnectTo(newPipe.ConnectorManager.Connectors.GetNearestConnector(connector.Origin)); // connector1.ConnectTo(newPipe.ConnectorManager.Connectors.GetNearestConnector(connector1.Origin)); //} //catch (Exception) //{ // continue; //} } }); } } }