
    [j$                         d dl Z d dlZd dlZd dlZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZeeedZdZd Zd Zedk(  r# ej(                   eej*                               yy)    Nc                     t        j                  t        d | D                    xs d}| D cg c]  }||z  	 c}S c c}w )Nc              3   &   K   | ]	  }||z    y wN ).0xs     >   E:\도진팩토리\3D스캔및티칭시스템\dzw_translate.py	<genexpr>znorm.<locals>.<genexpr>   s     %1aac1s   g      ?)mathsqrtsum)vLr   s      r	   normr      s<    		#%1%%&-#AAAaCs   =c                     | d   |d   z  | d   |d   z  z
  | d   |d   z  | d   |d   z  z
  | d   |d   z  | d   |d   z  z
  gS )N      r   r   abs     r	   crossr      sf    aD1Iad1Q4i1ad1Q4!9!4ad1Q4i!QqT	6IJJ    c                 :    t        d t        | |      D              S )Nc              3   ,   K   | ]  \  }}||z    y wr   r   )r   r   ys      r	   r
   zdot.<locals>.<genexpr>   s     4)$!Q!A#)s   )r   zipr   s     r	   dotr      s    c4#a)444r   c           	      ~   t        |d    |d    |d    g      }t        |dz   t        |       dz
        }t        |dz
  d      }t        | |   d   | |   d   z
  | |   d   | |   d   z
  | |   d   | |   d   z
  g      }|d   t	        ||      |d   z  z
  |d   t	        ||      |d   z  z
  |d   t	        ||      |d   z  z
  g}t        j                  t	        ||            dk  rg d}t        |      }t        j                  |      }	t        |d   t        j                  |	      z  |d   t        j                  |	      z  z   |d   t        j                  |	      z  |d   t        j                  |	      z  z   |d   t        j                  |	      z  |d   t        j                  |	      z  z   g      }
t        |d   t	        ||
      |
d   z  z
  |d   t	        ||
      |
d   z  z
  |d   t	        ||
      |
d   z  z
  g      }t        |
|      }|d   |d   |
d   g|d   |d   |
d   g|d   |d   |
d   ggS )ub   경로 i번째 점의 공구 좌표계(회전행렬 3x3, 열=X,Y,Z축) — 제품 좌표계 기준r   r   r   &.>)r   r   r   )r   minlenmaxr   r   r   radianscossinr   )ptsitool_dir
travel_degzjktr   r   z2x2y2s                r	   frame_atr1      s`   x{lXa[L8A;,78AAaCS!A#ac1+ac!fQiAq	!3q6!9SVAY#6Aq	#a&)8KLMA	
1c!Qi!n	ad3q!9QqT>11Q4Aq	!A$3FGAyyQd"	AQAZ A	qtDHHQK!TXXa[ 00!A$txx{2B1Q4QRCS2SUVWXUYZ^ZbZbcdZeUefghifjkokskstukvfvUvw	xB	qtC2Jr!u$$ad3q":be+;&;QqT#a*RPQUBR=RS	TB	r2BUBqE2a5!BqE2a5"Q%#82a5"Q%A:OPPr   c           
         t        j                  t        dt        d| d   d                      }t	        t        j
                  |            dkD  rEt        j                  | d   d   | d   d         }t        j                  | d   d   | d   d         }n%t        j                  | d   d    | d   d         }d}t        j                  |      t        j                  |      t        j                  |      gS )uC   KUKA A,B,C (도) — ZYX 오일러: A=Z회전, B=Y회전, C=X회전r   r   r   r           )r   asinr"   r    absr$   atan2degrees)RBACs       r	   mat_to_kuka_abcr=   *   s    		#b#a!A$q'*+,A
488A;$JJqtAw!Q(djj1a!A$q'.J!JJ!Qx1a)s1LLOT\\!_dll1o>>r   c                 z     d   d    d   d   z    d   d   z   }|dkD  rZt        j                  |dz         dz  }|dz   d   d    d   d   z
  |z   d   d    d   d   z
  |z   d   d    d   d   z
  |z  gS t        t        d       fd      }|dz   dz  |dz   dz  }}t        j                  t        dd |   |   z    |   |   z
   |   |   z
              dz  }g d	} |   |    |   |   z
  |z  |d<   |dz  ||dz   <    |   |    |   |   z   |z  ||dz   <    |   |    |   |   z   |z  ||dz   <   |S )
u%   ABB 쿼터니언 [q1..q4] = [w,x,y,z]r   r   r         c                     |    |    S r   r   )r,   r9   s    r	   <lambda>zmat_to_quat.<locals>.<lambda>9   s    AaDGr   )keyg-q=)r   r   r   r   )r   r   r"   range)r9   trsr'   r+   r,   qs   `      r	   mat_to_quatrH   3   s   	
1a1a1a	 B	AvIIbdOA!ad1gad1goq(1Q471Q47?A*=!Q!QQR?RSSE!H+,AaC19qsaiqA		#eQqtAwYqtAw.qtAw678:AAaDGAaDGOQAaDqSAacFAaDGAaDGOQ.!AaC&!A$q'!A$q'/19L!A#Hr   c                    g }| d   D ]  }|d   }|j                  dg d      }|j                  dd      }| j                  di       j                  dd	      }t        |      D ]Y  \  }}	t        ||||      }
|j                  |d
   |	d   |d   z   |	d   |d   z   |	d   |d   z   g|
||j                  d      f       [  |S )uR   작업기술서 → [(구간번호, [x,y,z], R행렬, 속도cmmin, 태그)] 나열seamspts_mmr(   )r   r   r   travel_angle_deg
   weld_paramsspeed_line_cmmin-   nor   r   r   tag)get	enumerater1   append)wsbaseoutrF   r&   tdtvspr'   pr9   s              r	   pointsr]   A   s    
