
    BPcP                         d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZ  G d d	          ZeZ G d
 d          Z G d de          ZdS )z,A Python path turtle for Inkscape extensions    N)ListUnion   )LineMovePathPathCommand)PathElementGroupBaseElement)Stylec                       e Zd ZdZddZdefdZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZeZeZeZe	Ze
ZeZdS )
PathTurtlezaA Python path turtle

    .. versionchanged:: 1.2
        pTurtle has been renamed to PathTurtle.r   r   c                     |d         |d         g| _         | j         d d          | _        d| _        d| _        d| _        d| _        d S )Nr   r   i T)_PathTurtle__home_PathTurtle__pos_PathTurtle__heading_PathTurtle__path_PathTurtle__draw_PathTurtle__new)selfhomes     ./usr/share/inkscape/extensions/inkex/turtle.py__init__zPathTurtle.__init__$   sG    AwQ([^



    magc           	         |                      | j        d         t          j        t          j        | j                            |z  z   | j        d         t          j        t          j        | j                            |z  z   f           dS )z4Move turtle forward by mag in the current direction.r   r   Nsetposr   mathcosradiansr   sinr   r   s     r   forwardzPathTurtle.forward,   y    
1dn)E)E F F LL
1dn)E)E F F LL	
 	
 	
 	
 	
r   c           	         |                      | j        d         t          j        t          j        | j                            |z  z
  | j        d         t          j        t          j        | j                            |z  z
  f           dS )z5Move turtle backward by mag in the current direction.r   r   Nr    r&   s     r   backwardzPathTurtle.backward5   r(   r   c                 &    | xj         |z  c_         dS )zRotate turtle right by deg degrees.

        Changed in inkex 1.2: The turtle now rotates right (previously left) when
            calling this method.Nr   r   degs     r   rightzPathTurtle.right>       
 	#r   c                 &    | xj         |z  c_         dS )zRotate turtle left by deg degrees.

        Changed in inkex 1.2: The turtle now rotates left (previously right) when
            calling this method.Nr,   r-   s     r   leftzPathTurtle.leftE   r0   r   c                 "    d| _         d| _        dS )z Enable non-drawing / moving modeFNr   r   r   s    r   penupzPathTurtle.penupL   s    


r   c                 0    | j         sd| _        d| _         dS )zEnable drawing modeTNr4   r5   s    r   pendownzPathTurtle.pendownQ   s    { 	DJr   c                 h    | j         r|                                  dS |                                  dS )z&Switch between drawing and moving modeN)r   r6   r8   r5   s    r   	pentogglezPathTurtle.pentoggleW   s.    ; 	JJLLLLLLLNNNNNr   c                 :    |                      | j                   dS )zMove to home positionN)r!   r   r5   s    r   r   zPathTurtle.home^   s    DK     r   c                     d| _         dS )zDelete current pathr   Nr   r5   s    r   cleanzPathTurtle.cleanb   s    r   c                 V    |                                   |                                  dS )z$Delete current path and move to homeN)r>   r   r5   s    r   clearzPathTurtle.clearf   s     

		r   c                    | j         r<| xj        dd                    d | j        D                       z   z  c_        d| _         || _        | j        r7| xj        dd                    d | j        D                       z   z  c_        dS dS )z5Move/draw to position, depending on the current stateM,c                 ,    g | ]}t          |          S  str.0is     r   
<listcomp>z%PathTurtle.setpos.<locals>.<listcomp>n       *F*F*Fa3q66*F*F*Fr   FLc                 ,    g | ]}t          |          S rE   rF   rH   s     r   rK   z%PathTurtle.setpos.<locals>.<listcomp>r   rL   r   N)r   r   joinr   r   r   args     r   r!   zPathTurtle.setposk   s    : 	KK3*F*F4:*F*F*F!G!GGGKKDJ
; 	HKK3*F*F4:*F*F*F!G!GGGKKKK	H 	Hr   c                      | j         dd         S )zReturns the current positionN)r   r5   s    r   getposzPathTurtle.getpost   s    z!!!}r   c                     || _         dS )zSet the heading to deg degreesNr,   r-   s     r   
setheadingzPathTurtle.setheadingx   s    r   c                     | j         S )zReturns the heading in degreesr,   r5   s    r   
getheadingzPathTurtle.getheading|   s
    ~r   c                 .    t          |          | _        dS )zSet home positionN)listr   rP   s     r   sethomezPathTurtle.sethome   s    3iir   c                     | j         S )zReturns the current pathr=   r5   s    r   getPathzPathTurtle.getPath   s
    {r   Fc                 v   ||k     rdS |                      |           t          j        dd          }|                     |           |                     |t          j        dd          z  ||           |                     |           t          j        dd          }|                     |           |                     |t          j        dd          z  ||           |                     |           |r|                                  |                     |           |r|                                  dS dS )zGenerates a random treeN   (   g      ?g?)	fdrandomuniformrtrtreeltpubkpd)r   sizeminimumptturns        r   rd   zPathTurtle.rtree   s   '>>F~b"%%

