# encoding: UTF-8
# mk_tri — 삼각 플레이트 t6 2장(좌우 대칭) 생성.
#   빗변 22.40도(= SWD_04 경사), 밑변은 주황판 상면 z=106.5, 수직변은 데크 끝 y 위치.
#   꼭짓점은 20mm 직각 모따기(수직 절단).
HB = 'E:/도진팩토리/3D스캔및티칭시스템/_자동화/inbox/_보류/_tri_heartbeat.txt'
def hb(s)
  begin
    File.open(HB, 'a:UTF-8') { |f| f.write("[#{Time.now.strftime('%H:%M:%S')}] #{s}\n"); f.flush }
  rescue Exception
    nil
  end
end
MM = 25.4
def r2(v); (v * 25.4).round(2); end

m = Sketchup.active_model
out = []
hb("START")
g2 = m.entities.grep(Sketchup::Group).find { |g| g.definition.name == "그룹#2" }
if g2.nil?
  out << "그룹#2 없음 -> 중단"
else
  ang = 22.40 * Math::PI / 180.0
  tn = Math.tan(ang)
  zb = 106.5
  cham = 20.0
  # [라벨, 바깥면 x(mm), 두께방향 부호, y시작(수직변), y끝(빗변이 밑면에 닿는 지점)]
  specs = [
    ["삼각판_jog30측_20260919", 9185.09, +1.0, 11600.06, 11844.20],
    ["삼각판_jog20측_20260919", 8862.68, -1.0, 11605.01, 11848.64]
  ]
  begin
    base = File.basename(m.path, '.skp'); dir = File.dirname(m.path)
    bak = File.join(dir, "#{base}.bak_#{Time.now.strftime('%Y%m%d_%H%M%S')}_tri직전.skp")
    m.save_copy(bak)
    out << "사전 백업 OK -> #{bak}"
    hb("BACKUP OK")
    m.start_operation("삼각 플레이트 2장 생성", true)
    specs.each do |name, xmm, sgn, ya, yc|
      span = yc - ya
      hgt = span * tn
      ycut = yc - cham
      zcut = zb + (yc - ycut) * tn
      pts = [
        Geom::Point3d.new(xmm / MM, ya / MM, (zb + hgt) / MM),
        Geom::Point3d.new(xmm / MM, ya / MM, zb / MM),
        Geom::Point3d.new(xmm / MM, ycut / MM, zb / MM),
        Geom::Point3d.new(xmm / MM, ycut / MM, zcut / MM)
      ]
      g = g2.entities.add_group
      f = g.entities.add_face(pts)
      d = 6.0 / MM
      f.pushpull(f.normal.x * sgn > 0 ? d : -d)
      g.name = name
      hb("TRI #{name} solid=#{g.manifold?}")
      hyp = Math.sqrt(span * span + hgt * hgt)
      out << "#{name}: 수직변 #{hgt.round(2)}mm / 밑변 #{span.round(2)}mm / 빗변 #{hyp.round(2)}mm / 각도 22.40도 / t6 / 모따기 20mm(직각) / 부착 x=#{xmm} solid=#{g.manifold?}"
      b = g.bounds
      out << "   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)})"
    end
    m.commit_operation
    hb("COMMIT OK")
  rescue Exception => e
    m.commit_operation rescue nil
    out << "ERR #{e.class}: #{e.message}"
    hb("ERR #{e.message}")
  end
end
puts out.join("\n")
hb("END")
"TRI"
