using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Plumbing; using Nice3point.Revit.Toolkit.External; namespace ShrlAlgoToolkit.RevitAddins.RvMEP; [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class ForceConnectCmd : ExternalCommand { public override void Execute() { using Transaction trans = new(Document, "强制连接系统"); try { while (true) { var pipeList = UiDocument.Selection.PickElementsByRectangle(new GenericFilter()).Cast().ToList(); try { trans.Start(); if (pipeList.Count == 2) { var pipe1 = pipeList[0]; var pipe2 = pipeList[1]; var l1 = (pipe1.Location as LocationCurve)?.Curve as Line; var l2 = (pipe2.Location as LocationCurve)?.Curve as Line; var l3 = l2.Clone(); var p1 = l1.Origin; var projectPoint = l2.Project(p1).XYZPoint; var collection1 = pipe1.ConnectorManager.UnusedConnectors; var collection2 = pipe2.ConnectorManager.UnusedConnectors; var di = double.MaxValue; var conns = new List(); foreach (Connector connector in collection1) { foreach (Connector connector1 in collection2) { var temp = connector.Origin.DistanceTo(connector1.Origin); if (temp < di) { conns.Clear(); di = temp; conns.Add(connector); conns.Add(connector1); } } } Document.Create.NewElbowFitting(conns[0], conns[1]); //conns[0].ConnectTo(conns[1]); //var comparisonResult= l1.Intersect(l3, out var result); // if (comparisonResult == SetComparisonResult.Overlap) // { // var p = result.get_Item(0).XYZPoint; // } } if (pipeList.Count == 3) { var pipe1 = pipeList[0]; var pipe2 = pipeList[1]; var pipe3 = pipeList[2]; var l1 = (pipe1.Location as LocationCurve).Curve as Line; var l2 = (pipe2.Location as LocationCurve).Curve as Line; var l3 = (pipe3.Location as LocationCurve).Curve as Line; if (l1.Direction.IsAlmostEqualTo(l2.Direction)) { var collection1 = pipe1.ConnectorManager.UnusedConnectors; var collection2 = pipe2.ConnectorManager.UnusedConnectors; foreach (Connector connector in collection1) { foreach (Connector connector1 in collection2) { //var temp = connector.Origin.DistanceTo(connector1.Origin); //if (temp < di) //{ // conns.Clear(); // di = temp; // conns.Add(connector); // conns.Add(connector1); //} } } //doc.Create.NewTeeFitting(); } } trans.Commit(); } catch (Exception) { trans.Commit(); return; } } } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { if (trans.GetStatus() == TransactionStatus.Started) { trans.Commit(); } } catch (Exception ex) { ErrorMessage = ex.Message; if (trans.GetStatus() == TransactionStatus.Started) { trans.Commit(); } return; } } }