
    j$              	       D   S r SSKrSrSrSrS rS r  S#S	 jrS
 r\	S:X  Ga[  SSK
r
\
R                  R                  \
R                  R                  \
R                  R                  \5      SS5      5      r\
R"                  " \SS9  \" SSSSS9\" SSSSS9\" SSSSS9/r\" \S5       HW  u  rr\
R                  R                  \S\ S35      r\" \SSS9 r\R5                  \" S$0 \D65        SSS5        \" S\5        MY     \" SSSSSS 9\" SSS!SSS 9/r\" \S5       HW  u  rr\
R                  R                  \S"\ S35      r\" \SSS9 r\R5                  \" S$0 \D65        SSS5        \" S\5        MY     gg! , (       d  f       N= f! , (       d  f       N.= f)%a#  Circular dial weighing (platform) scale SVG generator.

generate(reading, unit, full_scale, major_step, size) -> str  (self-contained SVG)

FULL-SCALE MAPPING (documented):
  The dial sweeps `full_scale` units over a SWEEP = 270 degrees arc.
  The needle's rest (zero) position is at the LOWER-LEFT, and the scale
  increases clockwise to the LOWER-RIGHT (a 90-deg gap at the bottom).

  Angle convention: clockwise angle measured from 12 o'clock (top), where
    x = cx + r*sin(theta),  y = cy - r*cos(theta).
  Zero sits at -135 deg (lower-left); full scale at +135 deg (lower-right).

    frac         = clamp(reading / full_scale, 0, 1)
    needle_angle = -135 + frac * 270   (degrees, clockwise-from-top)

  Majors are relabelled from 0..full_scale in steps of `major_step`.
  e.g. full_scale=1000, major_step=100 -> 0,100,...,1000 (11 majors).

  Backward compatible: generate(reading, unit) still defaults to a
  0..1000 face with majors every 100.

CIRCLE DIAL MODE (dial="circle"):
  A full 360-deg round face (e.g. a kitchen scale). 0 sits at the top
  (12 o'clock); labels run clockwise every `major_step` all the way
  around. The full-scale value coincides with 0 at the top.

    frac         = reading / full_scale (mod 1 for the needle)
    needle_angle = frac * 360   (degrees, clockwise-from-top)
    Nz<style>svg{--crimson:#960000;--gold:#BF9237;--lime:#88C808;--steel:#4A6488;--cream:#FAF5EE;--ink:#2A2A2A;--border:#D0ACAC;}</style>g     p@g     `c                     [         R                  " U5      nX[         R                  " U5      -  -   X[         R                  " U5      -  -
  4$ )N)mathradianssincos)cxcyrang_degas        ?C:\allgifted\mathapi11v2\tools\svg_generators\platform_scale.py_ptr   *   s9    WADHHQK$((1+o!555    c                 |    [        U [        U 5      -
  5      S:  a  [        [        [        U 5      5      5      $ SU -  $ )Ng&.>z%g)absroundstrint)vs    r   _fmtr   /   s4    
1uQx<43uQx=!!1Hr   gc                    [        U 5      n [        U5      n[        U5      nUS:X  a  [        XX#U5      $ US::  a  SO[        S[        SX-  5      5      n[        U[
        -  -   nUS-  nUS-  S-
  n	US-  S-
  n
/ nUR                  SU S	U S
U SU S3	5        UR                  [        5        UR                  SUS-
   S	US-
   S35        UR                  SUS-
   S	US-
   S35        UR                  SU SU	 SU
 S35        US::  a  SO[        [        X#-  5      5      nSn[        SU5      U-  n[        US-   5       H  nX-  n[        U[
        -  -   nUU-  nX-  S:H  nU(       a  [        XU
S-
  U5      u  nn[        XU
S-
  U5      u  nnUR                  SUS SUS SUS SUS S3	5        [        XU
S -
  U5      u  nnUR                  S!US S"US S#[        U5       S$35        M  [        XU
S-
  U5      u  nn[        XU
S%-
  U5      u  nnUR                  SUS SUS SUS SUS S&3	5        M     [        XU
S-
  U5      u  nn[        XS'US(-   5      u  nnUR                  SUS SUS SUS SUS S)3	5        UR                  SU SU	 S*35        UR                  S!U S"XS+-  -   S S,U S$35        UR                  S-5        S.R                  U5      $ )/Ncircler                 ?         /<svg xmlns="http://www.w3.org/2000/svg" width="
" height="" viewBox="0 0  "><rect x="3" y="3" width="G" rx="18" ry="18" fill="none" stroke="var(--border)" stroke-width="4"/><rect x="12" y="12" width="   '" rx="28" ry="28" fill="var(--steel)"/><circle cx="" cy="" r="<" fill="var(--cream)" stroke="var(--ink)" stroke-width="3"/>            
<line x1=".2f" y1="" x2="" y2="*" stroke="var(--ink)" stroke-width="2.5"/>    	<text x="" y="m" font-family="sans-serif" font-size="13" fill="var(--ink)" text-anchor="middle" dominant-baseline="central"></text>   (" stroke="var(--ink)" stroke-width="1"/>      C" stroke="var(--crimson)" stroke-width="4" stroke-linecap="round"/>" r="8" fill="var(--crimson)"/>?d" font-family="sans-serif" font-size="16" font-weight="bold" fill="var(--ink)" text-anchor="middle"></svg>
)float_generate_circlemaxminSTART_ANGLESWEEPappendSTYLEr   r   ranger   r   join)readingunit
full_scale
major_stepsizedialfracneedle_angler   r	   Rpartsn_majorsminor_per_majorminorsifangvalueis_majorx1y1x2y2lxlynxnytxtys                                 r   generaterl   5   s   GnGz"Jz"JxztLL/3s3C9M0N'OD-L	B	ABq2AE	LL
9$z$ PvQtfB	( 
LL 
LL
#DF8:d1fX >@ 	A 
LL
%d2gYjb	 B  	! 
LL
rd&E! -1 	2 !OqU:3J-K)LHOH/F6A:JAI%J'1,Q,FBR-FBLLRHF2c(&Cr#h O; < R-FBLLBs85C 1//3E{m7D Q,FBR-FBLLRHF2c(&Cr#h O9 :+ 6 R.FB\C/0FB	LL
RHF2c(&Cr#h GL 	M 
LL<t6"-LMN 
LL
B4uRD&[- .  $vW	. 
LL99Ur   c                    US::  a  SOX-  nUS-  S-  nUS-  nUS-  S-
  nUS-  S-
  n	/ n
U
R                  SU S	U S
U SU S3	5        U
R                  [        5        U
R                  SUS-
   S	US-
   S35        U
R                  SUS-
   S	US-
   S35        U
R                  SU SU SU	 S35        US::  a  SO[        S[        [	        X#-  5      5      5      nSnX-  n[        U5       H  nX-  nUS-  nX-  nX-  S:H  nU(       a  [        XxU	S-
  U5      u  nn[        XxU	S-
  U5      u  nnU
R                  SUS SUS SUS SUS S3	5        [        XxU	S -
  U5      u  nnU
R                  S!US S"US S#[        U5       S$35        M  [        XxU	S-
  U5      u  nn[        XxU	S%-
  U5      u  nnU
R                  SUS SUS SUS SUS S&3	5        M     [        XxU	S-
  U5      u  nn[        XxS'US(-   5      u  nnU
R                  SUS SUS SUS SUS S)3	5        U
R                  SU SU S*35        U
R                  S!U S"XS+-  -   S S,U S$35        U
R                  S-5        S.R                  U
5      $ )/z4Full 360-deg round dial: 0 at top, labels clockwise.r   r   r   g     v@r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   )	rL   rM   rH   r   r   rN   r   r   rO   )rP   rQ   rR   rS   rT   rV   rW   r   r	   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   s                                r   rG   rG      sd    /3(<D3J%'L	B	ABq2AE	LL
9$z$ PvQtfB	( 
LL 
LL
#DF8:d1fX >@ 	A 
LL
%d2gYjb	 B  	! 
LL
rd&E! -1 	2 !OqQE*:Q4R0S)THO'F6]J%i'1,Q,FBR-FBLLRHF2c(&Cr#h O; < R-FBLLBs85C 1//3E{m7D Q,FBR-FBLLRHF2c(&Cr#h O9 :+ 6 R.FB\C/0FB	LL
RHF2c(&Cr#h GL 	M 
LL<t6"-LMN 
LL
B4uRD&[- .  $vW	. 
LL99Ur   __main__z..samplesT)exist_okr   kg   r-   )rP   rQ   rR   rS   i  i      r/   platform_scale_z.svgwzutf-8)encodingwroter   )rP   rQ   rR   rS   rU   
   platform_scale_circle_)g     @o@r   i  d   i@  fan )__doc__r   rM   rK   rJ   r   r   rl   rG   __name__ospathabspathrO   dirname__file__outmakedirsdictro   	enumerater]   kwpopenr^   writeprintcircle_samplesr|   r   r   <module>r      s  < O 
 	6
 MPYxSl z
''//"'',,rwwx'@$	R
SCKKd#QTaA>SsssCQTaA>G
 7A&2GGLLs$78!S7+qGGHNrN# ,gq	 ' 	QTaAHMQTbQXNN >1-2GGLL 6qc>?!S7+qGGHNrN# ,gq	 .'  ,+ ,+s   F F 
F	
F	