# encoding: UTF-8
# vfin — 최종 검증 + 캡처
MM = 25.4
m = Sketchup.active_model
def ents_of(e); e.is_a?(Sketchup::ComponentInstance) ? e.definition.entities : e.entities; end
def collect(ent, tr, faces)
  ents_of(ent).each do |e|
    case e
    when Sketchup::Face
      pts = e.vertices.map { |v| v.position.transform(tr) }
      n = e.normal.transform(tr); n.normalize!
      faces << [pts, n]
    when Sketchup::Group, Sketchup::ComponentInstance
      collect(e, tr * e.transformation, faces)
    end
  end
end
def hitz(faces, x, y, down)
  res = []
  faces.each do |pts, n|
    next if n.z.abs < 0.05
    next if down && n.z > -0.05
    next if !down && n.z < 0.05
    inside = false
    j = pts.length - 1
    (0...pts.length).each do |i|
      xi = pts[i].x; yi = pts[i].y; xj = pts[j].x; yj = pts[j].y
      inside = !inside if ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi)
      j = i
    end
    next unless inside
    p0 = pts[0]
    d = n.x * (x - p0.x) + n.y * (y - p0.y)
    res << (p0.z - d / n.z)
  end
  res
end
out = []
g2 = m.entities.grep(Sketchup::Group).find { |g| g.definition.name == "그룹#2" }
s04 = g2.entities.grep(Sketchup::Group).find { |g| g.name == "SWD_04_t9_240x1046" }
won = m.entities.grep(Sketchup::Group).find { |g| g.name == "조립부원판_20260919" }
f4 = []; collect(s04, g2.transformation * s04.transformation, f4)
fw = []; collect(won, won.transformation, fw)
names = ["SWD_02_jog30_6T_20260919", "SWD_03_jog20_6T_20260919", "사이드막음판_9T_A_20260919", "사이드막음판_9T_B_20260919"]
objs = names.map { |n| m.entities.grep(Sketchup::Group).find { |g| g.name == n } }
objs.each_with_index do |g, i|
  next if g.nil?
  b = g.bounds
  out << "#{names[i]}: solid=#{g.manifold?} x #{(b.min.x*25.4).round(2)}..#{(b.max.x*25.4).round(2)} y #{(b.min.y*25.4).round(2)}..#{(b.max.y*25.4).round(2)} z #{(b.min.z*25.4).round(2)}..#{(b.max.z*25.4).round(2)}"
end
# 격판 끝 <-> 측면판 안쪽면 틈
pa = objs[2].bounds.max.y * 25.4   # A 안쪽면 10879.34
pb = objs[3].bounds.min.y * 25.4   # B 안쪽면 11872.77
[0, 1].each do |i|
  b = objs[i].bounds
  out << "#{names[i]} 끝단 틈: A측 #{((b.min.y*25.4) - pa).round(3)}mm / B측 #{(pb - (b.max.y*25.4)).round(3)}mm (음수=간섭)"
end
# 상하 틈 재확인
[0, 1].each do |i|
  fp = []; collect(objs[i], objs[i].transformation, fp)
  tg = []; bg = []
  fp.select { |_, n| n.z > 0.3 }.each { |pts, _| pts.each { |q| z = hitz(f4, q.x, q.y, true); tg << (z.min - q.z) * 25.4 unless z.empty? } }
  fp.select { |_, n| n.z < -0.3 }.each { |pts, _| pts.each { |q| z = hitz(fw, q.x, q.y, false); bg << (q.z - z.max) * 25.4 unless z.empty? } }
  out << "#{names[i]} 상틈 최대 #{tg.empty? ? '-' : tg.map(&:abs).max.round(3)}mm / 하틈 최대 #{bg.empty? ? '-' : bg.map(&:abs).max.round(3)}mm"
end
v = m.active_view
sel = m.selection
sel.clear
objs.compact.each { |g| sel.add(g) }
sel.add(g2); sel.add(won)
v.camera = Sketchup::Camera.new(Geom::Point3d.new(8250/25.4, 9900/25.4, 700/25.4), Geom::Point3d.new(9030/25.4, 11380/25.4, 160/25.4), Geom::Vector3d.new(0,0,1))
v.zoom(sel.to_a)
sel.clear
out << "capture=#{v.write_image('E:/도진팩토리/3D스캔및티칭시스템/_자동화/inbox/_보류/_cap3.png', 1400, 900, true)}"
puts out.join("\n")
"VFIN"
