
    M"j8                        d Z 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 d3dZ!d4dZ"d5dZ#d Z$d Z%d6dZ&d6dZ' G d d          Z(d Z)d Z*d7dZ+ G d  d!          Z, G d" d#e-          Z.g d$Z/d% Z0 e1d&d'd(d)d*d+d,d-d./	  	        Z2d0 Z3d1 Z4e5d2k    rddl6Z6 e6j7                     dS dS )8)angle2corner	angle2dirboxCornerCoordsCustomDrawChangerDrawTimeCollectorFillPairedDatafind_good_gridfind_interval	findNoneslineSegmentIntersectmakeCircularStringmaveragemkTimeTuplenextRoundNumberpairFixNonespairMaverageseconds2strstr2secondsticksxyDistz3.4.8z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          |                     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        `/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/reportlab/graphics/charts/utils.pyr   r   %   sX     
aAC!1!1#!6!67788LBD2rNAbqbE88O    c                 :    t          t          |                     S )z?Convert a number of seconds since the epoch into a date string.)r   r   )r1   s    r6   r   r   .   s     +j))***r7   c                 <    t          dt          |                     S )zAConvert a date string into the number of seconds since the epoch.z%Y-%m-%d)r   r   )secondss    r6   r   r   3   s     Jw000r7   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      @)r   r.   r   )xlgbases      r6   r   r   9   s     	F{{1uuoqb))))q]]771uu!VVBF#DD2:D 199#:Qh1__#:Qh1__#:$;r7   )r=   g?g      ?      ?r<   r@   c                    | |k    r+| |k    r| dk    rd} d}nd| z  } d|z  }nt          d          || z
  t          |          z  }|dk    r+|dk     s|dk    rdt          t          |                    z  pd}|}	 ||z  }|t          d	         k    rn|dz  }d}|t          |         k    r|dz   }|t          |         k    	 t          |         |z  }| |z  }t          |          |dk     z
  }	||	z  }||	|z   z  }||z  }|dk    r||k    rd
}|}n|dk     r| }| |k    r|}d}||k    r|| k    rn|dz   }|t          k    rd}|dz  }|||| |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IrA   bajssnls
             r6   r	   r	   a   s    
Rxxr661uuVVW%%%	BwaA	!1"62uU1XX#6;!A	AaCjnebD
 	
A
JqM//q1u1!JqM//]1_rEFFAaCLqD!HbDQ33"uuTTA!ttq55QUUEEV88A"A)* aR!VaZ"_$$r7      r@            r)   c                    |r=t          | |          d         |z  }t          ||          \  }}|dk    r|dz   }||z  }n	 |d          nB# t          $ r5 t          t          d|dz
            t          |dz   d                    }Y nw xY wd}|D ]5}t	          | ||          }|d         |k     r|d d         \  }}}|d         }6|||fS )Nr   :0yE>r<   r?   r+   g)divmod	TypeErrorrangemaxr	   )	lowerupperrS   gridtrM   zwis	            r6   r   r      s    5q!D(uT""AT6612W	-aDDD 	- 	- 	-c!AaCjjQqS,,AAA	-  	 	AE%**AtAvve2tA$b$;s   A
 
<B	B	c                 D   t          | |||          \  }}}t          t          |                    }	|	dk    rd}	|d|	z  z  }
t          |
          |
k    }
|	dk    s|	dk     rdt	          |
dz             z   dz   }nk|	dk    r(t          |	          |
z   }d	t	          |          z   d
z   }n=|
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   }|rPg }t          |          D ]:}|||z  z   }|                    |           |                    |||z   z             ;||fS t          |          D ]'}|||z  z   }|                    ||||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%+rX   z.0e%z.0fr?   .fz%%r=   )r   r   r   r.   reprrI   r^   append)r`   ra   rS   r/   percentrb   labelVOffsetrc   rM   powerre   formatdigitsTlabelsrf   vs                    r6   r   r      s    !q$77KAr4%++EaxxS%ZAA	AqyyEBJJd1Q3ii%A::ZZ\F4<<'-FFs5zz\FfQh'+DLL8<F"vd{
AE"Q$KKS !!!#A q 	5 	5A$q&AHHQKKKMM&AlN34444&yq 	5 	5A$q&AHHa1\>234444r7   c                     t                     }d  v rd}||k     r |         |dz  }||k     r |         ||k    r S |dz
  } |         |dz  } |         |dz  }|s|r
 ||           fdt          t                               D             }|D ]}d |dz
            |dz            z   z   |<    || fS d| fS )Nr   r<   c                 $    g | ]}|         
