
    UjEK              
          d Z ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZej                  j                  ej                  j                  e            ZdZej                  j%                  e      r*eej                  vrej                  j'                  de       dZdZdddd	d
ddddd
ddddd
ddddd
ddddd
ddddd
dZd Zh dZd,dZd Zej                  j7                  ed      Z ej:                  ed       dg d Zd!d!d!d"d"d"d#Zd$ Z d% Z! G d& d'ejD                  jF                        Z$e%d(k(  rddl&Z&ddlZ e'ejP                        d)kD  r e)ejP                  d)         nd*Z*de&jV                  _,        de&jV                  _-         e&jV                  de*fe$      5 Z. e/d+e*        e.ja                          ddd       yy# 1 sw Y   yxY w)-u   
DZW5 파일 서버 (포트 8090)
HTML + API(/api/browse, /api/parse-jbi, /api/list-jbi) 동일 포트 제공
ngrok 인터스티셜 자동 우회 헤더 포함
    Nu%   E:\도진웍스허브\암묵지엔진   에버다임uN   E:\VLA시스템\카고텍\12500_knuckle_boom\용접\!_12500_용접공정서.mdu   직선 본용접u;   직선부 40~50cm/min — 고장력강 입열 관리 범위 u   공정서 §1 속도표)actwhyrulesrcu   곡선(R) 본용접uD   R곡선 40~45cm/min · 하단R MOVC 필수, 기저 진입 2mm 하향zMOT-02u   공정서 §1·§3u   협소·저속 용접u'   열입력 최소화 구간(≤32cm/min)u   공정서 §1u   아크 시작uH   아크조건파일 ASF — 전류·전압은 용접기 WELDER.DAT 기준u   아크 정지u   자동분류-근거없음u   이송(에어무브)u*   용접 외 이동 — 근거 규칙 없음)movlmovcnarrowarconarcofapprc                 <   ddl }|j                  |       \  }}}g }d}d}|D 	
ci c]  \  }}	}
||	|
f }}	}}
t        t        |            D ]2  }||v r||   \  }	}
|	dk(  rd}|
}n|	dk(  rd}|j	                  ||f       4 g }t        |      D ]  \  }}||   \  }}|d   }|d   }|d	k(  s|sd
}n|dk(  rd}n
|dk  rd}nd}t        |   }|j	                  |dz   d|z   |d   |t        |dz  d      |r|nd|d   |d   |d   |d   t        |      d        i }i }d}d}|D ]U  }|d   r|j                  |d   d      dz   ||d   <   |j                  |d   d      dz   ||d   <   d|d   v r|dz  }Q|dz  }W ||||t        |      t        d}||fS c c}
}	}w )ub   명령별 근거 레코드 + 출처 집계(연동정보). 공정서 규칙표를 실시간 적용.r   NFONTOFkindvJr   Cr
   g333333@r   r	      MOVc   r   r   r   r   )idxinstr   r   cmminasfr   r   r   r   weldu   근거없음)
ruleCounts	srcCountscitednogrtotalwpsFile)jbi_extractparserangelenappend	enumerate_RULESroundboolget_WPS_SRC)pathJXmovesarcposstateoncondikr   evrecsmonstr   r   keyRrulessrcsr!   r"   rrprovs                            ;   E:\도진팩토리\3D스캔및티칭시스템\dzw_server.py_basis_recordsrE      s   hhtnOE3E	Bt%(	)S	Aq!aV)SB	)3u:7a5DAqDyt"ATdBb$Z   D% 11X
dyaf!3;dCS[C#XCC3KAE54<af1#AE1oddeHQuXqyQRSXQY!$Z) 	* !" Er15Qdf: %		"V*a 81 <E"V*((2e9a014RYRY&AIDQJE   dUDY85D:I 
*s   F>   .bmp.gif.jpg.png.jpeg.webpc                 T   t         j                  j                  |       }|t         j                  j                  |      t         j                  j                  t         j                  j                  |            g}|D ]  }|rt         j                  j                  |      s&i }	 t        j                  |      }|D ]Q  }t         j                  j                  ||      }t         j                  j                  |      rg }	t        j                  |      D ]  \  }
}}|D ]x  }t         j                  j                  |      d   j                         t        v s:|	j                  t         j                  j                  |
|             t        |	      |k\  sx n t        |	      |k\  s n |	s|	||<   t         j                  j                  |      d   j                         t        v s1|j                  dg       j                  |       T |s|t        |j                         d       D cg c]B  \  }}|t        |      |D cg c]$  }|t         j                  j!                  |      d& c}dD c}}}dc S  dg dS # t
        $ r Y w xY wc c}w c c}}}w )	u   JBI 경로에서 제품 루트를 찾아 공정별(하위폴더) 현장사진을 모은다.
    가접·용접·불량·완성차 등 하위폴더 = 공정 카테고리. 실제 파일만.r   u   기타c                      t        | d          S )Nr   )r(   xs    rD   <lambda>zweld_photos.<locals>.<lambda>l   s    AaD	z    r>   )r0   name)rS   countphotos)root
