Суммируйте площадь для материала в компонентах Google Sketchup - PullRequest
1 голос
/ 26 мая 2010

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

Я использую термин «одноуровневый или многоуровневый компонент», поскольку не знаю лучшего способа объяснить наличие компонента внутри компонента и т. Д.

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

Итак, как мне подсчитать площадь всего материала внутри компонента (одноуровневого или многоуровневого)?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Пример Ладислава не копает все уровни.

Для этого вам нужен рекурсивный метод:

def sum_area( material, entities, tr = Geom::Transformation.new )
  area = 0.0
  for entity in entities
    if entity.is_a?( Sketchup::Group )
      area += sum_area( material, entity.entities, tr * entity.transformation )
    elsif entity.is_a?( Sketchup::ComponentInstance )
      area += sum_area( material, entity.definition.entities, tr * entity.transformation )
    elsif entity.is_a?( Sketchup::Face ) && entity.material == material
      # (!) The area returned is the unscaled area of the definition.
      #     Use the combined transformation to calculate the correct area.
      #     (Sorry, I don't remember from the top of my head how one does that.)
      #
      # (!) Also not that this only takes into account materials on the front
      #     of faces. You must decide if you want to take into account the back
      #     size as well.
      area += entity.area
    end
  end
  area
end
2 голосов
/ 01 июня 2010

Вот что я бы сделал, давайте предположим, что вы перебираете все сущности и проверяете тип сущности.

if entity.is_a? Sketchup::ComponentInstance
  entity.definition.entities.each {|ent|
    if ent.is_a? Sketchup::Face
      #here do what you have to do to add area to your total
    end
  }
end

Вы можете сделать то же самое с группой:

if entity.is_a? Sketchup::Group
  entity.entities.each {|ent|
    if ent.is_a? Sketchup::Face
      #here do what you have to do to add area to your total
    end
  }
end

Надеюсь, это поможет Ладислав

...