
    Kwg$-                     8   d Z dZddlmZmZmZ ddlmZmZm	Z	m
Z
mZmZ ddl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 d	 Zd
 Zd Zd ZdZ ee      dz
  ZddZ d dZ!d!dZ"d Z#d Z$d"dZ%d"dZ& G d d      Z'd Z(d Z)d#dZ* G d d      Z+ G d de,      Z-y)$z3.3.0zUtilities used here and there.    )mktimegmtimestrftime)log10pifloorsincoshypotN)transformPointsinverseEllipseGroupStringnumericXShift)flatten)stringWidthc                     dgdz  }t        t        t        | j                  d                  \  }}}|||g|dd t	        |      S )zNConvert a 'dd/mm/yyyy' formatted string to a tuple for use in the time module.r   	   /N   )listmapintsplittuple)
timeStringLddmmyyyys        V/var/www/horilla/myenv/lib/python3.12/site-packages/reportlab/graphics/charts/utils.pymkTimeTupler#      sK     
aAC!1!1#!678LBD2rNAbqE8O    c                 *    t        t        |             S )z?Convert a number of seconds since the epoch into a date string.)r   r#   )r   s    r"   str2secondsr&      s     +j)**r$   c                 ,    t        dt        |             S )zAConvert a date string into the number of seconds since the epoch.z%Y-%m-%d)r   r   )secondss    r"   seconds2strr)      s     Jw00r$   c                     | dv r| S | dk  rdt        |        z  S t        t        |             }|dk(  r| dk  rd}nd}n|dk  r	d|dz
  z  }nd|z  }|| k\  r|dz  S |dz  | k\  r|d	z  S |d
z  | k\  r|dz  S |dz  S )a[  Return the first 'nice round number' greater than or equal to x

    Used in selecting apropriate tick mark intervals; we say we want
    an interval which places ticks at least 10 points apart, work out
    what that is in chart space, and ask for the nextRoundNumber().
    Tries the series 1,2,5,10,20,50,100.., going up or down as needed.
    )r      r   g      r+   皙?g      ?      $@   g       @   g      @)nextRoundNumberr   r   )xlgbases      r"   r0   r0   #   s     	F{1uoqb)))q]71u!VBF#D2:D 19#:Qh1_#:Qh1_#:$;r$   )r,   g?g      ?      ?r+   c                 X   | |k\  r%| |k(  r| dk(  rd} d}nd| z  } d|z  }nt        d      || z
  t        |      z  }|dkD  xr |dk  xs |dkD  xr dt        t        |            z  xs d}|}	 ||z  }|t        d	   k  rn|dz  }d}|t        |   kD  r|dz   }|t        |   kD  r	 t        |   |z  }| |z  }t        |      |dk  z
  }	||	z  }||	|z   z  }||z  }|dkD  r
||k\  rd
}|}n|dk  r| }| |kD  r|}d}||k  r|| k  rn|dz   }|t        kD  rd}|dz  }u|||| |z
  |z   |z
  fS )z>determine tick parameters for range [lo, hi] using I intervalsr   gr,   g?g?zlo>hir+   
   g        )
ValueErrorfloatr   r   
_intervalsr   _j_max)
lohiIr1   bajssnls
             r"   find_intervalrE   K   s    
Rxr61uVVW%%	BwaA	!1"62uU1X#6;!A	A
aCjnebD 
 	
A
JqM/q1u1!JqM/
]1_rEFAaCLqD!HbDQ3"uTA!tq5QUEEV8A"A) * aR!VaZ"_$$r$   c                 B   |r1t        | |      d   |z  }t        ||      \  }}|dkD  r|dz   }||z  }n3	 |d    d}|D ]&  }t	        | ||      }|d   |k  s|d d \  }}}|d   }( |fS # t        $ r) t        t        d|dz
        t        |dz   d            }Y cw xY w)Nr   :0yE>r+   r.   r   g)divmod	TypeErrorrangemaxrE   )	lowerupperrC   gridtr=   zwis	            r"   find_good_gridrS   z   s    5q!D(uT"AT612W	-aD  	AE%*AtAve2tA$		
 b$;  	-c!AaCjQqS,A	-s   A, ,/BBc                    t        | |||      \  }}}t        t        |            }	|	dk(  rd}	|d|	z  z  }
