
    jf                     ^   d dl Z d dlZd dlmZmZ d dlmZ d dlZddl	m
Z
mZmZmZ ddlmZmZ ddlmZmZ ddlmZmZmZmZmZ dd	lmZ d
dlmZmZ d
dlmZm Z m!Z! dZ"dZ#de# dZ$ ejJ                  d      Z&de&jN                  d<   d&dZ(dedefdZ)d'dZ*de+deejX                     fdZ-d(dedefdZ.d&dZ/d)dZ0d Z1d  Z2d! Z3d" Z4d#e(iZ5	 d d$l6m7Z7 	 d d%l;m<Z< y# e8$ r!Z9 e
jt                  e9      Z7e7e5d#<   Y dZ9[9)dZ9[9ww xY w# e8$ r!Z9 e
jt                  e9      Z<e<e5d#<   Y dZ9[9ydZ9[9ww xY w)*    N)defaultdictdeque)deepcopy   )
exceptionsgrouping	resourcesutil)logtol)planar_matrixtransform_points)DictIterableMappingNDArrayNumber)jsonify   )
arc_centerto_threepoint)ArcBezierLinetrimeshz!https://github.com/mikedh/trimesh{}F	WRITEABLEc                    d}d}g }g }| t        j                  | j                               }|j                  d      D ](  }|j	                  |j
                  t        |      f       * |j                  d      D ]F  }|j	                  |j                  j                  dd      d   |j
                  t        |      f       H 	 |j
                  t        dz      }n'||j	                  d|it        f       nt        d	      t        |||
      }		 |"t        |j
                  t        dz            |	d<   d|	v rN	 t        |j
                  t        dz            }
|
j%                         D ]  \  }}||	d   v s||	d   |   d<    	 |	S |	S # t        $ r Y w xY w# t        $ r Y nt        $ r t!        j"                  dd       Y w xY w# t        $ r Y |	S t        $ r t!        j"                  dd       Y |	S w xY w)ad  
    Load an SVG file into a Path2D object.

    Parameters
    -----------
    file_obj : open file object
      Contains SVG data
    file_type: None
      Not used
    path_string : None or str
      If passed, parse a single path string and ignore `file_obj`.

    Returns
    -----------
    loaded : dict
      With kwargs for Path2D constructor
    Nz{*}path)z	{*}circlez{*}rectz{*}linez{*}polylinez
{*}polygonr      classdz#`file_obj` or `pathstring` required)pathsshapesforcemetadatazfailed metadataTexc_infogeometrymetadata_geometry)etree
fromstringreaditerappendattribelement_transformtagrsplit_nsBaseException	_IDENTITY
ValueError_svg_path_convert_decodeKeyErrorr   debugitems)file_obj	file_typepath_stringr&   treer$   r%   elementshaperesultbagnamemetas                I/DATA/.local/lib/python3.12/site-packages/trimesh/path/exchange/svg_io.pysvg_to_pathrI      s
   & EDEF0 yy+GLL'..*;G*DEF ,
 YYL
E MM!!#q)"-u||=Nu=UV
	KKg.E 
	 sK()45>??U6GF	4!(S:5E)F!GF: V	8$++c,?&?@AC!iik
d6*--;?F:&t,Z8 * M6MM  		   4		#d34  	
 M	  	8II'$7M		8sH   F
 $F ;<G	 8G	 
	FF	G$GG		G8G87G8r1   returnc                     	 | j                         D ci c]<  \  }}|dd  j                  t              r|j                  t              t        |      > c}}S c c}}w # t        $ r i cY S w xY w)Nr    )r=   
startswith_ns_urllstripr5   r:   r6   )r1   kvs      rH   _attrib_metadatarQ   m   ss     
&1u( HHSM71:%&
 	
 

  	s#   A  AAA  A   A.-A.c                 P   t               }| }t        |      D ]Q  }d|j                  v r-|j                  t	        |j                  d         ddd          |j                         }|Q n t        |      dk(  rt        S t        |      dk(  r|d   S t        j                  |      S )z
    Find a transformation matrix for an XML element.

    Parameters
    --------------
    e : lxml.etree.Element
      Element to search upwards from.
    max_depth : int
      Maximum depth to search for transforms.
    	transformNr!   r   r    )
