
    ,.`j$                     &   d dl Z d dlmZ dZdZdfdZdZdZdZg Z	 e       5 Z
e
j                  j                         Zej                  d	d
d      Zg Zej#                  dd        ej#                  dd        ej%                  ed       ej'                  d       ej)                  edz           eeedz          ej+                  e      xZZ ede       ej)                  edz          ed   red   dk\  red   du se	j3                  dez         ed    r eed!         d"k\  se	j3                  d#ed!   z         ej+                  e      Z eed$   d%z   d&      Z eed'   d(z   d)      Zej<                  j?                  ed$   ed'          ej<                  jA                          ej<                  j?                  eed*+       ej<                  jC                          ej'                  d,       ej+                  e      Z"ej+                  e      Z# ed-eee"e#d.   D  cg c]  } | d/   	 c} fz         ej)                  ed0z          e"r" e$e"d$   ez
        d1kD  s e$e"d'   ez
        d1kD  re	j3                  d2e"eefz          e%d3 e#d.   D              se	j3                  d4       ej+                  d5      Z& ed6e&        e%d7 e&D              se	j3                  d8        e'd9 e&D              se	j3                  d:       ejQ                  d;      jS                         Z*ej+                  e      Z+ej<                  j?                  e*d<   e*d=   d>z  z   e*d?   e*d@   d>z  z          ej<                  jA                          ej<                  j?                  e*d<   e*d=   d>z  z   dAz   e*d?   e*d@   d>z  z   dB+       ej<                  jC                          ej'                  dC       ej+                  e      Z,ej'                  d,       ej+                  e      Z- edDe+dEe,dFe-       ej)                  edGz          e,r9e-r7 e$e,d$   e-d$   z
         e$e,d'   e-d'   z
        z   d>k  re	j3                  dH       ej]                  d       ej'                  d        ee       ej+                  e      Z/ej+                  e      Z0 edIe/d.   D  cg c]  } | d/   	 c} e0       ej)                  edJz           e%dK e/d.   D              se	j3                  dL       e/d   Z1eje                  dM       ej'                  dN       ej+                  e      Z3 edOe3dP   e3d   e3d          e3d   dQu re3d   e1k(  se	j3                  dRe3z         eje                  dM       ej'                  dS        edTej+                  e             ej'                  dU       ej+                  e      Z4 edVe4       ej)                  edWz          e4d   dk\  r	e4dX   dYgk(  se	j3                  dZe4z         eD cg c]'  }|jk                  d[      s|jk                  d      s&|) c}Z6e6D cg c]  }d\|vsd]|vs| c}Z6 ed^e6dd_        e6re	j3                  d`e6dda z         ejo                          ddd        edbe	rdcndd       e	D ]  Z8 edee8         e jr                  e	rd       yd        yc c} w c c} w c c}w c c}w # 1 sw Y   VxY w)g    N)sync_playwrightu>   E:\도진팩토리\3D스캔및티칭시스템\05_BROWSER_TESTSzhttp://localhost:8091/fab.htmlc                    | j                  d      j                  j                          | j                  d       dD ]T  }	 | j                  |d      j                  j                          | j                  d       | j                  d	      }|sT n |r| j                  |
       | j                  dd      j                  j                          | j                  d       y# t        $ r}t        d||       Y d}~d}~ww xY w)uR   제품 드롭다운에서 메가페어_3.5_톤 선택 (로드 완료까지 대기)u   제품 없음i  )u   에버다임u   수산중공업u   동우인더스트리u	   미분류F)exact  zcat failNu   () => Array.from(document.querySelectorAll('*')).filter(e=>e.children.length===0 && /메가페어/.test(e.textContent)).map(e=>e.textContent.trim())pathu   메가페어_3.5_톤i(#  )get_by_textfirstclickwait_for_timeout	Exceptionprintevaluate