t        |
      |
k7  }
|	dkD  s|	dk  rdt	        |
dz         z   dz   }nV|	dk\  r t        |	      |
z   }d	t	        |      z   d
z   }n1|
t        |	      z
  }d	t	        |dz         z   dz   t	        |      z   dz   }|r|dz   }g }t        t        ||z
        |z  dz         dz   }|rFg }t        |      D ]2  }|||z  z   }|j                  |       |j                  |||z   z         4 ||fS t        |      D ]#  }|||z  z   }|j                  ||||z   z  f       % |S )z
    return tick positions and labels for range lower<=x<=upper
    n=number of intervals to try (can be a list or sequence)
    split=1 return ticks then labels else (tick,label) pairs
    r   r+   r-   r   z%+   z.0e%z.0fr.   .fz%%r,   )rS   r   r   r   reprr9   rJ   append)rL   rM   rC   r   percentrN   labelVOffsetrO   r=   powerrQ   formatdigitsTlabelsrR   vs                    r"   ticksrd      s    !q$7KAr4%+EaxS%ZAA	AqyEBJd1Q3i%A:Z\F4<'-Fs5z\FfQh'+DL8<Fvd{
AE"Q$KS !!#Aq 	5A$q&AHHQKMM&AlN34	5 &yq 	5A$q&AHHa1\>234	5 r$   c                 T   t        |       }d | v rd}||k  r| |   |dz  }||k  r| |   ||k(  r| S |dz
  }| |   |dz  }| |   |dz  }|s|r| || } t        t        |             D cg c]
  }| |   	| }}|D ]  }d| |dz
     | |dz      z   z  | |<    ||| fS d|| fS c c}w )Nr   r+   r4   )lenrJ   )datamr?   rD   rR   r>   s         r"   	findNonesri      s    D	At|cd1goFA cd1goa4aC1goFA 1go	1$q)4c$i(<1DGOQ<< 	0A4!9T!A#Y./DG	0!TzQt8O	 =s   ,
B%7B%c                     | D cg c]  }|d   	 }}t        |      \  }}}t        |      }|s
||k  s||k7  r/|s||k  r| || } t        | |      D cg c]  \  }}|d   |f } }}| S c c}w c c}}w Nr+   r   )ri   rf   zip)pairsr1   Yr?   rD   nYrh   ys           r"   pairFixNonesrq      s    !1Aq\FAaAAAaC2q5!U1QZU%(r]3ca!A$q33L 	
 4s   A*A/c           
          |dz
  | d   gz  | z   } t        |t        |       dz         D cg c]  }t        t        | ||z
  |             |z  ! } }| S c c}w rk   )rJ   rf   r9   sum)rg   rC   rR   s      r"   maveragert      s`    aC$q'?4D/4Qs4y{/CD!E#d1Q3qk"#A%DDDK Es   $Ac           
          t        | t        | D cg c]  }|d   	 c}|            D cg c]  \  }}|d   |f c}}S c c}w c c}}w rk   )rl   rt   )rg   rC   r1   ss       r"   pairMaveragerw      sB     #D($3GQAaD3G*J KL1QqT!HLL3GLs
   A Ac                   j    e Zd ZdZdgfdZd Zd Zd Zed        Z	ed        Z
ed	        Zd
 Zd Zy)DrawTimeCollectorzi
    generic mechanism for collecting information about nodes at the time they are about to be drawn
    gifc                     t        j                         | _        | j                          d | _        || _        d| _        y )NF)weakrefWeakKeyDictionary_nodesclear_pmcanvformatsdisabled)selfr   s     r"   __init__zDrawTimeCollector.__init__   s0    //1

