
    BPc+D                        d Z ddlmZ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mZ ddlmZ d	d
lmZ d	dlmZ  G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z  G d de           Z! G d de           Z"d S )!zR
Interface for all shapes/polygons such as lines, paths, rectangles, circles etc.
    )cospisin)OptionalTuple   )ArcCurveMovePath	ZoneClose)Line)	TransformImmutableVector2dVector2dpointdistance   )addNS)ShapeElementc                   z     e Zd ZdZd Ze fd            Zd Zd Ze	d             Z
e
j        d             Z
 xZS )PathElementBasez"Base element for path based shapesc                 F    t          |                     d                    S )Ndr   getselfs    :/usr/share/inkscape/extensions/inkex/elements/_polygons.py<lambda>zPathElementBase.<lambda>(   s    D#//     c                 T     t                      j        ddt          |          i|S )Nr    )supernewr   )clspathattrs	__class__s      r   r%   zPathElementBase.new*   s*    uww{11T$ZZ15111r!   c                 f    |                      dt          t          |                               dS )z1Set the given data as a path as the 'd' attributer   N)setstrr   r   r'   s     r   set_pathzPathElementBase.set_path.   s(    c$t**oo&&&&&r!   c                     d| j         v rH| j                            | j                  | _        |                     dt	                                 dS dS )z9Apply the internal transformation to this node and delete	transformN)attribr'   r0   r+   r   r   s    r   apply_transformzPathElementBase.apply_transform2   sN    $+%%	++DN;;DIHH[)++..... &%r!   c                 R    t          |                     d| j                            S )z>Returns the original path if this is a LPE, or the path if notinkscape:original-d)r   r   r'   r   s    r   original_pathzPathElementBase.original_path8   s#     DHH2DI>>???r!   c                     t          d          | j        v r2|                     dt          t	          |                               d S || _        d S )Nr4   )r   r1   r+   r,   r   r'   r-   s     r   r5   zPathElementBase.original_path=   sJ    &''4;66HH*CT

OO<<<<<DIIIr!   )__name__
__module____qualname____doc__get_pathclassmethodr%   r.   r2   propertyr5   setter__classcell__r)   s   @r   r   r   %   s        ,,//H2 2 2 2 [2' ' '/ / / @ @ X@       r!   r   c                       e Zd ZdZdZededededededed	ed
ee	         fd            Z
e	 dd            Zedeeef         dedeeef         deeef         dedefd            Ze	 	 	 	 	 dd            ZdS )PathElementz,Provide a useful extension for path elementsr'   cxcyrxrystartendarctypereturnc                    t          |          dk     st          |          dk     rdS ||z
  }|dk     r|dt          z  z  }t          dt          |dz  t          z            z   d          }||z  }t	                      }	|	                    t          t          |          t          |                               t          d|dz             D ]P}
|	                    t          dddddt          ||
|z  z             t          ||
|z  z                                  Qt          ||z  dt          z  z
            dk    r'|dv r#|	                    t          dd                     |d	k    r!|	                    t                                 |	                    t                                          | |                              ||          d
           |	                                S )zCompute the path for an arc defined by Inkscape-specific attributes.

        For details on arguments, see :func:`arc`.

        .. versionadded:: 1.2g:0yE>Nr   r   r   g       @   )slice arcT)inplace)absr   minintr   appendr   r   r   ranger	   PathLiner   r0   r   add_translate	add_scaleto_relative)rC   rD   rE   rF   rG   rH   rI   incrnumsegscomputedsegs              r   _arcpathzPathElement._arcpathJ   s    r77T>>SWWt^^4U{!88AFNDa#dSj2o...22g~66SZZU44555GaK(( 	 	COOAq!Q3usTz'9#:#:Cd
@R<S<STT    tg~B&''$..}$$OOHQNN+++eOOIKK(((KK%%b"--77B?? 	 	
 	
 	
 ##%%%r!   NrN   Fc                 \   fddD             } | di }|                     d|d                    |                     d|d                    |                     d|           |                     d|p|           |                     d	d
           |dk    r|                     d|           |D ]?\  }	}
