# encoding: UTF-8
m = Sketchup.active_model
def r1(v); (v*25.4).round(1); end
sel = m.selection
puts "SEL COUNT=#{sel.length}"
sel.each do |e|
  nm = e.respond_to?(:name) ? e.name.to_s : ""
  nm = e.definition.name.to_s if nm.empty? && e.respond_to?(:definition)
  puts "SEL: #{e.class} #{nm.inspect}"
  next unless e.respond_to?(:bounds)
  b=e.bounds; t=e.transformation
  puts "  world bbox (#{r1(b.min.x)},#{r1(b.min.y)},#{r1(b.min.z)})..(#{r1(b.max.x)},#{r1(b.max.y)},#{r1(b.max.z)})"
  puts "  size #{((b.max.x-b.min.x)*25.4).round(1)} x #{((b.max.y-b.min.y)*25.4).round(1)} x #{((b.max.z-b.min.z)*25.4).round(1)}"
  puts "  scale #{t.xscale.round(4)}/#{t.yscale.round(4)}/#{t.zscale.round(4)} solid=#{(e.manifold? rescue 'n/a')}"
  puts "  origin (#{r1(t.origin.x)},#{r1(t.origin.y)},#{r1(t.origin.z)})"
  ents = e.respond_to?(:definition) ? e.definition.entities : e.entities
  puts "  ents=#{ents.length} faces=#{ents.grep(Sketchup::Face).length} grp=#{ents.grep(Sketchup::Group).length} cmp=#{ents.grep(Sketchup::ComponentInstance).length}"
  ents.grep(Sketchup::Group).each{|s| sb=s.bounds; puts "    sub #{s.name.inspect} (#{r1(sb.min.x)},#{r1(sb.min.y)},#{r1(sb.min.z)})..(#{r1(sb.max.x)},#{r1(sb.max.y)},#{r1(sb.max.z)})"}
  # 구멍(내부루프) 위치 - 로컬
  hs=[]
  ents.grep(Sketchup::Face).each do |f|
    f.loops.each do |lp|
      next if lp.outer?
      pts = lp.vertices.map{|v| v.position}
      cx = pts.map{|p| p.x}.inject(:+)/pts.length*25.4
      cy = pts.map{|p| p.y}.inject(:+)/pts.length*25.4
      cz = pts.map{|p| p.z}.inject(:+)/pts.length*25.4
      d = [(pts.map{|p| p.x}.minmax.reduce(:-)).abs*25.4, (pts.map{|p| p.y}.minmax.reduce(:-)).abs*25.4].max
      k=[cx.round(1),cy.round(1),cz.round(1)]
      hs << [k,d.round(1)] unless hs.any?{|a,_| (a[0]-k[0]).abs<1 && (a[1]-k[1]).abs<1 && (a[2]-k[2]).abs<1}
    end
  end
  puts "  구멍 #{hs.length}개 (로컬좌표):"
  hs.sort_by{|k,_| [k[0],k[1]]}.each{|k,d| puts "    #{k.inspect} Ø#{d}"}
  # 로컬 bbox
  lb = e.respond_to?(:definition) ? e.definition.bounds : nil
  puts "  로컬 bbox (#{r1(lb.min.x)},#{r1(lb.min.y)},#{r1(lb.min.z)})..(#{r1(lb.max.x)},#{r1(lb.max.y)},#{r1(lb.max.z)})" if lb
end
"RD5"