r$   c                 H    g | _         | j                   j                  | _        y N)_infor[   _info_appendr   s    r"   r   zDrawTimeCollector.clear   s    
 JJ--r$   c                 F    |||f| j                   |<   | |j                  d<   y )N_drawTimeCallback)r~   __dict__)r   funcnodeargskwdss        r"   recordzDrawTimeCollector.record   s&    !$t,D-1)*r$   c                     | j                   j                  |d       }|r)|\  }}} ||||g|i |}|| j                  |       y y y r   )r~   getr   )r   r   canvasrendererr   r   r   rR   s           r"   __call__zDrawTimeCollector.__call__   sV    {{tD)#D$T&9D9D9A}d//2} r$   c                     t        |dd       }|sy | j                  }| j                  }|| j                  z   }|| j                  z   }|j                         }	t        j                  |||f||ff      |	d<   |	S )Nctmrect)getattrr1   rp   widthheightcopyry   transformAndFlatten)
r   r   r   r   Ax1y1x2y2Ds
             r"   rectDrawTimeCallbackz&DrawTimeCollector.rectDrawTimeCallback   su    F5&&VVVV$**_$++IIK#77Br7Br7:KL&	r$   c                 t    t        |       dk7  rt        |       }t        ||      }t        t        |            S )z transform an flatten a list of points
        A   transformation matrix
        p   points [(x0,y0),....(xk,yk).....]
        )r+   r   r   r+   r   r   )r   r   r   r   )r   piAs      r"   r   z%DrawTimeCollector.transformAndFlatten   s4     8]"B1%AWQZ  r$   c                 h    | j                   sdd l}|j                  dd      | _         | j                   S )Nr   r+   )r   renderPMPMCanvas)r   r   s     r"   pmcanvzDrawTimeCollector.pmcanv	  s*    ||#,,Qq1DL||r$   c                    t        |dd       }|sy t        |t              rl| j                  }|j	                  |j
                  |j                  |j                  |j                         |j                  }|D cg c]  }|d   |d   f }}nH|j                         j                  }t        dt        |      d      D 	cg c]  }	||	   ||	dz      f }}	|j                         }
| j                  ||      |
d<   |
S c c}w c c}	w )Nr   r+   r.   r   poly)r   
isinstancer   r   ellipsecxcyrxryvpath	asPolygonpointsrJ   rf   r   r   )r   r   r   r   r   r   cr   r1   rR   r   s              r"   wedgeDrawTimeCallbackz'DrawTimeCollector.wedgeDrawTimeCallback  s    F5&&d7#AIIdggtww8A&'(!A$qt(A( ''A(-aAq(9:1!A$q1v:A:IIK,,Qq1&	 ) ;s   9C<?Dc                     ddl }t        |dz   d      }	 |j                  | j                  |       |j                          y# |j                          w xY w)z
        save the current information known to this collector
        fnroot is the root name of a resource to name the saved info
        override this to get the right semantics for your collector
        r   Nz.default-collector.outrQ   )pprintopenr   close)r   fnrootr   rY   s       r"   savezDrawTimeCollector.save   sC     	
v..s
3	MM$**Q'GGIAGGIs   A AN)__name__
__module____qualname____doc__r   r   r   r   staticmethodr   r   propertyr   r   r    r$   r"   ry   ry      sh      %g .23 
 
 ! !   r$   ry   c                 :    | \  }}|\  }}t        ||z
  ||z
        S )z"return distance between two points)r   )xxx_todo_changemexxx_todo_changeme1x0y0r   r   s         r"   xyDistr   -  s)    GR GR"R%"R%!!r$   c                    | \  }}|\  }}|\  }}	|\  }
}||f}||z
  ||z
  f}||	f}|
