# encoding: UTF-8
begin
  puts "###DZW-VERIFY-SAVE-20260920"
  m = Sketchup.active_model
  spec = [
    ['RJ102-0604_LH_20260918', 4424.7, 3848.5, 85.4, 20.4, 6.4455],
    ['RJ102-0602_RH_20260918', 4415.1, 3833.8, 88.8, 23.8, 6.3909]
  ]
  found = {}
  m.active_entities.each do |e|
    next unless e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance)
    nm = (e.respond_to?(:name) ? e.name.to_s : '')
    found[nm] = e unless nm.empty?
  end
  allok = true
  spec.each do |nm, cr_o, xt_o, zt_o, zc_o, ang_o|
    g = found[nm]
    if g.nil?
      puts "STOP: '#{nm}' 미발견"
      allok = false
      next
    end
    tr = g.transformation
    pts = []
    g.entities.grep(Sketchup::Edge).each { |ed| ed.vertices.each { |v| pts << v.position.transform(tr) } }
    xs = pts.map { |p| p.x.to_mm }
    ux = xs.uniq.sort
    gi = 0
    gv = -1.0
    (0...(ux.length - 1)).each do |i|
      dd = ux[i + 1] - ux[i]
      if dd > gv
        gv = dd
        gi = i
      end
    end
    xg = ux[gi]
    cr2 = pts.select { |p| p.x.to_mm >= xg - 4.0 && p.x.to_mm <= xg + 0.01 }
    crx = (cr2.map { |p| p.x.to_mm }.min + cr2.map { |p| p.x.to_mm }.max) / 2.0
    crz = cr2.map { |p| p.z.to_mm }.min
    crzh = cr2.map { |p| p.z.to_mm }.max
    xcl = cr2.select { |p| (p.z.to_mm - crz).abs < 0.05 }.map { |p| p.x.to_mm }.min
    tz = pts.select { |p| p.x.to_mm <= xs.min + 0.5 }.map { |p| p.z.to_mm }.min
    tzh = pts.select { |p| p.x.to_mm <= xs.min + 0.5 }.map { |p| p.z.to_mm }.max
    am = Math.atan((tz - crz) / (xcl - xs.min)) * 180.0 / Math::PI
    b = g.bounds
    d1 = (crx - cr_o).abs
    d2 = (tz - zt_o).abs
    d3 = (crz - zc_o).abs
    d4 = (am - ang_o).abs
    allok = false if d1 > 0.3 || d2 > 0.2 || d3 > 0.2 || d4 > 0.01
    puts "== #{nm} hidden=#{g.hidden?} 면수=#{g.entities.grep(Sketchup::Face).length}"
    puts "   절곡선X #{crx.round(1)} (원형 #{cr_o}, 차 #{d1.round(2)}) / 절곡하단Z #{crz.round(1)} (원형 #{zc_o}, 차 #{d3.round(2)}) / 상단Z #{crzh.round(1)}"
    puts "   앞끝 X #{xs.min.round(1)} (원형 #{xt_o}) Z #{tz.round(1)} (원형 #{zt_o}, 차 #{d2.round(2)}) 상단Z #{tzh.round(1)}"
    puts "   절곡높이 #{(tzh - crzh).round(1)}mm / 경사각 #{am.round(4)}deg (원형 #{ang_o}, 차 #{d4.round(4)})"
    puts "   bbox min=#{b.min.to_a.map { |v| v.to_mm.round(1) }.inspect} max=#{b.max.to_a.map { |v| v.to_mm.round(1) }.inspect}"
  end
  puts "검증: #{allok ? '원형 일치' : '불일치 있음'}"
  ok = m.save
  puts "SAVE=#{ok.inspect} modified?=#{m.modified?.inspect}"
  puts "DONE"
rescue Exception => e
  puts "EXC #{e.class}: #{e.message}"
  puts e.backtrace.first(5).join(" | ")
end
nil
