Files
2026-02-22 20:03:42 +08:00

114 lines
5.2 KiB
C#

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
{
/// <summary>
/// TODO 连接喷头
/// </summary>
[Transaction(TransactionMode.Manual)]
internal class ConnectSprinklerCmd:ExternalCommand
{
public override void Execute()
{
var fittings = Document.ActiveView
.OfClass<FamilyInstance>()
.OfCategory(BuiltInCategory.OST_PipeFitting)
.Where(e => e.GetConnectors(true).Size == 1);
var spks = Document.ActiveView
.OfClass<FamilyInstance>()
.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<Connector>().FirstOrDefault();
var connector1 = instance.GetConnectors(true).OfType<Connector>().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<Pipe>()
.Where(e => e.GetConnectors(true).Size == 1 && (e.GetCurve() as Line).Direction.IsParallelTo(XYZ.BasisZ));
var spks = Document.ActiveView
.OfClass<FamilyInstance>()
.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<Connector>().FirstOrDefault();
foreach (var p in pipes)
{
var conn = p.GetConnectors(true).OfType<Connector>().FirstOrDefault();
if (conn.Origin.IsAlmostEqualTo(conn1.Origin))
{
conn.ConnectTo(conn1);
break;
}
}
//try
//{
// var connector = ins.GetConnectors(true).OfType<Connector>().FirstOrDefault();
// var connector1 = instance.GetConnectors(true).OfType<Connector>().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;
//}
}
});
}
}
}