# encoding: UTF-8
# rd17 — 조립 구역(x 8700..9400, y 10600..12150) 부재 전수 + 수평/경사 판 식별 (읽기 전용)
def r1(v); (v * 25.4).round(1); end
def deg(a); (a * 180.0 / Math::PI).round(3); end
m = Sketchup.active_model
out = []

def walk(ent, tr, acc, faces)
  ent.entities.each do |e|
    case e
    when Sketchup::Face
      pts = e.vertices.map { |v| v.position.transform(tr) }
      pts.each { |p| acc << p }
      n = e.normal.transform(tr); n.normalize!
      faces << [n, e.bounds.center.transform(tr), e.area * 645.16, pts]
    when Sketchup::Group, Sketchup::ComponentInstance
      walk(e, tr * e.transformation, acc, faces)
    end
  end
end

targets = []
m.entities.each do |e|
  next unless e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance)
  b = e.bounds
  next if b.max.x * 25.4 < 8700 || b.min.x * 25.4 > 9400
  next if b.max.y * 25.4 < 10600 || b.min.y * 25.4 > 12150
  targets << e
end
out << "구역 내 최상위 개체 #{targets.length}개"
targets.each do |t|
  nm = t.name.to_s.empty? ? t.definition.name : t.name
  subs = []
  if t.definition.entities.grep(Sketchup::Group).length > 0 && t.definition.name == "그룹#2"
    t.definition.entities.grep(Sketchup::Group).each { |c| subs << [c, "#{nm}/#{c.name}"] }
  else
    subs << [t, nm]
  end
  subs.each do |obj, label|
    acc = []; faces = []
    walk(obj, obj.transformation * (obj == t ? Geom::Transformation.new : Geom::Transformation.new), acc, faces)
    next if acc.empty?
    # 최상위 좌표계로: 그룹#2 는 항등이므로 자식은 부모 변환 추가 필요
    if obj != t
      acc = []; faces = []
      walk(obj, t.transformation * obj.transformation, acc, faces)
    end
    xs = acc.map { |p| p.x }; ys = acc.map { |p| p.y }; zs = acc.map { |p| p.z }
    out << "=== #{label} ==="
    out << "  bbox (#{r1(xs.min)},#{r1(ys.min)},#{r1(zs.min)})..(#{r1(xs.max)},#{r1(ys.max)},#{r1(zs.max)})"
    # 수평에 가까운 큰 면 2개, 경사면 큰 것 2개
    horiz = faces.select { |f| f[0].z.abs > 0.985 }.sort_by { |f| -f[2] }[0, 3]
    slope = faces.select { |f| f[0].z.abs > 0.2 && f[0].z.abs <= 0.985 }.sort_by { |f| -f[2] }[0, 3]
    horiz.each { |n, c, a, _| out << "  [수평면] A=#{a.round(0)} n.z=#{n.z.round(4)} 기울기=#{deg(Math.acos([n.z.abs, 1.0].min))}도 중심 (#{r1(c.x)},#{r1(c.y)},#{r1(c.z)})" }
    slope.each { |n, c, a, _| out << "  [경사면] A=#{a.round(0)} n=(#{n.x.round(3)},#{n.y.round(3)},#{n.z.round(3)}) 기울기=#{deg(Math.acos([n.z.abs, 1.0].min))}도 중심 (#{r1(c.x)},#{r1(c.y)},#{r1(c.z)})" }
  end
end
puts out.join("\n")
"RD17"