r   ranger1   
extendlefttransform_to_matrices	getparentlenr7   r
   	multi_dot)rB   	max_depthmatricescurrent_s        rH   r2   r2   y   s     wHG9'..( 5gnn[6Q RSWUWSW XY##%?  8}	X!	{ ~~h''    rS   c           
         | j                         j                  d      D cg c]Z  }t        |      dkD  rJ|j                         j                  d      D cg c]!  }t        |      dkD  s|j                         # c}\ }}}g }|D ]  }t        |      dk(  rt        |      dk7  rt	        d      |\  }}t        j                  |j                  dd      j                         D cg c]  }t        |       c}      }|dk(  r0|j                  t        j                                ||d	   d
ddf<   |dk(  rB|j                  t        j                  |j                  d      j                  g df             |dk(  rLt        j                  |d         }	t        |      dk(  r|dd
 }
nd
}
|j                  t!        |	|
             H|dk(  r:t        j                         }|d
dd
dfxx   |z  cc<   |j                  |       t#        j$                  d|         t        j                  |t
        j&                        S c c}w c c}}w c c}w )a  
    Convert an SVG transform string to an array of matrices.

    i.e. "rotate(-10 50 100)
          translate(-36 45.5)
          skewX(40)
          scale(1 0.5)"

    Parameters
    -----------
    transform : str
      Contains transformation information in SVG form

    Returns
    -----------
    matrices : (n, 3, 3) float
      Multiple transformation matrices from input transform string
    )r   (r   z"should always have two components!, 	translater!   Nmatrix)r   r   )r   r   r    rotater   r    )thetapointscalezunknown SVG transform: dtype)lowersplitrX   stripr8   nparrayreplacefloatr0   r7   copyvstackreshapeTdegreesr   r   r<   float64)rS   ij
componentsr[   linekeyargsvaluesanglerh   mats               rH   rV   rV      s   . "((--Aq6A: GGIOOC0?0qCFQJ0?-   Ht9>Y!^ABB	T T\\#s-C-I-I-KL-K58-KLM+OOINN,-"(HRL!QH_
 OOBIIv~~f'='?'?&KLMH_JJvay)E6{aqr
OOMUCDG^.."CBQBK6!KOOC II/u56E H 88HBJJ//U 	@ Ms#   4II+I=I+I
Ir$   r%   c                   (+, d +,(fd}+,(fd}+,(fd}+,(fd} G d d      }||||d}t        t              }	t        t              }
t        d	       ,| D ]  \  }}|j                  d
d      }t        |      dk(  rt	        j
                  d       =t        |j                  t        dz               (t        j                  t        t        |                  }t        |      dk(  rdddd}t        j                  |D cg c]'  }|j                  t        |      j                  d      ) c}t              }t        j                  |dd      }t         j"                  rGt%        j&                  t        j(                  |      t        j*                  t        |                  sJ g }|D ]  }||   }t        ||d            j                  }|dv r|j-                   ||             @t        |      dkD  r|dk(  rt        j                  |D cg c]  }|j.                  j0                  |j.                  j2                  |j4                  j0                  |j4                  j2                  |j6                  j0                  |j6                  j2                  |j8                  j0                  |j8                  j2                  |j:                  g	 c}t        j<                        }d}t        j>                  |ddddf   d      jA                         dk  rB|ddddf   |ddddf   }}t%        j&                  |t        jB                  |dd            }|r d|d   _"        |j-                  |d          |jG                  |       |jG                  |        tI        |      }|D ]  }t        |      j                  }||v s ||   |      \  }} |jJ                  jM                  |       |	(   j-                  |       |
