o
    Rŀg                    @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ G dd deZdS )z(CircularDrawer module for GenomeDiagram.    )cos)pi)sin)ArcPath)Circle)Drawing)Group)Line)Polygon)String)colors   )_stroke_and_fill_colors)AbstractDrawer)draw_polygon)intermediate_points)
FeatureSet)GraphSetc                   @   s(  e Zd ZdZ																	dBd
dZdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Z		dCd.d/Z	0dDd1d2Z		0dEd3d4Z		5dFd6d7Zd8d9 Zd:d; Z		<	5	=	dGd>d?Z	dHd@dAZdS )ICircularDrawera  Object for drawing circular diagrams.

    Attributes:
     - tracklines    Boolean for whether to draw lines dilineating tracks
     - pagesize      Tuple describing the size of the page in pixels
     - x0            Float X co-ord for leftmost point of drawable area
     - xlim          Float X co-ord for rightmost point of drawable area
     - y0            Float Y co-ord for lowest point of drawable area
     - ylim          Float Y co-ord for topmost point of drawable area
     - pagewidth     Float pixel width of drawable area
     - pageheight    Float pixel height of drawable area
     - xcenter       Float X co-ord of center of drawable area
     - ycenter       Float Y co-ord of center of drawable area
     - start         Int, base to start drawing from
     - end           Int, base to stop drawing at
     - length        Size of sequence to be drawn
     - track_size    Float (0->1) the proportion of the track height to draw in
     - drawing       Drawing canvas
     - drawn_tracks  List of ints denoting which tracks are to be drawn
     - current_track_level   Int denoting which track is currently being drawn
     - track_offsets     Dictionary of number of pixels that each track top,
       center and bottom is offset from the base of a fragment, keyed by track
     - sweep     Float (0->1) the proportion of the circle circumference to
       use for the diagram
     - cross_track_links List of tuples each with four entries (track A,
       feature A, track B, feature B) to be linked.

    NA3	landscape皙?r         ?r           c                 C   sH   t | |||||||||	|
||| || _|| _|sd| _dS d| _dS )a  Create CircularDrawer object.

        Arguments:
         - parent    Diagram object containing the data that the drawer
           draws
         - pagesize  String describing the ISO size of the image, or a tuple
           of pixels
         - orientation   String describing the required orientation of the
           final drawing ('landscape' or 'portrait')
         - x         Float (0->1) describing the relative size of the X
           margins to the page
         - y         Float (0->1) describing the relative size of the Y
           margins to the page
         - xl        Float (0->1) describing the relative size of the left X
           margin to the page (overrides x)
         - xl        Float (0->1) describing the relative size of the left X
           margin to the page (overrides x)
         - xr        Float (0->1) describing the relative size of the right X
           margin to the page (overrides x)
         - yt        Float (0->1) describing the relative size of the top Y
           margin to the page (overrides y)
         - yb        Float (0->1) describing the relative size of the lower Y
           margin to the page (overrides y)
         - start     Int, the position to begin drawing the diagram at
         - end       Int, the position to stop drawing the diagram at
         - tracklines    Boolean flag to show (or not) lines delineating tracks
           on the diagram
         - track_size    The proportion of the available track height that
           should be taken up in drawing
         - circular      Boolean flaw to show whether the passed sequence is
           circular or not
         - circle_core   The proportion of the available radius to leave
           empty at the center of a circular diagram (0 to 1).
         - cross_track_links List of tuples each with four entries (track A,
           feature A, track B, feature B) to be linked.

        g?      ?N)r   __init__
track_sizecircle_coresweep)selfparentpagesizeorientationxyxlxrytybstartend
tracklinesr   circularr   cross_track_links r.   ^/var/www/html/myenv/lib/python3.10/site-packages/Bio/Graphics/GenomeDiagram/_CircularDrawer.pyr   C   s*   9

zCircularDrawer.__init__c              	   C   s&  t t | jd}t| j}d}i }d}t||d D ]&}z| j| j}W n ty/   d}Y nw ||7 }||| f||< ||7 }qdt | j| j }|d| j	  | }	|| j	 }
i | _
|	d| j  d }|D ]*}|| d |	 | |
 }|| d |	 | |
 }||| d  }|||f| j
