2010-05-26 18 views
1

Je fais un plugin pour résumer la superficie de tout le matériel dans un croquis. J'ai réussi à obtenir tous les visages et autres, mais maintenant les composants entrent dans l'image. J'utilise le terme de composant à un ou plusieurs niveaux car je ne connais pas de meilleure façon d'expliquer l'occurrence d'avoir un composant à l'intérieur d'un composant et ainsi de suite.Résumé zone pour le matériel dans les composants, Google Sketchup

J'ai remarqué que certains composants ont aussi plus d'un seul niveau. Donc, si vous allez à l'intérieur d'un composant, il peut y avoir des composants incorporés dans ce composant qui ont aussi des matériaux. Donc, ce que je veux, c'est résumer tout le matériel d'un composant spécifique et obtenir tous les matériaux "récursifs", le cas échéant, à l'intérieur du composant. Alors, comment compter la surface de tout le matériel à l'intérieur d'un composant (simple ou multi-niveaux)?

Répondre

2

Voici ce que je ferais, supposons que vous parcouriez toutes les entités et vérifiiez le type d'entité.

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 

Vous pouvez faire la même chose avec un groupe avec:

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 

Hope it helps Ladislav

2

exemple de Ladislav ne creuse pas dans tous les niveaux.

Pour que vous avez besoin d'une méthode récursive:

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