# encoding: UTF-8
begin
  puts "###DZW-REVERT-1B-20260920"
  m = Sketchup.active_model
  bk = 'E:/도진팩토리/3D스캔및티칭시스템/_자동화/autosave/BACKUP_before_revert1b.skp'
  m.save_copy(bk)
  puts "BACKUP=#{bk}"
  tgt = -0.8975   # ①-B 이전 기울기
  cov = nil
  m.active_entities.each do |e|
    next unless e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance)
    cov = e if (e.respond_to?(:name) ? e.name.to_s : '') == '하부프레임커버'
  end
  k = nil
  if cov
    (cov.entities.grep(Sketchup::Group) + cov.entities.grep(Sketchup::ComponentInstance)).each do |q|
      k = q if (q.respond_to?(:name) ? q.name.to_s : '') == '조립부원판_20260919'
    end
  end
  if k.nil?
    puts "STOP: 조립부원판 미발견"
  else
    ct = cov.transformation
    wt = ct * k.transformation
    pts = []
    k.entities.grep(Sketchup::Edge).each { |ed| ed.vertices.each { |v| pts << v.position.transform(wt) } }
    xs = pts.map { |p| p.x.to_mm }
    xmin = xs.min
    xmax = xs.max
    zf = pts.select { |p| p.x.to_mm <= xmin + 1.0 }.map { |p| p.z.to_mm }.min
    zr = pts.select { |p| p.x.to_mm >= xmax - 1.0 }.map { |p| p.z.to_mm }.min
    cur = Math.atan((zf - zr) / (xmax - xmin)) * 180.0 / Math::PI
    da = tgt - cur
    puts "검산: 현재 #{cur.round(4)}deg -> 복원 #{tgt}deg, 역회전 #{da.round(4)}deg (피벗 X#{xmax.round(1)}/Z#{zr.round(2)}, 앞끝 하강 예상 #{((xmax - xmin) * (Math.tan(cur * Math::PI / 180.0) - Math.tan(tgt * Math::PI / 180.0))).round(1)}mm)"
    if da.abs > 12.0
      puts "STOP: 역회전량 과다 -> 변경 없음"
    else
      piv = Geom::Point3d.new(xmax.mm, 0, zr.mm)
      rw = Geom::Transformation.rotation(piv, Geom::Vector3d.new(0, 1, 0), da * Math::PI / 180.0)
      m.start_operation('①-B 경사회전 되돌리기', true)
      k.transform!(ct.inverse * rw * ct)
      m.commit_operation
      wt2 = ct * k.transformation
      p2 = []
      k.entities.grep(Sketchup::Edge).each { |ed| ed.vertices.each { |v| p2 << v.position.transform(wt2) } }
      x2 = p2.map { |p| p.x.to_mm }
      z2 = p2.map { |p| p.z.to_mm }
      zf2 = p2.select { |p| p.x.to_mm <= x2.min + 1.0 }.map { |p| p.z.to_mm }.min
      zr2 = p2.select { |p| p.x.to_mm >= x2.max - 1.0 }.map { |p| p.z.to_mm }.min
      a2 = Math.atan((zf2 - zr2) / (x2.max - x2.min)) * 180.0 / Math::PI
      puts "== 복원 결과 기울기 #{a2.round(4)}deg (목표 #{tgt}), 월드 X=[#{x2.min.round(1)},#{x2.max.round(1)}] Z=[#{z2.min.round(1)},#{z2.max.round(1)}] (①-B 직전 기대 Z=[53.7,67.1])"
      puts "   scale=[#{k.transformation.xscale.round(5)},#{k.transformation.yscale.round(5)},#{k.transformation.zscale.round(5)}]  홀 정원(①-A) 유지"
      vw = m.active_view
      cam0 = vw.camera
      begin
        bb = cov.bounds
        c = bb.center
        eye = Geom::Point3d.new(c.x - 4000.mm, c.y - 5000.mm, c.z + 2500.mm)
        vw.camera = Sketchup::Camera.new(eye, c, Geom::Vector3d.new(0, 0, 1))
        vw.zoom(cov)
        img = 'E:/도진팩토리/3D스캔및티칭시스템/_자동화/inbox/_check_revert1b.png'
        vw.write_image(img, 1600, 1000, true)
        puts "   캡처=#{img} (존재=#{File.exist?(img)})"
      rescue Exception => e3
        puts "   캡처 실패: #{e3.class}: #{e3.message}"
      ensure
        vw.camera = cam0
      end
      ok = m.save
      puts "SAVE=#{ok.inspect} modified?=#{m.modified?.inspect}"
      puts "DONE"
    end
  end
rescue Exception => e
  puts "EXC #{e.class}: #{e.message}"
  puts e.backtrace.first(6).join(" | ")
end
nil
