Если ElementIntersectFilter
не подходит для ваших нужд, вам придется извлечь геометрию стены и базовой плоскости и работать с ними напрямую.
Пересечение опорных плоскостей с твердыми телами стен может работать, но есть более простой ответ, который будет работать, если я правильно понимаю ваш вопрос. Я предполагаю, что вам нужны только стены, где пересекается зеленая линия опорной плоскости, а не обработка объекта опорной плоскости как бесконечной геометрической плоскости. На снимке экрана ниже я предполагаю, что вы хотите найти галочки, а не красные крестики. Я также предполагаю, что вы рассматриваете это как упражнение по планированию, а не специально устанавливаете вертикальные границы базовой плоскости (это просто основано на том, как я видел, как большинство людей используют Ревит). Следующая функция принимает в качестве входных данных одну стену и список опорных плоскостей (вы упомянули, что у вас уже есть коллекция всех опорных плоскостей) и возвращает список опорных плоскостей, которые пересекают стену.
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;
}
person
0w3n
schedule
20.10.2016