|
8|                     d|	z   t          |
                                                     @|                     t	          |d                   t	          |d                   t	          |          t	          |p|          t	          |                    dd                    t	          |                    ddt          z                      |          }|r | di }|||_        |S )a  Generates a sodipodi elliptical arc (special type). Also computes the path
        that Inkscape uses under the hood.
        All data may be given as parseable strings or using numeric data types.

        Args:
            center (tuple-like): Coordinates of the star/polygon center as tuple or
                Vector2d
            rx (Union[float, str]): Radius in x direction
            ry (Union[float, str], optional): Radius in y direction. If not given,
                ry=rx. Defaults to None.
            arctype (str, optional): "arc", "chord" or "slice". Defaults to "", i.e.
                "slice".

                .. versionadded:: 1.2
                    Previously set to "arc" as fixed value
            pathonly (bool, optional): Whether to create the path without
                Inkscape-specific attributes. Defaults to False.

                .. versionadded:: 1.2
        Keyword args:
            start (Union[float, str]): start angle in radians
            end (Union[float, str]): end angle in radians
            open (str): whether the path should be open (true/false). Not used in
                Inkscape > 1.1

        Returns:
            PathElement : the created star/polygon
        c                 @    g | ]}|                     |d           fS N)pop).0namekws     r   
<listcomp>z#PathElement.arc.<locals>.<listcomp>   s,    RRR4d++,RRRr!   )rG   rH   opensodipodi:cxr   sodipodi:cyr   zsodipodi:rxzsodipodi:rysodipodi:typerO   rN   zsodipodi:arc-typeNz	sodipodi:zsodipodi:startzsodipodi:endr   r#   )r+   r,   lowerr^   floatr   r   r'   )r&   centerrE   rF   rI   pathonlyre   otherselemrd   valuer'   s         `     r   rO   zPathElement.arcr   s   @ SRRR9QRRRsyyRyyq	***q	***###b)))%(((b==HH('222! 	A 	AKD% t+SZZ-=-=-?-?@@@||&)&)"II"(OO$((+Q//00$((>1r62233
 
  	39999DDIr!   csidesrargrounded	flatsidedc                    
  fdd 
dt           f
fd}t                    dk     }t                      }|                    t	           dd                      t          d          D ]<}	sl|r'|                    t           d|	                      nC|                    t          g  |d|	d           |d|	d	           d|	          R             |r2|	dz
  k     r)|                    t           d|	dz                         |ssJ|                    t          g  |d|	d           |d|	dz   d	           d|	dz             R             |                    t          g  |d|	d           |d|	dz   d	           d|	dz             R             >|                    t                                 |	                                S )
zHelper method to generate the path for an Inkscape star/ polygon; randomized
        is ignored.

        For details on arguments, see :func:`star`.

        .. versionadded:: 1.2c                     |          dt           z  z  |z  z  z   }t           |          t          t          |          t          |                    z  z   S )Nr   )r   r   r   r   )pointindexcur_argru   rr   rt   rs   s      r   _star_get_xyz+PathElement._starpath.<locals>._star_get_xy   sP    %j1r6E>UU]#CCGQ<!E(Xc'llCLL-Q-Q"QQQr!   c                 ~    dt          ||           z  t          |j        | j        z
  |j        | j        z
            z  S )z;Returns a unit length vector at 90 deg from origin to otherr   )r   r   yx)originothers     r   
_rot90_relz)PathElement._starpath.<locals>._rot90_rel   sC     v../57VX-uw/ABBCr!   is_prevc           	         |z  } | |          }|dz
  z   z  }|dz   z  }r | |          n d| z
  | dk    r|n|          }r | |          n d| z
  | dk    r|n|          }d||z   z  } ||d ||          z  z             }	|	z  |rdt          ||          z  nt          ||          z  }
||
z   S )Nr   r   g      ?i r   )rz   r{   r   origprevinextiprevnextpmidrotretr   r}   rw   rv   rs   s              r   _star_get_curvepointz3PathElement._starpath.<locals>._star_get_curvepoint   sA   EME<u--DQY&%/EQY%'E MUE***!\!e)eqjjUUeLL  MUE***!\!e)eqjjUUeLL 
 &C*T3**S%2H2H)H#HIIC 4BtT2222&ud33  #:r!   g-C6?r   r   FT)