categoriesN)osr0   dirnameisdirlistdir	Exceptionjoinwalksplitextlower_IMG_EXTr)   r(   
setdefaultsorteditemsbasename)jbi_pathcap_catdcandsrV   catsentriesefullimgsdpdnfnfr9   r   ps                    rD   weld_photosrt   K   s%    	!A"BGGOOBGGOOA4F$GHE277==.	jj&G A77<<a(Dww}}T""$''$-JBB77++A.q1779XE KKR(;<"4yG3 %	  
 4yG+ #0 "DG!!!$Q'--/8;"-44T:    "4::<5IJ1LJDAq SVjk7ljkefBGGL\L\]^L_8`jk7lmJ1L M M5 : ++/  		* 8m1Ls*   'J8J#)J8J#	JJJ#c                 ,   	 ddl }	 ddl}ddl}|j                         }|j                  |      5  |j                  | t              }ddd       d| j                         v xs d| v }d   D 	
c	g c]#  \  }}	}
}}}}}||	|
|||rt        |      nd||d	% }}}}}}
}	}}|d
   D 
cg c]  \  }
}}}}}|
||t        |      ||d }}}}}}
}	 t        |       \  }}t        j                  |       }|d   |d   |d   |d   |d   |||||t        j                  dt        j                   |j"                              t%        |j&                  dz  d      t        j(                  j+                  |       dS # t        $ r}ddt        |      z   icY d}~S d}~ww xY w# 1 sw Y   bxY w# t        $ r}ddt        |      z   icY d}~S d}~ww xY wc c	}}}}}}
}	}w c c}}}}}}
w # t        $ r}g dt        |      i}}Y d}~&d}~ww xY w)u_   로드된 JBI를 달인 분포에 대조해 '생성 근거'를 낸다. 지어낸 수치 없음.r   Nerrorzengine import: zengine run: everdigmr   rows)segr   r7   suggestactualbandr   statusdmap)r7   np50r|   cvr   modelprogramsprefillhittotz%Y-%m-%d %H:%M:%Si   r   )r   r   r   r   r   rx   r~   
sameCorpusrecords
provenancemtimesizeKBsource)
tie_enginer\   strio
contextlibStringIOredirect_stdout	recommend_ENGINE_MODELr`   listrE   rX   stattimestrftime	localtimest_mtimer,   st_sizer0   re   )r0   TErl   r   r   bufrsamesir8   r   r   r   r|   r   sttrx   r   r   r~   r;   rC   s                         rD   engine_basisr   o   s"   52kkm'',T=1A - $**,&CNd,BD :;6D D9B5Q3T4 q!s#'T$ZT43P9B 	 D 01y: :/8+AsD"d QsDJbRVW/8 	 :+#D)
d ''$-CwZQz]q|U8AeHdD4t]]#6s||8TUCKK$.2bgg>N>Nt>T	V V)  5*SV3445
 -, 2#a&0112D D:  +'3q6*d+su   F )F4 F'F4 5(G2 G&G0 	F$
FF$F$'F1,F4 4	G=GGG0	H9HHshotsTexist_ok)tsdatag      @g      @SLUr?   BTc            
         t        j                          } | t        d   z
  dk  r	t        d   S dg}g }|D ]  }dD ]  }t        j                  t        j                  j                  |d|      d      D ]  }t        j                  j                  t        j                  j                  |            }t        j                  j                  t        j                  j                  t        j                  j                  |                  }|j                  t        j                  j                  |      |||d	        	  |j                  d
        | t        d<   |t        d<   |S )Nr   <   r   E:\)z*.JBIz*.jbiz**T)	recursive)rS   r0   folderproductc                     | d   S )NrS    rN   s    rD   rP   z list_jbi_files.<locals>.<lambda>   s    QvYrQ   rR   )
r   
_jbi_cacheglobrX   r0   r]   re   rY   r)   sort)nowrootsrd   rV   extrs   r   r   s           rD   list_jbi_filesr      s   
))+C
Z"&!!HEE%CYYrww||D$<M))"''//!*<=''**277??277??1;M+NObgg&6&6q&91PVcjkl N &  
JJ&J'JtJvLrQ   c                    t        | ddd      5 }|j                         D cg c]  }|j                          }}d d d        i }g }d}D ]  }|dk(  rd}|dk(  rd	}|j                  d
      r|j                  d      sd}9|dk(  r|j                  d      r|j                  d
      sr|j	                  d      }t        |      dk(  rS	 t        |d   dd        }	t        t        t        |d   j	                  d                  }
t        |
      dk\  r|
d d ||	<   |d	k(  sdD ]m  }|j                  |      s|j	                         }t        |      dk\  r:|d   j                  d      r&	 t        |d   dd        }|j                  ||d        n |j                  d      r|j                  ddd       q|j                  d      s|j                  ddd        g }d}g }g }|D ]  }|d   dk(  rd}|d   dk(  rd}|d   dk\  s"|d   |v s*||d      }t        }|d   |d   z  |d   |d   z  |d   |d   z  |d   |d    z  |d!   |d"   z  |d#   |d$   z  d%}|j                  |       |j                  |rdnd       |j                  |d           |sy g }d}d}d}d}t        |      D ]_  \  }}|dk(  r*|s(||kD  r|j                  ||d&d'| d(       |dz  }|}d}5|dk(  s;|s>|j                  ||d)d*| d(       |dz  }|}d}a |t        |      k  r1|rd)nd&}|rd*| nd'| }|j                  |t        |      ||d(       |sdt        |      d&d+d(g}t        |      }t        |      D cg c]  }t        |       } }|dkD  rt        |dz
        nd,}!||dz
  ||||| |!t        j                  j!                  |       d-	S c c}w # 1 sw Y   xY w#  Y xY w#  Y ixY wc c}w ).Nr   utf-8replace)encodingerrorsr   z//POSr4   z//INSTr   z//z///r   =   r   r   ,r   )MOVJMOVLMOVCMOVS)cmdciARCONARCOFFr   Tr   r   r   r      r?      r      r   r   lineu   이송 )srl   catlabelr   u   용접 HOMEg      ?)	r   
totalSteps	stepPosesr3   moveTypeblockscumr#   r   )open	readlinesstrip
startswithsplitr(   intr   mapr)   PULSE_SCALEr*   r'   floatrX   r0   re   )"r0   rr   llinesc_pointsinstructionssecr   r<   r   valsr   partsr   posesr3   arc_list
move_typesr   rs   scdegr   in_weld	seg_startseg_label_lineseg_label_weldr8   ar   r   r   r   r#   s"                                     rD   	parse_jbir      sh   	dC')	<$%KKM2MqM2 
= HL
C7?%C86S8??4 )?Ch%<DOOC09N

3A1v{ad12h-CC1C 9:D4yA~(,Ra&=7??3' JJLE5zQ58+>+>s+C%!$U1Xab\!2B(//20FG 8 w'##G2$>?)##G2$>?7 < E
CHJ;'!C%[G#C$Z1_dx!7d$ABqTBsG^!A$C.qtbg~qTBsG^!A$C.qtbg~C LLOOA!,d5k*    FGINN(#16'9}IAfQXYgXhOijk!#IG!VMM	&WUcTdKefgaNIG $ 3x= fV.5'.)*W^DT;UICM#PUVWE
6FKLE
A"1X
&X58XC
&EE!a%LsE !e''""4(
 
s 3 
=	<&  %v 's:   O"OO"AO/.%O7O?O""O,/O47O<c                   L     e Zd Z fdZd Zd Z fdZddZ fdZd Z	 xZ
S )	Handlerc                 0    t        |   |dt        i| y )N	directory)super__init__DIR)selfr   kw	__class__s      rD   r   zHandler.__init__  s    !1s1b1rQ   c                 F    | j                  d       | j                          y )N   )send_responseend_headers)r   s    rD   
do_OPTIONSzHandler.do_OPTIONS  s    3rQ   c                 b	   t         j                  j                  | j                        }|j                  dv r%|j                  dk(  rdnd}	 t	        | j
                  j                  dd            }| j                  j                  |      j                  dd	      }t        j                  |       t        t        j                  j                  t        |      d
d      5 }|j!                  |       d d d        t#        d| d| d       | j%                  d       | j'                  dd       | j)                          | j*                  j!                  d       y |j                  dk7  r"| j%                  d       | j)                          y 	 t	        | j
                  j                  dd            }| j                  j                  |      j                  dd	      }d|v r|j3                  dd      d   }t5        j6                  |      }t        j8                  t:        d       dt=        j>                  d       d}t        j                  j                  t:        |      }t        j                  jA                  |      rZ|d d }	d}
	 |	 d|
 d}t        j                  j                  t:        |      }t        j                  jA                  |      sn|
dz  }
Rt        |d      5 }|j!                  |       d d d        t#        d |        | j%                  d       | j'                  dd!       | j'                  dtC        |j1                  d                   | j)                          | j*                  j!                  |j1                  d             y # 1 sw Y   xY w# t,        $ ro}| j%                  d       | j)                          	 | j*                  j!                  t/        |      j1                  d             n# t,        $ r Y nw xY wY d }~y d }~ww xY w# 1 sw Y   (xY w# t,        $ rt}| j%                  d       | j)                          	 | j*                  j!                  t/        |      j1                  d             n# t,        $ r Y nw xY wY d }~y Y d }~y d }~ww xY w)"N)/save-dxf-defaultz/save-dxf-layoutr  zdxf_default_tf.jsonzdxf_saved_layout.jsonContent-Lengthr   r   r   )r   w)r   zdxf state saved: z (zB)r  Content-Typez
text/plains   OK  z/save  r   r   Tr   shot_z%Y%m%d_%H%M%SrI   _wbzshot saved: ztext/plain; charset=utf-8)"urllibr&   urlparser0   r   headersr.   rfilereaddecodejsonloadsr   rX   r]   r   writeprintr  send_headerr  wfiler\   r   encoder   base64	b64decodemakedirsSAVE_DIRr   r   existsr(   )r   parsedfnamelengthbodyrr   rl   r   r0   baser8   s              rD   do_POSTzHandler.do_POST  s   &&tyy1;;CC-3[[<O-O)UlET\\--.>BCzzv.55gi5P

4 "'',,sE2C'JaGGDM K)%6("=>""3'  >  "

  ' ;;'!s#"	))*:A>?F::??6*11')1LDd{zz#q)!,##D)DKK40DMM/:;4@E77<<%0Dww~~d#Sbz#fAaS-E77<<%8D77>>$/FA  dD!Q "L'(s#^-HI-s5<<3H/IJJJU\\'23] KJ  ""3'  "JJ$$SV]]7%;<  @ "!  	s#

  Qw!78  9		s   BN) #N5A(N) EP1 ,P$>BP1 N&!N) )	P!2!P3PP	PPPPP!$P.)P1 1	R.:!R)3RR)	RR)RR))R.c                     t         j                  j                  | j                        }|j                  dk(  r| j	                  t                      y |j                  dk(  rYt         j                  j                  |j                        }|j                  ddg      d   }t        j                  j                  |      s| j	                  ddid       y 	 t        j                  |      }g g }}t        |      D ]  }t        j                  j                  ||      }t        j                  j                  |      r|j                  ||d	       W|j                         j!                  d
      sw|j                  ||d	        | j	                  |t        j                  j#                  |      ||d       y |j                  dk(  rt         j                  j                  |j                        }|j                  ddg      d   }|rt        j                  j)                  |      s| j	                  ddid       y | j	                  t+        |             y |j                  dk(  rqt         j                  j                  |j                        }|j                  ddg      d   }|s| j	                  ddid       y | j	                  t-        |             y |j                  dk(  rt         j                  j                  |j                        }|j                  ddg      d   }	t        j                  j/                  |	      d   j1                         }
|	rc|
t2        vs[t        j                  j)                  |	      r<t        j                  j5                  |	      j                         j7                  d      s"| j9                  d       | j;                          y dddddddj                  |
d      }	 t=        |	d      5 }|j?                         }d d d        | j9                  d       | jA                  d |       | jA                  d!t'        tC                           | j;                          | jD                  jG                  |       y |j                  d"k(  rt         j                  j                  |j                        }|j                  ddg      d   }|rt        j                  j)                  |      s| j	                  ddid       y 	 tI        |      }|| j	                  dd#id       y | j	                  |       	 y tJ        |           y # t$        $ r'}| j	                  dt'        |      id       Y d }~y d }~ww xY w# 1 sw Y   yxY w# t$        $ r$ | j9                  d       | j;                          Y y w xY w# t$        $ r'}| j	                  dt'        |      id       Y d }~y d }~ww xY w)$Nz/api/list-jbiz/api/browser0   r   r   rv   znot a directoryi  )rS   r0   z.JBI)r0   parentdirsfilesr
  z/api/engine-basisr   zfile not foundr  z/api/weld-photosjbizno jbiz
/api/photor   zE:z
image/jpegz	image/pngz	image/gifz	image/bmpz
image/webp)rH   rJ   rI   rG   rF   rK   zapplication/octet-streamrbr  r	  r  z/api/parse-jbizparse failed)'r  r&   r  r0   _jsonr   parse_qsqueryr.   rX   rZ   r[   rc   r]   r)   upperendswithrY   r\   r   isfiler   rt   r_   r`   ra   abspathr   r  r  r   r  r  r(   r  r  r   r   do_GET)r   r"  qsr0   rk   r*  r+  rl   rm   rs   r   ctfpr   resultr   s                  rD   r5  zHandler.do_GETX  s   &&tyy1;;/)JJ~'(;;-'&&v||4B66&6(+A.D77==&

