[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
[Journaling(JournalingMode.NoCommandData)]
internal class Class13 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uIDocument = commandData.Application.ActiveUIDocument;
Document revitDoc = uIDocument.Document;
try
{
Reference reference1 = uIDocument.Selection.PickObject(ObjectType.Element, new PipeFilter());
Reference reference2 = uIDocument.Selection.PickObject(ObjectType.Element, new PipeFilter());
Pipe pipe1 = revitDoc.GetElement(reference1) as Pipe;
Pipe pipe2 = revitDoc.GetElement(reference2) as Pipe;
double parameter1 = pipe1.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM).AsDouble();
double parameter2 = pipe2.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM).AsDouble();
Line line1 = (pipe1.Location as LocationCurve).Curve as Line;
Line line2 = (pipe2.Location as LocationCurve).Curve as Line;
XYZ intersectionPoint1 = line1.Project(line2.GetEndPoint(0)).XYZPoint;
line2.MakeUnbound();
XYZ intersectionPoint2 = line2.Project(intersectionPoint1).XYZPoint;
if (parameter1 == parameter2)
{
using (Transaction tr = new Transaction(revitDoc, "tt1"))
{
tr.Start();
MEPCurve mEPCurve = revitDoc.GetElement(PlumbingUtils.BreakCurve(revitDoc, reference1.ElementId, intersectionPoint1)) as MEPCurve;
//TaskDialog.Show("提示", $"{mEPCurve.Id}");
ThreeMEPCurveCeateElbow(revitDoc, mEPCurve, pipe1, pipe2);
tr.Commit();
}
}
else
{
using (Transaction tr = new Transaction(revitDoc, "tt"))
{
tr.Start();
Pipe newPipe = revitDoc.GetElement(ElementTransformUtils.CopyElement(revitDoc, reference1.ElementId, XYZ.Zero).FirstOrDefault()) as Pipe;
Line newLine = Line.CreateBound(intersectionPoint1, intersectionPoint2);
(newPipe.Location as LocationCurve).Curve = newLine;
TwoMEPCurveCeateElbow(revitDoc, pipe2, newPipe);
MEPCurve mEPCurve = revitDoc.GetElement(PlumbingUtils.BreakCurve(revitDoc, reference1.ElementId, intersectionPoint1)) as MEPCurve;
//TaskDialog.Show("提示", $"{mEPCurve.Id}");
ThreeMEPCurveCeateElbow(revitDoc, mEPCurve, pipe1, newPipe);
tr.Commit();
}
}
}
catch (Exception)
{
return Result.Failed;
}
return Result.Succeeded;
}
private void TwoMEPCurveCeateElbow(Document doc, MEPCurve curve1, MEPCurve curve2)
{
double distance = double.MaxValue;
Connector connector1 = null, connector2 = null;
foreach (Connector item1 in curve1.ConnectorManager.Connectors)
{
foreach (Connector item2 in curve2.ConnectorManager.Connectors)
{
double d = item1.Origin.DistanceTo(item2.Origin);
if (d < distance)
{
distance = d;
connector1 = item1;
connector2 = item2;
}
}
}
if (connector1 != null && connector2 != null)
{
doc.Create.NewElbowFitting(connector1, connector2);
}
}
private void ThreeMEPCurveCeateElbow(Document doc, MEPCurve curve1, MEPCurve curve2, MEPCurve curve3)
{
double distance = double.MaxValue;
Connector connector1 = null, connector2 = null, connector3 = null;
foreach (Connector item1 in curve1.ConnectorManager.Connectors)
{
foreach (Connector item2 in curve2.ConnectorManager.Connectors)
{
double d = item1.Origin.DistanceTo(item2.Origin);
if (d < distance)
{
distance = d;
connector1 = item1;
connector2 = item2;
}
}
}
distance = double.MaxValue;
foreach (Connector item in curve3.ConnectorManager.Connectors)
{
double d = item.Origin.DistanceTo(connector1.Origin);
if (d < distance)
{
distance = d;
connector3 = item;
}
}
if (connector1 != null && connector2 != null && connector3 != null)
{
doc.Create.NewTeeFitting(connector1, connector2, connector3);
}
}
}
internal class PipeFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
if (elem.Category.Name == "管道")
{
return true;
}
return false;
}
public bool AllowReference(Reference reference, XYZ position)
{
return false;
}
}
revit二次开发管线T型连接
于 2024-06-26 17:17:42 首次发布