Error when inserting a tee, with three lines (Converted into Pipe)

Error when inserting a tee, with three lines (Converted into Pipe)

reylorente1
Collaborator Collaborator
147 Views
0 Replies
Message 1 of 1

Error when inserting a tee, with three lines (Converted into Pipe)

reylorente1
Collaborator
Collaborator

 

This is my code, what are you missing?

 

public Result Execute(
  ExternalCommandData commandData,
  ref string message,
  ElementSet elements)
{
    UIApplication uiapp = commandData.Application;
    UIDocument uidoc = uiapp.ActiveUIDocument;
    Application app = uiapp.Application;
    Document doc = uidoc.Document;

    var elementList = GetPipeLine(uidoc);
    CreatePipe(uidoc, elementList);

    return Result.Succeeded;
}

/// <summary>
/// An interface that provides the ability to filter objects during a selection operation
/// Una interfaz que proporciona la capacidad de filtrar objetos durante una operación de selección.
/// </summary>
/// 

public class PlanarFaceSelectionFilter : ISelectionFilter
{
    Document _doc;
    public PlanarFaceSelectionFilter(Document doc)
    {
        _doc = doc;
    }
    public bool AllowElement(Element elem)
    {
        return true;
    }

    public bool AllowReference(Reference reference, XYZ position)
    {
        if (_doc.GetElement(reference).GetGeometryObjectFromReference(reference) is PlanarFace)
        {
            return true;
        }
        return false;
    }
}

#region Obtener una lista de tuberia
/// <summary>
/// Obtener una lista de tuberia
/// </summary>
/// <param name="uidoc"></param>
/// <returns></returns>
public List<Element> GetPipeLine(UIDocument uidoc)
{
    Document doc = uidoc.Document;
    ISelectionFilter selectionFilter = new PlanarFaceSelectionFilter(doc);
    IList<Reference> refer = uidoc.Selection.PickObjects(ObjectType.Element, selectionFilter, "Select mulitple planar faces");
    List<Element> elementlist = new List<Element>();

    foreach (Reference reference in refer)
    {
        Element elem = doc.GetElement(reference);
        elementlist.Add(elem);
    }
    return elementlist;
}
#endregion


