
    ^j{                     	   U d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d d	l m!Z! d d
l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA g dZB e'       ZCeCj                   e# e&        e$dd d                     e j                  eF      ZGeeHed   eIeIf   eHed   eIeIf   eHed   eIeIeIeIf   eHed   eIeIeIeIeIeIf   eHed   eIeIeIeJeJeIeIf   eHed      f   ZK G d d      ZLdddeeK   deeJ   deMfdZNdjdeeK   deMdeMfdZOeeMeeK   ej                  f   ZQeeRd<   ej                  ZTeeRd <   eej                  ej                  f   ZWeeRd!<   ee0e.f   ZXeeRd"<    G d# d$e      ZY ed%      ZZ G d& d'eeZ         Z[ ed      Z\ed(d)d*d+eeMej                  ef   d,e]d-e]d.ee
eTeeW   ge\f      de[eHeXe\f      f
d/       Z^ed(d)d*d+eeMej                  ef   d,e]d-e]de[eX   fd0       Z^d(d)dd1d+eeMej                  ef   d,e]d-e]d.ee
eTeeW   ge\f      dee[eHeXe\f      e[eX   f   f
d2Z^ G d3 d4      Z_deQdee.   fd5Z`d6eTdee0   fd7Zad6eTfd8ZbdeQdee0   fd9ZcdeQdee-   fd:ZddeQdeeHee-   e]f      fd;Ze G d< d=      Zfd(d(d(d(d>d?e.d@eIdAe]dBe]dCe]dDe]deeK   fdEZgd(d(d(d(d(dFdGe0d@eIdAe]dBe]dCe]dDe]dHe]deeK   fdIZhd(d(d(d(d(dFdJe-d@eIdAe]dBe]dCe]dDe]dHe]deeK   fdKZid(d(d(d(d(d)dLdMe2d@eIdAe]dBe]dCe]dDe]dHe]dNe]deeK   fdOZj	 	 	 dkdPee!ef   dQeIdReIdSe#dHe]dDe]dNe]deeK   fdTZkd(d(d)dUdVedBe]dHe]dNe]deeK   f
dWZld(d)d)dXdYee&   dHe]dZe]dNe]deeK   f
d[Zmed)d\d+eeMej                  ef   d]e
eTeeW   ge\f   d-e]de[eHene0   e]e\f      fd^       Zoed)d\d+eeMej                  ef   d]dd-e]de[eHene0   e]df      fd_       Zod)d\d+eeMej                  ef   d]ee
eTeeW   ge\f      d-e]dee[eHene0   e]e\f      e[eHene0   e]df      f   fd`Zod)d\d+eeMej                  ef   d-e]de[eHeTeHeWdaf   f      fdbZpdeej                  eMf   deMfdcZqdeQdej                  fddZrdej                  deeHej                  e]f      fdeZsdfej                  fdgZudhej                  fdiZvy)l    N)chain)degreespi)AnyCallableIterableIteratorLiteral
NamedTupleOptionalSequenceTextIO	TypeAliasTypeVarUnionoverload)BRepAdaptor_Curve)BRepBuilderAPI_GTransformBRepBuilderAPI_Transform)Geom_BezierCurve)GeomAbs_CurveType)GeomAdaptor_Curve)gp_Ax1gp_Dirgp_GTrsfgp_Pntgp_Trsfgp_Vec)StdFail_NotDone)TopoDSTopoDS_EdgeTopoDS_FaceTopoDS_ShapeTopoDS_Wire   )CurveOrAdaptorInvalidWiresForFacebezier_curvecircle_curvecurve_and_adaptorcurve_to_bezierscurve_to_polylineedge_from_curveedge_to_curveellipse_curvefaces_from_wire_soupis_reversedsegment_curvetopoDS_iteratorwire_explorerwire_from_continuous_edges)import_svg_documentViewBoxColorAndLabelfaces_from_svg_pathwires_from_svg_pathedges_from_svg_pathcontinuous_edges_from_svg_pathface_to_svg_pathwire_to_svg_pathedge_to_svg_pathcurve_to_svg_pathSvgPathCommandformat_svg_pathMLQCAZc                   0    e Zd ZdZddee   fdZdefdZy)float_formatterz<float formatter with given precision and no trailing zeroes.Ndecimalsc                 "    d|xs d d| _         y )N.   f)format_spec)selfrK   s     C/opt/ringagent/.cad-venv/lib/python3.12/site-packages/ocpsvg/svg.py__init__zfloat_formatter.__init__W   s    x~2.a0    vc                 t    |j                  | j                        j                  d      j                  d      S )N0rM   )
__format__rP   rstrip)rQ   rU   s     rR   __call__zfloat_formatter.__call__Z   s-    ||D,,-44S9@@EErT   N)	__name__
__module____qualname____doc__r   intrS   floatrZ    rT   rR   rJ   rJ   T   s#    F1# 1F% FrT   rJ   )rK   pathrK   returnc                N    t        |      dj                  fd| D              S )N c           
   3   h   K   | ])  }|d     dj                  t        |dd               + yw)r   ,r%   N)joinmap).0cmdffs     rR   	<genexpr>z"format_svg_path.<locals>.<genexpr>b   s5     Ls1vhsxxBAB(89:;L   /2)rJ   ri   )rc   rK   rm   s     @rR   rB   rB   ^   s$     
	"B88LtLLLrT   float_formatc                 p    t        j                  dt        d       dj                  fd| D              S )Nz:`format_svg` is deprecated, use `format_svg_path` instead.   
