Ë
    :vžj`  ã                   ób  — d dl Z d dlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ  ej                  «       d	k(  röe j                  j                  d
d«      j!                  d«      D � cg c]  }  e| «      d kD  sŒ| ‘Œ c} ZdD ]�  Ze j(                  j+                  ed«      Ze j(                  j-                  e«      sŒ; e j.                  e«      D ]2  Zdev sŒej3                  e j(                  j+                  ee«      «       Œ4 Œƒ dj+                   ee«      «      Z ej6                  de«       n³ ej                  «       dk(  rƒe j                  j                  d
d«      j!                  d«      D � cg c]  }  e| «      d kD  sŒ| ‘Œ c} Zej9                  g d¢«       dj+                   ee«      «      Z ej6                  de«       ne j                  j                  d
d«      Z ej:                  de¬«      ZeduZddddœZ	 	 	 	 	 d$de
de	de de de de fd „Z!	 d%d!e"d"e"de fd#„Z#yc c} w c c} w )&é    Né   )Úutil)Úlog)Ú
get_string)ÚBooleanOperationTypeÚIterableé   )Ú
MeshScriptÚWindowsÚPATHÚ Ú;)zC:\Program FileszC:\Program Files (x86)zBlender FoundationÚBlenderzsearching for blender in: %sÚDarwinÚ:)z(/Applications/blender.app/Contents/MacOSz(/Applications/Blender.app/Contents/MacOSz0/Applications/Blender/blender.app/Contents/MacOSÚblender)ÚpathÚUNIONÚ
DIFFERENCEÚ	INTERSECT)ÚunionÚ
differenceÚintersectionÚmeshesÚ	operationÚ	use_exactÚuse_selfÚdebugÚcheck_volumec                 ót  — t         st        d«      ‚|rt        d„ | D «       «      st        d«      ‚|j                  «       j	                  «       }|t
        vr$t        d|› dt
        j                  «       › d�«      ‚|rd}nd}t        d«      }|j                  d	t
        |   «      j                  d
|«      j                  d|› «      }	t        | |	|¬«      5 }
|
j                  t        dz   «      }ddd«       t        j                  «      }|D ]	  }d|_        Œ t        j                  |«      S # 1 sw Y   ŒAxY w)aÂ  
    Run a boolean operation with multiple meshes using Blender.

    Parameters
    -----------
    meshes
      List of mesh objects to be operated on
    operation
      Type of boolean operation ("difference", "union", "intersect").
    use_exact
      Use the "exact" mode as opposed to the "fast" mode.
    use_self
      Whether to consider self-intersections.
    debug
      Provide additional output for troubleshooting.
    check_volume
      Raise an error if not all meshes are watertight
      positive volumes. Advanced users may want to ignore
      this check as it is expensive.

    Returns
    ----------
    result
      The result of the boolean operation on the provided meshes.
    úNo blender available!c              3   ó4   K  — | ]  }|j                   –— Œ y ­w)N)Ú	is_volume)Ú.0Úms     úk/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/interfaces/blender.pyÚ	<genexpr>zboolean.<locals>.<genexpr>T   s   è ø€ Ð<±V° §¥±Vùs   ‚zNot all meshes are volumes!Ú`z` is not a valid boolean: `ÚEXACTÚFASTz!templates/blender_boolean.py.tmplz
$OPERATIONz$SOLVER_OPTIONSz	$USE_SELF)r   Úscriptr   ú --background --python $SCRIPTN)ÚexistsÚ
ValueErrorÚallÚlowerÚstripÚ_blender_boolÚkeysr   Úreplacer
   ÚrunÚ_blender_executabler   Úmake_sequenceÚface_normalsÚconcatenate)r   r   r   r   r   r   ÚkeyÚsolver_optionsÚtemplater+   ÚblendÚresultr%   s                r&   Úbooleanr?   1   s5  € õB ÜÐ0Ó1Ð1ÙœCÑ<±VÓ<Ô<ÜÐ6Ó7Ð7ð �/‰/Ó
