
    1jJ,                        S r SrSrSrSrSrSrSrSrSS/r	S	r
S
rSrS
rSS.S jrSSSS.S jrSBS jrSBS jrSBS jrSSSSSS.S jrSCS jr\S:X  Ga2  SSKr\R.                  R1                  \R.                  R3                  \R.                  R5                  \5      SS5      5      r\R:                  " \SS9  \" SSSS ./S!.S"SSS .S#SS ./S!./5      r\" \R.                  R3                  \S$5      S%S&S'9 r \ RC                  \5        SSS5        \"" S(5        \" S)S*SS ./S!.S+S*SS ./S,-  S!./5      r#\" \R.                  R3                  \S-5      S%S&S'9 r \ RC                  \#5        SSS5        \"" S.5        \" S/S0SS ./S!.S1S0SS .S2SS ./S!./5      r$\" \R.                  R3                  \S35      S%S&S'9 r \ RC                  \$5        SSS5        \"" S45        \" S5S6SS7.S8S2S9S:S;./S<SS=9r%\" \R.                  R3                  \S>5      S%S&S'9 r \ RC                  \%5        SSS5        \"" S?5        \" S5S6SS7.S8S2S9S:S;./S<S,S=9r&\" \R.                  R3                  \S@5      S%S&S'9 r \ RC                  \&5        SSS5        \"" SA5        gg! , (       d  f       GN= f! , (       d  f       GN9= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N^= f)Duw  Singapore Math "model method" bar-model SVG generator.

Four model types, all in AGS brand style (CSS vars, dusty-rose border).
The public functions return a self-contained SVG string; the matching
`_*_content` helpers return just the inner XML + bounding box so that
`solution_block.py` can stack several models inside one outer frame.

Types:
  1. part_whole(entities)       — one entity's bar split into labelled parts
  2. comparison(entities)       — multiple bars drawn to relative scale
  3. multiplication(entities)   — bar split into N equal repeated units
  4. unitary(entities, total,   — N equal blank unit-boxes + optional
              unit_value)          known "extra" block + optional total bracket

Entity shape for types 1/2/3:
  {"label": "Sarah",
   "parts": [
     {"value": 8,  "known": True},
     {"value": 10, "known": True, "label": "?"}   # optional override
   ]}

Entity shape for type 4:
  {"label": "Yellow puppets",
   "units": 5,           # number of blank unit-boxes
   "extra": 1,           # number of extra "known" blocks
   "extra_value": 7}     # value shown inside the extra block (per extra)
z<style>svg{--crimson:#960000;--gold:#BF9237;--lime:#88C808;--steel:#4A6488;--cream:#FAF5EE;--ink:#2A2A2A;--border:#D0ACAC;}</style>(               )zvar(--crimson)var(--cream))zvar(--gold)
var(--ink)zvar(--border)r   r   T)borderc          	          SUS SUS SUS SUS S3	[         /nU(       a   UR                  SUS-
  S SUS-
  S S	35        UR                  U 5        UR                  S
5        SR                  U5      $ )Nz/<svg xmlns="http://www.w3.org/2000/svg" width="z.0f
" height="z" viewBox="0 0  z">z<rect x="3" y="3" width="   z?" rx="10" fill="none" stroke="var(--border)" stroke-width="3"/>z</svg>
)STYLEappendjoin)innerwhr	   partss        :C:\allgifted\mathapi11v2\tools\svg_generators\bar_model.py_svgr   5   s    
9!C AS'3q3r	;E
 '!Cy
1Q3s) DL M	
 
