
    Ni                     ~    d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd Z	d Z
d ZddZd ZddZg d	d
fdZedk(  ryy)    N)unary_unionc                    g }t        | d      5 }|j                         }dt        j                  |      z   dz   }t        j                  ||t        j
                        }|D ]b  }|j                  t        |j                  d            t        |j                  d            t        |j                  d      xs d      g       d 	 d d d        |S # 1 sw Y   |S xY w)Nrz\(footprint\s+"[^"]*?z/".*?\(at ([\d.-]+) ([\d.-]+)(?:\s+([\d.-]+))?\)         r   )	openreadreescapefinditerDOTALLappendfloatgroup)	file_pathfootprint_name
footprintsfcontentpatternmatchesms           ./home/hanthebot/chat/keyboard/generate_poly.pyget_footprintsr   	   s    J	i	 &&(
 %ii'(@A 	
 ++gw		: 	Aqwwqz"E!''!*$5uQWWQZ_17MN	  s   B8CCc                 n   g }g }t        | d      5 }|j                         }t        j                  d|t        j                        }|D ]y  }|j                  t        |j                  d            t        |j                  d            ft        |j                  d            t        |j                  d            ff       { t        j                  d|t        j                        }|D ]  }|j                  t        |j                  d            t        |j                  d            ft        |j                  d            t        |j                  d            ft        |j                  d            t        |j                  d	            ff        	 d d d        ||fS # 1 sw Y   ||fS xY w)
Nr   z_\(gr_line\s+\(start ([\d.-]+) ([\d.-]+)\)\s+\(end ([\d.-]+) ([\d.-]+)\).*?\(layer "Edge.Cuts"\)r   r   r      z|\(gr_arc\s+\(start ([\d.-]+) ([\d.-]+)\)\s+\(mid ([\d.-]+) ([\d.-]+)\)\s+\(end ([\d.-]+) ([\d.-]+)\).*?\(layer "Edge.Cuts"\)      )r	   r
   r   r   r   r   r   r   )r   linesarcsr   r   line_matchesr   arc_matchess           r   parse_edge_cutsr$      st   ED	i	 &&({{nII

  	ALL1771:&aggaj(9:1771:&aggaj(9:	 kk LII

  	AKK1771:&aggaj(9:1771:&aggaj(9:1771:&aggaj(9:	-> $;?> $;s   F
F((F4c                 b    t        j                  | d   |d   z
  dz  | d   |d   z
  dz  z         S )Nr   r   r   )mathsqrt)p1p2s     r   distancer*   B   s8    99bebem)RURU]q,@@AA    c           	         | x}}|}|}t        |d   |d   z
  |d   |d   z
  z  |d   |d   z
  |d   |d   z
  z  z
        dk  r| ||gS |\  }}	|\  }
}|\  }}|||z
  z  |	|
|z
  z  z
  |
|z  z   ||z  z
  }t        |      dk  r| ||gS |dz  |	dz  z   ||z
  z  |
dz  |dz  z   ||	z
  z  z   |dz  |dz  z   |	|z
  z  z   d|z  z  }|dz  |	dz  z   ||
z
  z  |
dz  |dz  z   ||z
  z  z   |dz  |dz  z   |
|z
  z  z   d|z  z  }t        j                  ||z
  dz  |	|z
  dz  z         }t        j                  |	|z
  ||z
        }t        j                  ||z
  |
|z
        }t        j                  ||z
  ||z
        }|dk  r|dt        j                  z  z  }|dk  r|dt        j                  z  z  }|dk  r|dt        j                  z  z  }d}||z
  dt        j                  z  z  }||z
  dt        j                  z  z  }||kD  rd}g }t        |dz         D ]  }||z  }|rD||||z
  dt        j                  z  z  z  z
  }||k  r?|||dt        j                  z  z   |z
  z  z
  }n||||z
  dt        j                  z  z  z  z   }|j                  ||t        j                  |      z  z   ||t        j                  |      z  z   f        |S )Nr   r   gư>r   FT)	absr&   r'   atan2piranger   cossin)startmidendnum_segmentstempr(   r)   p3x1y1x2y2x3y3Acxcyr   a1a2a3cwdiff1diff2ptsitas                               r   arc_to_linesrL   F   sg   
 D2	B	B 	RURU]r!ur!u}-AA2a52a5=0QQR
	 sC  FBFBFB
