# encoding: UTF-8
# rd18 — 수직 간극 실측: 조립부원판(아래) 상면 ~ SWD_04(위) 하면, jog30/jog20 현재 높이 (읽기 전용)
def r1(v); (v * 25.4).round(1); end
m = Sketchup.active_model

def collect(ent, tr, faces)
  ent.entities.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

# (x,y) 수직선이 면을 관통하면 그 z 반환
def zs_at(faces, x, y)
  res = []
  faces.each do |pts, n|
    # XY 평면 투영 다각형 내부 판정
    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
      if ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi)
        inside = !inside
      end
      j = i
    end
    next unless inside
    p0 = pts[0]
    d = n.x * (x - p0.x) + n.y * (y - p0.y)
    next if n.z.abs < 1e-9
    res << (p0.z - d / n.z)
  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" }
s02 = g2.entities.grep(Sketchup::Group).find { |g| g.name == "SWD_02_t6_1000_jog30" }
s03 = g2.entities.grep(Sketchup::Group).find { |g| g.name == "SWD_03_t6_1000_jog20" }
out = []
fw = []; collect(won, won.transformation, fw)
f4 = []; collect(s04, g2.transformation * s04.transformation, f4)
f2 = []; collect(s02, g2.transformation * s02.transformation, f2)
f3 = []; collect(s03, g2.transformation * s03.transformation, f3)
out << "면수 원판=#{fw.length} SWD_04=#{f4.length} jog30=#{f2.length} jog20=#{f3.length}"

[["jog30", 9200.0, f2], ["jog20", 8853.0, f3]].each do |label, xmm, fj|
  out << "=== #{label} (x=#{xmm}) ==="
  out << "   y      원판상면   SWD04하면   간극    현재#{label}(하..상=높이)"
  (10750..11850).step(50) do |ymm|
    x = xmm / 25.4; y = ymm / 25.4
    zw = zs_at(fw, x, y); z4 = zs_at(f4, x, y); zj = zs_at(fj, x, y)
    wt = zw.empty? ? nil : zw.max
    b4 = z4.empty? ? nil : z4.min
    gap = (wt && b4) ? r1(b4 - wt) : nil
    jl = zj.empty? ? "-" : "#{r1(zj.min)}..#{r1(zj.max)}=#{r1(zj.max - zj.min)}"
    out << "  #{ymm}  #{wt ? r1(wt) : '-'}      #{b4 ? r1(b4) : '-'}      #{gap ? gap : '-'}    #{jl}"
  end
end
puts out.join("\n")
"RD18"