stacklevelrf   c              3   f   K   | ](  }|d     dj                  fd|dd D                * yw)r   rh   c              3   @   K   | ]  }|j                          y wr[   )rX   )rk   argrp   s     rR   rn   z'format_svg.<locals>.<genexpr>.<genexpr>l   s     LSCNN<8Ls   r%   N)ri   )rk   rl   rp   s     rR   rn   zformat_svg.<locals>.<genexpr>k   s<       q6(388LCGLLMNs   .1)warningswarnFutureWarningri   )rc   rp   s    `rR   
format_svgr{   e   s8    MMD
 88   rT   SvgPathLikeShapeElementParentElement
FaceOrWirec                   6    e Zd ZU eed<   eed<   eed<   eed<   y)r7   widthheightxyN)r\   r]   r^   ra   __annotations__rb   rT   rR   r7   r7   x   s    LMHHrT   r7   Tc                   8    e Zd Zdee   deddfdZdee   fdZy)ItemsFromDocumentelementsviewboxrd   Nc                      || _         || _        y r[   )r   r   )rQ   r   r   s      rR   rS   zItemsFromDocument.__init__   s     rT   c                     | j                   S r[   )r   )rQ   s    rR   __iter__zItemsFromDocument.__iter__   s    }}rT   )r\   r]   r^   r	   r   r7   rS   r   rb   rT   rR   r   r      s0    ! w 4 (1+ rT   r   TF)flip_yignore_visibilitysvg_filer   r   metadatac                     y r[   rb   )r   r   r   r   s       rR   r6   r6      s     /2rT   c                     y r[   rb   )r   r   r   s      rR   r6   r6      s     %(rT   )r   r   r   c                  	
 dt         ffd}dt         ffd}dt        t           dt        dt        t
           fd	|rHt        | ||      } ||j                        
	
fd	|D        }t        | ||j                              S t        | |d
      } ||j                        
	
fd|D        }t        | ||j                              S )a  Import shapes from an SVG document as faces and/or wires.

    Each visible shape and path is converted to zero or more Face if it is filled,
    and to zero or more Wire if it is not filled.

    This importer does not cover the whole SVG specification,
    its most notable known limitations are:

    - degenerate and self-crossing paths may result in invalid faces and wires
    - clipping, both by clipping paths and viewport, is ignored
    - graphic properties such as line strokes and pattern fills are ignored

    Documents relying on these features need to be pre-processed externally.

    :param svg_file: input SVG document
    :param flip_y: whether to mirror the Y-coordinates
        to compensate for SVG's top left origin, defaults to True
    :param ignore_visibility: whether to ignore visibility
        attribute and process hidden elements.
    :param metadata: funtion to generate metadata from the source SVG element
    :raises IOError:
    :raises SyntaxError:
    :raises ValueError:
    r   c           
      @   t               j                  t        | j                  | j                  d             rLt               }|j                  t        t        ddd      t        ddd                   j                  |       dt        dt        ffd}|S )Nr   r%   shaperd   c                    t        | dd      j                         }r|j                          t        | t              rt        j                  |      S t        | t              rt        j                  |      S t        d|        )NFzsomehow got unexpected shape )
