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

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

Ваша помощь будет оценена по достоинству! Спасибо.


person Robert    schedule 07.10.2016    source источник


Ответы (2)


Если 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;
    }
person 0w3n    schedule 20.10.2016

Я бы начал с того, что попробовал встроенный ElementIntersectFilter. В документации есть хороший пример, замените «FamilyInstance» на «referencePlane», и это может помочь.

http://www.revitapidocs.com/2017/19276b94-fa39-64bb-bfb8-c16967c83485.htm

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

person 0w3n    schedule 07.10.2016
comment
Вышеупомянутое не работает для меня. Я попытался извлечь твердое тело стены и попытался пересечь опорную плоскость. Здесь тоже не повезло. - person Robert; 20.10.2016