4&.c222GR@@@~b"%%

4&.c222GR@@@ 	GGIII 	GGIIIII	 	r   N)r   )F)__name__
__module____qualname____doc__r   floatr'   r*   r/   r2   r6   r8   r:   r   r>   r@   r!   rS   rU   rW   rZ   r\   rd   r`   rg   rc   re   rf   rh   rE   r   r   r   r      s_       3 3
   
5 
 
 
 

 
 
      
    ! ! !    
H H H                ( 
B	B	B	B	B	BBBr   r   c                   d    e Zd ZdZdefdZdeeee         f         fdZ	d Z
defdZd	 Zd
 ZdS )PathBuilderzoThis helper class can be used to construct a path and insert it into a
    document.

    .. versionadded:: 1.2stylec                 :    t                      | _        || _        dS )ziInitializes a PathDrawHelper object

        Args:
            style (Style): Style of the path.
        N)r   currentrt   )r   rt   s     r   r   zPathBuilder.__init__   s     vv


r   commandc                 :    | j                             |           dS )zAdd a Path command to the Helper

        Args:
            command (Union[PathCommand, List[PathCommand]]): A (list of) PathCommand(s)
                to be appended.
        N)rv   append)r   rw   s     r   addzPathBuilder.add   s      	G$$$$$r   c                     dS )zwTerminates current subpath. This method does nothing by default and is
        supposed to be overridden in subclasses.NrE   r5   s    r   	terminatezPathBuilder.terminate   s      r   sibling_beforec                 |    t                      }| j        |_        | j        |_        |                    |           dS )zInsert the resulting Path as :class:`inkex.elements._polygons.PathElement`
        into the document tree.

        Args:
            sibling_before (BaseElement): The element the resulting path will be
                appended after.
        N)r
   rv   pathrt   addnext)r   r}   pths      r   append_nextzPathBuilder.append_next   s9     mm<J	s#####r   c                 L    |                      t          ||                     dS )zShorthand to insert an absolute move command: `M x y`.

        Args:
            x (Float): x coordinate to move to
            y (Float): y coordinate to move to
        N)rz   r   r   xys      r   Move_tozPathBuilder.Move_to   $     	ar   c                 L    |                      t          ||                     dS )zShorthand to insert an absolute lineto command: `L x y`.

        Args:
            x (Float): x coordinate to draw a line to
            y (Float): y coordinate to draw a line to
        N)rz   r   r   s      r   Line_tozPathBuilder.Line_to   r   r   N)rm   rn   ro   rp   r   r   r   r	   r   rz   r|   r   r   r   r   rE   r   r   rs   rs      s         
e    %5d;.?!?@ % % % %4 4 4$+ $ $ $ $      r   rs   c                   4     e Zd ZdZ fdZd ZdefdZ xZS )PathGroupBuilderzxThis helper class can be used to construct a group of paths that all have the
    same style.

    .. versionadded:: 1.2c                 p    t                                          |           t                      | _        d S )N)superr   r   result)r   rt   	__class__s     r   r   zPathGroupBuilder.__init__   s*    ggr   c                     t          | j                  dk    rRt                      }| j                                        |_        | j        |_        | j                            |           t                      | _        dS )zTTerminates the current Path, and appends it to the group if it is not
        empty.r   N)	lenrv   r
   to_absoluter   rt   r   ry   r   )r   r   s     r   r|   zPathGroupBuilder.terminate   se     t|q  --C|//11CH
CIKs###vvr   r}   c                 :    |                     | j                   dS )zInsert the resulting Path as :class:`inkex.elements._groups.Group` into the
            document tree.

        Args:
            sibling_before (BaseElement): The element the resulting group will be
                appended after.
        N)r   r   )r   r}   s     r   r   zPathGroupBuilder.append_next   s      	t{+++++r   )	rm   rn   ro   rp   r   r|   r   r   __classcell__)r   s   @r   r   r      sl         
      ,+ , , , , , , , ,r   r   )rp   r"   ra   typingr   r   pathsr   r   r   r	   elementsr
   r   r   stylesr   r   pTurtlers   r   rE   r   r   <module>r      s   & 3 2           0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5      C C C C C C C CL 9 9 9 9 9 9 9 9x, , , , ,{ , , , , ,r   