(   j-                  tO        | |             ,(xx   t        |       z  cc<     |D ]  \  }!}}t        |j                  t        dz               (|!dk(  rZtQ        tS        |d         tS        |d         gtS        |d                }"tU        t        j*                  d!      ,(   z   d"      }#n|!d#k(  rt        j                  |d$   |d%   gt        j<                        }$t        j                  |d&   |d'   gt        j<                        \  }%}&t        j                  |$|$|%dfz   |$|%|&fz   |$d|&fz   |$gt        j<                        }"tW        t        j*                  t        |"            ,(   z   (      }#n|!d)k(  rt        jX                  |d*   j[                         j]                  d+d,      d,t        j<                  -      j_                  d.      }"tW        t        j*                  t        |"            ,(   z   (      }#nh|!d/k(  rt        jX                  |d*   j[                         j]                  d+d,      d,t        j<                  -      j_                  d.      }"|"d   |"d0   k(  ja                         r%t        j*                  t        |"            ,(   z   }'n/t        j*                  t        |"      dz         ,(   z   }'|'d   |'d0<   tW        |'(      }#n|!d1k(  rst        j                  |d2   |d3   |d4   |d5   gt        j<                        j_                  d6      }"tW        t        j*                  t        |"            ,(   z   (      }#nt	        j
                  d7|! d8       F|	(   j-                  |#       |
(   j-                  tO        |"|             ,(xx   t        |"      z  cc<    t        |
      dk(  rg g d9S |
jc                         D ( ci c]!  \  }(} |(t        jd                  |       |	|(   d9# })}(} t        |)      dkD  s|d:k(  rd;|)i}*|*S tg        ti        |)jk                                     }*|*S c c}w c c}w c c} }(w )<a  
    Convert an SVG path string into a Path2D object

    Parameters
    -------------
    paths: list of tuples
      Containing (path string, (3, 3) matrix, metadata)

    Returns
    -------------
    drawing : dict
      Kwargs for Path2D constructor
    c                     t        j                  | D cg c]  }|j                  |j                  g c}t         j                        S c c}w )Nrj   )ro   rp   realimagrx   )r   ry   s     rH   complex_to_floatz+_svg_path_convert.<locals>.complex_to_float   s6    xx6:6a!&&!&&)6:"**MM:s   A
c                        }|t        | j                        z   }t        t        j                  ||            | j                  fS )Npoints)rX   r   r   ro   arange)multistartendcountsrF   s      rH   
load_multiz%_svg_path_convert.<locals>.load_multi   s@     tc%,,''BIIeS12ELLAAr^   c                      | j                   | j                  d      | j                  g      }t        t	        j
                  d         z   t        | dd            }||fS )Ng      ?r   closedFr   r   )r   rh   r   r   ro   r   getattr)svg_arcr   arcr   r   rF   s      rH   load_arcz#_svg_path_convert.<locals>.load_arc   s]    !7=='--2Dgkk"RS99Q<&,. 7He4	
 F{r^   c                      | j                   | j                  | j                  g      }t        t	        j
                  d         z         |fS )Nr   r   )r   controlr   r   ro   r   )svg_quadraticr   r   r   rF   s     rH   load_quadraticz)_svg_path_convert.<locals>.load_quadratic  sL    !  -"7"79J9JK
 RYYq\F4L896AAr^   c                      | j                   | j                  | j                  | j                  g      }t	        t        j                  d         z         |fS )N   )r   control1control2r   r   ro   r   )	svg_cubicr   r   r   rF   s     rH   
load_cubicz%_svg_path_convert.<locals>.load_cubic
  sP    !__i00)2D2DimmT
 biilVD\12F::r^   c                       e Zd Zd Zy)$_svg_path_convert.<locals>.MultiLinec                 j   t         j                  rt        d |D              sJ |D cg c]  }|j                   }}|j	                  |d   j
                         t        j                  |D cg c]  }|j                  |j                  g c}t        j                        | _        y c c}w c c}w )Nc              3   J   K   | ]  }t        |      j                  d v   yw)r   CloseN)type__name__).0Ls     rH   	<genexpr>z@_svg_path_convert.<locals>.MultiLine.__init__.<locals>.<genexpr>  s!     P%Q47++/@@%s   !#r!   rj   )r   strictallr   r0   r   ro   rp   r   r   rx   r   )selflinesr   r   ry   s        rH   __init__z-_svg_path_convert.<locals>.MultiLine.__init__  s    zzP%PPPP',-u!agguF-MM%)--(((f#EfQVVQVV$4f#ERZZXDK	 . $Fs   B+/B0N)r   