LL	LL99U    \      )target_widthx0y0c                4   U (       d  SU[         S-  4$ [        S U  5       5      =(       d    SnU[        -
  [         S-  -
  nXT-  nU  VVs/ s H-  nUS    Vs/ s H  n[        US   U-  [        5      PM     snPM/     n	nnU	 V
s/ s H  n
[	        U
5      PM     nn
[        U5      n[        U-   [         S-  -   n[        U 5      n[         S-  U[        -  -   US-
  [        -  -   n/ nU[         -   n[        U 5       GHv  u  nn[        U[        [        5      -     u  nnUR                  SU[         -    SU[        S-  -   S	 S
[         SUR                  SS5       S3	5        U[        -   n[        US   5       H  u  nnU	U   U   n
[        UR                  SS5      5      nU(       a  UO[        nU(       a  UO[        nSU;   a  [!        US   5      nO%U(       a  [!        UR                  SS5      5      nOSnUR                  SUS	 SU SU
S	 S[         SU S35        UR                  SUU
S-  -   S	 SU[        S-  -   S	 S
["         SU SU S35        UU
-  nM     U[        [        -   -  nGMy     SR%                  U5      X4$ s  snf s  snnf s  sn
f )z1Render parts-based entities. Returns (xml, W, H).    c              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)valueN ).0ps     r   	<genexpr>+_parts_content.<locals>.<genexpr>.<genexpr>K   s     7Jq'
Js   r   N)sumr%   es     r   r'   !_parts_content.<locals>.<genexpr>K   s"     JAC7AgJ777s   "$   r   r#   	<text x="" y=".1f&" font-family="sans-serif" font-size="C" font-weight="bold" fill="var(--ink)" dominant-baseline="central">label</text>knownF?	<rect x="	" width="r   " fill="(" stroke="var(--ink)" stroke-width="2"/>" font-weight="bold" fill="3" text-anchor="middle" dominant-baseline="central">r   )PADmaxLBLMIN_SEGr)   lenBHGAP	enumerate_ENTITY_COLORSr   LBL_FSgetbool_UNKNOWN_FILL_UNKNOWN_TEXTstrSEG_FSr   )entitiesr   r   r   	max_totalavailscaler+   r&   seg_wswbar_wmax_barWnHoutyifilltxtxjr5   f_colort_colorr3   s                              r   _parts_contentra   G   s   L#'**JJJOaI3q(EE   9:'
C
1c!G*u$g.
C 
  $%uSWuE%%jGgaAHAa!b&AES=(A
C
SA(#1"1s>':#:;	c

Szq2a4xn 5339( ;++,55+<*=WF	
 Haj)DAqq!Bw./E#dG"cG!|AgJAEE'2./JJAc7%s)Bs8:bT J 	!IK JJA1HS>q2a4xn =77=h ?,,39 5DDI7'S GA+ *, 	
R#X? $@ IIcNA!!U D  %s   J J
8JJ
Jc                 2    [        XS9u  p#n[        X#U5      $ N)r   ra   r   rM   r   xmlrU   rW   s        r   
part_wholerg   |   s    xCICA?r   c                 2    [        XS9u  p#n[        X#U5      $ rc   rd   re   s        r   
comparisonri          xCICA?r   c                 2    [        XS9u  p#n[        X#U5      $ rc   rd   re   s        r   multiplicationrl      rj   r   N)total
unit_valuer   r   r   c                  ^ U (       d  SU[         S-  4$ SnUS Ln[        S U  5       5      =(       d    SnU[        -
  [         S-  -
  U(       a  UOS-
  n	[        [        X-  5      m[        U4S jU  5       5      n
[        U
-   [         S-  -   U(       a  UOS-   n[	        U 5      n[         S-  U[
        -  -   US-
  [        -  -   n/ nU[         -   nUn[        U 5       GH  u  nnUR                  SU[         -    S	U[
        S-  -   S
 S[         SUR                  SS5       S3	5        U[        -   n[        UR                  SS5      5      n[        U5       H~  nUb  [        U5      OSnUR                  SUS
 S	U STS
 S[
         S[         S35        UR                  SUTS-  -   S
 S	U[
        S-  -   S
 S[         S[          SU S35        UT-  nM     [        UR                  SS5      5      nUS:  a  TU-  nUR                  S5      nUb  [        U5      OSnUR                  SUS
 S	U SUS
 S[
         S["         S35        UR                  SUUS-  -   S
 S	U[
        S-  -   S
 S[         S[$         SU S35        UU-  nU[
        [        -   -  nGM     U[        -
  nU(       a  U[        -   U
-   S-   nUU-   S-  nUR                  SU SU SU SU S3	5        UR                  SU SU SUS-
   SU S3	5        UR                  SU SU SUS-
   SU S3	5        UR                  SU SUS
 SUS -    SUS
 S3	5        UR                  SUS-    S	US
 S[         S!U S3	5        S"R'                  U5      X4$ )#Nr   r    n   c              3   j   #    U  H)  oR                  S S5      UR                  SS5      -   v   M+     g7funitsr   extraNrG   r*   s     r   r'   #_unitary_content.<locals>.<genexpr>   s)     L8aEE'1%gq(998s   13r-   r   c              3   t   >#    U  H-  nUR                  S S5      UR                  SS5      -   T-  v   M/     g7frr   ru   )r%   r+   unit_ws     r   r'   rv      s8      %#a 55!$quuWa'88FB#s   58r.   r/   r0   r1   r2   r3   r4   rs   r6   r7   r8   r   r9   r:   r;   r<   rt   extra_value   z
<line x1="z" y1="z" x2="z" y2="      zG" font-weight="bold" fill="var(--crimson)" dominant-baseline="central">r   )r=   r>   r?   r@   rA   rB   rC   rD   r   rF   rG   intrangerK   rI   rL   rJ   _EXTRA_FILL_EXTRA_TEXTr   )rM   rm   rn   r   r   r   BRACE_W	has_total	max_unitsrO   rT   rU   rV   rW   rX   rY   	first_toprZ   r+   r]   rs   _r3   rt   ewevetxtlast_botbxmidrx   s                                 @r   _unitary_contentr      s\   L#'**GT!IL8LLQPQI3q(yGaHE%+,F %#% %Ggai7Q?AHAa!b&AES=(A
C
SAI(#1

Szq2a4xn 5339( ;++,55+<*=WF	
 HAEE'1%&uA'1'=C
O3EJJAc7%s)F3<z" N&'OQ JJAqL-U1r!t8C. A77=h ?,,9? ;DDI7'S KA  AEE'1%&19%B}%B n3r7"DJJAc7%s)Bs8:bT J$%MO JJA1HS>q2a4xn =77=h ?,,7= 9DDH6R GA	R#XM $N 3wH#X"$8#q(

F9+VB4vhZ H5 6	
 	

F9+VBqD6	{ K5 6	
 	

F8*F2a4&xj I5 6	
 	

F3s)6"Q$vc#Y G5 6	
 	

Ryc#Y /  "++0':	

 IIcNA!!r   c                 6    [        XUUS9u  pEn[        XEU5      $ )N)rm   rn   r   )r   r   )rM   rm   rn   r   rf   rU   rW   s          r   unitaryr      s&     ,6.:<ICA ?r   __main__z..samples)exist_okSarahr|   )r#   r5   )r3   r   Jenny
   zbar_model_part_whole.svgr   zutf-8)encodingzwrote bar_model_part_whole.svgJimmy	   David   zbar_model_multiplication.svgz"wrote bar_model_multiplication.svgAli   Ahmad   zbar_model_comparison.svgzwrote bar_model_comparison.svgzPurple puppetsr   )r3   rs   rt   zYellow puppetsr-   r{   )r3   rs   rt   ry   '   )rm   rn   zbar_model_unitary_setup.svgz!wrote bar_model_unitary_setup.svgzbar_model_unitary_solved.svgz"wrote bar_model_unitary_solved.svg)r   )NNr   )'__doc__r   rB   rC   r?   r=   r@   rF   rL   rE   rI   rJ   r   r   r   ra   rg   ri   rl   r   r   __name__ospathabspathr   dirname__file__rX   makedirspwopenfwriteprintmucmpun_setup	un_solvedr$   r   r   <module>r      s|  :O  	
		 5/1 !% $ .1Q1 2"j
 )-"%!R"j z
''//"'',,rwwx'@$	R
SCKKd# 
./	1.$/1	2 
B 
bggll3 :;S
 #$	
  

*+ 
./	1./!3	5 
B 
bggll3 >?
 #$	
  

./ $/0	2$/.0	1 C 
bggll3 :;S
 #$	
  

*+ "Q;"Q1M D"H 
bggll3 =>
 #$	
  

-."Q;"Q1M AI 
bggll3 >?
 #$		
  

./y 
  
 
  
 
  
 
  
 
  
 s<   7JJ6J,J=$K
J
J),
J:=
K
K