|< qfdS )zInitialize track heights.

        Since tracks may not be of identical heights, the bottom and top
        radius for each track is stored in a dictionary - self.track_radii,
        keyed by track number
        r   r         ?       @N)mindrawn_tracksmaxrange_parentheight	Exception	pagewidth
pageheightr   track_radiir   )r   	bot_track	top_tracktrackunit_sum
trackunitsheightholdertracktrackheight
max_radiustrackunit_height
track_core
track_croptopbtmctrr.   r.   r/   set_track_heights   s4   


z CircularDrawer.set_track_heightsc                    sF  t  jd  jd  _g }g }g }g }g }g } j  _    j D ]@}| _ j| } |\}	}
|	|	 |	|
  
|\}}|	| |	| |jrg |\}}|	| |	| q'g } jD ]} |}|r{|	| qm|||||||g}|D ]}|D ]} fdd|D  qq jr   dS dS )z+Draw a circular diagram of the stored data.r   r   c                    s   g | ]} j |qS r.   )drawingadd).0elementr   r.   r/   
<listcomp>   s    z'CircularDrawer.draw.<locals>.<listcomp>N)r   r!   rK   r6   get_drawn_levelsr3   rJ   current_track_leveldraw_greytrackappend
draw_trackscale
draw_scaler-   draw_cross_linkr+   draw_test_tracks)r   feature_elementsfeature_labelsgreytrack_bgsgreytrack_labels
scale_axesscale_labelstrack_levelrA   gbgsglabelsfeaturesflabelsaxesslabelsfeature_cross_linkscross_link_objcross_link_elementselement_groupselement_groupelement_listr.   rO   r/   draw   sX   









	zCircularDrawer.drawc                 C   sP   g }g }t | jt| ji}| D ]}||j |\}}||7 }||7 }q||fS )z7Return list of track elements and list of track labels.)r   draw_feature_setr   draw_graph_setget_sets	__class__)r   rA   track_elementstrack_labelsset_methodssetelementslabelsr.   r.   r/   rU      s   
zCircularDrawer.draw_trackc                 C   sT   g }g }|  D ]}| |js| |jr%| |\}}||7 }||7 }q||fS )<Return list of feature elements and list of labels for them.)get_featuresis_in_boundsr)   r*   draw_feature)r   ru   rZ   label_elementsfeaturerc   rw   r.   r.   r/   rn     s   zCircularDrawer.draw_feature_setc           
      C   s   g }g }|j r||fS |  \}}|jD ]/\}}||k rqt||}||k r'qt||}| |||\}}	|| |	durC||	 q||fS )rx   N)hide_current_track_start_end	locationsr4   r2   get_feature_sigilrT   )
r   r}   rZ   r|   r)   r*   locstartlocendfeature_sigillabelr.   r.   r/   r{     s$   



zCircularDrawer.draw_featurec                 K   s  | j | j \}}}| |\}}	}
| |\}}}| || d \}}}| j| j| j| j| jd}||j }|j	|d< |j
|d< t|drP|j|d< |j|d< |||||||jjf|j|jd|}|jrFtd	d	d
|j  d
|j|j|jd}t|}|jr|j}n|jj}|jdv r|dkr|dt  }|
|	}}nY|dt  }||}}nM|jdv r|dt  }||}}n<|jdv r|dkr|dt  }||}}n'|dt  }|
|	}}n|tk r|dt  }||}}n|dt  }|
|	}}|dkr|}|tk r
|t8 }nd|jd	 _n|}|tk r"|t8 }d|jd	 _| j||  }| j||  }t |}t!|}|| ||||f|_"||fS d}||fS )zReturn graphics for feature, and any required label for it.

        Arguments:
         - feature       Feature object
         - locstart      The start position of the feature
         - locend        The end position of the feature

           )BOXOCTOJAGGYARROWBIGARROWhead_length_ratioshaft_height_ratiourlhrefURL	hrefTitle)colorborderr    fontNamefontSize	fillColor)r)   z5'leftr0   )middlecentercentre)r*   z3'rightr*   N)#r;   rR   canvas_angle_draw_sigil_box_draw_sigil_cut_corner_box_draw_sigil_jaggy_draw_sigil_arrow_draw_sigil_big_arrowsigilarrowhead_lengtharrowshaft_heighthasattrr   namelocationstrandr   r   r   r   strip
