
    ;KjS              	       Z   d Z ddlZddlZddlmZ ddlZdZ	dZ
ddiZdZd	Zd
 ZddZd Zedk(  r| ej$                  d      e_         ed eej&                              D ]H  Z ee      Zej1                  de d        ede dej4                  dz  ddej6                          J yy)u  Curvy 'beauty' connectors: loft a rounded-rect cross-section along the connector axis, blending from the
HOLDER face size down to the YOKE-arm size, with a waist pinch mid-span. EXTRUDE_FRAC=0.5 = reach only
halfway toward the yoke (Cameron 2026-07-02).

RECOVERY NOTE (2026-07-06): reconstructed from session context. Constants + _rrect + curvy_connector are
verbatim; _stitch was REWRITTEN from its documented behavior (stitch rings -> watertight loft) — verify
against the lab original when phe108 is back.    N)boxg      @g333333?   g333333?      ?   c                 6   | D cg c]  }t        j                  |t               } }t        | d         }t        j                  |       }g }t        t        |       dz
        D ]F  }||z  |dz   |z  }}t        |      D ])  }|dz   |z  }	|||z   ||	z   ||	z   g||z   ||	z   ||z   ggz  }+ H t        |      t        |      dz   }}
t        j                  || d   j                  d      | d   j                  d      g      }t        |       dz
  |z  }t        |      D ]8  }|dz   |z  }	|j                  |
|	|g       |j                  |||z   ||	z   g       : t        j                  |t        j                  |      d      }|j                          |S c c}w )zStitch a list of same-length rings (K points each, matched order) into a closed watertight mesh:
    side quads between consecutive rings + triangle-fan end caps. [RECONSTRUCTED]r      T)process)npasarrayfloatlenvstackrangemeanappendtrimeshTrimesharrayfix_normals)ringsrKVFia0b0jj2c0c1lastms                 0/home/cameronsmith/cad_recovery_mnt/gen_curvy.py_stitchr&      s    ,11aRZZ5!1E1E!HA
		%A
A3u:>" IQQ!Bq 	IAa%1B2627BG,rAvrBwQ.GHHA	II
 VSVaZB
		1eAhmmA&b	q(9:;AJNaD1X ,!eq[	"b!	"dQhr	*+, 	288A;5AMMOH% 2s   !Fc           
      &   t        dt        || dz
  |dz
              }g }| |z
  ||z
  df| |z
   ||z
  t        j                  dz  f| |z
   ||z
   t        j                  f| |z
  ||z
   dt        j                  z  dz  ffD ]z  \  }}}t	        |      D ]f  }|t        j                  dz  |z  |dz
  z  z   }	|j                  ||t        j                  |	      z  z   ||t        j                  |	      z  z   f       h | t        j                  |      S )zWRounded-rectangle outline with a FIXED point count (4*nc) so lofted rings always align.gMbP?g           r   r   )	maxminr   pir   r   cossinr   )
abr   ncptscxcyr   kangs
             r%   _rrectr6   ,   s   D#aT1t8,-A
CAq1uc*q1uXq1ubeeai,Ha%AE(BEE2QUa!eHa"%%iRSm4TV E
Br 	EA	Q"q&11CJJQ_,b1rvvc{?.BCD	EE
 ::c?    c                    t        j                  dd      }t        j                  dd      }t        j                  t        j                  | dz
           t        j                  t        j                  |          }}|j
                  |j
                  d d df   t        j                  k     }t        j                  |j                  d      |j                  d            t        j                  |j                   }}t        j                  ||||      \  }}	t        j                  ||	   d   |      }
|
j                  d      }|
d   |
d   z
  |
d   |
d   z
  }}t        j                  j!                  |      dz  t        j                  j!                  |      dz  }}|t        j                  j!                  |      z  |t        j                  j!                  |      z  }}t        j                  ||   d   g|      d   }||z
  t        j                  j!                  ||z
        z  }t        j                  ||      |z  }t#        |j                               t#        ||z        z
  }t#        |j                               t#        ||z        z
  }|||z
  d	z   t$        z  z   }t        j                  ||   d   |      }||z  j                         ||z  j                         z
  dz  d
z   }||z  j                         ||z  j                         z
  dz  d
z   }t&        j)                  | t*              }g }t-        t.              D ]  }|t.        dz
  z  }d|t        j0                  t        j2                  |z        z  z
  }|d|z
  z  ||z  z   |z  } |d|z
  z  ||z  z   |z  }!t5        | |!t        t6        | dz
  |!dz
              }"|j9                  |||z  |z  z   t        j:                  |"d d df   |      z   t        j:                  |"d d df   |      z           t=        |      }#|#j?                  t        j                  t        j                  jA                  t        j                  |                       |#S )Nzyoke_exact.stlmesh)forcezholder_approx_drilled.stlr   r   r   r(   g      @g      ?g      ?r   )!r   loadg_mmLAYOUTvertices
YOKE_ARM_X
_box_facesr*   r)   bounds_closest_facestransform_pointsr   r   linalgnormr   EXTRUDE_FRACWAIST_BY_CONNgetWAISTr   Nr-   r+   r6   Rr   outerr&   apply_transforminv)$r   yokeholderTyTharmyfaceshfacesr.   r/   hwhce1e2h1h2e1ue2uycbdirprojnearfardepthaendya1ya2wr   r4   tpinchaabbp2conns$                                       r%   curvy_connectorro   8   s   <<(7D\\5VDFUU188AE?#QUU188A;%7B
--ad+all:
;C\\#''!*cggaj91<<;WFFFFB3DAq		!	!&)A,	3B"''!*RURU]BqEBqEMBYY^^B!#RYY^^B%7!%;BBIINN2&&RYY^^B-?(?C		!	!6!9Q<."	5a	8BGryy~~b2g..D##C,t3DuR$Y//D


eBI.
.CC$J$44E##F1IaL"5D3J 0 0 22a
7#
=C3J 0 0 22a
7#
=C!U#AE1X `QKa"&&+++AElS1W$-AElS1W$-BC28R#X67R$,**RXXbAh-DDrxxPRSTVWSWPXZ]G^^_` 5>Dryy}}QXXa[9:;Kr7   __main__ztwo_servo_from_blender.glbr   connector_curvy_z.stlz: vol=i  z.1fzcm3 wt=)   )__doc__numpyr   r   shapely.geometryr   sboxgen_two_servor<   rL   rJ   rH   rG   rK   r&   r6   ro   __name__read_layoutr>   r   r   r   cexportprintvolumeis_watertight r7   r%   <module>r      s   1   ( E
0	D zq}}9:AH1c!((m$ WA	#A3d+, 6!((4-)<GAOOCTUVW r7   