|S N ).0rf   datas     r6   
<listcomp>zfindNones.<locals>.<listcomp>   s    <<<1DGOQOOOr7   rD   )lenr^   )r{   mrO   rT   rN   rf   s   `     r6   r
   r
      s   D		At||ccd1goFA ccd1goa44aC1goFA 1go	1##$qs)4<<<<c$ii((<<< 	0 	0A4!9T!A#Y./DGG!TzQt8Or7   c                     d | D             }t          |          \  }}}t          |          }|s||k     s||k    r,|s||k     r
| ||         } d t          | |          D             } | S )Nc                     g | ]
}|d          S r<   ry   rz   rA   s     r6   r|   z pairFixNones.<locals>.<listcomp>   s    !1r7   c                 (    g | ]\  }}|d          |fS r   ry   )rz   rA   ys      r6   r|   z pairFixNones.<locals>.<listcomp>   s$    333ca!A$q333r7   )r
   r}   zip)pairsYrO   rT   nYr~   s         r6   r   r      s    uAq\\FAaAA 4AaCC2q55'!U1Q3ZU33Sr]]333Lr7   rW   c                      dz
   d         gz   z     fdt          t                     dz             D               S )Nr<   r   c           	      d    g | ],}t          t          |z
  |                             z  -S ry   )rI   sum)rz   rf   r{   rS   s     r6   r|   zmaverage.<locals>.<listcomp>   s:    DDD!E#d1Q3q5k""##A%DDDr7   )r^   r}   r{   rS   s   ``r6   r   r      sQ    aC$q'?4DDDDDDuQs4yy{/C/CDDDDKr7   c                 f    d t          | t          d | D             |                    D             S )Nc                 (    g | ]\  }}|d          |fS r   ry   )rz   rA   ss      r6   r|   z pairMaverage.<locals>.<listcomp>   s$    LLL1QqT!HLLLr7   c                     g | ]
}|d          S r   ry   r   s     r6   r|   z pairMaverage.<locals>.<listcomp>   s    3G3G3GQAaD3G3G3Gr7   )r   r   r   s     r6   r   r      s9    LLD(3G3G$3G3G3G*J*J K KLLLLr7   c                   ~    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dS )r   zi
    generic mechanism for collecting information about nodes at the time they are about to be drawn
    gifc                     t          j                    | _        |                                  d | _        || _        d| _        d S )NF)weakrefWeakKeyDictionary_nodesclear_pmcanvformatsdisabled)selfr   s     r6   __init__zDrawTimeCollector.__init__   s8    /11

r7   c                 6    g | _         | j         j        | _        d S rx   )_inform   _info_appendr   s    r6   r   zDrawTimeCollector.clear   s    
 J-r7   c                 4    |||f| j         |<   | |j        d<   d S )N_drawTimeCallback)r   __dict__)r   funcnodeargskwdss        r6   recordzDrawTimeCollector.record   s(    !$t,D-1)***r7   c                     | j                             |d           }|r-|\  }}} ||||g|R i |}||                     |           d S d S d S rx   )r   getr   )r   r   canvasrendererr   r   r   rf   s           r6   __call__zDrawTimeCollector.__call__   s}    {tD)) 	3#D$T&9D999D99A}d//22222	3 	3 }r7   c                     t          |dd           }|sd S | j        }| j        }|| j        z   }|| j        z   }|                                }	t                              |||f||ff          |	d<   |	S )Nctmrect)getattrrA   r   widthheightcopyr   transformAndFlatten)
r   r   r   r   Ax1y1x2y2Ds
             r6   rectDrawTimeCallbackz&DrawTimeCollector.rectDrawTimeCallback  sz    F5&&&&VV$*_$+IIKK#77Br7Br7:KLL&	r7   c                     t          |           dk    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   )r0   r!   r    r&   )r   piAs      r6   r   z%DrawTimeCollector.transformAndFlatten  sC     88]""B1%%AWQZZ   r7   c                 \    | j         sdd l}|                    dd          | _         | j         S )Nr   r<   )r   renderPMPMCanvas)r   r   s     r6   pmcanvzDrawTimeCollector.pmcanv  s4    | 	2OOO#,,Qq11DL|r7   c                    t          |dd           }|sd S t          |t                    rG| j        }|                    |j        |j        |j        |j                   |j	        d D             nC|
                                j        fdt          dt                    d          D             |                                }|                     |          |d<   |S )Nr   c                 .    g | ]}|d          |d         fS )r<   r?   ry   r   s     r6   r|   z;DrawTimeCollector.wedgeDrawTimeCallback.<locals>.<listcomp>-  s$    (((!A$qt(((r7   c                 6    g | ]}|         |d z            fS r   ry   )rz   rf   r   s     r6   r|   z;DrawTimeCollector.wedgeDrawTimeCallback.<locals>.<listcomp>0  s)    :::1!A$q1v:::r7   r   r?   poly)r   
isinstancer"   r   ellipsecxcyrxryvpath	asPolygonpointsr^   r}   r   r   )	r   r   r   r   r   r   cr   r   s	           @r6   wedgeDrawTimeCallbackz'DrawTimeCollector.wedgeDrawTimeCallback&  s    F5&&&&d7## 	;AIIdgtw888A((a(((AA  'A::::aAq(9(9:::AIIKK,,Qq11&	r7   c                     ddl }t          |dz   d          }	 |                     | j        |           |                                 dS # |                                 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.outre   )pprintopenr   close)r   fnrootr   rk   s       r6   savezDrawTimeCollector.save6  s`     	
v..s
3
3	MM$*Q'''GGIIIIIAGGIIIIs   A
 
A N)__name__
__module____qualname____doc__r   r   r   r   staticmethodr   r   propertyr   r   r   ry   r7   r6   r   r      s           %g    . . .2 2 23 3 3 
 
 \
 ! ! \!   X       r7   r   c                 B    | \  }}|\  }}t          ||z
  ||z
            S )z"return distance between two points)r   )xxx_todo_changemexxx_todo_changeme1x0y0r   r   s         r6   r   r   C  s,    GR GR"R%"R%!!!r7   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dS d S ||z  }||z  }d|cxk    rdk    r=n d S d|cxk    rdk    r.n d S |d         ||d         z  z   |d         ||d         z  z   fS d S d S )Nr   r<   r[   	collinear)rI   abs)xxx_todo_changeme2xxx_todo_changeme3xxx_todo_changeme4xxx_todo_changeme5x00y00x01y01x10y10x11y11r   rqr   rsqpqprqpsrc   us                         r6   r   r   I  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
2wwt||s88D==tBABA!wwwwQwwwwww1a7777777777tAadF{AaD1Q4K'' w77r7   startc
                    |st                      }|dz  }t          dz  }
||
z  }t          |||          }|rdpd}|dz  }|dz  }|	dk    rd|	dk    r||d|z  z  |z  z  }nO|	d	k    r||t          |          z  |z  z  }n0|	d
k    r*||t          t	          |	||||d                    z  |z  z  }|D ]}t          |||          }t          |          |z  }t                      }|                    t          dd|||d                     |                    | t          |          |z  z   |t          |          |z  z              |
                    |||z  z
  |
z  |z
             |                    |           |||z  z  }|S )z%make a group with circular text in ith     rG   r<   rD   Z   r   middleendnumericNr   )fontNamefontSize
textAnchor)r#   r   r'   rI   r%   addr$   	translater   r   rotate)rA   r   radiusangletextr  r  insideGr  pi180phir   sighsigsig90letterbetahs                      r6   r   r   f  s   %''a	SLEsFE
+Ch11E
-R
1Cs7DFE7x3E	?6))CC3uU||#F**CC""3u]:d5(SWXXYYYZ```C  FHh77U||F"GG	fQ6HhRYZZZ[[[	Ac#hhvo%aC&7888	#d4i-&u,---	as4xHr7   c                   $    e Zd ZdZd Zd Zd ZdS )r   z9
    a class to simplify making changes at draw time
    c                     d | _         d S rx   )storer   s    r6   r   zCustomDrawChanger.__init__  s    


r7   c                 $   |rM|                      |          | _        t          | j        t                    sJ d| j        j        z              d S | j        9| j                                        D ]\  }}t          |||           d | _        d S d S )Nz5%s.changer should return a dict of changed attributes)_changerr  r   dict	__class__r   itemssetattr)r   changeobjrP   ru   s        r6   r   zCustomDrawChanger.__call__  s     	s++DJdj..  B  B0gjnjx  kB  1B  B  B.  B  BZ#z'')) ! !!Aa    DJJJ $#r7   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     r6   r  zCustomDrawChanger._changer  s     <===r7   N)r   r   r   r   r   r   r  ry   r7   r6   r   r     sK             > > > > >r7   r   c                       e Zd ZddZdS )r   r   c                 J    t                               | |           || _        d S rx   )r,   r   other)r   ru   r%  s      r6   r   zFillPairedData.__init__  s!    d1


r7   Nr   )r   r   r   r   ry   r7   r6   r   r     s(             r7   r   )	)rG        6@e)r&       P@ne)r(        \@rS   )r*       c@nw)r+       Pi@re   )r-       n@sw)r.       Hr@r   )r0       u@se)r1  ii  r'  c                 T    | dz  }t           D ]\  }}}||cxk     r|k    rn |c S dS )aZ  converts mathematical angle to a compass point from a math angle where
    0 degrees lies along the x axis ie east==0 degrees

    >>> [angle2dir(_) for _ in [0,360]+[__[0] for __ in _arange2dirs]+[__[1] for __ in _arange2dirs]]
    ['e', 'e', 'e', 'e', 'ne', 'n', 'nw', 'w', 'sw', 's', 'se', 'e', 'ne', 'n', 'nw', 'w', 'sw', 's', 'se', 'e']
    r   r   )_arange2dirs)r
  rP   rL   rM   ds        r6   r   r     sJ     	A!  	Ba888888888AXXX83r7   re   r/  r   r2  r'  r)  rS   r,  r   )	r'  r)  rS   r,  re   r/  r   r2  r   c                 6    t           t          |                    S )a0  converts a direction angle to a box corner name effectively the reverse direction
    >>> [angle2corner(_) for _ in [0,360]+[__[0] for __ in _arange2dirs]+[__[1] for __ in _arange2dirs]]
    ['w', 'w', 'w', 'w', 'sw', 's', 'se', 'e', 'ne', 'n', 'nw', 'w', 'sw', 's', 'se', 'e', 'ne', 'n', 'nw', 'w']
    )_cornerNamesr   )r
  s    r6   r   r     s    
 	%(())r7   c                    | d         | d         k    s| d         | d         k    rnt          | d         | d                   t          | d         | d                   t          | d         | d                   t          | d         | d                   f} |dvrt          d|          |dv r| d         | d         z   dz  }n|dv r	| d         }n| d         }|d	v r| d         | d         z   dz  }n|d
v r	| d         }n| d         }||fS )a`  return (x,y) for bounding box and corner name
    >>> bb=(1,0,0,1);[boxCornerCoords(bb,_) for _ in 'c n ne e se s sw w nw'.split()]
    [(0.5, 0.5), (0.5, 1), (1, 1), (1, 0.5), (1, 0), (0.5, 0), (0, 0), (0, 0.5), (0, 1)]
    >>> boxCornerCoords(bb,'z')
    Traceback (most recent call last):
        ...
    ValueError: invalid box corner name 'z'
    r   r?   r<   r+   )	rS   r)  r'  r2  r   r/  re   r,  r   zinvalid box corner name )r   r   rS   )r)  r'  r2  )r'  r   re   )r,  rS   r)  )minr_   rH   )bbcnrA   r   s       r6   r   r     s)    
!uRU{{beBqEkk"Q%1s2a5A//BqE"Q%0@0@RU2a5AQAQR	BBB:B::;;;	]U2a5[!O			qEqE	]U2a5[!O			1AAqEa4Kr7   __main__)r@   )rU   N)rU   r<   r   Nr   )rW   )r   Nr   )8__all____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   r   rJ   r}   rK   r	   r   r   r
   r   r   r   r   r   r   r   r   r,   r   r4  r   r  r7  r   r   r   doctesttestmodry   r7   r6   <module>rF     s  . ( ) ) ) ) ) ) ) ) ) ) 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  e e e e e e e e e e e e e e e e ' ' ' ' ' ' 4 4 4 4 4 4  + + +
1 1 1$ $ $L 

s:q-% -% -% -%^   ($ $ $ $L  $     
M M M MT T T T T T T Tl" " "( ( (:   @> > > > > > > >0    T   


 

 


 
 
  TC4#tcTCPPP* * *  6 ZNNNGO r7   