r   ShapeReverse
isinstancer"   r    Facer$   WireAssertionError)r   mirroredr   	transforms     rR   transform_fz?import_svg_document.<locals>.doc_transform.<locals>.transform_f   sp    /y%OUUWH  "%-{{8,,E;/{{8,,$'DUG%LMMrT   )r   SetTranslationr   r   r   	SetMirrorr   r   r   PreMultiplyr   )r   mirrorr   r   r   s      @rR   doc_transformz*import_svg_document.<locals>.doc_transform   s    I	  		799a!@AYFVF1aOVAq!_EF!!&)		Nz 		Nj 		N rT   c                 >    r| \  }}}}t        |||| |z
        S | S r[   )r7   )r   whr   r   r   s        rR   transform_viewboxz.import_svg_document.<locals>.transform_viewbox   s/     JAq!Q1aQBF++NrT   wires	is_filledrd   c              3      K   |r	 t        |       E d {    y | E d {    y 7 # t        $ r# t        j                  d       | E d {  7   Y y w xY w7 6w)Nz+filled shape could not be converted to face)r0   r'   loggerwarning)r   r   s     rR   process_wirez)import_svg_document.<locals>.process_wire   sX      !/666
  7& !LM   ! sG   A' %' AAA' #A
AAAAA)r   metadata_factoryc              3   V   K   | ]   \  }}} ||      D ]  } |      |f  " y wr[   rb   )rk   r   r   r   face_or_wirer   r   s        rR   rn   z&import_svg_document.<locals>.<genexpr>   sE      
*y( ,UI >
  |$h/
/
s   &)Nc              3   R   K   | ]  \  }}} ||      D ]  } |          y wr[   rb   )rk   r   r   	_metadatar   r   r   s        rR   rn   z&import_svg_document.<locals>.<genexpr>  s@      
+y) ,UI >
  l#
#
s   $')	r7   listr$   boolr	   r   wires_from_svg_documentr   r   )r   r   r   r   r   r   wires_from_doc_with_metadataitemswires_from_doc_without_metadatar   r   s    `       @@rR   r6   r6      s    @w ,7 K  
*	 '>/%(
$
 "">"F"FG	
.J

 !$%A%I%IJ
 	
 +B/!+
'
 ""A"I"IJ	
/N

 !$%D%L%LM
 	
rT   c            
           e Zd Z	 ddedee   deddfdZdefdZ	e
d	eej                  df   deeeeeef   df   fd
       Ze
deeef   defd       Zeddefd       Zy)r8   elementparentslabel_byrd   Nc                       j                  |j                         _         j                  |j                        xs d _         j                  |       _        t         fd|D               _        y )Nr   r   r   r%   c              3   B   K   | ]  }j                  |        y wr[   )_label)rk   parentr   rQ   s     rR   rn   z)ColorAndLabel.__init__.<locals>.<genexpr>  s     "WV4;;vx#@"Ws   )	_colorfill
fill_colorstrokestroke_colorr   labeltupleparent_labels)rQ   r   r   r   s   `  `rR   rS   zColorAndLabel.__init__  sX     ++gll3 KK7G<[[(3
""Ww"WWrT   r   c                 |    t        |t        t        f       }|r| j                  r| j                  S | j                  S )z<Fill color if shape should be filled stroke color otherwise.)r   r$   r!   r   r   )rQ   r   filleds      rR   	color_forzColorAndLabel.color_for  s3    ['ABB"(T__tS$BSBSSrT   colorc                     | rM| j                   rA	 | j                  | j                  | j                  | j                  f}t        d |D              S y # t        $ r Y yw xY w)Nc              3   8   K   | ]  }t        |      d z    yw)   N)ra   )rk   rU   s     rR   rn   z'ColorAndLabel._color.<locals>.<genexpr>#  s     :U1X^:s   r   )valueredgreenbluealphar   	TypeError)r   rgbas     rR   r   zColorAndLabel._color  sZ     U[["yy%++uzz5;;F:T:::   "!"s   ?A 	AAc                 ^    	 t        | j                  |         S # t        t        f$ r Y yw xY w)N )strvaluesKeyErrorAttributeError)r   r   s     rR   r   zColorAndLabel._label)  s2    	w~~h/00.) 		s    ,,c                 >     dt         dt        t           f fd}|S )Nr   r   c                      | |      S )N)r   rb   )r   r   clsr   s     rR   rO   z!ColorAndLabel.Label_by.<locals>.f2  s    w(;;rT   )r}   r   r~   )r   r   rO   s   `` rR   Label_byzColorAndLabel.Label_by0  s"    	<| 	<h}.E 	< rT   )id)r\   r]   r^   r}   r   r~   r   rS   r#   r   staticmethodr   svgelementsColorr   ra   r   r   classmethodr   rb   rT   rR   r8   r8     s    
 		X	X -(	X 		X
 
	XT| T
 
[&&,-
	uUE5%/0$6	7
 
 lM9: c     rT   r8   c                 *    t        t        |             S )zCreate faces from an SVG path.

    :param SvgPathLike path: input SVG path
    :yield: faces
    :raises SyntaxError:
    :raises ValueError:
    )r0   r:   rc   s    rR   r9   r9   ;  s       3D 9::rT   r   c              #   d   	K   dt         t        t        t        t        f   d f   f fd	dt        f	 fd}t	         t
        j                  t
        j                  f      rt         j                        }t         j                        }t         j                        }t         j                        }t        ||d      }||k(  rt        ||      nt        |||      } |t        t!        |      f             y t#               x}rt%        |t'        |            E d {    y y 7 w)Nrd   c                     t        j                  dd      j                  z  } t        j                  dd      j                  z  }t        j                  dd      j                  z  }t        | j	                  |      | j	                  |      z
        t
        dz  k7  }|s2| j                  |      | j                  |      | j	                  |      fS y )Nr   r%   rr   )r   Pointr   absangle_tor   distance_to)or   r   	is_skewedr   s       rR   check_unskewed_transformz8wires_from_svg_element.<locals>.check_unskewed_transformG  s    a#g&7&77a#g&7&77a#g&7&77

