
    ^j?S                        d Z ddl ddlZdZdZdZdZ edd	d
       eddd       eddd       eddd      dZ eddd      Z	ddddddZ
 eddd      ZdedefdZdefdZd efd!Zd" Zd#edefd$Zd%d&d'd(d)d*d+d,d-d.d/
Zd0ed1edeeef   fd2ZdLd3Zd4 Zd5\  ZZZdMd6ZdNd7ZdOd8Z	 	 dPd9ZdQd:Z dRd;Z!dSd<Z"d= Z#e#Z$	 	 dTd>Z%	 	 dUd?Z&dVd@Z'	 	 dWdAZ(dBefdCZ)dXdDZ*	 	 dYdEZ+	 	 dZdFZ,dG Z-d[dHZ.d\dIZ/d]dJZ0d^dKZ1y)_u  Ring parts kit — validated components the archetype templates assemble from.

v2 (castable core): every metal element is built to FUSE into one watertight
body and to obey lost-wax casting floors (Formlabs/Materialise guides):
band >=1.0 mm thick, prongs >=0.8 mm base / 0.6 mm tip diameter, bead prongs
>=0.5 mm. Stones are separate solids (set after casting, never printed) and
the templates cut real seats for them.

Grounding:
- US size -> inner diameter: d(mm) = 0.8128*size + 11.63 (standard US formula).
- carat -> stone dims: cube-root scaling from standard 1ct reference sizes.
- Gem angles from open faceting references (crown ~34 deg, pavilion ~41 deg,
  table ~55%) — lofted polygon facets so stones read FACETED.
    )*N      ?皙?333333?      ?gףp=
?ףp=
?Q?=
ףp=?)\(?皙?gzG?Q?      ?g)\(?)yellowrosewhiteplatinum333333?)r   r
   r   )gp=
ף?r   gRQ?)(\?{Gz?Q?)r   r   gQ?)ffffff?r   r   )diamondemeraldrubysapphire	morganite333333?
ףp=
?metalreturnc                 x    t         j                         D ]  \  }}|| j                         v s|c S  t         d   S )Nr   )METALSitemslower)r   keycs      /opt/ringagent/ringcli/parts.pymetal_colorr(   +   s:    ,,. Q%++-H '?    c                     t        | dd      }|yt        |      dd \  }}}t        j                         D ]=  \  }}}t	        ||z
        dk  st	        ||z
        dk  s+t	        ||z
        dk  s= y y)u   Anything whose color matches a known STONE color is a stone; everything
    else is metal. (Purely hue-heuristic tests broke the moment gemstone
    colors joined the palette — green reads 'metal' on blue-dominance.)colorNT   {Gz?F)getattrtupleSTONE_COLORSvaluesabs)partr&   rgbsrsgsbs           r'   is_metalr:   2   s     	gt$AyAhrlGAq!"))+ 
Bq2v;#a"f+"4QVt9K r)   fc                     | j                         }t        |j                  |j                  |j                        t        t        |j                   |j                   |j                         | z  |      z  S )zxUniform scale about the shape's own center (plain scale() is about the
    origin and would displace off-center stones).)centerPosXYZscale)sr;   r&   s      r'   scaled_about_centerrD   @   sV     	

AqssACCc133$qssd&;a&? CCCr)   c                     | D cg c]  }||	 }}|st        d      d }t        |      dk  r ||      S d}t        dt        |      d      D ]  } ||||dz          }||n||z   } |S c c}w )u:  Boolean fuse of many solids into one body.

    Balanced tree for normal counts; above ~64 parts switch to chunked mode
    (balanced-fuse groups of 16, then accumulate sequentially) — a full tree
    keeps O(n) complex intermediates alive and a full-circle pave band
    (~180 parts) got the process OOM-killed.Nznothing to fusec                    t        |       dkD  rpg }t        dt        |       dz
  d      D ]  }|j                  | |   | |dz      z          ! t        |       dz  r|j                  | d          |} t        |       dkD  rp| d   S )N   r      )lenrangeappend)chunknxtis      r'   treezfuse_all.<locals>.treeR   s    %j1nC1c%j1na0 4