label_font
label_sizelabel_colorr   label_strandlabel_positionr   contents
textAnchorxcenterycenterr   r   	transform)r   r}   r   r   kwargsrH   rI   rG   
startanglestartcosstartsinendangleendcosendsinmidanglemidcosmidsindraw_methodsmethodr   r   
labelgroupr   label_anglesinvalcosvalradiusx_posy_poscoslabelsinlabelr.   r.   r/   r   0  s   

	




	







z CircularDrawer.get_feature_sigilc                 C   sT  |j }|j}|j}|j}| |s| |sdS | |s$| |s$dS || jk r,| j}|| jk r4| j}| j|k r<| j}| j|k rD| j}|t| j	j
 }|t| j	j
 }|dus`J |dusfJ ||krlt|jdur~||jk rxdS t||j}|jdur|j|k rdS t||j}|jdur||jk rdS t||j}|jdur|j|k rdS t||j}| j	 D ]}| j	| }	|	|kr|}
|	|kr|}q|
|krt| |\}}}| |\}}}| |\}}}| |\}}}| j|
 \}}}| j| \}}}||k r| |||||||j|j|j	gS | |||||||j|j|j	gS )z#Draw a cross-link between features.N)startAstartBendAendBrz   r)   r*   _trackAlistr6   tracksvalues_trackBNotImplementedErrorr4   r2   rQ   r   r;   _draw_arc_polyr   r   flip)r   
cross_linkr   r   r   r   	trackobjA	trackobjBr`   rA   trackAtrackBstartangleA	startcosA	startsinAstartangleB	startcosB	startsinB	endangleAendcosAendsinA	endangleBendcosBendsinBbtmActrAtopAbtmBctrBtopBr.   r.   r/   rX     s   













zCircularDrawer.draw_cross_linkc                 C   s>   g }| j | j| jd}| D ]}|||j |7 }q|g fS )zzReturn list of graph elements and list of their labels.

        Arguments:
         - set       GraphSet object

        )lineheatbar)draw_line_graphdraw_heat_graphdraw_bar_graph
get_graphsstyle)r   ru   rv   style_methodsgraphr.   r.   r/   ro     s   zCircularDrawer.draw_graph_setc                 C   sf  g }|  }|d |d }}| j| j \}}}d||  }	|| }
|
dkr(|	}
|  \}}||| }|s8g S |jdu rD|| d }n|j}t|| || }|d \}}| |\}}}|	||  | | }| j||  }| j||  }|D ]8\}}| |\}}}|	||  | | }| j||  }| j||  }|	t
|||||j|jd ||}}qx|S )zsReturn line graph as list of drawable elements.

        Arguments:
         - graph     GraphData object

        r      r0   Nr1   )strokeColorstrokeWidth)	quartilesr;   rR   r   r   r4   r   r   r   rT   r	   poscolor	linewidth)r   r   line_elementsdata_quartilesminvalmaxvalrH   rI   rG   rB   	dataranger)   r*   datamidval
resolutionposval	lastanglelastcoslastsin	posheightlastxlastyposangleposcospossinr#   r$   r.   r.   r/   r   "  sL   

zCircularDrawer.draw_line_graphc              
   C   s:  g }|  }|d |d }}| j| j \}}}d||  }	|| }
|
dkr(|	}
|| j| j }|jdu r<|| d }n|j}|  \}}t||||| }|sSg S t|| || }|dkrb|	}|D ]6\}}}| 	|\}}}| 	|\}}}|	||  | }|dkr|j
}n|j}|| ||| ||| qd|S )zqReturn list of drawable elements for a bar graph.

        Arguments:
         - graph     Graph object

        r   r   r0   Nr1   )r   r;   rR   r)   r*   r   r   r   r4   r   r   negcolorrT   	_draw_arc)r   r   bar_elementsr   r   r  rH   rI   rG   rB   r  r  r  r)   r*   r  pos0pos1r  	pos0anglepos0cospos0sin	pos1anglepos1cospos1sinbarvalbarcolorr.   r.   r/   r   ^  s<   