1

156"q&@	==#Q]]1%5qzz!}DDrT   wirec                 &   j                   j                         r| S         rt               } |j                  g j                   j                  j                   j
                  dj                   j                  fj                   j                  j                   j                  dj                   j                  fd  t        j                  t        | |      j                               S t               }|j                  ddj                   j                         |j                  ddj                   j                         |j                  ddj                   j
                         |j                  ddj                   j                         |j                  ddj                   j                         |j                  ddj                   j                         t        j                  t!        | |      j                               S )N        )r   r   g      ?r   r%   rr      )r   is_identityr   	SetValuesacebdrO   r    r   r   r   r   SetValuer   )r   trsfgtrsfr   r   s      rR   transform_if_neededz3wires_from_svg_element.<locals>.transform_if_neededQ  s   ((*K%'9DDNN ##%%w'8'8':':CARARATATU##%%w'8'8':':CARARATATU &
 ;;7dCIIKLLJENN1a!2!2!4!45NN1a!2!2!4!45NN1a!2!2!4!45NN1a!2!2!4!45NN1a!2!2!4!45NN1a!2!2!4!45;;8uEKKMNNrT   r   )center)r   r   ra   r$   r   r   CircleEllipsecxcyrxryr   r)   r/   r5   r-   svg_element_to_pathrj   r:   )
