Message 1 of 1
Error when inserting a tee, with three lines (Converted into Pipe)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
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