1

スケッチ内のすべてのマテリアルの面積を合計するプラグインを作成しています。すべての顔などを取得することに成功しましたが、コンポーネントが表示されます。

コンポーネント内にコンポーネントがあるなどの発生を説明するより良い方法がわからないため、単一または複数レベルのコンポーネントという用語を使用しています。

一部のコンポーネントには、1 つのレベルだけでなく複数のレベルがあることに気付きました。そのため、1 つのコンポーネント内に移動すると、このコンポーネント内に埋め込まれたコンポーネントもマテリアルを持つ可能性があります。したがって、私が望むのは、特定のコンポーネントのすべてのマテリアルを合計し、コンポーネント内にある場合はすべての「再帰的」マテリアルを取得することです。

では、コンポーネント (シングルまたはマルチレベル) 内のすべてのマテリアルの面積をどのように数えますか?

4

2 に答える 2

2

Ladislav の例は、すべてのレベルを掘り下げているわけではありません。

そのためには、再帰的な方法が必要です:

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
于 2012-02-06T20:38:39.140 に答える
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

ラディスラフに役立つことを願っています

于 2010-06-01T10:37:14.867 に答える