r   r  r  r  r  r	  r  circle_or_ellpiserc   r   s
   `        @rR   wires_from_svg_elementr  F  s    eE%2E,F,L&M O+ O* 'K..0C0CDE7::7::7::7::B" Rx F+r2f5 	
 "&8I(J'LM
 	
 %W-	-	-*,?,EFFF 
.Fs   D#D0'D.(D0c                 h    t        j                  |       }t        |      r|j                          |S y r[   )r   Pathlenreify)r   rc   s     rR   r
  r
  y  s,    G$D
4y

 rT   c              #   P   K   t        |       D ]  \  }}t        ||        yw)zCreate wires from an SVG path.

    :param SvgPathLike path: input SVG path
    :yield: wires
    :raises SyntaxError:
    :raises ValueError:
    )closedN)r<   r5   )rc   edgesr  s      rR   r:   r:     s-      8= ?v(v>>?s   $&c              #   J   K   t        |       D ]  \  }}|E d{     y7 w)zCreate edges from an SVG path.

    :param SvgPathLike path: input SVG path
    :yield: edges
    :raises SyntaxError:
    :raises ValueError:
    N)r<   )rc   r  _s      rR   r;   r;     s,      348 qs   #!#c              #      K   dt         t        j                  d f   f fddt         t        j                  t        j                  t        j
                  t        j                  f   ffddt        j                  ffd}t                t               D ]  \  }}t         ||            x}s||f ! y w)Nr   c                     | #t         j                  d       t        ddd      S t        | j                  | j                  d      S )Nzfound None point in %sr   )r   r   r   realimag)r   rc   s    rR   pz)continuous_edges_from_svg_path.<locals>.p  s<    9NN3T:!Q?"!&&!&&!,,rT   segmentc                 @   t        | t        j                        ry t        | t        j                        rF| j                  | j
                  k7  r,t         | j                         | j
                              S y t        | t        j                        r=t         | j                         | j                         | j
                              S t        | t        j                        rNt         | j                         | j                         | j                         | j
                              S t        | t        j                        r| j                  }| j                  | j                  z   }t!        | j"                  j$                  | j"                  j&                  t)        ||      t+        ||      ||kD   | j,                        t/        | j1                                     S t        | t        j2                        rF| j                  | j
                  k7  r,t         | j                         | j
                              S y t4        j7                  dt9        |               t         | j                         | j
                              S )N)start_angle	end_angle	clockwiser  rotationzunexpected segment type: )r   r   MoveLinestartendr2   QuadraticBezierr(   controlCubicBeziercontrol1control2Arcthetadeltar/   radiusr  r  minmaxr  r   get_rotationCloser   r   type)r  r  r  r  s      rR   curves_from_segmentz;continuous_edges_from_svg_path.<locals>.curves_from_segment  s    g{//0!1!12}}+$Qw}}%5q~FF ,!<!<='-- 0!GOO2DanUU!8!89'-- '""#'""#'++	  1!--K5I ####Y7i5#k1( !5!5!78  !2!23}}+$Qw}}%5q~FF , NN6tG}oFG 7==!11W[[>BBrT   rc   c           	   3      K   | D ]  }	  |      x}rt        |        y # t        t        f$ r# t        j	                  dt        ||              Y Ow xY ww)Nz
invalid %s)r-   r   
ValueErrorr   debug_SegmentInPath)rc   r  curver3  s      rR   edges_from_pathz7continuous_edges_from_svg_path.<locals>.edges_from_path  sh       	JGJ/8858)%00	J $Z0 J\>'4+HIJs%   A$A/AAAA)r   r   r   r"  r%  r'  r*  r  _path_from_SvgPathLike_continuous_subpathsr   )rc   r9  subpathr  r  r3  r  s   `    @@rR   r<   r<     s     -U;$$d*+ -'C''##OO
'CRJJ "$'D/5  12252- s   B0B?6	B?c                   @    e Zd Zdedej
                  ddfdZdefdZy)r7  r  rc   rd   Nc                      || _         || _        y r[   )r  rc   )rQ   r  rc   s      rR   rS   z_SegmentInPath.__init__  s    	rT   c                 \    | j                   j                         }d| j                   d| dS )N`z` segment in path `)rc   r   r  )rQ   r   s     rR   __str__z_SegmentInPath.__str__  s+    IIKKM4<<. 3A3a88rT   )	r\   r]   r^   r   r   r  rS   r   rA  rb   rT   rR   r7  r7    s.     ;+;+;  9 9rT   r7  )
use_cubicsuse_quadraticsuse_arcssplit_full_arcsface	tolerancerB  rC  rD  rE  c          
   #      K   t        |       D ]?  }d }t        t        j                  |      |||||d      D ]  }|  |s6|dk7  s<d A y w)NTrG  rB  rC  rD  rE  with_first_moverH   )r3   r>   r    r   )rF  rG  rB  rC  rD  rE  r   rl   s           rR   r=   r=     sj       % #KK!)+ 
 		C I		 3&=Js   AAA
A)rB  rC  rD  rE  rJ  r   rJ  c             #     K   t        t        |             }t        j                  fdt	        |      D              E d {    t        t        j                  t        |             D ci c]  }t        |      | }	}t        |      t        |	      k  rZ|D ]  }|	j                  t        |              t        j                  fd|	j                         D              E d {    y y 7 c c}w 7 w)Nc              3   |   K   | ]3  \  }}t        t        j                  |      xr |d k(         5 yw)r   rI  Nr?   r    Edge)	rk   iedgerE  rG  rD  rB  rC  rJ  s	      rR   rn   z#wire_to_svg_path.<locals>.<genexpr>  sP      # At 	KK!)++6Q	
 	
#s   9<c           
   3   h   K   | ])  }t        t        j                  |      d        + yw)TrI  NrN  )rk   rQ  rE  rG  rD  rB  rC  s     rR   rn   z#wire_to_svg_path.<locals>.<genexpr>(  sC      '
  D!#%-! / $ '
ro   )r   r4   r   from_iterable	enumeraterj   r    rO  r3   hashr  popr   )
r   rG  rB  rC  rD  rE  rJ  ordered_edgesr   	all_edgess
    ``````   rR   r>   r>     s      t,-M"" # # !/#   $ &)od6K%LMa!MIM
=C	N* 	#AMM$q'"	# && '
 "((*'
 
 	
 	
	 +)$ N	
s1   ADC=)D6C?	A-D6D7D?DrQ  c                L    t        t        |       ||||||t        |             S )N)rG  rB  rC  rD  rE  rJ  reverse)r@   r.   r1   )rQ  rG  rB  rC  rD  rE  rJ  s          rR   r?   r?   6  s3     d%''D!	 	rT   )rB  rC  rD  rE  rJ  rZ  curve_or_adaptorrZ  c          	   #     K   t        |       \  }}	|	j                         }
	 |
t        j                  k(  r|	j	                  |	j                               }|	j	                  |	j                               }|r||}}|r#d|j                         |j                         f d|j                         |j                         f y |r|
t        j                  t        j                  fv r|
t        j                  k(  r3|	j                         }|j                         x}}|j                         }n@|	j                         }|j                         |j!                         }}|j                         }t#        |	||||||      E d {    y |s|rZt%        |	||rdnd      }|rt'        t)        |            }t+        |      D ]#  \  }}t-        |||xr |dk(  |      E d {    % y t/        t1        |	|	      ||	j3                         |
      E d {    y 7 7 :7 	# t4        $ rS}t6        j9                  d|
|       t/        t1        |	|	      ||	j3                         |
      E d {  7   Y d }~y d }~ww xY ww)NrC   rD   )rE  rJ  rZ     rr   )rG  
max_degreer   rC  rJ  rZ  )rG  rJ  r  rZ  zBfailed to convert %s curve, falling back to polyline approximation)exc_info)r*   GetTyper   GeomAbs_LineValueFirstParameterLastParameterXYGeomAbs_CircleGeomAbs_Ellipser  RadiusXAxisr  MajorRadiusMinorRadiusellipse_to_svg_pathr+   reversedr   rT  bezier_to_svg_pathpolyline_to_svg_pathr,   IsClosed	Exceptionr   error)r[  rG  rB  rC  rD  rE  rJ  rZ  _curveadaptor
curve_typep0p1circler1r2axisellipsebeziersrP  bezierr   s                         rR   r@   r@   L  sc     ((89OFG"JA
*777w5578Bw4467BRB24462446))rttvrttv%%*,,--)
 
 .=== ) --/)R||~!//+ ,,.0C0C0EB}}* / /   >&9jaG "4=1&w/ 	6-#1$3$>Q#	   ,!'Y? /'')	  1"  
P 	 	

 (g;+##%	
 	
 	

s   I;BH I;B?H HH I;AH HH $I;%+H HH I;H H H 	I8%AI3(I+)I3.I;3I88I;adaptor_curver|  r}  r~  c           	   #     K   | j                         }| j                         }|r||}}| j                  |      }	| j                  ||z   dz        }
| j                  |      }t        ddd      j	                  t        |
|	      t        |
|            }|j                         j                  t        ddd      t        ddd            }||z
  t        kD  rdnd}|dk  rdnd}|r#d|	j                         |	j                         f | j                         r|rQd||ddd|
j                         |
j                         f d||ddd|j                         |j                         f y d}| j                  |||z
  |z  z         }d||d	|z  dd|j                         |j                         f y d||t        |      |||j                         |j                         f y w)
Ng       @r   r%   rC   rG      gG?ih  )re  rf  rd  r   DotCross	DirectionAngleWithRefr   r   rg  rh  rs  r   )r  r|  r}  r~  rJ  rE  rZ  t0t1ry  pmrz  r   angle	large_arcsweep
almost_onepqs                     rR   ro  ro    s     
	%	%	'B		$	$	&BRB			R	 B			b2g_	-B			R	 Bq!Q  BB@ANN))&Aq/6!Q;KLE"Wr\qIQAAE24462446!!r2sAq"$$&"$$&88r2sAq"$$&"$$&88!J$$R27j*@%@ABr2sZ/ArttvrttvEE2r75>9eRTTVRTTVKKs   G"G$r_  r  c             #   H  K   | j                         }| j                  d      }|dk(  r| j                  d      }| j                  d      }| j                  d      }|r||||f\  }}}}|r#d|j                         |j                         f d|j                         |j                         |j                         |j                         |j                         |j                         f y |dk(  r| j                  d      }| j                  d      }|r|||}}}|rg|r#d|j                         |j                         f d|j                         |j                         |j                         |j                         f y t	        |j                         |j                         d      j                  t	        ||      j                  d	            }	t	        |j                         |j                         d      j                  t	        ||      j                  d	            }
|r#d|j                         |j                         f d|	j                         |	j                         |
j                         |
j                         |j                         |j                         f y |dk(  r`| j                  d      }|r||}}|r#d|j                         |j                         f d
|j                         |j                         f y t        d|  d      w)Nr%   r]  rr   r   rC   rF   rE   r   gUUUUUU?rD   zcould not convert z to SVG path)DegreePolerg  rh  r   Added
Multipliedr5  )r  rC  rJ  rZ  degreery  rz  p2p3p1bp2bs              rR   rq  rq    sa     ]]_F	QB{[[^[[^[[^R^NBBrttvrttv%%244624462446244624462446AA	1[[^[[^RBB24462446))rttvrttvrttvrttv55+11&R.2K2KE2RSC+11&R.2K2KE2RSC24462446))suuw#%%'24462446II	1[[^Brttvrttv%%24462446!! -fX\BCCs   L L"r`  pointsr  c             #      K   t        |       } | rh|rt        |       n| ^}}|r#d|j                         |j                         f |D ]%  }d|j                         |j                         f ' |rd y y y w)NrC   rD   rK  )r   rp  rg  rh  )r  rJ  r  rZ  firstotherspoints          rR   rr  rr    s~      &\F-4&)&uwwy%'')++ 	,Euwwy%'')++	, J  s   A7A9r   r   c                     y r[   rb   r   r   r   s      rR   r   r     s     <?rT   c                     y r[   rb   r  s      rR   r   r     s     ?BrT   c                    t        | |      }dt        fdt              r"fd|D        }t        ||j                        S fd|D        }t        ||j                        S )Nr  r   c                 6    | j                   }|j                  d uS r[   )r   r   )r   r   s     rR   r   z*wires_from_svg_document.<locals>.is_filled.  s    ||zz%%rT   c              3   l   K   | ]+  \  }}t        t        |             |       ||      f - y wr[   r   r  )rk   source_elementsource_parentsr   r   s      rR   rn   z*wires_from_svg_document.<locals>.<genexpr>3  sA      
 /	 +N;<.) @
s   14c              3   ^   K   | ]$  \  }}t        t        |             |      d f & y wr[   r  )rk   r  _source_parentsr   s      rR   rn   z*wires_from_svg_document.<locals>.<genexpr>=  s:      "
 0	 +N;<.)"
s   *-)find_shapes_svg_in_documentr}   callabler   r   )r   r   r   r   wires_with_metadatawires_without_metadatar   s    `    @rR   r   r   !  s|     +$5H&< &  !
 3;
 !!4h6F6FGG"
 4<"
 !!79I9IJJrT   .c                  	 	 ddt         j                  dt        t        df   dt        t        t
        t        t        df   f      f	fd	t         j                  j                  t        | t        t        j                  f      rt        |       n| d      	fd}t              rt        j                  d	d
       t!              \  }}j"                  x}rKt%        |j&                  |z  |j(                  z        }t%        |j*                  |z  |j,                  z        }nd}d}t/         |       t1        ||||            S )Nr   r   .rd   c              3      K   t        | t        j                        r| |f y t        | t        j                  t        j                  f      r g || }| D ]  } ||      E d {     y y 7 wr[   )r   r   r   GroupUse)r   r   new_parentschildwalk_svg_elements       rR   r  z5find_shapes_svg_in_document.<locals>.walk_svg_elementM  sy      g{0017""+"3"3[__!EF+7+G+K  @+E;???@ G @s   A$A2'A0(	A2gffffff9@)parse_display_noneppic               3     K          D ]  \  } }s	 | j                   d   }|dv r	 t        | t        j
                        rt        |       sD| |f Kt        | t        j                        sft	        j
                  |       }t        |      s|j                          | |f  y # t        t        f$ r Y w xY ww)N
visibility)hiddencollapse)	r   r   r   r   r   r  r  r   r  )r   r   r  rc   r   
parsed_svgr  s       rR   r   z-find_shapes_svg_in_document.<locals>.elementsa  s      0 < 	+GW$!(!=J!%;;  <
 ';#3#34w<!7**G[%6%67"''0t9JJL!7**#	+ !.1 s9   CB,'C!C2 CC,B>;C=B>>CzNposition of SVG document with only one of `width` or `height` may be incorrectr   rs   r   )rb   )r   
SVGElementr   r~   r	   r}   SVGparser   r   pathlibr  resolve_path$_possibly_problematic_svg_dimensionsrx   ry   _svg_dimensionsr   ra   r   r   r   r   r   r7   )
r   r   r   r   r   r   r   r   r  r  s
    `      @@rR   r  r  H  s5    OQ@''@27s8J2K@	%eM3,>&??@	A@ && (S',,$78 ", ' J+( ,J7\	

 $J/ME6$$$w$'))e#gmm34'))f$w~~56XZ1)EFFrT   c                     t        | t        j                        st        j                  |       } t        | j	                         j                               S r[   )r   r  r  r   
