# encoding: UTF-8
m = Sketchup.active_model
YMID = 8142.55
root = m.entities.grep(Sketchup::Group).find{|g| g.name=="하부마운트커버_v5_20260919"}
acc=[]; mn=[1e9]*3; mx=[-1e9]*3; zs=[]; ys=[]; tot=0.0
walk = lambda do |g,tr|
  g.entities.grep(Sketchup::Group).each do |s|
    t = s.transformation*tr
    if s.entities.grep(Sketchup::Group).length>0 then walk.call(s,t)
    else
      acc << [s.name, s.volume, s.manifold?]
      s.entities.grep(Sketchup::Face).each do |f|
        n = f.normal.transform(t)
        pts = f.vertices.map{|v| v.position.transform(t)}
        pts.each{|p| ys << (p.y*25.4).round(2)
          3.times{|k| val=[p.x,p.y,p.z][k]*25.4; mn[k]=val if val<mn[k]; mx[k]=val if val>mx[k]}}
        if n.z > 0.999
          zz = pts.map{|p| (p.z*25.4).round(2)}.uniq
          if zz.length==1 && zz[0] > 115.0 then tot += f.area*645.16; zs << zz[0] end
        end
      end
    end
  end
end
walk.call(root, root.transformation)
vol = acc.map{|a| a[1]}.inject(:+)
puts "솔리드=#{acc.length} nonsolid=#{acc.reject{|a| a[2]}.map{|a| a[0]}.inspect}"
acc.each{|n,v,s| puts "  #{n}  #{(v*16387.064/1000).round(1)}cm3"}
puts "BBOX (#{mn.map{|v| v.round(1)}.join(',')})..(#{mx.map{|v| v.round(1)}.join(',')})"
puts "체적=#{(vol*16387.064/1e6).round(2)}L 중량=#{(vol*16387.064/1e6*7.85).round(1)}kg"
puts "결합면 수평: Z레벨=#{zs.uniq.inspect} 면적=#{(tot/100).round(1)}cm2 -> #{zs.uniq.length==1 ? '통과' : '불일치'}"
ys.uniq!
puts "좌우대칭 mismatch=#{ys.reject{|y| ys.any?{|o| ((2*YMID-y)-o).abs<0.05}}.length}/#{ys.length}"
puts "격자/앵글/채널 부재수=#{acc.count{|a| a[0]=~/격자|앵글|채널/}}"
# 간섭
puts "== 간섭 후보 =="
m.entities.each do |e|
  next unless e.is_a?(Sketchup::Group)||e.is_a?(Sketchup::ComponentInstance)
  next if e.hidden?
  nm = e.name.to_s; nm = e.definition.name.to_s if nm.empty?
  next if nm=="하부마운트커버_v5_20260919"
  b=e.bounds
  next if b.min.x*25.4>mx[0] || b.max.x*25.4<mn[0] || b.min.y*25.4>mx[1] || b.max.y*25.4<mn[1]
  next if b.min.z*25.4>mx[2] || b.max.z*25.4<mn[2]
  puts "  #{nm.inspect} Z#{(b.min.z*25.4).round(1)}~#{(b.max.z*25.4).round(1)} X#{(b.min.x*25.4).round(1)}~#{(b.max.x*25.4).round(1)} Y#{(b.min.y*25.4).round(1)}~#{(b.max.y*25.4).round(1)}"
end
m.selection.clear; m.selection.add(root); m.active_view.zoom(root)
puts "SEL=#{m.selection.length} MODIFIED=#{m.modified?}"
"V5B"