zCircularDrawer.draw_bar_graphc                 C   s   g }|  }|d |d }}|| d }| j| j \}}}	|	| }
|  \}}t||||| }|D ].\}}}| |\}}}| |\}}}t|j|j	|||}|
| j||	||||d q4|S )ztReturn list of drawable elements for the heat graph.

        Arguments:
         - graph     Graph object

        r   r   r1   )r   )r   r;   rR   r   r   r   r   linearlyInterpolatedColorr   r  rT   r  )r   r   heat_elementsr   r   r  r  rH   rI   rG   rB   r)   r*   r  r  r  r  r  r  r  r  r  r  r   r.   r.   r/   r     s$   zCircularDrawer.draw_heat_graphc           /      C   s  g }g }|j sg g fS | j| j \}}}|| }|  \}}	|jdus(|jdurt|jdd}
| |\}}}| |	\}}}|
	| j
| j|d|d t  d|d t   ||
 ~
| j
||  | j||  }}| j
||  | j||  }}|t|||||jd | j
||  | j||  }}| j
||  | j||  }}|t|||||jd n| jdk r1t|jdd}
|
j	| j
| j|dd| j  dd ||
 ~
| j
| j| }}| j
| j| }}|t|||||jd d	t | j }| j
|t|  | j|t|  }}| j
|t|  | j|t|  }}|t|||||jd n|t| j
| j||jdd |  \}}	|jr|j| }t|j}t|| j|  t| j|D ]*}||ksn|	|krpqb| |||||j\}}|| |dur|| qb|j| }t|j}t|| j|  t| j|D ]*}||ks|	|krq| |||||j\}}|| |dur|| q| |\}}}| |	\}}}|jr| D ]}|jt u rtd
D ]}|d }||k s||k rqt|t|}}| j
||  | j||  }}| j
||  | j||  }}|t|||||jd g } g }!g }"|! D ]`}#|#" }$|$d |$d }%}&|#j#du rw|&|% d }'| |%d |!|&d |"|'d qEt$|#j#|% |&|#j# }(|#j#|( }%|#j#|( }&|#j#}'|"|'d | |%d |!|&d qE|| d || d })}*| ||f|!||f|"|)|*ffD ],\}+},}-t%ddd&|+|j'|j(|jd}d|_)t*|}.|| |||,|-f|._+||. qqq||fS )z~Return list of elements in the scale and list of their labels.

        Arguments:
         - track     Track object

        Nr   r   Z      r   r   ih  )startangledegreesendangledegreesr      ges-8R?r   r   r1   z.3f;r   r   ),rV   r;   rR   r   r)   r*   r   scale_colorr   addArcr   r   r   rT   r	   r   r   r   r   scale_ticksscale_largeticksintscale_largetick_intervalr5   	draw_tickscale_largetick_labelsscale_smallticksscale_smalltick_intervalscale_smalltick_labelsaxis_labelsrp   rq   r   r   r   r   r4   r   join
scale_fontscale_fontsizer   r   r   )/r   rA   scale_elementsr_   rH   rI   rG   rB   r)   r*   pr   r   r   r   r   r   x0y0x1y1alphaticklentickitervaltickpostickr   ru   nangleticksintickcosgraph_label_mingraph_label_maxgraph_label_midr   r   r   r  r  diffxmidymidlimitr#   r$   r   r.   r.   r/   rW     s(  

&&












zCircularDrawer.draw_scalec                 C   s  |  |\}}}| j||  | j||  }	}
| j|| |  | j|| |  }}t|	|
|||jd}|r|jdkrZ|dkrHt|d d }n|dkrUt|d d }n	t|}nt|}tdd||j|j	|jd}|t
krrd	|_t|}d
ddd
||f|_||fS d}||fS )an  Return drawing element for a tick on the scale.

        Arguments:
         - tickpos   Int, position of the tick on the sequence
         - ctr       Float, Y co-ord of the center of the track
         - ticklen   How long to draw the tick
         - track     Track, the track the tick is drawn on
         - draw_label    Boolean, write the tick label?

        r#  SInti@B z Mbpi  z Kbpr   r   r*   r   N)r   r   r   r	   r(  scale_formatstrr   r5  r6  r   r   r   r   )r   r@  rI   r>  rA   
