2016-10-07 6 views
0

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

Вам поможет помощь! Спасибо.

ответ

0

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

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

Большое спасибо @ 0w3n. Он работал отлично. – Robert

1

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

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

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

+0

Вышеупомянутые не работают для меня. Я попытался извлечь твердую стену и попытался пересечься с эталонной плоскостью. Здесь не везет. – Robert

 Смежные вопросы

  • Нет связанных вопросов^_^