C[kj) <2155I[]_C`bVVM2&**+=rBcNDAqaR(AJJ$!A$tAw,!T!Wad47l!KQPRTUTYTYZ_T`ab #  Jr   c           
         ddt        |       z   dz   ddt        |      z   d| j                  di       j                  dd	      d
z  dz   dg}d }t        | |      D ]^  \  }}}}}||k7  r|j	                  d||rd|z  ndfz         |}t        |      \  }	}
}|j	                  d|d   |d   |d   |	|
|fz         ` |dgz  }dj                  |      dfS )Nz&ACCESS RVPzDEF z()uN   ; DOZIKWORKS 작업기술서 번역 — 제품 중심 티칭의 KUKA 실행본u>   ; 규약: 공구Z+=제품방향, 진행각 반영. base-shift=z$VEL.CP=rN   rO   rP   ip  z.4fzPTP $POS_ACTu   ; ---- 구간 %d%s ---- [%s] z5LIN {X %.2f,Y %.2f,Z %.2f,A %.2f,B %.2f,C %.2f} C_DISr   r   r   END
z.src)namestrrS   r]   rU   r=   join)rV   rW   r   cursegnor\   r9   r[   rR   r;   r:   r<   s               r	   	emit_kukarh   L   s   	b)D0	Y	ICPTI	U	b1556HLTQRUV	W			A
 C &r4 0q!RC<HH.%#3SU1VVWC!!$1a	HAaDRSTURVXYZ[X\^_abdeKffg !1 %LA99Q<r   c                    dt        |       z   dddg}dt        dt        | j                  di       j                  dd	      d
z              z  }d }t	        | |      D ]h  \  }}}}}	||k7  r|j                  d||	rd|	z  ndfz         |}t        |      }
|j                  d|d   |d   |d   |
d   |
d   |
d   |
d   |fz         j |ddgz  }dj                  |      dfS )NzMODULE uM   ! DOZIKWORKS 작업기술서 번역 — 제품 중심 티칭의 ABB 실행본zLPERS tooldata tWeld:=[TRUE,[[0,0,0],[1,0,0,0]],[1,[0,0,1],[1,0,0,0],0,0,0]];zPROC main()zv%d   rN   rO   rP      u       ! ---- 구간 %d%s ----r_   r`   zc    MoveL [[%.2f,%.2f,%.2f],[%.5f,%.5f,%.5f,%.5f],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]],%s,z1,tWeld;r   r   r   r@   ENDPROC	ENDMODULErb   z.mod)rc   r"   roundrS   r]   rU   rH   re   )rV   rW   r   r   rf   rg   r\   r9   r[   rR   rG   s              r	   emit_abbro   \   s   	T"X		X	W		A 	AuRVVM26::;MrRSTTUVVA
C &r4 0q!RC<HH2ecWs]WY5ZZ[CN	vaD!A$!adAaD!A$!a@A 	B !1 )[	!!A99Q<r   c                     dg}t        | |      D ]J  \  }}}}}t        |      }|j                  d||d   |d   |d   |d   |d   |d   |d   ||xs df
z         L dj                  |      d	fS )
Nz.seg,x_mm,y_mm,z_mm,qw,qx,qy,qz,speed_cmmin,tagz+%d,%.2f,%.2f,%.2f,%.5f,%.5f,%.5f,%.5f,%s,%sr   r   r   r@   r`   rb   z.csv)r]   rH   rU   re   )	rV   rW   r   rg   r\   r9   r[   rR   rG   s	            r	   emit_csvrq   m   s    	9:A &r4 0q!RN	>%1qQRtUVWXUY[\]^[_abcdaeghijgkmnopmqsuwz  xA  A  BB  B  	C !1 99Q<r   c                     | j                  di       j                  dd      }dj                  d t        j                  j	                  |      d   D              d d xs dS )Nproductrc   dzwr`   c              3   D   K   | ]  }|j                         r|nd   yw)_N)isalnum)r   cs     r	   r
   zname.<locals>.<genexpr>v   s      M6L		1,6Ls    r      )rS   re   ospathsplitext)rV   ns     r	   rc   rc   t   sU    