__module____qualname__r    r^   rH   	MultiLiner     s    		Yr^   r   )r   r   CubicBezierQuadraticBezierc                       y)Nr   r   r   r^   rH   <lambda>z#_svg_path_convert.<locals>.<lambda>(  s    r^   r#    r   zempty path string!rF   r    r   )r   r   r   rj   F)min_lenonly_nonzeror   r   Nr   )axisgMbP?T)r1   circlecxcyrr   r   rectxywidthheightr   polyliner   rb   rc   )seprk   )r!   r   polygonr!   r|   x1y1x2y2)r   r   zunsupported SVG shape: ``)verticesentitiesScener*   )6r   listgetrX   r   r<   r:   r5   ro   rp   
parse_pathr   r   intr   blocksr   r   r
   allclosehstackr   r0   r   r   r   r   centerradiusrotationrx   ptpmeanrollr   extendrQ   r'   updater   r   rr   r   r   r-   rn   rq   ru   r   r=   rt   nextr/   r   )-r$   r%   r&   r   r   r   r   r   loadersr   r   r1   re   r@   rawkinds_lookupry   kindsr   parsedbchunkr\   avertsr   r   r   entity_meta
svg_entity	type_nameerP   kindr   entityoriginwhindexrF   geomskwargsr   r   s-                                           `  @@rH   r9   r9      sY   NB
B;Y Y !)	G 4 H4 H#Fjjb){q II*+ vzz#,/0hhtJ{345 s8q= !"Aa8MA,**47+;+;Q?MUXY F::==6!2BIIc#h4GHHH AFE3qt9o..G++i./Q!5 0  "' "'A GGLLGGLLEEJJEEJJHHMMHHMMHHMMHHMMJJ
 "' **$ 66%12,Q/446=!&q"1"uuQ!V}3E "]]5"''#qq2IJF&*E!HOMM%(+ MM%( e$] ` 'f5 !JZ(11IG#)wy)*51