58eAEl2345zA~

59%E %j1n Qxr)   @   r      )
ValueErrorrJ   rK   )solidsrC   r#   rP   accstartr5   s          r'   fuse_allrW   G   s     01!-Q0E0*++ 5zRE{
Cq#e*b) ,uURZ();aC!G, J) 1s
   A/A/us_sizec                     d| z  dz   dz  S )Ng
F%u?g(\B'@rH    )rX   s    r'   inner_radiusr[   f   s    Wu$))r)   )      @r\   )g@g       @)ffffff@r]   )g      @g      @)      @r^   )g333333@g      @)g      @g333333@)ffffff@r_   )g@g@)@g @)
roundovalcushionelongated_cushionprincessr   radiantasscherpearmarquisecutcaratc                 `    t         j                  | t         d         \  }}|dz  }||z  ||z  fS )Nra   gUUUUUU?)_REF_1CTget)rj   rk   wlengthrC   s        r'   
stone_dimsrq   s   s8    S(7"34IAv%Aq5&1*r)   c                     t        |       t        |  df| dfd|f      z   }|j                         j                  t        j
                        d   }t        ||      S )Nr   rI   )CirclePolygonverticessort_byAxisr@   fillet)r4   tip_ysoftface
tip_vertexs        r'   teardrop_facer}   z   sS    !9wAwAE
;;D((04J*d##r)   c                     | | z  ||z  z   d| z  z  }|| z
  }t        | d      t        |      z  t        |d      t        |      z  z  S )NrH   r   )r>   rs   )ro   LRds       r'   marquise_facer      sP    	
QQ1q5!A	AAAJ"s1ay6!9'<==r)   )g      A@g     D@r   c                 0   | t         z  }| |z
  t        j                  t        j                  t                    z  }|2| t        j                  t        j                  t
                    z  dz  }t        dd|      t        | d      z  }t        dd||z         t        |d      j                  t        j                  d      z  }t        dd||z
        t        | dz  d      z  }	t        |	||g|      }
|dk7  rt        |
d|df      }
t        |
_        |
|fS )	u(  Faceted brilliant: octagon loft (8 kite crown facets + table).
    pav_h overrides the angle-derived pavilion depth; exact=True uses a RULED
    loft so the girdle diameter is exact (the default B-spline loft bulges
    ~1.5% between sections — fine for renders, fatal for a real stone's seat).333333?r      g     6@r-   ruledr   rG   )	TABLE_PCTmathtanradians	CROWN_DEGPAV_DEGr>   RegularPolygonrotaterw   rA   loftrB   DIAMONDr+   )grgirdle_zelongpav_hexacttable_rcrown_hgirdtabkeelrC   s              r'   	gem_roundr      s    
 9nGG|txxY(?@@G}TXXdll7344t;q!XA!66D
aHw&
'.!*D*K*KDFFTX*Y
YCq!X%&T	1)EEDdD#e,A|!a]#AGg:r)   c           	         t        | |      dz  }|t        | |      dz  }t        dd|      t        | dz  |dz  |      z  }t        dd||z
        t        | dz  |dz  |dz        z  |g}	|r9|	j                  t        dd||dz  z         t        | dz  |dz  |d	z        z         |	j                  t        dd||z         t        | d
z  |d
z  |dz        z         t	        |	|      }
t
        |
_        |
|fS )zStep-cut (emerald/radiant/asscher) or cushion: lofted rounded rectangles.
    step=True adds an intermediate crown step so it reads step-cut.r         ?r   rH   ffffff?r   r   g333333?皙?g?ffffff?r   )minr>   RectangleRoundedrL   r   r   r+   )gwgLr   cornerstepr   r   r   r   facesrC   s              r'   gem_rectr      s!    "bkD G}Bd"q!X!1"q&"q&&!IIDAx%'(+;BIrDyRX[^R^+__ESAx'D.89'S"s(FSLIJ 	K	LLQ8g-.#BIrDy&3,GH IU% AAGg:r)   c                 h   | dz  }|| dz  }t        dd|      t        | dz  | dz        z  }t        dd||z         t        | dz  | dz        z  }t        dd||z
        t        | dz  | dz        z  }t        |||g|      }	|r |	j                  t        j
                  d      }	t        |	_        |	|fS )	zKPrincess: square pyramid loft; kite=True turns it 45 deg (corners on axes).r   r   r   rH   g      ?皙?r   -   )r>   	Rectangler   r   rw   rA   r   r+   )
r5   r   kiter   r   r   r   r   r   rC   s
             r'   gem_princessr      s    $hG}Dq!X1q5!a%!88D
aHw&
')AHa$h*G
GCq!X%&1s7AG)DDDdD#e,AHHTVVR AGg:r)   c                     t        dd|      | z  }t        dd||z         t        | |      z  }t        dd||z
        t        | |      z  }	t        |	||g|      }
t        |
_        |
S )zBPear/marquise/any outline: lofted crown + pavilion from a 2D face.r   r   )r>   rB   r   r   r+   )r{   r   r   r   table_scale
keel_scaler   r   r   r   rC   s              r'   gem_outliner      st     q!X%D
aHw&
'%k*B
BCq!X%&tZ)@@DdD#e,AAGHr)   c           	      t   t        |       }t        |t              }t        |d      }||z   }||dz  z   }t        j                  t        |d      z  t        ||t        ||      dz        z  }	t        |	t        j                        j                  t        j                  d      }
t        |      |
_        |
||fS )u   Comfort shank: a rounded-rectangle cross-section REVOLVED 360 degrees
    (v2 — replaces the square-edged tube; reads and casts like a real band).
    Casting floors applied: thickness >=1.0, width >=1.5.      ?rH   r   {Gz?Z   )r[   maxMIN_WALLPlaneXZr>   r   r   revolverw   rA   r   r?   r(   r+   )rX   	thicknesswidthr   inner_rtro   outer_rmidprofr6   s              r'   bandr      s     7#GIx AE3AkG
AE/C88c#qk!$4Q3q!9t;K$LLDdff$$TVVR0A% AGgwr)   c           	         g }t        j                  |      }dD ]>  }	| dz
  }
|	|
z  t        j                  |      z  d|
t        j                  |      z  f}|	|z  dz  d|dz
  f}|d   |d   z
  |d   |d   z
  |d   |d   z
  f}t        j                  t        d	 |D                    }|d   |z  |d   |z  |d   |z  f}t        ||
      t        t        |dz  d      t        |dz  d      d      z  }t        ||
      t        t        |dz  d      t        |dz  d      d      z  }t        ||g      }t        |      |_        |j                  |       A |S )u   Cathedral shoulders v2: LOFTED tapering wedges rising from inside the
    band to under the head rim — replaces the rod-with-ball-end struts that
    read unfinished in every judged round.rG   rI   ?        r   r   r   rG   rH   c              3   &   K   | ]	  }||z    y w)NrZ   ).0xs     r'   	<genexpr>zshoulders.<locals>.<genexpr>   s     +A!a%+s   originz_dirffffff?g?333333?r   r   r   r   ?皙?)r   r   sincossqrtsumr   r   r   r   r(   r+   rL   )r   band_tband_whwr   	angle_degr   outshsgnroot_rp1p2r   r   zdirbasetoprC   s                      r'   	shouldersr      sz    C	i	 B 4FlTXXb\)3"0EFBhosHtO4URU]BqEBqEM2a52a5=9IIc+++,!q!A$(AaD1H-Bd+.>s#S$%<d/D D2T*-=c"Cc$:C.A A$e$

1 Jr)   c           
         |dz
  }||z
  }t        d|xs d      }t        d|dz         }t        dd|      t        || |t        j                  t        j                  t        j
                  f      z  t        dd|dz
        t        || dz  |d	z   t        j                  t        j                  t        j
                  f      z  z
  }	t        |      |	_        |	S )
u   Open cathedral basket bridging band top -> under the stone.
    bore: bottom opening radius — must exceed the pavilion's width at that
    depth or the stone physically cannot seat (a 3ct pavilion is far wider
    than the old fixed 0.65 hole).r   g?g?r   r   alignr   gRQ?r   )r   r>   ConeAlignCENTERMINr(   r+   )
rim_rr   r   r   boregbotbhb0wallbks
             r'   basketr      s    
 T>D	DB	T4<4	 BtR#XD
aD/Dubu||UZU^U^8_`
`1dSj!DUT\2805ellEII/V%X XXB 5!BHIr)   c                    |d   | d   z
  |d   | d   z
  |d   | d   z
  }}}t        j                  ||z  ||z  z   ||z  z         }t        ||z
        dk  r<t        ||t        j
                  t        j
                  t        j                  f      }n<t        |||t        j
                  t        j
                  t        j                  f      }|j                  t        j                  t        j                  t        j                  t        j                  ||      |                  }|j                  t        j                  t        j                  t        j                  ||                  }t        |  |z  S )Nr   rG   rH   gư>r   )r   r   r2   Cylinderr   r   r   r   r   rw   r@   degreesatan2hypotrA   r>   )	p0r   r0r1dxdydzr   cones	            r'   _segr    s   AA11r!ur!u}BB		"r'BG#b2g-.A
27|dAellELL%))%LMBAellELL%))%LM;;tvvt||DJJtzz"b7I2,NOPD;;tvvt||DJJr2,>?@D8d?r)   c	           	      H   t        |t              }t        |dz  t              }	t        j                  ||      }
|rt        dd||
z  z
        nd}||dz  z   ||dz  z   |dz
  f}||dz  z   ||dz  z   ||dz  z   f}|||z  z   |||z  z   ||dz  z   f}t        | |||dz        t        |||dz  |dz        z   t        |||dz  |	      z   }|t        | t        |dz        z  t        | t        |d	z        z  z   t        | t        t        |d
z  t                    z  z   z  }|S )u  Three-segment gripping claw: root arm from the basket rim, near-vertical
    post at the stone edge, edge-hugging curl whose bead rests on the crown
    slope. v2: casting floors — base >=0.8 mm dia, tip >=0.6 mm dia.
    inward_mm: absolute curl reach past the girdle edge — outline stones
    (pear/marquise) need this; the default 20%-of-radius curl lies a full
    millimetre ACROSS a long teardrop's crown (r74).r   r   rG   r   gp=
ף?gp=
ף?r   r   r   (\?r   MIN_PRONG_R	MIN_TIP_Rr   r   r  r>   Sphere)rootgxgyr   r   ro   cx0cy0	inward_mmtip_rr   r;   r   overtipr&   s                   r'   clawr    sP    	A{AD)$E

2rA(1D!i!m#$tA"t)OS29_ho>D"t)OS29_h4.GHDa<rAvx'D.'@
AC	dD!QW	%T4S!d((K	Kc1t8U+
,A#t*va#g
&dfQX6F)F
FIs1t8Y7889 :AHr)   c	                    g }	| D ]w  \  }
}t        j                  |
|      }|r||z  n|}||
|z  |z  z   |||z  |z  z   |dz
  f}t        ||
|||||||rdnd	      }t        |      |_        |	j                  |       y |	S )u   One claw per (gx, gy) girdle point. Roots sit on the basket rim circle,
    or — for elongated outlines (pear/marquise) — at root_frac of each point's
    own radius, so tip claws rise instead of lying sideways (r73).r   r   N)r  )r   r   r  r(   r+   rL   )pointsr   r   r   ro   r   r  r  	root_fracr   r	  r
  r   rrr  r&   s                   r'   claw_setr  &  s    
 C BJJr2'Q]Ub1frk!3a"#4hoFr2x!S##,4$8e$

1 Jr)   c                 ~   t        |t              }t        |dz  t              }t        j                  ||      }	||	z  ||	z  }}
||
||z   z  z   ||||z   z  z   }}|||dz
  f}||||z   |z   f}t        | |||dz        t        |||dz  |      z   t        | t        |dz        z  z   t        | t        |      z  z   }|S )uj  PRODUCTION claw: a settable straight prong blank. Root arm from the
    basket rim to a base just outside the girdle, then a VERTICAL tapered post
    ending in a domed tip `overlength` mm above the crown. The setter cuts the
    bearing at girdle height and bends the remainder over the real stone —
    nothing pre-curls, so a real diamond drops straight in.r   r   r  )r  r	  r
  r   r   ro   
overlengthgapr  r   uxuypxpyr   r  r&   s                    r'   claw_straightr  7  s     	A{AD)$E

2rA!VR!VB"a. "rS1W~"5BHtO$Dr8g%
2
3C	dD!QX	&dCT5)I	I:q4x((
)+.9ve}+D
EAHr)   c	                     g }	| D ]l  \  }
}t        j                  |
|      }|r||z  n|}|
|z  |z  ||z  |z  |dz
  f}t        ||
||||||      }t        |      |_        |	j                  |       n |	S )zCProduction prong set: one straight settable blank per girdle point.r   )r  r  )r   r   r  r(   r+   rL   )r  r   r   r   ro   r   r  r  r  r   r	  r
  r   r  r  r&   s                   r'   claw_set_straightr   I  s     C BJJr2'Q]UQR!Vb[(T/:$B'1%/S:e$

1 Jr)   clrc                     	 t        | |t        j                        S # t        $ r t        | |t        j                        cY S w xY w)u$  Production seat cutter: the stone grown by a TRUE 3D offset — exact
    absolute bearing clearance everywhere. (Scale-based growth proved unsafe:
    build123d scale/center on transformed lofts can leave parts of the stone
    OUTSIDE the 'grown' copy, i.e. an overlapping seat.) clr in mm.kind)offsetKindINTERSECTION	ExceptionARC)stoner!  s     r'   seat_cutter_prodr+  X  s>    
1eSt'8'899 1eStxx001s    %AAc           	         t        | dt        j                        t        | | dz   t        j                        z
  }t        t	        dd||z
        |z  t	        dd||z
  dz         |z  g      }t        |      |_        |S )zSlim visible rail just under the girdle tying every claw post together.
    Thin band (not a bezel wall): the pavilion stays exposed below it.r   r#  r   r   )r%  r&  r)  r   r>   r(   r+   )r{   r   r   dropr   ringrails          r'   gallery_railr0  c  s     4DHH-TD54<dhh78DQ8d?+d2Q8d?T12T9; <DU#DJKr)   c           
         t        |t        dz        }t        | |t        j                        }|t        | d      }nt        | |t        j                        }||z
  ||z   }
}	t        t        dd|	      |z  t        dd|
      |z  g      t        t        dd|	dz
        |z  t        dd|
dz         |z  g      z
  }t        |      |_	        |S )u   Smooth full-bezel collar wrapping a 2D outline. Uniform offset (Kind.ARC)
    keeps the rim even and rounds sharp points — no miter fins.
    clearance_mm (production): the inner cut is the outline offset OUT by an
    absolute bearing clearance instead of the proportional 0.98 shrink.r   r#  g\(\?r   r   )
r   r   r%  r&  r)  rB   r   r>   r(   r+   )r{   r   r   lipdepthr   clearance_mmriminnerlohicols               r'   bezel_collarr:  n  s     tX^$D
t$((
+CdD!t\9x#~BQ2$c!Qmc&9:;3q!R#X&.q!R#X&.0 11C E"CIJr)   c                    g g g }	}}| |dz  z   }
t        |dz  t              }|dk  rdgn*t        |      D cg c]  }||dz
  dz  z
  d|z  dz  z   c}}t        |      D ]  \  }}d|dz  z  }dD ]  }t        |      D ]w  }t	        j
                  |||z   |z  z         }t	        j                  |      t	        j                  |      }}t        ||
z  |z  ||
|z        t        |      z  }t        |_        |j                  |       |	j                  t        || d	|z  z
  z  |z  || d	|z  z
  |z  f|| d|z  z   z  |z  || d|z  z   |z  f|d
z  |d
z               |dz   |k  st	        j
                  |||z   dz   |z  z         }| |dz  z   }t        ||z  t	        j                  |      z  ||t	        j                  |      z        t        |      z  }t        |      |_        |j                  |       z   |||	dS c c}w )u#  Pave v2 — a real setting, not surface dots:
    - melee girdles sit AT the band surface (crown proud, pavilion inside)
    - an azure hole is drilled under every melee (returned as cutters for the
      fused band) so plaster/metal flows correctly and stones can seat
    - shared bead prongs (>=0.5 mm) sit fused to the surface between stones
    rows: parallel rows across the band width (2 = double-row pave, offset a
    half step so the rows brick-lay like real micro-pave).
    Returns {"stones": [...], "prongs": [...], "cutters": [...]}.皙?r  rG   r   rH   r   r   r   gffffff?r   r   )stonesprongscutters)r   
MIN_BEAD_RrK   	enumerater   r   r   r   r>   r  r   r+   rL   r  r(   )r   nr4   	start_degstep_degr   rowsr=  r>  r?  raddot_rjysrow_iystaggersidekthsxszr5   tmprr   s                             r'   pave_rowrT    s;    !"bGFF
AH
CD*%E!)#7<T{"D23dQh!^	A-"DBbM %q# 	%D1X %\\)q7{h.F"FG"txx|Bs
RC"H5q	A!a tWsQw./"4a'C!G:Kr9QRWsQw./"4a'C!G:Kr9QRHa$h ( ) q519i1w;3D2P&PQB 54</BD2I4a"-/17?A)%0AGMM!$!%	%%( 7CC-"Ds   Hc                    t        | |t        j                        }t        |d      r|j	                         n|g}|d   j                         }t        dt        |j                  |z              }g }t        |      D ]=  }|j                  ||z        }	|j                  |	j                  |	j                  f       ? |S )zIEvenly spaced (x, y) points along the TRUE offset outline of any 2D face.r#  r   r      )r%  r&  r)  hasattrr   
outer_wirer   intrp   rK   position_atrL   r?   r@   )
r{   
offset_outspacingr.  r   wirerB  ptsrO   ps
             r'   outline_pointsr`    s    $