draw_label	tickanglerE  rD  r9  r:  r;  r<  rA  
tickstringr   r   r.   r.   r/   r.    s:   	

zCircularDrawer.draw_tickc              
   C   s   | j D ]:}| j| \}}}| jt| j| j|tjdd | jt| j| j|tj	dd | jt| j| j|tjdd qdS )z8Draw blue test tracks with grene line down their center.Nr   )
r3   r;   rK   rL   r   r   r   r   bluegreen)r   rA   rH   rI   rG   r.   r.   r/   rY     s<   
		zCircularDrawer.draw_test_tracksc                 C   s  g }g }|j sg g fS | j| j \}}}|  \}}| |\}	}
}| |\}}}|jdus4|jdurMt|jdd}|	| 
|||	|tddd n2| jdk ri|	| 
||ddt | j tddd n|	t| j| j|tdddd|| d |jr| j|j }t| j| j|D ]r}tdd|j|j|j|jd}| |\}}}||	k s||k rq| j||  | j||  }}t|}| jd t || j  | j td  }|tkrd	|_|t7 }t|t|}}|| ||||f|_| j| |ks|	| q||fS )
z;Drawing element for grey background to passed Track object.Nr   gQ?r   r   r   )r   r   r   r   r*   )	greytrackr;   rR   r   r   r)   r*   r   r(  rT   r  r   Colorr   r   r   r   r   r]   lengthr5   r   r   greytrack_fontgreytrack_fontsizegreytrack_fontcolorr   r   r   r   r   )r   rA   r\   r]   rH   rI   rG   r)   r*   r   r   r   r   r   r   r8  	labelstepr  r   thetacosthetasinthetar#   r$   r   
labelanglecosAsinAr.   r.   r/   rS     sx   
$
zCircularDrawer.draw_greytrackc                 C   s0   | j d t || j  | j }|t|t|fS )z@Given base-pair position, return (angle, cosine, sin) (PRIVATE).r   )r   r   r)   rW  r   r   )r   baserC  r.   r.   r/   r   ,  s   zCircularDrawer.canvas_anglec           
      K   sD   |dkr	|}|}	n|dkr|}|}	n|}|}	| j ||	||fi |S )zDraw BOX sigil (PRIVATE).r   r   )r  )
r   bottomr   rG   r   r   r   r   inner_radiusouter_radiusr.   r.   r/   r   1  s   zCircularDrawer._draw_sigil_boxc                 K   sf  |dur|}t ||\}	}t|| dkrTt|	|dd}
|
j| j| j|d|d t  d|d t  dd |
j| j| j|d|d t  d|d t  dd	 |
  |
S t|t	|}}t|t	|}}| j| j}}|||  |||  }}|||  |||  }}|||  |||  }}|||  |||  }}t
||f||f||f||fg||S )
a  Return closed path describing an arc box (PRIVATE).

        Arguments:
         - inner_radius  Float distance of inside of arc from drawing center
         - outer_radius  Float distance of outside of arc from drawing center
         - startangle    Float angle subtended by start of arc at drawing center
           (in radians)
         - endangle      Float angle subtended by end of arc at drawing center
           (in radians)
         - color        colors.Color object for arc (overridden by backwards
           compatible argument with UK spelling, colour).

        Returns a closed path object describing an arced box corresponding to
        the passed values.  For very small angles, a simple four sided
        polygon is used.
        N{Gz?r   )r   r   strokewidthr!  r"  TmoveToreverse)r   absr   r)  r   r   r   	closePathr   r   r   )r   rd  re  r   r   r   r   colourr   strokecolorr8  r   r   r   r   r9  r:  r;  r<  x2y2x3y3x4y4r.   r.   r/   r  B  s>   $zCircularDrawer._draw_arcFc                 C   s  | j | j}}|| }	|| }