!!+.%%a(%%&6q&&ABtA& !g  B !'ffvzz#,/08"vd|$eF4L&9:E&+<NF 		!vd| ;DIFV^XXvc{F3K8

KF88VG_fX.>?rzzRDAqXX1a&&Aq6/6QF?FSjjF 3v;!7&,!FGFZ]]x &&(00c:2::gg  3v;!7&,!FGFY]]x &&(00c:2::gg  q	VBZ',,.		#f+.=		#f+/2VD\A!!Hb	'FV^XXvd|VD\6$<HPRPZPZgfo  3v;!7&,!FGFII0a89f%.vv>?tF#k !'n 8}B//  ~~''GD! 	299Q<Xd^DD' 
  5zA~')e$
 M d5<<>*+Mc N.`s   ,a1
 B<a6&a;c                    |d}|j                         dt        |       d}dj                  d|      dj                  d|      dj                  d|      dj                  d|      d	t        d
t        dt        fdfd}fd}g }| D ]l  }	||	j
                  |vr|	j                  j                  dk(  r	 ||	      }
n ||	      }
t        |	j                        }|||d<   |j                  ||
f       n |S )a  
    Convert the entities of a path to path strings.

    Parameters
    ------------
    entities : (n,) list
      Entity objects
    vertices : (m, 2) float
      Vertices entities reference
    name : any
      Trimesh namespace name to assign to entity
    digits : int
      Number of digits to format exports into
    only_layers : set
      Only export these layers if passed
       z0.fzKM {x:DI},{y:DI}a{r:DI},{r:DI},0,1,0,{d:DI},0a{r:DI},{r:DI},0,1,0,-{d:DI},0ZDIzM{:DI},{:DI}zL{:DI},{:DI}z6M{SX:DI} {SY:DI}A{R},{R} 0 {L:d},{S:d} {EX:DI},{EY:DI}r   r   rJ   c                 0    | d   |d   z  | d   |d   z  z
  S )zD
        Numpy 2.0 depreciated cross products of 2D arrays.
        r   r    r   )r   r   s     rH   	_cross_2dz#_entities_to_str.<locals>._cross_2d  s'     tad{QqTAaD[((r^   c           	         | j                      }t        |dd      }|j                  |j                  |j                  }}}| j
                  r!j                  |d   |z
  |d   |d|z        S |\  }}}t        |t        j                  kD        }	t         ||z
  ||z
        dkD        }
j                  |d   |d   |	|
|d   |d   |	      S )
z
        arc string: (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
        large-arc-flag: greater than 180 degrees
        sweep flag: direction (cw/ccw)
        FT)return_normalreturn_angler   r    g       @)r   r   r   r#   g        )SXSYr   SEXEYR)
r   r   r   r   spanr   formatr   ro   pi)r   r   infoCr  r   vertex_start
vertex_mid
vertex_end
large_flag
sweep_flagr   r   temp_arctemp_circles              rH   r   z!_entities_to_str.<locals>.svg_arc  s     #**%(%dKkk4;;		e1::%%!qAaDAq%II/7,j*'
j</l1JKcQ

 AA!}!}  
 	
r^   c                     | j                        }t        |      dk(  ry t        |      dz
  z  z   j                  |j                  d       S )za
        Use an entities discrete representation to export a
        curve as a polyline
        r   r   r    r!   )discreterX   r  ru   )r   r  r   	temp_line	temp_moves     rH   svg_discretez&_entities_to_str.<locals>.svg_discrete  sX    
 ??6*x=AE	Y#h-!*;<=EEb!
 	
r^   r   rF   )rs   r   rq   r   r   layer	__class__r   r   r'   r0   )r   r   rF   digitsonly_layerstemp_digitsr   r  pairsr   r@   rG   r   r   r  r  r  r  s               @@@@@@rH   _entities_to_strr    s'   " ~]]_F s6{m1%K 	[gdK   &&t[9I&&t[9IGOOkH)W ) )V )
6
 E"v||;'F$$-!&/K 'v.K(DLdK()  Lr^   c           
         dt        |       j                  i}t        j                  | d      rg }i }| j                  j                         D ]^  \  }}	t        j                  |	d      s|	j                  ||<   |j                  t        |	j                  |	j                  |||             ` t        |      dkD  rTt        |      |d<   nEt        j                  | d      r$t        | j                  | j                  ||      }nt        d      |rd	j                  d
 |D              S t        j                   d      }
g }|D ]&  \  }}|j#                  d| dt%        |       d       ( d|v rt'        |d         }n| j(                  j+                         dz  }	 t        | j                        |d<   dj                  |      | j2                  d   d   | j2                  d   d   | j(                  d   | j(                  d   |t%        |      d} |
j4                  di |S # t,        $ r t/        j0                  dd       Y w xY w)a  
    Export a Path2D object into an SVG file.

    Parameters
    -----------
    drawing : Path2D
     Source geometry
    return_path : bool
      If True return only path string not wrapped in XML
    only_layers : None or set
      If passed only export the specified layers
    digits : None or int
      Number of digits for floating point values

    Returns
    -----------
    as_svg : str
      XML formatted SVG, or path string
    r"   r   Path2D)r   r   rF   r  r  r   r+   )r   r   r  r  z'drawing must be Scene or Path2D object!rc   c              3   &   K   | ]	  }|d      yw)r    Nr   )r   rP   s     rH   r   zexport_svg.<locals>.<genexpr>s  s     ,e!es   ztemplates/base.svgz	<path d="z" z/>stroke_widthg      @r'   zfailed to encodeTr(   
r    )elementsmin_xmin_yr   r   r   attribsr   )r   r   r
   is_instance_namedr*   r=   r'   r   r  r   r   rX   _encoder8   joinr	   
