def embedded_parts(self): """ Находим окна данной панели Нужно проверить является ли окно частью панели. Сейчас такой проверки нет """ if not hasattr(self, "_embedded_parts"): bb = self.union_solid.GetBoundingBox() tt = bb.Transform p1 = tt.OfPoint(bb.Min) p2 = tt.OfPoint(bb.Max) outline = Outline(p1, p2) filtered = BoundingBoxIntersectsFilter(outline) collector = FilteredElementCollector(self.doc).OfCategory( BuiltInCategory.OST_Rebar).WherePasses(filtered) collector.UnionWith( FilteredElementCollector(self.doc).OfCategory( BuiltInCategory.OST_StructuralFraming).WherePasses( filtered)).ToElements() res = [] for i in collector: param = i.LookupParameter(self.element_type_parameter_name) if param and param.AsDouble( ) == self.embedded_part_parameter_value: # if self.is_element_of_supercomponent(i): res.append(Precast_embedded_part(i, self.doc, self)) self._embedded_parts = res return self._embedded_parts
def get_elements_by_cats(self, classes): els = None for i in classes: if els is None: els = FilteredElementCollector(self.doc).OfClass(i) else: els.UnionWith(FilteredElementCollector(self.doc).OfClass(i)) return els
def panels(self): """ Поиск панелей. Если выбран элемент. Выбираем у него все, что вложено Если не выбран - берем все элементы категории стены и колонны. Проходим по всем элементам. Если является эеземпляром семейства, не системное. Идем дальше. Проверяем является ли семейство геометрическое: Должен быть префикс 215 216 префикс у контейнеров Проверяем является ли семейство параметрическим. Префикс 214 Если семейство геометрическое, либо параметрическое, добавляем в _panels экземпляр класса Precast_panel. с параметром geometrical говорящее. является ли элемент геометрическим. Так же прокидываем нужно ли анализировать геометрию. Если нет - будет выполнено только объединение и заполнение параметров. См. класс Precast_panel """ if not hasattr(self, "_panels"): self._panels = [] sel_id = self.uidoc.Selection.GetElementIds() if not sel_id.Count: wall_panels = FilteredElementCollector(self.doc).OfCategory( BuiltInCategory.OST_Walls).WhereElementIsElementType() wall_panels.UnionWith(FilteredElementCollector( self.doc).OfCategory(BuiltInCategory.OST_Columns).WhereElementIsNotElementType()) wall_panels = wall_panels.ToElements() else: sel_elements = [self.doc.GetElement( i) for i in self.uidoc.Selection.GetElementIds()] wall_panels = [] for i in sel_elements: if isinstance(i, AssemblyInstance): wall_panels += [self.doc.GetElement(j) for j in i.GetMemberIds()] else: wall_panels.append(i) wall_panels += [self.doc.GetElement(k) for j in wall_panels for k in j.GetSubComponentIds()] for i in wall_panels: if isinstance(i, FamilyInstance): geometrical = i.Symbol.Family.Name[:len( self.panel_prefix)] == self.panel_prefix parametrical = i.Symbol.Family.Name[:len( self.panel_parametrical_prefix)] == self.panel_parametrical_prefix if geometrical or parametrical: self._panels.append(Precast_panel( i, doc=self.doc, analys_geometry=self.analys_geometry, geometrical=geometrical)) return self._panels