# encoding: UTF-8
begin
  puts "###DZW-SCAN-OILCOVER-20260920"
  m = Sketchup.active_model
  ents = lambda { |s| s.is_a?(Sketchup::Group) ? s.entities : s.definition.entities }
  et = m.edit_transform
  puts "active_entities==model.entities? #{(m.active_entities == m.entities)} / edit_transform origin=#{et.origin.to_a.map { |v| v.to_mm.round(1) }.inspect}"
  ap = m.active_path
  puts "active_path=#{ap ? ap.map { |x| (x.respond_to?(:name) && !x.name.to_s.empty?) ? x.name.to_s : x.class.to_s }.inspect : 'nil(최상위)'}"
  sel = m.selection.to_a
  puts "선택 #{sel.length}개"
  if sel.empty?
    puts "STOP: 선택 0개 -> 중단(복사본 특정 불가)"
  else
    sel.each_with_index do |e, i|
      nm = (e.respond_to?(:name) ? e.name.to_s : '')
      dn = e.is_a?(Sketchup::ComponentInstance) ? e.definition.name.to_s : ''
      if e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance)
        wt = et * e.transformation
        ps = []
        col = nil
        col = lambda do |en, t|
          en.grep(Sketchup::Edge).each { |ed| ed.vertices.each { |v| ps << v.position.transform(t) } }
          (en.grep(Sketchup::Group) + en.grep(Sketchup::ComponentInstance)).each { |q| col.call(ents.call(q), t * q.transformation) }
        end
        col.call(ents.call(e), wt)
        next puts "  [#{i}] '#{nm}#{dn}' 정점 없음" if ps.empty?
        xr = ps.map { |p| p.x.to_mm }.minmax
        yr = ps.map { |p| p.y.to_mm }.minmax
        zr = ps.map { |p| p.z.to_mm }.minmax
        d = [xr[1] - xr[0], yr[1] - yr[0], zr[1] - zr[0]]
        puts "  [#{i}] #{e.class} '#{nm}#{dn}' 월드 X=#{xr.map { |v| v.round(1) }.inspect} Y=#{yr.map { |v| v.round(1) }.inspect} Z=#{zr.map { |v| v.round(1) }.inspect}"
        puts "       크기=[#{d[0].round(1)},#{d[1].round(1)},#{d[2].round(1)}] 두께후보=#{d.min.round(2)} scale=[#{e.transformation.xscale.round(4)},#{e.transformation.yscale.round(4)},#{e.transformation.zscale.round(4)}] 정점#{ps.length}"
        hl = []
        ff = nil
        ff = lambda do |en, t|
          en.grep(Sketchup::Face).each do |fa|
            fa.loops.each do |lp|
              next if lp.outer?
              next if lp.vertices.length < 8
              vp = lp.vertices.map { |v| v.position.transform(t) }
              bb = Geom::BoundingBox.new
              vp.each { |p| bb.add(p) }
              dd = [bb.width.to_mm, bb.height.to_mm, bb.depth.to_mm].sort
              hl << [dd[1].round(1), dd[2].round(1)]
            end
          end
          (en.grep(Sketchup::Group) + en.grep(Sketchup::ComponentInstance)).each { |q| ff.call(ents.call(q), t * q.transformation) }
        end
        ff.call(ents.call(e), wt)
        g = {}
        hl.each { |a| g[a] = (g[a] || 0) + 1 }
        puts "       구멍(내부루프) #{hl.length}개: #{g.to_a.sort_by { |a, c| -c }.first(4).map { |a, c| "#{a[0]}x#{a[1]}x#{c}개" }.join(' , ')}"
      else
        puts "  [#{i}] #{e.class} (그룹 아님)"
      end
    end
  end
  puts "모델 수정 없음"
rescue Exception => e
  puts "EXC #{e.class}: #{e.message}"
  puts e.backtrace.first(5).join(" | ")
end
nil
