#revit-api #revit
#revit-api #revit
Вопрос:
Мне нужно узнать количество опорных плоскостей и их имена, которые проходят через выбранную стену. Я могу получить все опорные плоскости для конкретного документа, но как мне это сделать для конкретной стены.
Мы будем признательны за вашу помощь! Спасибо.
Ответ №1:
Если ElementIntersectFilter
это не подходит для ваших нужд, вам придется извлечь геометрию стены и опорной плоскости и работать с ними напрямую.
Пересечение опорных плоскостей с твердыми телами стены может работать, но есть более простой ответ, который будет работать, если я правильно понимаю ваш вопрос. Я предполагаю, что вам нужны только стены, где пересекается зеленая линия плоскости ссылки, вместо того, чтобы рассматривать объект опорной плоскости как бесконечную геометрическую плоскость. На скриншоте ниже я предполагаю, что вы хотите найти галочки, но не красные крестики. Я также предполагаю, что вы рассматриваете это как упражнение по планированию, а не специально устанавливаете вертикальные границы опорной плоскости (это просто основано на том, как я видел, что большинство людей используют Revit). Следующая функция принимает в качестве входных данных одну стену и список опорных плоскостей (вы упомянули, что у вас уже есть коллекция всех опорных плоскостей) и вернет список опорных плоскостей, которые пересекают стену.
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;
}
Ответ №2:
Я бы начал с того, что попробовал встроенное ElementIntersectFilter
. В документации есть хороший пример, замените « FamilyInstance
» на « referencePlane
«, и это может сработать.
http://www.revitapidocs.com/2017/19276b94-fa39-64bb-bfb8-c16967c83485.htm
Если это не сработает, вам нужно будет извлечь сплошную часть стены и пересечь ее с опорной плоскостью.
Комментарии:
1. Для меня это не работает. Я попытался извлечь твердое тело стены и попытался пересечься с опорной плоскостью. Здесь тоже не повезло.