×
!Ñ
!Ó
#€CØ
”-ÑÜØ�	ˆ{Ð5´m×6HÑ6HÓ6JÐ5KÈ1ÐMó
ð 	
ñ Ø ‰àˆô Ð=Ó>€Hð
 	×Ñ˜¤}°SÑ'9Ó:ß	‰Ð" NÓ	3ß	‰�  
Ó	,ð ô
 
˜6¨&¸Õ	>À%Ø—‘Ô.Ð1QÑQÓRˆ÷ 
?ô ×Ñ Ó'€FÛˆàˆ�ð ô ×Ñ˜FÓ#Ð#÷ 
?Ð	>ús   ÃD.Ä.D7Úangle_limitÚisland_marginc                 óF  — t         st        d«      ‚t        d«      }|j                  d|d›«      j                  d|d›«      }t	        | g|d|¬«      5 }|j                  t        dz   «      }d	d	d	«       t        j                  «      D ]	  }d	|_	        Œ |S # 1 sw Y   Œ,xY w)
z0
    Run an unwrap operation using blender.
    r!   z$templates/blender_unwrap.py.templatez$ANGLE_LIMITz.6fz$ISLAND_MARGINÚobj)r   r+   Úexchanger   r,   N)
r-   r.   r   r4   r
   r5   r6   r   r7   r8   )	Úmeshr@   rA   r   r<   r+   r=   r>   r%   s	            r&   ÚunwraprF   x   s«   € õ ÜÐ0Ó1Ð1ô Ð@ÓA€HØ×Ñ˜n°¸SÐ0AÓC×KÑKØ˜]¨3Ð/ó€Fô 
˜D˜6¨&¸5ÈÕ	NÐRWØ—‘Ô.Ð1QÑQÓRˆ÷ 
Oô ×Ñ Ö'ˆàˆ�ð (ð €M÷ 
OÐ	Nús   ÁBÂB )r   TFFT)g     €P@g        F)$ÚosÚplatformr   r   Ú	constantsr   Ú	resourcesr   Útypedr   r   Úgenericr
   ÚsystemÚenvironÚgetÚsplitÚlenÚ_search_pathÚpfr   Újoinr-   ÚlistdirÚpÚappendÚsetr   ÚextendÚwhichr6   r2   Úboolr?   ÚfloatrF   )Úis   0r&   Ú<module>r^      sD  ðÛ 	Û å Ý Ý "ß 2Ý à€8‡?�?Ó˜	Ò!ð  "Ÿz™zŸ~™~¨f°bÓ9×?Ñ?ÀÔDÓSÑD˜!ÉÈAËÐQRË
’AÐDÑS€LÛ>ˆØ�W‰W�\‰\˜"Ð2Ó3ˆØ�7‰7�>‰>˜"ÕØ�R—Z‘Z –^�Ø ’>Ø ×'Ñ'¨¯©¯©°R¸Ó(;Õ<ñ $ð ?ð —8‘8™C Ó-Ó.€LØ€C‡I�IÐ,¨lÕ;Ø€X‡_�_Ó˜(Ò"à!Ÿz™zŸ~™~¨f°bÓ9×?Ñ?ÀÔDÓSÑD˜!ÉÈAËÐQRË
’AÐDÑS€LØ×Ñò	
ôð —8‘8™C Ó-Ó.€LØ€C‡I�IÐ,¨lÕ;à—:‘:—>‘> &¨"Ó-€Là �d—j‘j °Ô>Ð Ø	 DÐ	(€ð
 ØØñ€ð '3ØØØØñD$ØðD$à#ðD$ð ðD$ð ð	D$ð
 ðD$ð óD$ðP PUñØðØ49ðØHLôùòW Tùò Ts   Á*H'Á;H'Å4H,ÆH,