expanduserresolver   s    rR   r  r    s9    dGLL)||D!t ((*++rT   c                     t        | t        j                        r| S t        | t              st	        |       } 	 t        j                  t        |             S # t
        $ r t        d|       w xY w)Nzcould not make svg path from: )r   r   r  r   rB   rt  r5  r   s    rR   r:  r:    sj    $(()dC t$DD	** D9$BCCDs   A A/c              #      K   | j                         D ];  }|st        |d   t        j                        }t        j                  |      |f = y w)Nr  )as_subpathsr   r   r1  r  )rc   r<  	is_closeds      rR   r;  r;    sO      ##% 7"72;0A0ABI""7+Y667s
   A9Asvgc                 (   d| j                   v }d| j                   v }| j                  }|r,|r*t        | j                        t        | j                        fS |rF|rDt        | j                        t        |j                  | j                  z  |j                  z        fS |rF|rDt        |j                  | j                  z  |j                  z        t        | j                        fS |r*t        |j                        t        |j                        fS y)Nr   r   )r   r   )r   r   ra   r   r   )r  	has_width
has_heightboxs       rR   r  r    s    3::%ISZZ'J
++CZSYYszz!222	sSYYszzCII'=		'I!JJJ	SYY+cjj895;LLL	SYYszz!222rT   r  c                     | j                   }|y| j                  j                  d      }| j                  j                  d      }t        |      xr t	        |      j                  d       }t        |      xr t	        |      j                  d       }|xr0 | xr+ t        | j                        t        |j                        k7  xs4 |xr0 | xr+ t        | j                        t        |j                        k7  S )zy`svgelements` doesn't fully deduce dimensions in some cases
    where only one of `width` and `height` is specified.
    Fr   r   %)	r   r   getr   r   endswithra   r   r   )r  r   