y"!!&%0A77Mbgg6F6Fq6I!6LMMcrR[V[[r   )kukaabbcsvzC:/RoboDK/Postsc           
         dd l }dd l}t        |j                  vr |j                  j	                  dt               ddlm} |j                  |      }|j                  |t        |       d      }|j                  t        |              |j                  d| j                  dd      z  d       | j                  di       j                  d	d
      dz  }	|j                  |	       d }
t        | |      D ]  \  }}}}}||
k7  r |j                  d||rd|z  ndfz  d       |}
|j!                  |d   d   |d   d   |d   d   |d   g|d   d   |d   d   |d   d   |d   g|d   d   |d   d   |d   d   |d   gg dg      }|j#                  |dgdz  d         |j%                  t        |              |j'                  |t        |       dd      }t)        |dd       xs |S # t        $ r Y w xY w)Nr   )robomathrk   u8   DOZIKWORKS workspec v%s — product-centric weld programversion1TrN   rO   rP   g      @z	seam %d%sr_   r`   r   r   )r   r   r   r   F
PROG_FILES)	importlibsys	POSTS_DIRr{   insertrobodkr   import_module	RobotPostrc   	ProgStart
RunMessagerS   setSpeed	Exceptionr]   MatMoveL
ProgFinishProgSavegetattr)rV   rW   	post_nameout_dirr   _sysr   modrpmmpsrf   rg   r\   r9   r[   rR   posesaveds                     r	   emit_via_postr      s   !		!499#3#3Ay#A

!
!)
,C	y$r(A	.BLLbMMLrvvV_adOeegkl66-$(();R@DD	T	
C &r4 0q!RC<MM+#"(MMtTC||ad1gqtAw!Q1>d1gqtAw!Q1>d1gqtAw!Q1>)+ , 	s1ud# !1 MM$r(KKb5%8E2|T*3e3 ds   G" "	G/.G/c           
         t        |       dk  sd| vrt        t        xs d       y| d   }| | j                  d      dz      }|j	                         }g d}d| v r<| | j                  d      dz      j                  d      D cg c]  }t        |       }}|dk(  rt        d	       y
|j                  d      rt        j                  t        |d            }|j                  d      dk(  sJ d       |dd  }t        |||t        j                  j                  t        j                  j!                  |                  }t        d|d|       y
|t"        vr%t        ddj%                  t"              z   dz          yt        j                  t        |d            }|j                  d      dk(  sJ d       t#        |   ||      \  }	}
t        j                  j'                  |      d
   j)                  dd      dz   |z   |
z   }t        |dd      j+                  |	       t-        d |d   D              }t        d|j/                         |t        |d         |fz         y
c c}w )Nr   z--robotu[   사용법: python dzw_translate.py <워크스펙> --robot kuka|abb|csv [--base-shift x,y,z]r   )r4   r4   r4   z--base-shift,yaskawaut   야스카와는 뷰어의 검증된 JBI 생성기 사용 — 뷰어에서 'JBI 초안' 버튼 (중복 구현 금지)r   zpost:zutf-8)encodingformatzdozikworks-workspecu    작업기술서 파일이 아님rj   u   번역 완료(RoboDK 포스트 z): u   지원: z, uA    / post:<포스트명> (150종, C:/RoboDK/Posts) / yaskawa=뷰어z	.workspecr`   rv   wc              3   8   K   | ]  }t        |d            yw)rK   N)r!   )r   rF   s     r	   r
   zmain.<locals>.<genexpr>   s     2kC(ks   rJ   u,   번역 완료: %s → %s (구간 %d, 점 %d))r!   print__doc__indexlowersplitfloat
startswithjsonloadopenrS   r   rz   r{   dirnameabspathBACKENDSre   r|   replacewriter   upper)argvsrc	robot_rawrobotrW   r   rV   postfilesbodyextrX   r}   s                r	   mainr      s=   
4y1}	-gvvw
q'CTZZ	*1,-IOOED"&tzz.'A!'C"D"J"J3"OP"OQa"OP	  E  	F  OP YYtC'23vvh#88\:\\8}b$bggoobggooc>R.ST$FGPQHj499X..1ttu~	4g.	/B66(44X6XX4D)ID#
''

3

"
*
*;
;c
AE
IC
OCcG$**402bk22A	
8EKKM3PSTVW^T_P`bc;d
de% Qs   I'__main__)r   r   r   rz   r   r   r   r1   r=   rH   r]   rh   ro   rq   rc   r   r   r   r   __name__exitr   r   r   r	   <module>r      s      K 5Q?	   " \ hx@
 	42: zCHHT#((^ r   