# encoding: UTF-8
# intf — 실제 솔리드 간섭 전수 검사 (복제본 intersect, 원본 무변경)
HB = 'E:/도진팩토리/3D스캔및티칭시스템/_자동화/inbox/_보류/_intf_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; end; end
MM = 25.4
m = Sketchup.active_model
out = []
hb("START")
g2 = m.entities.grep(Sketchup::Group).find { |g| g.definition.name == "그룹#2" }
s04 = g2.entities.grep(Sketchup::Group).find { |g| g.name == "SWD_04_t9_240x1046" }
parts = []
parts << ["주황판SWD_04", s04.definition, g2.transformation * s04.transformation]
["조립부원판_20260919", "SWD_02_jog30_6T_20260919", "SWD_03_jog20_6T_20260919", "사이드막음판_9T_A_20260919", "사이드막음판_9T_B_20260919"].each do |nm|
  g = m.entities.grep(Sketchup::Group).find { |x| x.name == nm }
  parts << [nm, g.definition, g.transformation] if g
end
out << "검사 부재 #{parts.length}개: #{parts.map { |p| p[0] }.inspect}"
begin
  m.start_operation("간섭 검사(복제본)", true)
  res = []
  (0...parts.length).each do |i|
    ((i + 1)...parts.length).each do |j|
      a = m.entities.add_group
      a.entities.add_instance(parts[i][1], parts[i][2]).explode
      b = m.entities.add_group
      b.entities.add_instance(parts[j][1], parts[j][2]).explode
      if !a.manifold? || !b.manifold?
        out << "  #{parts[i][0]} vs #{parts[j][0]}: 솔리드 복제 실패(a=#{a.manifold?} b=#{b.manifold?})"
        a.erase!; b.erase!
        next
      end
      r = a.intersect(b)
      if r && r.valid?
        v = (r.volume rescue 0.0) * (25.4**3)
        bb = r.bounds
        out << "  간섭: #{parts[i][0]} ∩ #{parts[j][0]} = #{v.round(0)}mm3, bbox (#{(bb.min.x*25.4).round(1)},#{(bb.min.y*25.4).round(1)},#{(bb.min.z*25.4).round(1)})..(#{(bb.max.x*25.4).round(1)},#{(bb.max.y*25.4).round(1)},#{(bb.max.z*25.4).round(1)}) 높이 #{((bb.max.z-bb.min.z)*25.4).round(2)}mm"
        res << [parts[i][0], parts[j][0], v]
        r.erase!
      end
      hb("PAIR #{i}-#{j}")
    end
  end
  m.commit_operation
  hb("COMMIT")
  out << (res.empty? ? "간섭 없음" : "간섭 쌍 #{res.length}개")
rescue Exception => e
  m.commit_operation rescue nil
  out << "ERR #{e.class}: #{e.message}"
  hb("ERR #{e.message}")
end
puts out.join("\n")
hb("END")
"INTF"