screenshot)pgshotcatehits        X   E:\도진팩토리\3D스캔및티칭시스템\05_BROWSER_TESTS\_pin_root_visible_shot.pypick_productr      s    NN?#))//1X	&NN3eN,2288:$ kk : ;  Y 
4 NN)N7==CCE  	&*c1%%	&s   <C%%	D.D  Du  () => {
  const P = window.FAB_PINPHOTO, s = P && P._state;
  const layer = document.getElementById('fab-pinphoto-overlay');
  const dots = layer ? Array.from(layer.querySelectorAll('[data-step-hidden]')) : [];
  const lines = layer ? Array.from(layer.querySelectorAll('svg line')) : [];
  // 실제로 화면에 그어진 끈 = display 가 안 꺼진 line
  const liveLines = lines.filter(l => l.getAttribute('display') !== 'none')
    .map(l => ({x1:+l.getAttribute('x1'), y1:+l.getAttribute('y1'),
                x2:+l.getAttribute('x2'), y2:+l.getAttribute('y2')}));
  return {
    product: s && s.product,
    pins: s ? s.pins.map(p=>({id:p.id, ctxPath:p.ctxPath||null, photos:(p.photos||[]).length,
                              balloon:p.balloon||null})) : null,
    ctx: P.currentCtxPath(),
    domTotal: dots.length,
    drawn: dots.filter(d=>d.getAttribute('data-step-hidden')==='0'
                       && d.getAttribute('data-gate-hidden')==='0').length,
    shown: P.pinsShown(),
    mode: s && s.on,                       // 핀 찍기 모드(버튼) — 표시와 무관해야 한다
    btn: (document.getElementById('fab-pin-toggle')||{}).textContent,
    label: (document.getElementById('fab-pin-ctxlabel')||{}).textContent,
    balloons: layer ? layer.querySelectorAll('.fab-pin-balloon').length : -1,
    liveLines: liveLines,
    // 끈 길이(앵커→사진) — 3D 시야를 안 가릴 만큼 떨어져 있는지
    ropeLen: liveLines.map(l => Math.round(Math.hypot(l.x2-l.x1, l.y2-l.y1)))
  };
}u\  () => {
  const I = window.FAB_ISO;
  const ctx = I.contextNode();
  let g03 = null;
  ctx.traverse(o => { if (!g03 && o.isGroup && /(^|\/)G03$/.test(String(o.name))) g03 = o; });
  if (!g03) return 'G03 그룹 없음';
  let mesh = null;
  g03.traverse(o => { if (!mesh && o.isMesh) mesh = o; });
  return { g03: g03.name, ok: I.enterAt(mesh) };
}a  () => {
  const layer = document.getElementById('fab-pinphoto-overlay');
  const b = layer && layer.querySelector('.fab-pin-balloon');
  if (!b) return null;
  const r = b.getBoundingClientRect();
  return { cx: r.left + r.width/2, cy: r.top + r.height/2, w: r.width };
}i@  i  )widthheight)viewportconsolec                 f    t         j                  | j                  dz   | j                  d d z         S )N:   )logsappendtypetext)ms    r   <lambda>r$   X   s$    t{{166C<!&&#,+FG    	pageerrorc                 J    t         j                  dt        |       d d z         S )Nz
pageerror:r   )r   r    str)r   s    r   r$   r$   Y   s    \CF4CL-H!Ir%   load)
wait_untili	  z\_pinshot_0_initial.pngr   z\_pinshot_1_menu.png)r   u   ROOT(자동표시)>>>z\_pinshot_2_root.pngshowndrawn   modeFu*   ① 로드 직후 자동 표시 실패: %r	liveLinesropeLend   u    ② 끈 없음/너무 짧음: %rcx   g     p@cy   g     @   )stepsi  z'DRAG>>> to=(%.0f,%.0f) at=%r balloon=%rpinsballoonz\_pinshot_5_dragged.png   u>   ④ 드래그한 자리에 머물지 않음: %r vs (%.0f,%.0f)c              #   &   K   | ]	  }|d      ywr9   N .0qs     r   	<genexpr>rA   y   s     5_q|_   u   ④ pin.balloon 미저장u~  async () => {
      const r = await fetch('fab_models/parts/메가페어_3.5_톤/pin_notes.json?t=' + Date.now(), {cache:'no-store'});
      const j = await r.json();
      return j.pins.map(p => ({id:p.id, balloon:p.balloon||null,
                               keeps:!!(p.photos && p.photos.length), md:typeof p.md,
                               ctxPath:p.ctxPath||null}));
    }zSAVED>>>c              #   &   K   | ]	  }|d      ywr<   r=   r>   s     r   rA   rA      s     +Uq|UrB   u(   ④ pin_notes.json 에 balloon 미기록c              #   &   K   | ]	  }|d      yw)keepsNr=   r>   s     r   rA   rA      s     )5aqz5rB   u   ④ 기존 photos 필드 손실z#fab-canvas canvasxr   g      ?yr   i     <   zROTATE>>> before=z mid=z end=z\_pinshot_4_rotate.pngu;   ③ 감쇠 보간 흔적 없음(즉시 스냅으로 보임)z	RELOAD>>>z\_pinshot_6_reload.pngc              #   &   K   | ]	  }|d      ywr<   r=   r>   s     r   rA   rA      s     3]q|]rB   u#   ④ 새로고침 후 balloon 유실z#fab-pin-togglei   zPICKMODE>>>btnTu*   ⑤ 📍 버튼이 표시를 건드림: %rr   zENTER>>>i  zG03>>>z\_pinshot_3_g03.pngctxG03u    ⑥ G03 자동 표시 실패: %rerrorERR_CONNECTION_REFUSEDzFailed to load resourcezLOGS>>>   u   JS 예외: %r   u   결과:FAILPASSz -)N):sysplaywright.sync_apir   OUTURLr   PINSTATE	ENTER_G03BAL_POSfailpchromiumlaunchbnew_pager   r   ongotor   r   r   st_rootpinstater   r    minpostxtymousemovedownupafterst_dragabsanysavedalllocatorbounding_boxboxp0p_midp_endreloadst_reafter2before_drawnr   st_modest_g03
startswitherrsclosefexit)r@   ls   00r   <module>r      s    /G&*8		 
!	

A	
ts;	<BDEE)GHEE+IJGGCFG#MMs77M8# 778 X..Gh	
!7+MMs44M5G!1Q!676?e;S@7JKK S);%<%C69KKL ++g
C	SY_f	%B	SY_e	$BHHMM#d)SY'HHMMOHHMM"bM#HHKKMKK Ekk(#G	
3r2u]dek]lFm]lXYq|]lFm6n
noMMs77M8Cdb()B.#eDkB6F2G"2LTX]_aceWffg5WV_55/0KK 	 
E 
*e+U++>?)5))56 **)
*
7
7
9C	W	BHHMM#c(S\C//SCMC<O1OPHHMMOHHMM#c(S\C//#5s3x#h-RUBU7U]_M`HHKKMKK EKK E	UE
BCMMs66M73uT{U4[89CdeTXk@Y<ZZ]``QR III KK!E[[!F	+eFm<m)m<fEMMs66M73U6]339: >LHHkk(#G	-'':JKFOt#(8L(H@7JKHH 
*bkk),-[["F	(FMMs33M47Oq VE]ug%=6?@Rt!q||G4[8QAtRDht!7q@E^fgEgAthD	)T"1XOd2Ah./GGIS V i4V ,	A	$N 
 d  [ GnT =2 ShK sV   H\&[32J$\[8"E\4'[=[= \'	\1\6\:8\3\\