
    ^jp                       d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 dddZ
dddZedk(  ra e
ej                  d	   ej                  d
    eej                        dkD  rej                  d   nd        edej                  d
           yy)u	  Cast export — the printable file.

Loads a generated design module, builds the FUSED metal-only body, verifies it
is one valid solid, and writes the STL the jeweler resin-prints for lost-wax
casting (stones are set after casting and are never part of the print).
    )annotationsN)Path)
export_stlc                   t        |       }t        j                  j                  d|      }t        j                  j	                  |      }t
        j                  j                  dt        |j                               |j                  j                  |       t        |d      r5t        |j                  j                  di       j                  dd            nd}|j!                         }|j#                         }t%        |      dk7  rt'        dt%        |       d	      |j(                  }	t+        |	      r |	       st'        d
      |	st'        d
      t-        ||dd       t/        ||j0                         |rt        |d      rddlm}
  |
|g|j7                         z         }|dk7  rNt        t        |      j9                  t        |      j:                  j=                  dd      d|ddz               }t-        ||dd       t/        ||j0                         |dk7  r7dd l}|jA                  |      }|jC                  |       |jE                  |       tG        |       y y y )Ngen_modr   SPECcastingshrink_scale      ?   zmetal body is z solids, expected 1z$fused metal body failed OCC validityg{Gz?g333333?)	toleranceangular_tolerance)expected_volgen_supports)fuse_allz-print z-print-sz.4fz.stl)$r   	importlibutilspec_from_file_locationmodule_from_specsyspathinsertstrparentloaderexec_modulehasattrfloatr   get	gen_metalsolidslenRuntimeErroris_validcallabler   _make_watertightvolumeringcli.partsr   r   	with_namestemreplacetrimeshloadapply_scaleexportprint)gen_pathout_stlout_print_stlgenspecmodshrinkmetalr"   ivr   	printabler-   ms                 /opt/ringagent/ringcli/cast.pyexport_castr>      s   
x.C>>11)SAD
..
)
)$
/CHHOOAs3::'KKC 3 388<<	2.22>3GH%( MMOE\\^F
6{a^CK=8KLMM	BRLBDABB ')ABB ugEW5<<8n5*eWs'7'7'99:	S=  ] 3 = =]#((002>VCL-.!/ 0M 	9mtsSY5E5EFS=]+AMM&!HH]#m# 6}    c           	        ddl }ddl}|j                  |       }|j                  ryddl}|j                  |j                  |j                        |j                  |j                        dd      \  }}|j                  ||      }|j                  st        d|  d      |r|n|j                  }	t        |j                  |	z
        dt        |	d	      z  kD  r!t        d
|j                  dd|	dd|  d      |j                  |        y)u-  OCC tessellation leaves cracked/non-manifold edges at tangencies; print
    houses bounce those. Repair in place and verify against the OCC solid's
    exact volume — a NON-watertight mesh has no meaningful volume, so the old
    repaired-vs-broken comparison misfired on heavily-segmented geometry.r   NTF)joincompremove_smallest_componentszmesh repair failed: z still not watertightg{Gz?r   zmesh repair volume z.1fz  deviates >8% from solid volume z ())numpyr-   r.   is_watertight	pymeshfixclean_from_arraysasarrayverticesfacesTrimeshr$   r(   absmaxr0   )
r   r   npr-   r<   rF   vfm2refs
             r=   r'   r'   8   s   
 TA&&rzz!**'=rzz!''?R,0>C ' EDAq 
A	B1$7LMNN&,AHHC
299s?dSc]2203 @003Cy4&C D 	DIIdOr?   __main__r         z
cast STL: )N)r2   r   r3   r   r4   z
str | NonereturnNone)r   zfloat | NonerV   rW   )__doc__
__future__r   importlib.utilr   r   pathlibr   	build123dr   r>   r'   __name__argvr#   r1    r?   r=   <module>r`      s    #  
   $N0 zSXXa[SXX9J#((1+PTU	Jsxx{m
$% r?   