我正在制作一个插件来总结 Sketch 中所有材料的面积。我已经成功地获得了所有的面孔等,但现在组件进入了画面。
我使用术语单级或多级组件,因为我不知道有什么更好的方法来解释组件内部存在组件等等。
我注意到有些组件对 i 的影响也不仅仅是 1 级。因此,如果您进入一个组件内部,则可能会嵌入该组件中的组件也具有材料。所以我想要的是总结特定组件的所有材料并获得组件内部的所有“递归”材料(如果有的话)。
那么,如何计算组件内所有材料的面积(单层或多层)?
我正在制作一个插件来总结 Sketch 中所有材料的面积。我已经成功地获得了所有的面孔等,但现在组件进入了画面。
我使用术语单级或多级组件,因为我不知道有什么更好的方法来解释组件内部存在组件等等。
我注意到有些组件对 i 的影响也不仅仅是 1 级。因此,如果您进入一个组件内部,则可能会嵌入该组件中的组件也具有材料。所以我想要的是总结特定组件的所有材料并获得组件内部的所有“递归”材料(如果有的话)。
那么,如何计算组件内所有材料的面积(单层或多层)?
这是我要做的,假设您遍历所有实体并检查实体类型。
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
您可以对 Group 执行相同操作:
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
希望它可以帮助拉迪斯拉夫
拉迪斯拉夫的例子并没有深入到所有层面。
为此,您需要一个递归方法:
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