attr_widthattr_heighthas_absolute_widthhas_absolute_heights         rR   r  r    s       G""&&w/J##''1Kj)O#j/2J2J32O.O{+RC4D4M4Mc4R0R 	<##	<*""#uW]]';;
 	 	>""	>*##$gnn(==rT   )rO   )TTF)wloggingr  rx   	itertoolsr   mathr   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   OCP.BRepAdaptorr   OCP.BRepBuilderAPIr   r   OCP.Geomr   OCP.GeomAbsr   OCP.GeomAdaptorr   OCP.gpr   r   r   r   r   r   OCP.StdFailr   
OCP.TopoDSr    r!   r"   r#   r$   ocpr&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   __all__r   r   	getLoggerr\   r   r   ra   r`   rA   rJ   r   rB   r{   r  r|   r   r   r}   r  r  r~   r   r7   r   r   rC   r   r6   r8   r9   r  r
  r:   r;   r<   r7  r=   r>   r?   r@   ro  rq  rr  r   r   r  r  r:  r;  r  r  r  rb   rT   rR   <module>r     s]	             - R % ) - D D ' R R    &" 
   &Aq/2 3 
		8	$	'#,u
$%	'#,u
$%	'#,ueU
23	'#,ueUE5
@A	'#,ueS#ue
CD	'#,F F BFM
>
"M19#MM	Xn- 	S 	3 	 sH^$<k>N>NNOY O%++i + !2!2KOO!CDy Dk;67
I 7j  CL  CL 
 #	2Cv-.2 2 	2
 xx/F G JKL2 uZ]+,2 
2 
 #	(Cv-.( ( 	(
 z"( 
( #OSg
Cv-.g
 g
 	g

 xx/F G JKLg
 U:q=124Ej4QQRg
T* *`;k ;h{.C ;0GL 0GXk5J 0Gf 
?k 
?h{.C 
?	k 	h{.C 	@ 
@ eH[)4/01@ F9 9"  
  	
    n:   1

1
 1
 	1

 1
 1
 1
 1
 n1
p   
  	
     n4   O
$O
 O
 	O

 O
 O
 O
 O
 O
 nO
n ! #L*,==>#L#L 	#L 	#L
 #L #L #L n#LR   1D1D 1D 	1D
 1D n1Dn !V  	
  n. 

 $	?Cv-.?h}.EFIJ? 	?
 uT+.a789? 
? 

 $	BCv-.BB 	B
 uT+.d:;<B 
B $	$KCv-.$Kxx7N(OQR(RST$K 	$K
 eD-tQ678eD-tT9:;=$KT $:GCv-.:G :G u\51C+DDEF	:Gz,uW\\3./ ,C ,D D1A1A D7


7eK$$d*+,7  [__ rT   