Если ElementIntersectFilter
не работает для ваших потребностей, вы должны извлечь геометрию стены и плоскости отсчета и работать с теми, непосредственно.
Пересечение опорных плоскостей с твердыми стенками может работать, но есть более простой ответ, который будет работать, если я правильно понимаю ваш вопрос. Я предполагаю, что вы хотите, только стены, где зеленая линия реф плоскости пересекает, а не рассматривать объект базовой плоскости в виде бесконечной геометрической плоскости. На скриншоте ниже я предполагаю, что вы хотите найти галочки, но не красные X. Я также предполагаю, что вы рассматриваете это как упражнение по плану, а не конкретно устанавливаете вертикальные экстенты эталонной плоскости (это только на основе того, как я видел, как большинство людей используют Revit). Следующая функция принимает в качестве входных данных одну стену и список плоскостей ref (вы упомянули, что у вас уже есть коллекция всех плоскостей ref) и вернет список плоскостей ref, которые пересекают стену.
public static List<ReferencePlane> getRefPlanesIntersectingWall(Wall wal, List<ReferencePlane> refPlanesIn)
{
//simplify this to a 2D problem, using the location curve of the wall
List<ReferencePlane> refPlanesOut = new List<ReferencePlane>();
LocationCurve wallLocation = wal.Location as LocationCurve;
Curve wallCurve = wallLocation.Curve;
Double wallZ = wallLocation.Curve.GetEndPoint(0).Z;
foreach (ReferencePlane rp in refPlanesIn)
{
XYZ startPt = new XYZ(rp.BubbleEnd.X, rp.BubbleEnd.Y, wallZ);
XYZ endPt = new XYZ(rp.FreeEnd.X, rp.FreeEnd.Y, wallZ);
Line rpLine = Line.CreateBound(startPt, endPt);
SetComparisonResult test = wallCurve.Intersect(rpLine);
if (test == SetComparisonResult.Overlap ||
test == SetComparisonResult.Subset ||
test == SetComparisonResult.Superset ||
test == SetComparisonResult.Equal )
{
refPlanesOut.Add(rp);
}
}
return refPlanesOut;
}
Большое спасибо @ 0w3n. Он работал отлично. – Robert