# -*- coding: utf-8 -*-
def f(v); (v.to_f*25.4).round(1); end
m = Sketchup.active_model
sel = m.selection
selg = sel.first
sb = selg.bounds
puts "SEL  X #{f(sb.min.x)}~#{f(sb.max.x)}  Y #{f(sb.min.y)}~#{f(sb.max.y)}  Z #{f(sb.min.z)}~#{f(sb.max.z)}"

mb = m.bounds
puts "MODEL X #{f(mb.min.x)}~#{f(mb.max.x)} Y #{f(mb.min.y)}~#{f(mb.max.y)} Z #{f(mb.min.z)}~#{f(mb.max.z)}"

def ov(a1,a2,b1,b2); [a2,b2].min - [a1,b1].max; end

puts "\n== 선택부재 XY 근방(여유 400mm)과 겹치는 상위 엔티티 =="
x1=sb.min.x-400/25.4; x2=sb.max.x+400/25.4; y1=sb.min.y-400/25.4; y2=sb.max.y+400/25.4
m.entities.each do |e|
  next unless e.is_a?(Sketchup::Group)||e.is_a?(Sketchup::ComponentInstance)
  next if e == selg
  b=e.bounds
  next unless ov(b.min.x,b.max.x,x1,x2) > 0 && ov(b.min.y,b.max.y,y1,y2) > 0
  nm=(e.respond_to?(:name)? e.name.to_s : ""); dn=""; begin; dn=e.definition.name.to_s; rescue; end
  puts "  #{nm.inspect}/#{dn.inspect} hid=#{e.hidden?} X #{f(b.min.x)}~#{f(b.max.x)} Y #{f(b.min.y)}~#{f(b.max.y)} Z #{f(b.min.z)}~#{f(b.max.z)}"
end

puts "\n== Z 100~400 사이 하면을 가진 대형 상위 엔티티(프레임 후보) =="
m.entities.each do |e|
  next unless e.is_a?(Sketchup::Group)||e.is_a?(Sketchup::ComponentInstance)
  b=e.bounds
  w=f(b.width); d=f(b.height); h=f(b.depth)
  next unless w>1500 || d>1500
  nm=(e.respond_to?(:name)? e.name.to_s : ""); dn=""; begin; dn=e.definition.name.to_s; rescue; end
  puts "  #{nm.inspect}/#{dn.inspect} hid=#{e.hidden?} X #{f(b.min.x)}~#{f(b.max.x)} Y #{f(b.min.y)}~#{f(b.max.y)} Z #{f(b.min.z)}~#{f(b.max.z)}"
end

puts "\n== 나머지 SWD_ 부재(선택 밖) =="
m.entities.each do |e|
  next unless e.is_a?(Sketchup::Group)||e.is_a?(Sketchup::ComponentInstance)
  nm=(e.respond_to?(:name)? e.name.to_s : "")
  next unless nm =~ /^SWD_/
  b=e.bounds
  puts "  #{nm} X #{f(b.min.x)}~#{f(b.max.x)} Y #{f(b.min.y)}~#{f(b.max.y)} Z #{f(b.min.z)}~#{f(b.max.z)}"
end

puts "\n== 실형상 트랙 상세 =="
["트랙R_실형상_20260919","트랙L_실형상_20260919"].each do |tn|
  g = m.entities.find{|e| (e.respond_to?(:name) ? e.name.to_s : "")==tn}
  next unless g
  b=g.bounds
  puts "  #{tn} X #{f(b.min.x)}~#{f(b.max.x)} Y #{f(b.min.y)}~#{f(b.max.y)} Z #{f(b.min.z)}~#{f(b.max.z)}"
end
"DONE3"

puts "\n== 선택부재 경사각 실측 =="
t = selg.transformation
ax = t.xaxis; ay = t.yaxis; az = t.zaxis
puts "  group xaxis #{ax.to_a.map{|v| v.round(4)}.inspect}"
puts "  group yaxis #{ay.to_a.map{|v| v.round(4)}.inspect}"
puts "  group zaxis #{az.to_a.map{|v| v.round(4)}.inspect}"
puts "  origin mm #{[f(t.origin.x),f(t.origin.y),f(t.origin.z)].inspect}"
zup = Geom::Vector3d.new(0,0,1)
puts "  그룹 Z축과 월드 Z축 사이각(도) = #{(az.angle_between(zup)*180/Math::PI).round(3)}"
# 모든 면의 월드 법선 분포 (경사면 찾기)
def collect(e, tr, arr)
  if e.respond_to?(:entities)
    e.entities.each{|c| collect(c, tr*e.transformation, arr)}
  elsif e.is_a?(Sketchup::Face)
    n = e.normal.transform(tr)
    a = (n.angle_between(Geom::Vector3d.new(0,0,1))*180/Math::PI)
    arr << [a.round(1), e.area*25.4*25.4, n]
  end
end
arr = []
collect(selg, Geom::Transformation.new, arr)
agg = Hash.new(0.0)
arr.each{|a,ar,n| agg[a] += ar}
top = agg.sort_by{|k,v| -v}.first(14)
puts "  면법선-수직각(도) => 총면적(mm2)  [상위14]"
top.each{|k,v| puts "    #{k} deg : #{(v/1000000.0).round(3)} m2"}