2D#D'2DJJLE8 DBDKK')*+A
C1X QU#

ACC: Jr)   c                    g g }}t        | ||dz        }t        |dz  t              }t        |      }	t	        |      D ]  \  }
\  }}t        |||dz         t        |      z  }t        |_        |j                  |       ||
dz   |	z     \  }}t        ||z   dz  ||z   dz  |dz         t        |      z  }t        |      |_        |j                  |        ||dS )	u   Dense accent-stone ring set into the halo seat with shared bead prongs
    (>=0.5 mm). Returns {"stones": [...], "prongs": [...]} — global gem-seat
    cutting in the template sinks the stones into the seat metal.gffffff @)r\  g
ףp=
?r-   rG   rH   g{Gz?)r=  r>  )r`  r   r@  rJ   rA  r>   r  r   r+   rL   r(   )r{   r   r[  stone_rr   r=  r>  r^  rG  rB  rO   r   rK  rC   nxnyr_  s                    r'   	halo_ringre    s     FF
z7T>
BC$
+ECAs^ 	6Aq1ho&8aa!eq[!BR1q2vlHtO<ve}Le$a //r)   c                    g g }}t        |d      \  }}t        | d|      |z  }t        |_        |j	                  |       t        | d|dz
        t        t        d|dz        |dz  ||z
  dz   t        j                  t        j                  t        j                  f      z  t        | d|dz
        t        d|dz  ||z
  dz   t        j                  t        j                  t        j                  f      z  z
  }	t        |      |	_        |j	                  |	       t        d	      D ]  }
t        j                  d
|
dz  z         }t        j                  |      t        j                  |      }}| |dz  |z  z   |dz  |z  |dz
  f}t!        |||z  ||z  ||t"        | d      }t        |      |_        |j	                  |        ||dS )zSide stone v2: a real FACETED ROUND BRILLIANT (not a cone) seated in a
    slim open collar merged into the shank, held by mini-claws at the casting
    floor. Returns {"stones": [...], "metal": [...]}.r   r   r   r   r   r   r   r      r   r   r	   r   )r  r  )r=  r   )r   r>   r   r+   rL   r   r   r   r   r   r(   rK   r   r   r   r   r  r  )cxprQ  r7   band_zr   r=  metalssts_crownr9  rO   angr  r  r  r&   s                   r'   
side_stonern    s    FFB"KB	S!R2	BBH
MM"sAv}%SrDy-A28.06kT-A49LL%,,PUPYPY3Z)\ \ a$'$sBI02Vt/C6;llELLRWR[R[5\+^ ^^C E"CI
MM#1X ll2B;'#Bb4i"n$b4i"nb4i@rBwRWiScRe$a v..r)   c           	          | D cg c]  }t        t        t        |             }}t        | }t	        |d   |dz        t        t        |d      dz        z  }t        ||      }t        |      |_	        |S c c}w )uC   Open swept wire — scrollwork, vines, struts. Casting floor 0.8mm.r   r   r   rH   )
r/   mapfloatSpliner   rs   r   sweepr(   r+   )r  
profile_mmr   qr^  pathr   rC   s           r'   detail_wirerw    sv    )/
0A5UA
0C
03<DAdQh/&Z9MPQ9Q2RRDdDA% AGH 1s    A9c                     t        | D cg c]  }t        |       c} t        t        |d      dz        z  }t	        |      |_        |S c c}w )uB   Placed sphere — granulation, milgrain dots. Casting floor 0.5mm.r   rH   )r>   rq  r  r   r(   r+   )atd_mmr   vr6   s        r'   detail_beadr|    sF    #1eAh#$vc$nq.@'AAA% AGH $s   A)r   )r   NF)r   TNF)FNF)r   gQ?F)r   r   r   )"   r   )r   N)r   r   N)r   r   r   N)r   r<  )r   r   r<  N)g)\(?r  r   )r   r   r   r   N)rR   gp=
ף?rR   r`   r   rG   )r   gHzG?r   )r   )r   r   )r   r   )2__doc__	build123dr   r   r  r  r@  Colorr"   r   r0   SUPPORTstrr(   boolr:   rq  rD   rW   r[   rm   r/   rq   r}   r   r   r   r   r   r   r   r   r   r   r   r  segr  r  r  r   r+  r0  r:  rT  r`  re  rn  rw  r|  rZ   r)   r'   <module>r     s     	

 D$%$d#4t$dD$'	
 dD
!!!"# dD
!s u d De D>*% *E * 
#jZJ	C  %u*= $> !1 	7I&& =A',. 	  ;>, FI $"$ BI:>1 1 IP"( GN#DL
0&/8r)   