#region Creacion de tuberia y la Tee
/// <summary>
/// Creacion de Tuberia
/// </summary>
/// <param name="uidoc"></param>
/// <param name="elementlist"></param>
public void CreatePipe(UIDocument uidoc, List<Element> elementlist)
{
    Document doc = uidoc.Document;
    //Get PipeType
    PipeType pipeType = new FilteredElementCollector(doc).OfClass(typeof(PipeType)).FirstElement() as PipeType;
    //Get Level
    Level level = new FilteredElementCollector(doc).OfClass(typeof(Level)).First() as Level;
    //Get SystemPipe
    FilteredElementCollector syscollector = new FilteredElementCollector(doc)
                                             .OfClass(typeof(PipingSystemType));
    ElementId pipeSysType = syscollector.FirstElementId();

    //
    Pipe newpipe;
    XYZ start = null;
    XYZ end = null;

    //Geometry Elements
    List<GeometryElement> geometrylist = new List<GeometryElement>();

    foreach (Element element in elementlist)
    {
        GeometryElement geometryElement = element.get_Geometry(new Options());
        geometrylist.Add(geometryElement);
    }

    //
    using (Transaction tx = new Transaction(doc, "create pipe"))
    {
        try
        {
            tx.Start();
            //
            List<Line> lines = new List<Line>();
            List<Pipe> pipeList = new List<Pipe>();
            List<Element> elePipeElement = new List<Element>();

            foreach (GeometryElement geoElem in geometrylist)
            {
                foreach (GeometryObject geoObj in geoElem)
                {
                    Line line = geoObj as Line;
                    lines.Add(line);

                    start = line.GetEndPoint(0);
                    end = line.GetEndPoint(1);

                    if (pipeType != null)
                    {
                        newpipe = Pipe.Create(doc, pipeSysType, pipeType.Id, level.Id, start, end);
                        pipeList.Add(newpipe);

                        Element element = doc.GetElement(newpipe.Id);
                        elePipeElement.Add(element);

                        //fitting
                        ElementId elementId = newpipe.Id;
                        Parameter parameter = element.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM);
                        parameter.Set(10 * 0.00733);

                        ElementType teeType = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeFitting)
                                                                                  .OfClass(typeof(ElementType))
                                                                                  .Cast<ElementType>()
                                                                                  .Where(x => x.FamilyName.Contains("Tee")).FirstOrDefault();
                          // Get FamilySymbol for Tap I want to use.

                        //FamilySymbol teeType = null;
                        //doc.LoadFamilySymbol(@"D:\M_Tee - PVC - Sch 40.rfa",
                        //    "MyTee", out teeType);

                        //// Symbol needs to be activated before use.

                        //if (!teeType.IsActive && teeType != null)
                        //{
                        //    teeType.Activate();
                        //    doc.Regenerate();
                        //}                                                         


                        RoutingPreferenceManager preferenceManager = newpipe.PipeType.RoutingPreferenceManager;
                        preferenceManager.AddRule(RoutingPreferenceRuleGroupType.Junctions, new RoutingPreferenceRule(teeType.Id, "MyTee"));
                        int routingPreferenceGroupCnt = preferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Junctions);
                        if (routingPreferenceGroupCnt > 1)
                        {
                            for (int i = 0; i != routingPreferenceGroupCnt; i++)
                            {
                                preferenceManager.RemoveRule(RoutingPreferenceRuleGroupType.Junctions, 0);
                            }
                        }
                    }
                }
            }
            doc.Regenerate();

           

            for (int i = 0; i < pipeList.Count - 1; i++)
            {
                ConnectorManager pipe_conectorManager1 = pipeList[i].ConnectorManager;
                ConnectorSet pipe_connectorSet1 = pipe_conectorManager1.Connectors;
                //
                ConnectorManager pipe_conectorManager2 = pipeList[i + 1].ConnectorManager;
                ConnectorSet pipe_connectorSet2 = pipe_conectorManager2.Connectors;

                ConnectorManager pipe_conectorManager3 = pipeList[i + 2].ConnectorManager;
                ConnectorSet pipe_connectorSet3 = pipe_conectorManager3.Connectors;

                Connector pipe_connector1 = null;
                Connector pipe_connector2 = null;
                Connector pipe_connector3 = null;

                foreach (Connector connector1 in pipe_connectorSet1)
                {
                    if (connector1.Id == 0)
                    {
                        continue;
                    }

                    foreach (Connector connector2 in pipe_connectorSet2)
                    {
                        double minDist = double.MaxValue;
                        var punto2 = connector2.Origin;//{(55.838062275, -11.848221885, 0.000000000)}

                        double d = connector1.Origin.DistanceTo(connector2.Origin);
                        if (d < minDist)
                        {
                            pipe_connector1 = connector1;//{(55.838062275, -11.848221885, 0.000000000)}
                            pipe_connector2 = connector2;//{(55.838062275, -11.848221885, 0.000000000)}
                            minDist = d;//40.614889774081156
                        }
                    }
                    
                }
                foreach (Connector connector1 in pipe_connectorSet1)
                {
                    if (connector1.Id == 0)
                    {
                        continue;
                    }
                    foreach (Connector connector3 in pipe_connectorSet3)
                    {
                        if (connector3.Id == 1)
                        {
                            continue;
                        }
                        double minDist = double.MaxValue;
                        
                        double d = connector1.Origin.DistanceTo(connector3.Origin);
                       
                        if (d < minDist)
                        {
                            pipe_connector1 = connector1;//{(55.838062275, -11.848221885, 0.000000000)}
                            pipe_connector3 = connector3;//{(55.838062275, -11.848221885, 0.000000000)}
                            minDist = d;//40.614889774081156
                        }
                    }
                }

                var p1 = pipe_connector1.Origin;//{(55.838062275, -41.375780940, 0.000000000)}
                var p2 = pipe_connector2.Origin;//{(55.838062275, -41.375780940, 0.000000000)}
                var p3 = pipe_connector3.Origin;//{(55.838062275, -41.375780940, 0.000000000)}
                
                doc.Create.NewTeeFitting(pipe_connector1, pipe_connector2, pipe_connector3);
                //doc.Create.NewTeeFitting(pipe_connector1, pipe_connector3, pipe_connector2);
                //doc.Create.NewTeeFitting(pipe_connector2, pipe_connector1, pipe_connector3);
                //doc.Create.NewTeeFitting(pipe_connector2, pipe_connector3, pipe_connector1);
                //doc.Create.NewTeeFitting(pipe_connector3, pipe_connector2, pipe_connector1);
                //doc.Create.NewTeeFitting(pipe_connector3, pipe_connector1, pipe_connector2);
            }
            
            //
            foreach (Element elem in elementlist)
            {
                doc.Delete(elem.Id);
            }

            tx.Commit();
        }
        catch (Exception ex)
        {

            TaskDialog.Show("Info", "Error " + ex.Message);
            tx.RollBack();
        }

    }
}
#endregion

 

 

Screenshot 2024-03-23 232837.png

0 Likes
148 Views
0 Replies
Replies (0)