d}|t d }|r,|||t|  ||t|   n|||t|  ||t|   |}dt|krt|dk rt|||	  }|||
  t d }|||t|  ||t|   ||7 }|dk sJ|t d }|||t|  ||t|   dS )zAdd a list of points to a path object (PRIVATE).

        Assumes angles given are in degrees!

        Represents what would be a straight line on a linear diagram.
        rf  r"  r   N)r   r   r   ri  r   r   lineTorl  )r   pathstart_radius
end_radiusstart_angle	end_anglemover9  r:  radius_diff
angle_diffdxar#   rr.   r.   r/   _draw_arc_line  s&   	&$$(zCircularDrawer._draw_arc_linec
           #   	   K   s"  t ||\}}| j| j}}t|| dks.t|| dks.t|| dks.t|| dkrt||ddd}d|d t  }d|d t  }d|d t  }d|d t  }|j|||||ddd |	r| ||||| |j|||||dd	 | ||||| n| ||||| |j|||||d
d	 | ||||| |  |S t	|t
|}}t	|t
|}}t	|t
|}}t	|t
|}}|||  |||  }}|||  |||  }}|||  |||  }} |||  |||  }!}"t||f||f|| f|!|"fg||ddS )z&Return polygon path describing an arc.rf  r   r   r   r   strokeLineJoinrg  r!  r"  Tri  rk  rj  F)r  )r   r   r   rl  r   r   r)  r  rm  r   r   r   )#r   rd  re  inner_startangleinner_endangleouter_startangleouter_endangler   r   r   r   ro  r9  r:  r8  i_starti_endo_starto_endinner_startcosinner_startsininner_endcosinner_endsinouter_startcosouter_startsinouter_endcosouter_endsinr;  r<  rp  rq  rr  rs  rt  ru  r.   r.   r/   r     sh   







zCircularDrawer._draw_arc_polyr0   c
                 K   s  |dkr	|}|}n|dkr|}|}n|}|}t ||\}}t||t||}}|| }d||  }|| }td| d| |	 }|| }|| }tdtt|d |	 | t|d }|dk re|d9 }t|t|}}t|t|}}| j| j}}td||ddd|
}|j	| j| j|d|| d t
  d|| d t
  d	d
 ||||  |||   ||||  |||   |j	| j| j|d|| d t
  d|| d t
  d	d ||||  |||   ||||  |||   |  |S )z4Draw OCTO sigil, box with corners cut off (PRIVATE).r   r   r0   r   r   r  r!  r"  Trh  rj  Nr.   )r   r2   r4   rl  r   r   r   r   r   r)  r   rv  rm  )r   rc  r   rG   r   r   r   r   r   cornerr   rd  re  ro  rC  middle_radius	boxheight
corner_lenshaft_inner_radiusshaft_outer_radiuscornerangle_deltar   r   r   r   r9  r:  r8  r.   r.   r/   r      sl   "
	z)CircularDrawer._draw_sigil_cut_corner_boxc                 K   sT   |dkr|}|}	d}
