# -*- coding: utf-8 -*-
def f(v); (v.to_f*25.4).round(2); end
m = Sketchup.active_model
selg = m.selection.first
puts "SEL def=#{selg.definition.name} scales x=#{selg.transformation.xscale.round(5)} y=#{selg.transformation.yscale.round(5)} z=#{selg.transformation.zscale.round(5)}"

def walk(e, tr, path, res)
  if e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance)
    t2 = tr * e.transformation
    nm = (e.respond_to?(:name) && e.name.to_s != "") ? e.name.to_s : e.definition.name.to_s
    e.definition.entities.each{|c| walk(c, t2, path+"/"+nm, res)}
  elsif e.is_a?(Sketchup::Face)
    res << [path, e, tr]
  end
end

res = []
walk(selg, Geom::Transformation.new, "", res)
puts "총 face 수 = #{res.size}"

# 내부 루프(구멍) 조사
puts "\n== 내부 루프(구멍) 목록 =="
n_hole = 0
byleaf = Hash.new{|h,k| h[k]=[]}
res.each do |path, face, tr|
  face.loops.each do |lp|
    next if lp.outer?
    n_hole += 1
    pts = lp.vertices.map{|v| v.position.transform(tr)}
    xs = pts.map{|p| f(p.x)}; ys = pts.map{|p| f(p.y)}; zs = pts.map{|p| f(p.z)}
    dx = (xs.max-xs.min); dy = (ys.max-ys.min); dz = (zs.max-zs.min)
    cx = (xs.max+xs.min)/2.0; cy=(ys.max+ys.min)/2.0; cz=(zs.max+zs.min)/2.0
    # 정의 공간에서의 원본 치수
    lpts = lp.vertices.map{|v| v.position}
    lxs=lpts.map{|p| f(p.x)}; lys=lpts.map{|p| f(p.y)}; lzs=lpts.map{|p| f(p.z)}
    ldx=(lxs.max-lxs.min); ldy=(lys.max-lys.min); ldz=(lzs.max-lzs.min)
    isarc = lp.edges.any?{|ed| ed.curve.is_a?(Sketchup::ArcCurve)}
    rad = nil
    lp.edges.each{|ed| c=ed.curve; if c.is_a?(Sketchup::ArcCurve); rad = f(c.radius); break; end}
    byleaf[path] << 1
    puts "  [#{n_hole}] #{path}"
    puts "      정의공간 bbox mm: #{ldx} x #{ldy} x #{ldz}  arc=#{isarc} defR=#{rad.inspect} nvert=#{lp.vertices.size}"
    puts "      월드   bbox mm: #{dx} x #{dy} x #{dz}   center=(#{cx}, #{cy}, #{cz})"
  end
end
puts "내부 루프 총 #{n_hole}개"
puts "부재별: #{byleaf.map{|k,v| [k, v.size]}.inspect}"

puts "\n== 리프 부재별 면/솔리드 상태 =="
def leaves(e, path, out)
  if e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance)
    nm = (e.respond_to?(:name) && e.name.to_s != "") ? e.name.to_s : e.definition.name.to_s
    subs = e.definition.entities.select{|c| c.is_a?(Sketchup::Group)||c.is_a?(Sketchup::ComponentInstance)}
    if subs.empty?
      out << [path+"/"+nm, e]
    else
      subs.each{|s| leaves(s, path+"/"+nm, out)}
    end
  end
end
lv = []
leaves(selg, "", lv)
lv.each do |p, e|
  d = e.definition
  puts "  #{p}  faces=#{d.entities.grep(Sketchup::Face).size} edges=#{d.entities.grep(Sketchup::Edge).size} manifold=#{d.entities.respond_to?(:parent) ? (e.manifold? rescue 'n/a') : 'n/a'} volume=#{(e.volume*25.4**3/1000.0).round(1) rescue 'n/a'} cm3"
  b = d.bounds
  puts "      def bbox mm #{f(b.width)} x #{f(b.height)} x #{f(b.depth)}"
end
"DONE5"