boolrQ   r   rT   r   rU   rV   r
   r   rY   )rr   rs   rt   ru   rv   rw   r   pointyresultir   r}   s   ``````    @@r   	_starpathzPathElement._starpath   s    	R 	R 	R 	R 	R 	R 	R 	R	 	 		 	 	 	 	 	 	 	 	 	 	< W$dLLA../000q%  	  	A 
 	MM(LLA,>,>"?@@@@MM 11!Q>>11!Q== *\!Q//      A!eai--hQA(>(>?@@@   MM 11!Q>>11!QUDAA *\!QU33      MM 11!Q>>11!QUDAA *\!QU33     	ikk"""!!###r!      r   r   r   c           
          |             }|                     d|d                    |                     d|d                    |                     d|d                    |                     d|d                    |                     d|d                    |                     d|d                    |                     d	|rt          |d
          nt          |d                     |                     d|           |                     dt          |                                                     |                     dd           |                     t          |d                   t          |d                   ft          |          t          |d                   t          |d                   ft          |d                   t          |d                   ft          |          |          }	|r
 |             }|	|	|_        |S )a  Generate a sodipodi star / polygon. Also computes the path that Inkscape uses
        under the hood. The arguments for center, radii, sides, rounded and args can be
        given as strings or as numeric data.

        .. versionadded:: 1.1

        Args:
            center (Tuple-like): Coordinates of the star/polygon center as tuple or
                Vector2d
            radii (tuple): Radii of the control points, i.e. their distances from the
                center. The control points are specified in polar coordinates. Only the
                first control point is used for polygons.
            sides (int, optional): Number of sides / tips of the polygon / star.
                Defaults to 5.
            rounded (int, optional): Controls the rounding radius of the polygon / star.
                For `rounded=0`, only straight lines are used. Defaults to 0.
            args (tuple, optional): Angle between horizontal axis and control points.
                Defaults to (0,0).

                .. versionadded:: 1.2
                    Previously fixed to (0.85, 1.3)
            flatsided (bool, optional): True for polygons, False for stars.
                Defaults to False.

                .. versionadded:: 1.2
            pathonly (bool, optional): Whether to create the path without
                Inkscape-specific attributes. Defaults to False.

                .. versionadded:: 1.2

        Returns:
            PathElement : the created star/polygon
        rh   r   ri   r   zsodipodi:r1zsodipodi:r2zsodipodi:arg1zsodipodi:arg2zsodipodi:sides   r   zinkscape:roundedzinkscape:flatsidedrj   star)r+   maxr,   rk   r   rl   rS   r'   )
r&   rm   radiirs   rv   argsrw   rn   rp   r'   s
             r   r   zPathElement.star  s   X suuq	***q	***a)))a)))$q'***$q'***!I#P3ua===3ua==QQQ#W---%s9~~';';'='=>>>&)))}}6!9uVAY//0JJ58__eE!Hoo.47^^U47^^,'NN
 
  	355DDIr!   )NrN   F)r   r   r   FF)r7   r8   r9   r:   tag_namestaticmethodrl   r,   r   r   r^   r<   rO   r   rS   r   r   r   r#   r!   r   rB   rB   E   sg       66H%&%&%& %& 	%&
 %& %& %& 
