# encoding: UTF-8
# READ-ONLY: 하판 하면 형상 조사
m = Sketchup.active_model
g = m.entities.grep(Sketchup::Group).find { |e| e.name == '조립부원판_20260919' }
if g.nil?
  puts "하판 없음"
else
  tr = g.transformation
  ents = g.entities
  puts "하판 solid=#{g.manifold?} faces=#{ents.grep(Sketchup::Face).size} edges=#{ents.grep(Sketchup::Edge).size}"
  b = g.bounds
  puts "bbox mm 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]
  # 하향 법선 면들 (전역)
  down = []
  ents.grep(Sketchup::Face).each do |f|
    n = f.normal.transform(tr)
    next unless n.z < -0.05
    pts = f.outer_loop.vertices.map { |v| v.position.transform(tr) }
    zs = pts.map { |p| p.z.to_mm }
    xs = pts.map { |p| p.x.to_mm }
    ys = pts.map { |p| p.y.to_mm }
    down << [f.area*0.00064516*1000000, n, xs, ys, zs, pts.size]
  end
  down.sort_by! { |a| -a[0] }
  puts "하향면 개수=#{down.size}"
  down.first(14).each_with_index do |(ar,n,xs,ys,zs,np), i|
    ang = Math.acos([[-n.z,-1.0].max,1.0].min)*180/Math::PI
    puts "  [%d] area=%.0fmm2 verts=%d normal=(%.4f,%.4f,%.4f) 경사=%.4f도 x %.1f..%.1f y %.1f..%.1f z %.2f..%.2f" % [i,ar,np,n.x,n.y,n.z,ang,xs.min,xs.max,ys.min,ys.max,zs.min,zs.max]
  end
end
nil
