public class RevitPipe : IPipe
{
private readonly Pipe pipe;
private readonly ElementId pipeCurvesCategoryId = new ElementId(BuiltInCategory.OST_PipeCurves);
private readonly ElementId pipeCurveCenterLineId = new ElementId(BuiltInCategory.OST_PipeCurvesCenterLine);
public RevitPipe(Pipe pipe)
{
this.pipe = pipe;
}
public IEnumerable<Reference> GetEndPointReferences(View view)
{
var curveLine = GetCurveLines(view).FirstOrDefault(IsPipeCurveLine);
if (curveLine == null)
return Enumerable.Empty<Reference>();
return Enumerable.Range(0, 2).Select(curveLine.GetEndPointReference);
}
public Reference GetCenterlineReference(View view) => GetCurveLines(view).FirstOrDefault(IsCenterLine)?.Reference ?? GetCurveLines(view).FirstOrDefault(IsPipeCurveLine)?.Reference;
private IEnumerable<Line> GetCurveLines(View view)
{
var options = new Options
{
View = view,
ComputeReferences = true,
IncludeNonVisibleObjects = true
};
return pipe
.get_Geometry(options)
.OfType<Line>();
}
private bool IsPipeCurveLine(Line line) => IsCurveOfCategory(line, pipeCurvesCategoryId);
private bool IsCenterLine(Line line) => IsCurveOfCategory(line, pipeCurveCenterLineId);
private bool IsCurveOfCategory(Line line, ElementId curvesCategoryId)
{
if (line.GraphicsStyleId == ElementId.InvalidElementId)
return false;
var document = pipe.Document;
var graphicsStyle = (GraphicsStyle)document.GetElement(line.GraphicsStyleId);
return graphicsStyle.GraphicsStyleCategory?.Id == curvesCategoryId;
}
}