G%67=3**T* "eA77<<a0Dww}}T*Q$=>++F3a%>? ) 

DBGGOOD4ISWbghi ;;--&&v||4B66&2$'*Drww~~d3

G%56<JJ|D)*;;,,&&v||4B66%"&q)D

GX.4JJ{4();;,&&&v||4Bvt$Q'A''""1%a(..0C8+277>>!3DBGGOO\]L^LdLdLfLqLqrvLw""3')9)9);V&{%{\SSVSVWZ\vSw 	<!T]b779D #""3'  4  !13s4y>B  "

  & ;;**&&v||4B66&2$'*Drww~~d3

G%56<3"4>JJ8#>
  JJv& m  3

GSV,c223: #]  <""3')9)9);<  3

GSV,c223si   BU 3A	U <V VA:V !W ;W 	V&VVVV *W
	W
	W=W88W=c                 "   t        j                  |d      j                  d      }| j                  |       | j	                  dd       | j	                  dt        |             | j                          | j                  j                  |       y )NF)ensure_asciir   r	  zapplication/json; charset=utf-8r  )	r  dumpsr  r  r  r(   r  r  r  )r   objcoder   s       rD   r.  zHandler._json  so    zz#E299'B4 )JK)3t95

rQ   c                 B   | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd	       | j                  d
d       | j                  dd       | j                  dd       t        | 	          y )NzNgrok-Skip-Browser-Warning1zBypass-Tunnel-ReminderzAccess-Control-Allow-Origin*zAccess-Control-Allow-MethodszGET, POST, OPTIONSzAccess-Control-Allow-Headersr	  zCache-Controlz.no-store, no-cache, must-revalidate, max-age=0Pragmazno-cacheExpires0)r  r   r  )r   r   s    rD   r  zHandler.end_headers  s    5s;1376<79MN7H*Z[:.C(rQ   c                      y )Nr   )r   r   s     rD   log_messagezHandler.log_message  s    rQ   )r  )__name__
__module____qualname__r   r  r'  r5  r.  r  rF  __classcell__)r   s   @rD   r   r     s)    2>@KZ	rQ   r   __main__r   i  u9   DZW5 서버 시작(멀티스레드) → http://localhost:)r   )1__doc__http.serverhttprX   r  r   urllib.parser  mathr   r  sysr0   rY   r4  __file__r   
ENGINE_DIRrZ   insertr   r/   r+   rE   ra   rt   r   r]   r   r  r   r   r   r   serverSimpleHTTPRequestHandlerr   rG  socketserverr(   argvr   portThreadingTCPServerallow_reuse_addressdaemon_threadssrvr  serve_foreverr   rQ   rD   <module>r_     s!  
 J I I I Iggoobggooh/0 6
77==388!;HHOOAz" ](1nxz  D]  ^+4z  EM  Vj  k-6_ik  uD  E%.x  CE  N]  ^%b"E`a,5akm  wR  S
+Z >",HV> 77<<W% Ht $ r"
 f6U[\"ePidkk22 iV z"388}q03sxx{dD:>L##759L##2	(	(	("dW	=I$PQ 
>	=  
>	=s   .GG