get_stringr0   _format_attribrr   extentsmaxr6   r   r<   boundsr  )drawingreturn_pathr  r  r   r%  r  	geom_metarF   geomtemplate_svgr"  rG   r@   r   subss                   rH   
export_svgr4  :  s:   * W../Ggw/	!**002JD$))$9"mmIdOLL !]]!]]! + 3 y>A ,39+=G'(				2 %%%%#	
 BCC xx,e,,, ''(<=LH"k)K=>$3G2HKL #
 VN34 **,u45%g&6&67
 IIh'"1%"1%#//!$$!'*D <&&&  5		$t45s   H" " IIc                     | j                         D ci c]  \  }}|t        |       }}}dj                  d |j                         D              S c c}}w )z
    Format attribs into the trimesh namespace.

    Parameters
    -----------
    attrib : dict
      Bag of keys and values.
    r!  c              3   |   K   | ]4  \  }}t        |      d kD  r!|t        |      d kD  rt         d| d| d 6 yw)r   N:z="")rX   _ns_name)r   rO   rP   s      rH   r   z!_format_attrib.<locals>.<genexpr>  sH      DAqq6A:!-CFQJ *AaS1#Qs   :<)r=   r'  r(  )r1   rO   rP   rE   s       rH   r*  r*    sS     &,\\^
4^TQ1gaj=^C
499 IIK   5s   Ac                 ~   t        | t              rd| vr| S t        j                  t	        | j                         D ci c]  \  }}|j                  d      r|| c}}d      j                  d            }dt        j                  |      z   }t        j                  rt        | t        |             |S c c}}w )z
    Wangle things into a string.

    Parameters
    -----------
    stuff : dict, str
      Thing to pack

    Returns
    ------------
    encoded : str
      Packaged into url-safe b64 string
    r8  r]   )rb   r7  )
separatorsutf-8base64,)
isinstancestrbase64urlsafe_b64encoder   r=   rL   encoder
   decode_textr   r   
_deep_samer:   )stuffrO   rP   packrD   s        rH   r'  r'    s     %#U"2###kkmEmda1<<3DQTmE!	
 &/	D ))$//F
zz5'&/*M Fs   B9B9c                    t        | t        j                        r"t        |t        t        j                  f      s;J t        | t              rt        |t              sJ t        | t        |            sJ t        | t        t        f      r| |k(  sJ yt        | t        t        t        j                  f      rt        j                  | |      sJ yt        | t              r:t        |       t        |      k(  sJ t        | |      D ]  \  }}t        ||        yt        | t              sJ t        | j                               t        |j                               k(  sJ | j                         D ]  }t        | |   ||           y)aR  
    Do a recursive comparison of two items to check
    our encoding scheme in unit tests.

    Parameters
    -----------
    original : str, bytes, list, dict
      Original item
    other : str, bytes, list, dict
      Item that should be identical

    Raises
    ------------
    AssertionError
      If items are not the same.
    N)r>  ro   ndarrayr   r?  r   bytesrr   r   r   rX   ziprD  dictsetkeys)originalotherr   r   rO   s        rH   rD  rD    sD   & (BJJ'%$

!3444	Hc	"%%%% (DK000(S%L)5   	Huc2::6	7 {{8U+++	Hd	#8}E
***%(DAqq! ) h%%% x}}3uzz|#4444]]_8A;a) r^   c                     | yt        j                  |       }|j                  d      rIt        j                  t        j                  |dd j                  d            j                  d            S |S )z
    Decode a base64 bag of stuff.

    Parameters
    ------------
    bag : str
      Starts with `base64,`

    Returns
    -------------
    loaded : dict
      Loaded bag of stuff
    Nr=     r<  )	r
   rC  rL   jsonloadsr@  urlsafe_b64decoderB  decode)rE   texts     rH   r:   r:     sh     {C Dy!zz$$T!"X__W%=>EEgN
 	
 Kr^   svg)r   )r,   )NNN)
   )N)FNN)=r@  rR  collectionsr   r   rs   r   numpyro   r   r   r   r	   r
   	constantsr   r   transformationsr   r   typedr   r   r   r   r   r   r   r   r   r   r   r   r   r9  rM   r5   eyer7   flagsrI   rQ   r2   r?  rx   rV   r9   r  r4  r*  r'  rD  r:   _svg_loaderssvg.pathr   r6   EExceptionWrapperlxmlr,   r   r^   rH   <module>re     s^     *   5 5 ! > = =  + ( ( 
-
7)2BFF1I	$	 Qh	W 	 	(@@0S @0WRZZ-@ @0FsX sx slePY'x"<3*l0 {#%#   % -,,Q/J$L	%    (J''*EL	 s0   C D D"C>>DD,D''D,