|z
  ||	z
  f}t        |d   |d   z  |d   |d   z  z
        }|d   |d   z
  |d   |d   z
  f}|d   |d   z  |d   |d   z  z
  }|d   |d   z  |d   |d   z  z
  }t        |      dk  rt        |      dk  ryy ||z  }||z  }d|cxk  rdk  r.n y d|cxk  rdk  rn y |d   ||d   z  z   |d   ||d   z  z   fS y y )Nr   r+   rG   	collinear)r9   abs)xxx_todo_changeme2xxx_todo_changeme3xxx_todo_changeme4xxx_todo_changeme5x00y00x01y01x10y10x11y11r   rqrv   rsqpqprqpsrO   us                         r"   lineSegmentIntersectr   3  s]   "IS"IS"IS"ISCACCA 	CACCA	qtAaDy1ad"	#B	
1ad1Q4!9	B
Q%!*RU1Q4Z
C
Q%!*RU1Q4Z
C
2wt|s8D=BABA!wQw1a77tAadF{AaD1Q4K'' wr$   c
                    |s
t               }|dz  }t        dz  }
||
z  }t        |||      }|xr dxs d}|dz  }|dz  }|	dk7  rU|	dk(  r||d|z  z  |z  z  }nA|	d	k(  r||t        |      z  |z  z  }n'|	d
k(  r"||t        t	        |	||||d            z  |z  z  }|D ]  }t        |||      }t        |      |z  }t               }|j                  t        dd|||d             |j                  | t        |      |z  z   |t        |      |z  z          |j                  |||z  z
  |
z  |z
         |j                  |       |||z  z  } |S )z%make a group with circular text in itih     r7   r+   r4   Z   startmiddleendnumericNr   )fontNamefontSize
textAnchor)r   r   r   r9   r   addr   	translater
   r	   rotate)r1   rp   radiusangletextr   r   insideGr   pi180phir   sighsigsig90letterbetahs                      r"   makeCircularStringr   P  s   %'a	SLEsFE
+Ch1E
-R
1Cs7DFE7x3E	?6))C3uU|#F**C"3u]:d5(SWXYYZ```C FHh7U|F"G	fQ6HhRYZ[	Ac#hvo%aC&78	#d4i-&u,-	as4x Hr$   c                   "    e Zd ZdZd Zd Zd Zy)CustomDrawChangerz9
    a class to simplify making changes at draw time
    c                     d | _         y r   )storer   s    r"   r   zCustomDrawChanger.__init__t  s	    
r$   c                 ,   |rO| j                  |      | _        t        | j                  t              sJ d| j                  j
                  z         y | j                  7| j                  j                         D ]  \  }}t        |||        d | _        y y )Nz5%s.changer should return a dict of changed attributes)_changerr  r   dict	__class__r   itemssetattr)r   changeobjr@   rc   s        r"   r   zCustomDrawChanger.__call__w  s    s+DJdjj.  B0gjnjxjx  kB  kB  1B  B.ZZ#zz'') !!Aa !DJ $r$   c                     t        d      )z
        When implemented this method should return a dictionary of
        original attribute values so that a future self(False,obj)
        can restore them.
        zAbstract method _changer called)RuntimeError)r   r
  s     r"   r  zCustomDrawChanger._changer  s     <==r$   N)r   r   r   r   r   r   r  r   r$   r"   r   r   p  s    >r$   r   c                       e Zd ZddZy)FillPairedDatac                 >    t         j                  | |       || _        y r   )r   r   other)r   rc   r  s      r"   r   zFillPairedData.__init__  s    d1
r$   N)r   )r   r   r   r   r   r$   r"   r  r    s    r$   r  )r/   )   r/      rV      r   N)r  r+   r   Nr   )r  )r   Nr   ).__version__r   timer   r   r   mathr   r   r   r	   r
   r   r|   reportlab.graphics.shapesr   r   r   r   r   r   reportlab.lib.utilsr   reportlab.pdfbase.pdfmetricsr   r#   r&   r)   r0   r:   rf   r;   rE   rS   rd   ri   rq   rt   rw   ry   r   r   r   r   r   r  r   r$   r"   <module>r     s   
 ( ) ) 2 2  e e ' 4+
1$L 

:q-%^($L$
MT Tl"(:@> >0T r$   