Как найти количество опорных плоскостей, проходящих через выбранную стену.

#revit-api #revit

#revit-api #revit

Вопрос:

Мне нужно узнать количество опорных плоскостей и их имена, которые проходят через выбранную стену. Я могу получить все опорные плоскости для конкретного документа, но как мне это сделать для конкретной стены.

Мы будем признательны за вашу помощь! Спасибо.

Ответ №1:

Если ElementIntersectFilter это не подходит для ваших нужд, вам придется извлечь геометрию стены и опорной плоскости и работать с ними напрямую.

Пересечение опорных плоскостей с твердыми телами стены может работать, но есть более простой ответ, который будет работать, если я правильно понимаю ваш вопрос. Я предполагаю, что вам нужны только стены, где пересекается зеленая линия плоскости ссылки, вместо того, чтобы рассматривать объект опорной плоскости как бесконечную геометрическую плоскость. На скриншоте ниже я предполагаю, что вы хотите найти галочки, но не красные крестики. скриншот revitЯ также предполагаю, что вы рассматриваете это как упражнение по планированию, а не специально устанавливаете вертикальные границы опорной плоскости (это просто основано на том, как я видел, что большинство людей используют 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. Для меня это не работает. Я попытался извлечь твердое тело стены и попытался пересечься с опорной плоскостью. Здесь тоже не повезло.