b2grBw'"r'1BG;A
1v}sC   
QQ27#q52q5=R"W
%	&q52q5=R"W
%	& 
Q	
B 
QQ27#q52q5=R"W
%	&q52q5=R"W
%	& 
Q	
B
 			27q.BG>12A	BGR"W	%B	BGR"W	%B	BGR"W	%B 
Av
a$''k	Av
a$''k	Av
a$''k 
B"WTWW%E"WTWW%Eu}
C<!#$ AQ27q477{344ABwb1tww;.344Q27q477{344A

BTXXa[("q488A;*>?@A Jr+   c                    t        |       \  }}g }|D ]+  \  }}|j                  t        j                  ||g             - |D ]7  \  }}}t	        |||      }|j                  t        j                  |             9 t        j
                  |      }t        j                  j                  |      }	t        |	t        j
                        rg }
|	j                  D ]3  }|j                  s|
j                  t        j                  |             5 t        |
      dk(  r\t        d       g }|D ]  }|j                  |        |D ]  }|j                  |        t        j                   |      j"                  S t%        |
d       S |	j                  rt        j                  |	      S t        d       g }|D ]  }|j                  |        |D ]  }|j                  |        t        j                   |      j"                  S )Nr   z/Warning: Edge.Cuts does not form a closed loop!c                     | j                   S )N)area)ps    r   <lambda>z#get_kicad_polygon.<locals>.<lambda>   s
    AFF r+   )key)r$   r   geom
LineStringrL   MultiLineStringshapelyops	linemerge
isinstancegeomsis_ringPolygonlenprintextend
MultiPointconvex_hullmax)r   r    r!   segmentsr3   r5   r4   rH   
multi_linemergedpolyslineall_ptslrK   s                  r   get_kicad_polygonrj      s   !),KE4H 7
s567 .sC5#s+,-. %%h/J[["":.F&$../LL 	1D||T\\$/0	1 u:?CDG "q!" "q!"??7+777 u"233>><<''CDG "q!" "q!"??7+777r+   c                 
   t        j                  | dz  | dz  f|dz  | dz  f|dz  |dz  f| dz  |dz  fg      }t        j                  j	                  ||dd      }t        j                  j                  || |      }|S )Nr   )r   r   F)originuse_radians)xoffyoff)rS   r\   rV   affinityrotate	translate)xyrotsizerects        r   create_switch_polyrx      s    <<UQY	"AXuqy!AXtax UQYq!		
D ""4V"OD%%d%;DKr+   blacknonec           
         t        j                  | d      }t        d      x}}t        d      x}}	t        |t              s|g}|D ]^  }
t        |
t
        j                        s|
j                  \  }}}}t        ||      }t        ||      }t        ||      }t        |	|      }	` ||z
  dz   }|	|z
  dz   }| d|d<   | d|d<   |j                  |d	z
  |d	z
  ||       |D ]  }
t        |
t
        j                        s|
j                  j                  D cg c]  }|d
   |d   f }}|j                  |j                  |||d             |
j                  D ]G  }|j                  D cg c]  }|d
   |d   f }}|j                  |j                  |||d             I  |D ]-  \  }}}|j                  |j!                  ||f|ddd             / |j#                          y c c}w c c}w )Ntiny)profileinfz-inf
   mmwidthheightr   r   r   g?)fillstrokestroke_widthrz   red)centerr   r   r   r   )svgwriteDrawingr   rY   listrS   r\   boundsminrb   viewboxexteriorcoordsaddpolygon	interiorscirclesave)filenamerf   holescolorr   dwgmin_xmin_ymax_xmax_ypolyminxminymaxxmaxyr   r   rP   
ext_coordsinterior
int_coordshxhyr   s                           r   
export_svgr      s   


8V
4C%L EE&M!EEeT" %dDLL)%)[["D$dt$Et$Et$Et$E% EMBEU]RFWB<CLhbMCMKK	519eV4 dDLL)040D0DE11Q41,EJEGGCKK
eRUKVW NN 4<OODqqtQqTlD
DKK
eRUKV	  
	BJJBx16%c  	

 HHJ F Es   G,.G1__main__)   )g      ,@)r   r&   rV   shapely.geometrygeometryrS   shapely.opsr   r   r   r$   r*   rL   rj   rx   r   __name__ r+   r   <module>r      s[    	    # ("JBBJ(8V  ')f (V z r+   