n|dkr|}|}	d}
n|}|}	d}
| j ||	||fd|
i|S )zDraw ARROW sigil (PRIVATE).r   r   r   r   r"   _draw_arc_arrow)r   rc  r   rG   r   r   r   r   rd  re  r"   r.   r.   r/   r   Q  s*   z CircularDrawer._draw_sigil_arrowc           	      K   s.   |dkrd}nd}| j ||||fd|i|S )zADraw BIGARROW sigil, like ARROW but straddles the axis (PRIVATE).r   r   r   r"   r  )	r   rc  r   rG   r   r   r   r   r"   r.   r.   r/   r   j  s   z$CircularDrawer._draw_sigil_big_arrow皙?r   c           $   	   K   s  |
dur|
}t ||\}}t||t||}}|	dkr(|	dkr(td|	d|| }d||  }|| }|| }|d|  }|d|  }tdtt|| | t|}|dk r^|d	9 }|	dkrg|| }n|| }||krxtt|||}ntt|||}||  kr|ksn ||  kr|ksn td
||||f t|t|}}t|t|}}t|t|}}| j| j	}}dt|kr7t|t|kr7|	dkr|||  |||  }}|||  |||  }} |||  |||  }!}"n'|||  |||  }}|||  |||  }} |||  |||  }!}"t
|||| |!|"g|p1||dddS |	dkrtd||ddd|}#|#j| j| j	|d|d t  d|d t  dd |#j| j| j	|d|d t  d|d t  dd t|dk r|#|||  |||   |#|||  |||   |#|||  |||   n*| |#||d|d t  d|d t   | |#||d|d t  d|d t   |#  |#S td||ddd|}#|#j| j| j	|d|d t  d|d t  ddd |#j| j| j	|d|d t  d|d t  dd t|dk rM|#|||  |||   |#|||  |||   |#|||  |||   n*| |#||d|d t  d|d t   | |#||d|d t  d|d t   |#  |#S )z%Draw an arrow along an arc (PRIVATE).Nr   r   zInvalid orientation z, should be 'left' or 'right'r0   r   r   r   zcProblem drawing arrow, invalid positions. Start angle: %s, Head angle: %s, End angle: %s, Angle: %sr   r  r!  r"  Trh  rj  r  Fr.   )r   r2   r4   
ValueErrorrl  RuntimeErrorr   r   r   r   r
   r   r)  r   rv  r  rm  )$r   rd  re  r   r   r   r   r   r   r"   rn  r   ro  rC  r  r  shaft_heightr  r  headangle_delta	headangler   r   headcosheadsinr   r   r9  r:  r;  r<  rp  rq  rr  rs  r8  r.   r.   r/   r  v  s  

,
 
	
zCircularDrawer._draw_arc_arrowc	              
   K   sV  |dkr|}
|}d}n|dkr|}
|}d}n|}
|}d}d}d}t ||\}}t||t||}}|| }||
 }||krB|dksDJ |rr|rrt|t|| ||  |d  |}t|t|| ||  |d  |}t||}n'|rt|t|| ||  | |}|}n|}t|t|| ||  | |}||  kr|  kr|ksn td|||||f t|t|}}t|t|}}t|t|}}| j| j}}td||ddd	|	}|j	| j| j|
d
|d t
  d
|d t
  dd t|D ]B}|	| j| j|
|| |  d
|d t
  d
|d t
   | ||
|| |  |
|d | |  d
|d t
  d
|d t
   q|j	| j| j|d
|d t
  d
|d t
  dd t|D ]E}|j	| j| j||| |  d
|d t
  d
|d t
  dd | |||| |  ||d | |  d
|d t
  d
|d t
   q_|  |S )zDraw JAGGY sigil (PRIVATE).

        Although we may in future expose the head/tail jaggy lengths, for now
        both the left and right edges are drawn jagged.
        r   r   r   r   r   r   r0   zxProblem drawing jaggy sigil, invalid positions. Start angle: %s, Tail angle: %s, Head angle: %s, End angle %s, Angle: %sr  r!  r"  Trh  rj  Nr.   )r   r2   r4   r  r   r   r   r   r   r)  r   r5   r  rm  )r   rc  r   rG   r   r   r   r   r   r   rd  re  teethtail_length_ratior   ro  rC  r7   r  	tailangler   r   r  r  r   r   r9  r:  r8  ir.   r.   r/   r   3  s    	z CircularDrawer._draw_sigil_jaggy)Nr   r   r   r   NNNNNNr   r   r   r   N)NN)F)NF)Nr0   )Nr  r0   r   N)N)__name__
__module____qualname____doc__r   rJ   rm   rU   rn   r{   r   rX   ro   r   r   r   rW   r.  rY   rS   r   r   r  r  r   r   r   r   r  r   r.   r.   r.   r/   r   %   sx    
S%? [<>* A7!N
G
(
b
Q
 Gr   N)r  mathr   r   r   reportlab.graphics.shapesr   r   r   r   r	   r
   r   reportlab.libr   _AbstractDrawerr   r   r   r   _FeatureSetr   	_GraphSetr   r   r.   r.   r.   r/   <module>   s&   