
    j                     $   S r SSKrSSKrSSKrSSKJrJrJr  \R                  R                  \R                  R                  \5      5      rSS jrS rS r\S:X  a  SS	S
SS.S
SS.S
SS./SS0S.SS
SS./S./SSS
/S.S.r\" \R&                  5      S
:  a  \R&                  S
   O\R                  R)                  \S5      r\r\" \R&                  5      S:  a$  \R.                  " \" \R&                  S   SS95      r\" \" \\5      5        gg)a1  Bar-model (Singapore model-method) renderer -> PNG.

Reads a structured spec and draws unit boxes with labels, a "?" bracket,
and an optional total brace. Used by Workstream B to attach drawn model
diagrams to solutions (the Flutter solution modal renders only text/LaTeX,
so the bars have to be a real image).

Spec shape:
{
  "unit_px": 90,          # width of ONE unit box
  "bars": [
    {"label": "Alan",
     "segments": [{"u": 1, "text": "", "fill": "#dbe9ff"},
                  {"u": 1, "text": "", "fill": "#dbe9ff"},
                  {"u": 1, "text": "", "fill": "#dbe9ff"}],
     "brace": {"text": "?"}},          # brace under whole bar
    {"label": "Ben",
     "segments": [{"u": 1, "text": "", "fill": "#ffe7c2"}]}
  ],
  "total": {"text": "$640", "bars": [0,1]}   # right-side brace spanning bars
}
    N)Image	ImageDraw	ImageFontc                     SU(       a  SOS-   n [         R                  " X 5      $ ! [         a    [         R                  " 5       s $ f = f)NzC:/Windows/Fonts/zarialbd.ttfz	arial.ttf)r   truetype	Exceptionload_default)szboldps      >C:\allgifted\mathapi11v2\docs\past year questions\_barmodel.py_fontr      sD    }+FA(!!!(( (%%''(s   & AAc                 b   ^  T =(       d    SR                  S5      m [        U 4S jS 5       5      $ )N#ffffff#c              3   F   >#    U  H  n[        TXS -    S5      v   M     g7f)      N)int).0ics     r   	<genexpr>_hex.<locals>.<genexpr>%   s#     6IqQq1Xr""Is   !)r   r      )lstriptuple)r   s   `r   _hexr   #   s(    	
i$A6I666    c                   ^'^( [        U R                  SS5      5      nSnSnSnSnSn[        S5      n[        SS	S
9n	[        S5      n
U S   m'[        U R                  S5      5      n[	        S T' 5       5      nSnU(       ad  [        U S   R                  SS5      5      n[        R                  " [        R                  " SS5      5      nUR                  SXS9S   nSU-   S-   nX\U-  -   U-   US-  -   nT' Vs/ s H   nUUR                  S5      (       a  UOS-   PM"     nnUS-  [        U5      -   U[        T'5      S-
  -  -   n[        R                  " SUU4S5      n[        R                  " U5      m(S.U(4S jjnUn0 n[        T'5       GH  u  nnXe-   nUUU'   T(R                  UUUS-  -   S-
  4UR                  SS5      USS9  UnUS    H~  nUS    U-  nT(R                  UUUU-   UU-   /SS![!        UR                  S"S#5      5      S$9  UR                  S5      (       a#  U" UUS-  -   UUS-  -   [        US   5      U
5        UU-  nM     [        S% US    5       5      U-  nUR                  S5      (       a  UU-   S&-   n T(R#                  UU UU-   U /SSS'9  T(R#                  UU UU S(-
  /SSS'9  T(R#                  UU-   U UU-   U S(-
  /SSS'9  U" UUS-  -   U S)-   [        US   R                  SS*5      5      U5        UUU   U-   -  nGM     U(       Ga  U S   n!U!R                  S[%        ['        [        T'5      5      5      5      n"[	        U'4S+ jU" 5       5      U-  n#Xe-   U#-   S,-   n$U[)        U"5         n%U[	        U"5         U-   n&T(R#                  U$U%U$U&/SSS'9  T(R#                  U$U%U$S(-
  U%/SSS'9  T(R#                  U$U&U$S(-
  U&/SSS'9  T(R#                  U$U%U&-   S-  U$S--   U%U&-   S-  /SSS'9  T(R                  U$S,-   U%U&-   S-  S-
  4[        U!R                  SS5      5      U
SS9  UR+                  U5        U$ s  snf )/Nunit_pxZ   8                  F)r   barstotalc              3   L   #    U  H  n[        S  US    5       5      v   M     g7f)c              3   *   #    U  H	  oS    v   M     g7fuN r   ss     r   r   #render.<locals>.<genexpr>.<genexpr>2   s     61#   segmentsNsum)r   bs     r   r   render.<locals>.<genexpr>2   s"     E1C6*666s   "$r   text RGB)   r<   r   r   fontr       brace   )   rC   rC   r   r   r   c                 r   > T	R                  SX#S9u  pVpxT	R                  XU-
  S-  -
  XU-
  S-  -
  4X#US9  g )Nr=   r>   r   r?   fill)textbboxr9   )
cxcytr?   rG   ltprr7   ds
            r   ctextrender.<locals>.ctextD   sF    jjj6q	!eq[ "B!|"34aNr      labelrF   r4   r.      rG   r   )outlinewidthrG   c              3   *   #    U  H	  oS    v   M     g7fr-   r/   r0   s     r   r   r8   W   s     5_sV_r3   r<   )rG   rV         ?c              3   T   >#    U  H  n[        S  TU   S    5       5      v   M     g7f)c              3   *   #    U  H	  oS    v   M     g7fr-   r/   r0   s     r   r   r2   e   s     <(;1#(;r3   r4   Nr5   )r   r   r)   s     r   r   r8   e   s(     KdC<Q
(;<<<ds   %(r   
   )rD   )r   getr   boolmaxstrr   Drawr   newrH   r6   len	enumerater9   	rectangler   linelistrangeminsave))specout_pathUBHGAPLBL_WPADBRACEffsfb	has_total	max_unitsRTOTALttxt_tmptwWr7   rowhHimgrP   ybar_topr   barxseg_xr1   wfull_wbytbidxsspanwbxytopybotr)   rO   s)                                          @@r   renderr   '   s   )R()ABCECE2YAU2E2rB<DTXXg&'IEEEI F4=$$VR01~~eiiv67]]64]1!42"A&q0A;?@4aB155>>%q14D@a#d)cSY]33A
))EAq6?
3CsAO 	AGD/3K
	QaZ"_%swww';!)TZA#
AKK519a"f5yd155+C&D  FuuV}}ea!emQaZQvYDQJE ! 5S_559777R!BFFAr1v:r*!FDFFAr1b1f%IQF?FFAJAJQ7iqFQ!fqj."r'3s7|/?/?/L+MqQ	T!Ws]+ "0 ']vvfd5T#345KdKKaO[5 2%s4y!s4y!B&	D"d#)1=	D"q&$'iqA	D"q&$'iqA	TD[A%rBw0ABZ[\	R$+*R/0#bffVR6H2IPRYbcHHXOe As   :'Q__main__r"   AlanrB   z#dbe9ff)r.   rG   r9   rZ   )rS   r4   rA   Benz#ffe7c2)rS   r4   z$640)r9   r)   )r!   r)   r*   z_barmodel_sample.pngr   zutf-8)encoding)T)__doc__jsonsysosPILr   r   r   pathdirnameabspath__file__BASEr   r   r   __name__demord   argvjoinoutrl   loadopenprintr/   r   r   <module>r      s'  ,   + +	wwrwwx01(7IV z  !95Q	7R !957sm%  !9568
 !1a&1D SXX*#((1+TCY0ZCD
388}qyychhqkG<=	&s
% r   