总结组件中的材料区域,Google Sketchup

时间:2010-05-26 06:15:09

标签: ruby components area sketchup

我正在制作一个插件来总结Sketch中所有材质的区域。 我已经成功地获得了所有面孔等等,但现在组件就出现了。

我使用术语单层或多层组件,因为我不知道任何更好的方法来解释组件内部组件的出现等等。

我注意到有些组件对i的要求不仅仅是1级。因此,如果您进入一个组件内部,可能会在此组件中嵌入也包含材料的组件。所以我想要的是总结一个特定组件的所有材料,并获得组件内的所有“递归”材料(如果有的话)。

那么,我如何计算组件内所有材料的面积(单层或多层)?

2 个答案:

答案 0 :(得分:2)

以下是我要做的事情,让我们假设您遍历所有实体并检查实体类型。

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

希望它有所帮助 拉吉斯拉夫

答案 1 :(得分:2)

拉迪斯拉夫的例子没有深入到所有层面。

为此你需要一个递归方法:

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