"""분리면 확정용: 토치를 3구간(플랜지원판/몸통/목) 색칠 + 토치에 카메라 정확히 줌인 클로즈업 2장."""
import asyncio
from playwright.async_api import async_playwright
URL='http://localhost:8090/DOZIKWORKS_OS_v5_locked.dc.html'
OUT=r'E:\도진팩토리\3D스캔및티칭시스템\shots\ceo_feedback'

async def main():
    async with async_playwright() as p:
        br=await p.chromium.launch(channel='msedge',headless=True)
        pg=await br.new_page(viewport={'width':1400,'height':1000})
        await pg.goto(URL)
        await pg.wait_for_function("window.__dzw && window.__dzw._torchMesh", timeout=15000)
        # 3구간 색칠: 플랜지원판(z>-500)=빨강, 몸통(-500~-258)=초록, 목/노즐(z>-258)=파랑
        info=await pg.evaluate("""()=>{ const d=window.__dzw, T=d._T; const me=d._torchMesh;
          const g=me.geometry; const pos=g.attributes.position; const N=pos.count;
          const col=new Float32Array(N*3);
          const zDisc=-500, zNeck=-258; let nf=0,nb=0,ng=0;
          for(let i=0;i<N;i++){ const z=pos.getZ(i); let r,gr,b;
            if(z<=zDisc){ r=0.95;gr=0.15;b=0.1; nf++; }          // 플랜지 원판(z최소단) = 빨강
            else if(z<=zNeck){ r=0.2;gr=0.85;b=0.25; ng++; }     // 몸통 = 초록
            else { r=0.2;gr=0.45;b=0.95; nb++; }                 // 목/노즐 = 파랑
            col[i*3]=r; col[i*3+1]=gr; col[i*3+2]=b; }
          g.setAttribute('color', new T.BufferAttribute(col,3));
          me.material=new T.MeshLambertMaterial({vertexColors:true});
          // 카메라: 토치 월드 바운딩스피어로 정확히 줌
          me.updateMatrixWorld(true);
          const box=new T.Box3().setFromObject(me); const c=new T.Vector3(); box.getCenter(c);
          const sph=box.getBoundingSphere(new T.Sphere());
          if(d.orbit){ d.orbit.tgt.copy(c); d.orbit.r=sph.radius*2.3; d.orbit.theta=-0.5; d.orbit.phi=1.5; d.updateCam&&d.updateCam(); }
          return {flangeVerts:nf, bodyVerts:ng, neckVerts:nb, worldRadius:+sph.radius.toFixed(3), center:[+c.x.toFixed(3),+c.y.toFixed(3),+c.z.toFixed(3)]};
        }""")
        await pg.wait_for_timeout(400)
        await pg.screenshot(path=OUT+r'\SPLIT_preview_side.png')
        # 정면쪽 각도 하나 더
        await pg.evaluate("()=>{ const d=window.__dzw; if(d.orbit){ d.orbit.theta=-1.4; d.orbit.phi=1.5; d.updateCam&&d.updateCam(); } }")
        await pg.wait_for_timeout(300)
        await pg.screenshot(path=OUT+r'\SPLIT_preview_front.png')
        import json; print(json.dumps(info,ensure_ascii=False,indent=1))
        await br.close()

asyncio.run(main())
