114 lines
5.2 KiB
C#
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;
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|