# encoding: UTF-8
# READ-ONLY: 선택 브라켓 주변(상·하 체결 상대물)의 구멍/장공 실측 -> 피치 확인
m = Sketchup.active_model
res = []
walk = nil
walk = lambda do |ents, tr, path, depth|
  ents.grep(Sketchup::Face).each do |f|
    f.loops.reject{|l| l.outer?}.each do |l|
      b = Geom::BoundingBox.new; l.vertices.each{|v| b.add(v.position.transform(tr))}
      cx=((b.min.x+b.max.x)/2).to_mm; cy=((b.min.y+b.max.y)/2).to_mm; cz=((b.min.z+b.max.z)/2).to_mm
      next unless cx > 8700 && cx < 9500 && cy > 10600 && cy < 12100 && cz > 130 && cz < 400
      res << [path, cx.round(2), cy.round(2), cz.round(2), (b.max.x-b.min.x).to_mm.round(2), (b.max.y-b.min.y).to_mm.round(2)]
    end
  end
  return if depth > 3
  (ents.grep(Sketchup::Group) + ents.grep(Sketchup::ComponentInstance)).each do |e|
    nm = e.respond_to?(:name) && !e.name.to_s.empty? ? e.name : '(무명)'
    sub = e.is_a?(Sketchup::Group) ? e.entities : e.definition.entities
    walk.call(sub, tr * e.transformation, "#{path}/#{nm}", depth+1)
  end
end
walk.call(m.entities, Geom::Transformation.new, '', 0)
res.sort_by!{|r| [r[0], r[2], r[1]]}
puts "영역내 구멍/장공 #{res.size}개"
res.group_by{|r| r[0]}.each do |path, v|
  xs = v.map{|r| r[1]}.sort
  puts "#{path} : #{v.size}개  Ø(x,y)=#{v.map{|r| [r[4],r[5]]}.uniq.inspect}"
  v.each{|r| puts "    c=(#{r[1]}, #{r[2]}, #{r[3]})"}
  puts "    x피치=#{xs.each_cons(2).map{|a,b| (b-a).round(2)}.uniq.inspect}"
end
nil
