# encoding: UTF-8
begin
  puts "###DZW-TIDY-20260921"
  m = Sketchup.active_model
  bk = 'E:/도진팩토리/3D스캔및티칭시스템/_자동화/autosave/BACKUP_before_tidy.skp'
  m.save_copy(bk)
  puts "BACKUP=#{bk}"
  lab = lambda do |s|
    nm = (s.respond_to?(:name) ? s.name.to_s : '')
    dn = s.is_a?(Sketchup::ComponentInstance) ? s.definition.name.to_s : ''
    nm.empty? ? (dn.empty? ? '(무명)' : dn) : nm
  end
  want = ['조립부원판_20260919', 'DJ1250-윈치받침', '하부보강_2절곡_A_20260919', '하부보강_2절곡_B_20260919',
          '사이드막음판_9T_A_20260919', '사이드막음판_9T_B_20260919', '연결브라켓_L_A_20260919', '연결브라켓_L_B_20260919',
          'SWD_02_jog30_6T_20260919', 'SWD_03_jog20_6T_20260919']
  hidev = ['조립부원판_구_돌기포함_20260919', '조립부원판_구2_홀비대칭_20260919', '조립부원판_구3_홀중심어긋남_20260919', '조립부원판_구4_홀중심어긋남_20260919']
  members = []
  oil = []
  hides = []
  bo_b = 0
  m.entities.each do |e|
    next unless e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance)
    l = lab.call(e)
    members << e if want.include?(l)
    bo_b += 1 if l == '하부보강_2절곡_B_20260919'
    oil << e if l.start_with?('오일탱크커버')
    hides << e if hidev.include?(l)
  end
  puts "묶을 부재 #{members.length}개 / 오일탱크커버 #{oil.length}개 / 숨길 구버전 #{hides.length}개 / 하부보강_2절곡_B 중복 #{bo_b}개"
  if members.length < 5
    puts "STOP: 묶을 부재가 #{members.length}개뿐 -> 중단(무수정)"
  else
    b0 = Geom::BoundingBox.new
    members.each { |e| b0.add(e.bounds) }
    m.start_operation('커버 재그룹화 + 정리', true)
    g = m.entities.add_group(members)
    g.name = '하부프레임커버'
    hides.each { |e| e.hidden = true if e.valid? }
    ren = nil
    if oil.length == 2
      srt = oil.sort_by { |e| e.bounds.min.x.to_mm }
      srt[1].name = '오일탱크커버_B_420_20260920'
      ren = "#{srt[1].bounds.min.x.to_mm.round(0)}~#{srt[1].bounds.max.x.to_mm.round(0)}"
    end
    m.commit_operation
    b1 = g.bounds
    puts "== 그룹 '#{g.name}' 자식 #{g.entities.grep(Sketchup::Group).length + g.entities.grep(Sketchup::ComponentInstance).length}개"
    puts "   bbox 전 min=#{b0.min.to_a.map { |v| v.to_mm.round(1) }.inspect} max=#{b0.max.to_a.map { |v| v.to_mm.round(1) }.inspect}"
    puts "   bbox 후 min=#{b1.min.to_a.map { |v| v.to_mm.round(1) }.inspect} max=#{b1.max.to_a.map { |v| v.to_mm.round(1) }.inspect}"
    puts "   구버전 hidden: #{hides.map { |e| "#{lab.call(e)}=#{e.hidden?}" }.inspect}"
    puts "   오일탱크커버 B 개명: #{ren ? "완료(X #{ren})" : '대상 2개 아님 -> 미실시'}"
    ok = m.save
    puts "SAVE=#{ok.inspect} modified?=#{m.modified?.inspect}"
    puts "DONE"
  end
rescue Exception => e
  puts "EXC #{e.class}: #{e.message}"
  puts e.backtrace.first(6).join(" | ")
end
nil
