# encoding: UTF-8
# vf1 — 필러/삼각판 틈 검증 (읽기 전용): 필러 상면 vs SWD_04 하면, 필러 하면 vs 주황판 상면
def r2(v); (v * 25.4).round(2); end
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] if n.z.abs > 0.05
    when Sketchup::Group, Sketchup::ComponentInstance
      collect(e, tr * e.transformation, faces)
    end
  end
end
def zs_at(faces, x, y)
  res = []
  faces.each do |pts, n|
    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) if n.z.abs > 1e-9
  end
  res
end
g2 = m.entities.grep(Sketchup::Group).find { |g| g.definition.name == "그룹#2" }
won = m.entities.grep(Sketchup::Group).find { |g| g.name == "조립부원판_20260919" }
s04 = g2.entities.grep(Sketchup::Group).find { |g| g.name == "SWD_04_t9_240x1046" }
f4 = []; collect(s04, g2.transformation * s04.transformation, f4)
fw = []; collect(won, won.transformation, fw)
out = []
[["jog30", 9170.0, "SWD_02_jog30_필러"], ["jog20", 8870.0, "SWD_03_jog20_필러"]].each do |label, xmm, pre|
  fs = []
  g2.entities.grep(Sketchup::Group).each do |g|
    next unless g.name.to_s.start_with?(pre)
    collect(g, g2.transformation * g.transformation, fs)
  end
  out << "=== #{label} 필러 검증 (x=#{xmm}) ==="
  out << "   y      필러상단  SWD04하면  상틈 | 필러하단  주황판상면  하틈"
  maxtop = 0.0; maxbot = 0.0
  (11060..11840).step(40) do |ymm|
    x = xmm / MM; y = ymm / MM
    zf = zs_at(fs, x, y); z4 = zs_at(f4, x, y); zw = zs_at(fw, x, y)
    next if zf.empty?
    ft = zf.max * 25.4; fb = zf.min * 25.4
    t4 = z4.empty? ? nil : z4.min * 25.4
    tw = zw.empty? ? nil : zw.max * 25.4
    gt = t4 ? (t4 - ft) : nil
    gb = tw ? (fb - tw) : nil
    maxtop = gt.abs if gt && gt.abs > maxtop
    maxbot = gb.abs if gb && gb.abs > maxbot
    out << "  #{ymm}   #{ft.round(2)}  #{t4 ? t4.round(2) : '-'}  #{gt ? gt.round(3) : '-'} | #{fb.round(2)}  #{tw ? tw.round(2) : '-'}  #{gb ? gb.round(3) : '-'}"
  end
  out << "  최대 상틈 #{maxtop.round(3)}mm / 최대 하틈 #{maxbot.round(3)}mm"
end
out << "=== 삼각판 ==="
g2.entities.grep(Sketchup::Group).each do |g|
  next unless g.name.to_s.start_with?("삼각판")
  b = g.bounds
  out << "  #{g.name} bbox (#{r2(b.min.x)},#{r2(b.min.y)},#{r2(b.min.z)})..(#{r2(b.max.x)},#{r2(b.max.y)},#{r2(b.max.z)}) solid=#{g.manifold?}"
end
out << "=== 그룹#2 구성 ==="
g2.entities.grep(Sketchup::Group).each { |g| out << "  #{g.name.inspect} hidden=#{g.hidden?}" }
puts out.join("\n")
"VF1"
