# encoding: UTF-8
# 원인: 이전 스크립트에서 u축 기울기를 mm/inch 혼용으로 계산해 거의 수평이 됨 -> 단위없는 dz/dx=-pa/pc 로 교정
m = Sketchup.active_model
g = m.entities.grep(Sketchup::Group).find { |e| e.name == '조립부원판_20260919' }
old = m.entities.grep(Sketchup::Group).select { |e| e.name.to_s.start_with?('하부보강_2절곡_') }
tr = g.transformation
best=nil; ba=0.0
g.entities.grep(Sketchup::Face).each { |f| n=f.normal.transform(tr); next unless n.z<-0.05; if f.area>ba then ba=f.area; best=f end }
pa,pb,pc,pd = Geom.fit_plane_to_points(best.outer_loop.vertices.map{|v| v.position.transform(tr)})
zf = lambda { |x,y| -(pa*x + pb*y + pd)/pc }

def arc(cu, cv, r, a0, a1, seg)
  (0..seg).map { |i| a=(a0+(a1-a0)*i.to_f/seg)*Math::PI/180.0; [cu+r*Math.cos(a), cv+r*Math.sin(a)] }
end
W=100.0; D=25.0; T=6.0; RI=6.0; RO=12.0
prof  = [[0.0,D],[0.0,RO]]
prof += arc(RO,RO,RO,180.0,270.0,6)
prof << [W-RO,0.0]
prof += arc(W-RO,RO,RO,270.0,360.0,6)
prof += [[W,D],[W-T,D]]
prof += arc(W-RO,RO,RI,0.0,-90.0,6)
prof << [RO,T]
prof += arc(RO,RO,RI,270.0,180.0,6)
prof << [T,D]
clean=[]; prof.each{|p| clean << p if clean.empty? || ((p[0]-clean[-1][0]).abs>1e-6 || (p[1]-clean[-1][1]).abs>1e-6)}

tv = Geom::Vector3d.new(1.0, 0.0, -pa/pc); tv.normalize!            # 판면 내 +x 방향 (경사 6.4452도)
nv = Geom::Vector3d.new(-pa, -pb, -pc);    nv.normalize!
nv.reverse! if nv.z > 0

def build(m, name, xa, y0, len, clean, tv, nv, zf)
  org = Geom::Point3d.new(xa.mm, y0.mm, zf.call(xa.mm, y0.mm))
  pts = clean.map { |u,v| org.offset(tv, u.mm).offset(nv, v.mm) }
  grp = m.entities.add_group
  f = grp.entities.add_face(pts)
  return nil if f.nil?
  f.reverse! if f.normal.y < 0
  f.pushpull(len.mm)
  grp.name = name
  grp
end

m.start_operation('하부보강 A 재작성', true)
m.entities.erase_entities(old) unless old.empty?
a = build(m, '하부보강_2절곡_A_20260919', 8900.0, 10850.0, 1050.0, clean, tv, nv, zf)
m.commit_operation
raise "A 생성 실패" if a.nil?

b=a.bounds
puts "삭제한 이전판=#{old.size}"
puts "tv 기울기 = %.4f도" % (Math.atan(-pa/pc).abs*180/Math::PI)
puts "A solid=#{a.manifold?} faces=#{a.entities.grep(Sketchup::Face).size} vol=%.0fmm3" % (a.volume.to_f*(25.4**3))
puts "A bbox x %.2f..%.2f y %.2f..%.2f z %.2f..%.2f" % [b.min.x.to_mm,b.max.x.to_mm,b.min.y.to_mm,b.max.y.to_mm,b.min.z.to_mm,b.max.z.to_mm]
at = a.transformation
dmax = 0.0
a.entities.grep(Sketchup::Face).each do |f|
  f.vertices.each do |v|
    p = v.position.transform(at)
    d = (pa*p.x + pb*p.y + pc*p.z + pd).to_f
    dmax = d if d > dmax          # 평면 위로 파고든 양(+) 최대
  end
end
top = a.entities.grep(Sketchup::Face).map{|f| f.vertices.map{|v| p=v.position.transform(at); (pa*p.x+pb*p.y+pc*p.z+pd).to_f.abs}.min}.min
puts "하판 평면 침투 최대 = %.6f in / 상면 최소이격 = %.6f in (0이면 밀착)" % [dmax, top]
m.save
puts "SAVED #{File.mtime(m.path)}"
nil
