
    z;jy                        d Z ddlmZmZmZmZmZ dZd\  ZZ	d\  Z
Zd\  ZZg dZg dZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZd Zdad Z d Z!d'dZ"e#dk(  r e"       Z$e$jK                         D  cg c]  } | jL                  dkD  s|  c} Z'e'r e(e'd       ne$Z) ee)ddd !        e*d"e)jL                  d#d$ e+e'       d% e+e$jK                                d&       yyc c} w )(u1  Both-sides wrapping servo holder (iteration v1) for the Feetech STS3215.

Design intent (Cameron): TOM's servo_end_mount bolts to ONE face (cantilevered).
This instead CRADLES the body — a sleeve wrapping the X-Z faces, closed by flanges
on BOTH the +Y (horn-side) and -Y (idler-side) mount faces, each bolted to the
servo's REAL extracted corner holes (hole_markers.json). TOM-inspired exactness,
two-sided robustness.

Servo STEP frame (mm): output axis +Y through (-25.5,0); horn protrudes +Y at x=-25.5.
Body bbox X[-35.6,9.6] Y[-28.2,9.6] Z[-12.4,12.4].
    )BoxCylinderPosRot
export_stlzM/data/cameron/repos/cad_experiments/parts/waveshare_feetech_st3215_servo.step)gAg333333#@)g(g(@)皙@g9)3333331ffffff$@r
   ffffff$)      @r   )r   r   )r	   r   )@r   )r   r   g?g333333?g      @g@r   g333333@g@g       g      #@g      @g     9g      8@c                 n    t        | |z   dz  ||z   dz  ||z   dz        t        || z
  ||z
  ||z
        z  S )N   )r   r   )x0x1y0y1z0z1s         6/data/cameron/repos/smith300_para_stuff/wrap_holder.py_boxr   0   sG    R1}rBw!mb2g];c"r'2PR7TVY[T[>\\\    Nc                  >    t         ddlm}   | t              a t         S )zKCached servo solid for trimming (so screw bosses conform to the real body).r   import_step)_SERVO	build123dr   
SERVO_STEPr   s    r   _servor!   7   s     ~)Z(Mr   c                     | t               z
  } t        dkD  r>t        }|ddf| ddfd|dfd| dfdd|fdd| ffD ]  }| t        | t               z  z
  }  | S )u   Subtract the servo (+SERVO_CLEAR gap) from the holder. OCP offset() fails on the
    detailed geared servo, so dilate by subtracting the servo plus 6 axis-shifted copies
    (octahedral Minkowski — robust, guaranteed to contain the raw servo).r   )r!   SERVO_CLEARr   )partcds      r   _trim_servor'   @   sy     &(?DQa)qb!QZ!QQAJAq	AqSTRT:VA37VX-.D WKr   c           
         t         t        z
  t        t        z   }}t        t        z
  t        t        z   }}|t
        z
  |t
        z   }}|t
        z
  |t
        z   }}t        ||t        t        ||      t        ||t        dz
  t        dz   ||      z
  }	t        t        t        t        z   ft        t        t        z
  t        ffD ]5  \  }
}}|	t        |
|||t        |      z   }	|	t        |
||||t               z   }	7 |t        z   |t        z
  }}t        t        z   t        t        z
  }}|	t        |||||dz
  |dz         z
  }	|	t        |||||dz
  |dz         z
  }	|	t        t        dd      t!        ddd      z  t#        t$        d      z  z
  }	t&        D ]  \  }}|t        k\  s|	t        |t        t        dz  z   |      t!        ddd      z  t#        t(        t              z  z   }	|	t        |t        t        dz  z   |      t!        ddd      z  t#        t*        dz  t        dz         z  z
  }	|	t        |t        t        z   t,        dz  z
  |      t!        ddd      z  t#        t.        dz  t,              z  z
  }	 t0        D ]  \  }}|t        k\  s|	t        |t        t        dz  z
  |      t!        ddd      z  t#        t(        t              z  z   }	|	t        |t        t        dz  z
  |      t!        ddd      z  t#        t*        dz  t        dz         z  z
  }	|	t        |t        t        z
  t,        dz  z   |      t!        ddd      z  t#        t.        dz  t,              z  z
  }	 | rt3        |	      }	|	S )N   r   Z   P   r   )BX0CLEARBX1BZ0BZ1WALLr   BOT_YTOP_YTOP_X0FTBOT_X0FZWIN_Br   
SWEEP_AX_Xr   r   R_SWEEP	TOP_HOLESBOSS_RBOLT_DCB_DEPTHCB_D	BOT_HOLESr'   )trimix0ix1iz0iz1ox0ox1oz0oz1r$   r   r   r   wx0wx1wy0wy1xzs                      r   make_wrap_holderrP   L   s'   U{C%KCU{C%KCTz3:CTz3:C S%S1Dc519eVWiY\^a4bbD !%4vurz56QRRd2sBB44d2sBC"55 S U{C%KCu}eemC$sCc37C!G<<D$sCc37C!G<<D 3z1a(3r1a=88GR;PPQD A;3q%"q&.!4s2q!}DxPVXZG[[\D3q%"q&.!4s2q!}DxPVYZPZ\^ab\bGccdD3q52:A"=qACAqMQT\]ade]egoTppqD	 
 A;3q%"q&.!4s2q!}DxPVXZG[[\D3q%"q&.!4s2q!}DxPVYZPZ\^ab\bGccdD3q52:A"=qACAqMQT\]ade]egoTppqD	  4 Kr   __main__g      ?c                     | j                   S )N)volumess    r   <lambda>rV   |   s    188r   )keyzwrap_holder.stlg?F)	toleranceascii_formatzwrote wrap_holder.stl  vol=z.0fzmm3  real_solids=z (raw ))T),__doc__r   r   r   r   r   r   r    r,   r.   r/   r0   r3   r2   r;   r@   r-   r#   r1   r5   r=   r?   r>   r<   r4   r6   r7   r8   r9   r:   r   r   r!   r'   rP   __name__psolidsrS   realmaxr$   printlenrT   s   0r   <module>rc      sB  
 : 9\
 SSuF	F	
	
	
 
	 

] 
	)X zAxxz4z!QXX^Az4D043t+,!Dt&#EJ	'C'88I#d)TZ[^_`_g_g_i[jZkkl
mn  5s   3C#C#