# encoding: UTF-8
m = Sketchup.active_model
sel = m.selection.to_a
def dump(e, tr, path, depth)
  ents = e.is_a?(Sketchup::Group) ? e.entities : e.definition.entities
  t2 = tr * e.transformation
  subs = ents.grep(Sketchup::Group) + ents.grep(Sketchup::ComponentInstance)
  fs = ents.grep(Sketchup::Face)
  b = e.bounds
  puts "#{'  '*depth}#{path} solid=#{e.manifold?} faces=#{fs.size} subs=#{subs.size} vol=%.0fmm3" % (e.volume.to_f*(25.4**3))
  fs.sort_by{|f| -f.area}.first(8).each_with_index do |f,j|
    n = f.normal.transform(t2)
    fb = Geom::BoundingBox.new; f.vertices.each{|v| fb.add(v.position.transform(t2))}
    puts "#{'  '*depth}  면[%d] %.0fmm2 n=(%.3f,%.3f,%.3f) loops=%d x %.1f..%.1f y %.1f..%.1f z %.1f..%.1f" %
      [j, f.area*645.16, n.x,n.y,n.z, f.loops.size, fb.min.x.to_mm,fb.max.x.to_mm,fb.min.y.to_mm,fb.max.y.to_mm,fb.min.z.to_mm,fb.max.z.to_mm]
    f.loops.reject{|l| l.outer?}.each do |l|
      lb=Geom::BoundingBox.new; l.vertices.each{|v| lb.add(v.position.transform(t2))}
      puts "#{'  '*depth}      홀 c=(%.2f,%.2f,%.2f) 크기 %.2f x %.2f x %.2f" %
        [((lb.min.x+lb.max.x)/2).to_mm,((lb.min.y+lb.max.y)/2).to_mm,((lb.min.z+lb.max.z)/2).to_mm,
         (lb.max.x-lb.min.x).to_mm,(lb.max.y-lb.min.y).to_mm,(lb.max.z-lb.min.z).to_mm]
    end
  end
  subs.each_with_index { |s,i| dump(s, t2, "#{path}/sub#{i}", depth+1) }
end
sel.each { |e| dump(e, Geom::Transformation.new, e.name, 0) }

# 주변 참조: 윈치 베이스 플레이트 / 커버프레임 후보
['WINCH_BASE_PLATE_25T_1','조립부원판_20260919'].each do |nm|
  g = m.entities.grep(Sketchup::Group).find{|x| x.name==nm} || m.entities.grep(Sketchup::ComponentInstance).find{|x| x.name==nm}
  next if g.nil?
  b=g.bounds
  puts "#{nm} bbox x %.2f..%.2f y %.2f..%.2f z %.2f..%.2f" % [b.min.x.to_mm,b.max.x.to_mm,b.min.y.to_mm,b.max.y.to_mm,b.min.z.to_mm,b.max.z.to_mm]
end
nil