$%& %& %& \%&N 7<9 9 9 [9v _$_$_$ _$ 5%< 	_$
 _$ _$ _$ _$ \_$B 
 E E E [E E Er!   rB   c                   "    e Zd ZdZdZd Zd ZdS )Polylinez7Like a path, but made up of straight line segments onlypolylinec                 L    t          d|                     d          z             S )NMpointsr   r   s    r   r;   zPolyline.get_path^  s!    C$((8,,,---r!   c                     d t          |          j        D             }|                     dd                    |                     d S )Nc                 &    g | ]\  }}|d d|d S )g,r#   )rc   r   r   s      r   rf   z%Polyline.set_path.<locals>.<listcomp>b  s*    CCCTQQ...1...CCCr!   r    )r   
end_pointsr+   join)r   r'   r   s      r   r.   zPolyline.set_patha  sD    CCT$ZZ-BCCC388F++,,,,,r!   N)r7   r8   r9   r:   r   r;   r.   r#   r!   r   r   r   Y  s=        AAH. . .- - - - -r!   r   c                       e Zd ZdZdZd ZdS )PolygonzA closed polylinepolygonc                 R    t          d|                     d          z   dz             S )Nr   r   z Zr   r   s    r   r    zPolygon.<lambda>j  s$    Dtxx'9'9!9D!@AA r!   N)r7   r8   r9   r:   r   r;   r#   r!   r   r   r   f  s!        HAAHHHr!   r   c                        e Zd ZdZdZ ed           Z ed           Z ed           Z ed           Z	d Z
e fd            Z xZS )	r   z$A line segment connecting two pointslinec                 T    |                      |                     dd                    S )Nx1r   to_dimensionlessr   r   s    r   r    zLine.<lambda>q  "    t44TXXdA5F5FGG r!   c                 T    |                      |                     dd                    S )Ny1r   r   r   s    r   r    zLine.<lambda>r  r   r!   c                 T    |                      |                     dd                    S )Nx2r   r   r   s    r   r    zLine.<lambda>s  r   r!   c                 T    |                      |                     dd                    S )Ny2r   r   r   s    r   r    zLine.<lambda>t  r   r!   c           
      `    t          d| j         d| j         d| j         d| j                   S )Nr   r   z L)r   r   r   r   r   r   s    r   r    zLine.<lambda>u  s7    D!MTW!M!Mtw!M!M$'!M!MDG!M!MNN r!   c                     t          |          }t          |          } t                      j        d|j        |j        |j        |j        d|S )N)r   r   r   r   r#   )r   r$   r%   r   r   )r&   rG   rH   r(   r)   s       r   r%   zLine.neww  sH    smmuww{Oeg%'ceOOOOOr!   )r7   r8   r9   r:   r   r=   r   r   r   r   r;   r<   r%   r?   r@   s   @r   r   r   m  s        ..H	GG	H	HB	GG	H	HB	GG	H	HB	GG	H	HBNNHP P P P [P P P P Pr!   r   c                       e Zd ZdZ ed           Z ed           Z ed           Z ed           Z ed           Z	 ed           Z
 ed           Z ed	           Zd
 ZdS )RectangleBase1Provide a useful extension for rectangle elementsc                 T    |                      |                     dd                    S )Nr   0r   r   s    r   r    zRectangleBase.<lambda>  s"    !6!6txxS7I7I!J!J r!   c                 T    |                      |                     dd                    S )Nr   r   r   r   s    r   r    zRectangleBase.<lambda>  s"     5 5dhhsC6H6H I I r!   c                      | j         | j        z   S ra   )leftwidthr   s    r   r    zRectangleBase.<lambda>  s    $)dj"8 r!   c                      | j         | j        z   S ra   )topheightr   s    r   r    zRectangleBase.<lambda>  s    48dk#9 r!   c                 T    |                      |                     dd                    S )Nr   r   r   r   s    r   r    zRectangleBase.<lambda>  s"    $"7"7#8N8N"O"O r!   c                 T    |                      |                     dd                    S )Nr   r   r   r   s    r   r    zRectangleBase.<lambda>  s"    4#8#8(C9P9P#Q#Q r!   c           	      |    |                      |                     d|                     dd                              S )NrE   rF           r   r   s    r   r    zRectangleBase.<lambda>  0    T**488D$((4:M:M+N+NOO r!   c           	      |    |                      |                     d|                     dd                              S )NrF   rE   r   r   r   s    r   r    zRectangleBase.<lambda>  r   r!   c                    | j         rX| j         | j        }}| j        |z   | j        |z
  | j        |z   | j        |z
  g}d                    g d|d          d| j         d|d          d| j         d| j          d| j         d| j         d|d	          d| j         d|d
          d| j          d| j         d|d          d| j         d|d          d| j         d| j          d| j         d| j         d|d
          d| j         d|d	          d| j          d| j         d|d          d| j         d          S d| j         d| j         d| j         d| j         d| j          dS )z-Calculate the path as the box around the rectrN   zM r   r   zL r   z    A z 0 0 1 r   r   z  A z A z   A z zz hvh)	rE   rF   r   rightr   bottomr   r   r   )r   rE   rF   cptss       r   r;   zRectangleBase.get_path  s   7 	WdgBINDJOTX]DKRTDTUDF F F F F FT!W F F F Ftx F F F F!WF F F F#xF F F FWF F F F#wF F F F/3zF F F F<@GF F F F ZF F F F #'q'F F F F W	F F F F  $w	F F F F 04Aw	F F F F :>	F F F F
 !WF F F F
  ${F F F F WF F F F  $wF F F F 04yF F F F <@7F F F F YF F F F "&aF F F F WF F F F  $wF F F F 04AwF F F F :>F F F F F F
 WDIVVVVDJVVVV
{VVVVr!   N)r7   r8   r9   r:   r=   r   r   r   r   r   r   rE   rF   r;   r#   r!   r   r   r   ~  s        ;;8JJKKD
(II
J
JCH8899EX99::FHOOPPEXQQRRF	OO
 
B 
OO
 
BW W W W Wr!   r   c                   6     e Zd ZdZdZe fd            Z xZS )	Rectangler   rectc                 @     t                      j        d||||d|S )N)r   r   r   r   r#   )r$   r%   )r&   r   r   r   r   r(   r)   s         r   r%   zRectangle.new  s*    uww{NTSfNNNNNr!   )r7   r8   r9   r:   r   r<   r%   r?   r@   s   @r   r   r     sV        ;;HO O O O [O O O O Or!   r   c                   t     e Zd ZdZd Zed             Zej        d             Zd Ze	 fd            Z
 xZS )EllipseBasez1Absorbs common part of Circle and Ellipse classesc                     |                                  \  }}| j        j        | j        j        |z
  }}d                    ||||          S )z%Calculate the arc path of this circlezHM {cx},{y} a {rx},{ry} 0 1 0 {rx}, {ry} a {rx},{ry} 0 0 0 -{rx}, -{ry} z)rC   r   rE   rF   )_rxryrm   r   r   format)r   rE   rF   rC   r   s        r   r;   zEllipseBase.get_path  sJ    Bt{}r1A/ &B!r&
*
*		+r!   c           	          t          |                     |                     dd                    |                     |                     dd                              S )zReturn center of circle/ellipserC   r   rD   r   r   r   r   s    r   rm   zEllipseBase.center  T     !!!$((4"5"566!!$((4"5"566
 
 	
r!   c                     t          |          }|                     d|j                   |                     d|j                   d S )NrC   rD   )r   r+   r   r   r   rq   s     r   rm   zEllipseBase.center  s?    uwuwr!   c                     t                      )zHelper function)NotImplementedErrorr   s    r   r   zEllipseBase._rxry  s     "###r!   c                 V     t                      j        di |}||_        ||_        |S )Nr#   )r$   r%   rm   radius)r&   rm   r   r(   circler)   s        r   r%   zEllipseBase.new  s1    %%u%%r!   )r7   r8   r9   r:   r;   r=   rm   r>   r   r<   r%   r?   r@   s   @r   r   r     s        ;;+ + + 
 
 X
 ]    ] 
$ $ $
     [    r!   r   c                   X    e Zd ZdZdZedefd            Zej        d             Zd Z	dS )Circlez.Provide a useful extension for circle elementsr   rJ   c                 T    |                      |                     dd                    S )zReturn radius of circlert   r   r   r   s    r   r   zCircle.radius  s&     $$TXXc3%7%7888r!   c                 X    |                      d|                     |                     d S )Nrt   )r+   r   r   s     r   r   zCircle.radius  s*    d++E2233333r!   c                 0    | j         }t          ||          S ra   )r   r   )r   rt   s     r   r   zCircle._rxry  s    K1~~r!   N)
r7   r8   r9   r:   r   r=   rl   r   r>   r   r#   r!   r   r   r     sp        88H9 9 9 9 X9 ]4 4 ]4    r!   r   c                   X    e Zd ZdZdZedefd            Zej        d             Zd Z	dS )Ellipsez@Provide a similar extension to the Circle interface for ellipsesellipserJ   c           	          t          |                     |                     dd                    |                     |                     dd                              S )zReturn radii of ellipserE   r   rF   r   r   s    r   r   zEllipse.radius  r   r!   c                     t          |          }|                     dt          |j                             |                     dt          |j                             d S )NrE   rF   )r   r+   r,   r   r   r   s     r   r   zEllipse.radius  sK    s57||$$$s57||$$$$$r!   c                     | j         S ra   )r   r   s    r   r   zEllipse._rxry  s
    {r!   N)
r7   r8   r9   r:   r   r=   r   r   r>   r   r#   r!   r   r   r     sq        JJH
) 
 
 
 X
 ]% % ]%
    r!   r   N)#r:   mathr   r   r   typingr   r   pathsr	   r
   r   r   r   r   rV   
transformsr   r   r   bezierr   _utilsr   _baser   r   rB   r   r   r   r   r   r   r   r#   r!   r   <module>r      s  ,            " " " " " " " " 5 5 5 5 5 5 5 5 5 5 5 5 5 5 $ $ $ $ $ $ ? ? ? ? ? ? ? ? ? ? " " " " " "                l   @Q Q Q Q Q/ Q Q Qh
- 
- 
- 
- 
-| 
- 
- 
-B B B B Bl B B BP P P P P< P P P"!W !W !W !W !WL !W !W !WHO O O O O O O O% % % % %, % % %P    [   &    k     r!   