
    TiR                     ,   d dl Z d dlZd dlmZ d dlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddlm$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 	 ddl5m6Z6m7Z7 n## e8$ rZ9 ee9          Z6de:fdZ7Y dZ9[9ndZ9[9ww xY wdee;         fdZ<dee;         fdZ=	 	 	 	 d0d!ed"ee;         d#eej>                 d$ee;         d%e?defd&Z@	 	 	 	 d1d!ed"ee;         d#eej>                 d%e?d'ee         defd(ZAde
fd)ZBd2d*ZCd+e;defd,ZDdefd-ZE	 	 d3d"ee;         d#eej>                 d%e?defd.ZFeCeCeCeCd/ZGi ZHeHI                    e$           eHI                    e,           eHI                    e*           eHI                    e&           eHI                    e(           eHI                    e!           eHI                    e#           eHI                    e2           eHI                    e.           eHI                    e0           eHI                    e4           eHI                    e           i ZJeJI                    e           dS )4    N)deepcopy   )	resolversutil)Trimesh)ExceptionWrapper)Geometry
LoadSource
PointCloud)Sceneappend_scenes)DictLoadableOptionalSet)log   )misc)_binvox_loaders)_cascade_loaders)_collada_loaders)_gltf_loaders)_misc_loaders)_obj_loaders)_off_loaders)_ply_loaders)_stl_loaders)_threedxml_loaders)_three_loaders)_xaml_loaders)_xyz_loaders)	load_pathpath_formatsreturnc                      t                      S N)set     O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trimesh/exchange/load.pyr$   r$   %   s    uur*   c                  H    d t                                           D             S )z
    Get a list of mesh formats available to load.

    Returns
    -----------
    loaders
      Extensions of available mesh loaders
      i.e. `{'stl', 'ply'}`
    c                 B    h | ]\  }}t          |t                    |S r)   )
isinstancer   .0kvs      r+   	<setcomp>zmesh_formats.<locals>.<setcomp>4   s,    VVV$!QjDT6U6UVAVVVr*   )mesh_loadersitemsr)   r*   r+   mesh_formatsr6   )   s%     WV,,,..VVVVr*   c                      t                      } |                     t                                 |                     t                                                     | S )z
    Get a list of all available loaders


    Returns
    -----------
    loaders
      Extensions of all available loaders
      i.e. `{'stl', 'ply', 'dxf'}`
    )r6   updater$   compressed_loaderskeys)loaderss    r+   available_formatsr<   7   sG     nnGNN<>>"""NN%**,,---Nr*   Ffile_obj	file_typeresolverforceallow_remotec                    t          d	| |||d|}|dk    r(t          j        d           |                                S |dk    rt          j        d           |S |j        j        }h d}||vrt          |j                  dk    rmt          t          |j        
                                                    }	|	j                            |j                   t          |	t                    s|dv r|	S |S )
a  
    THIS FUNCTION IS DEPRECATED but there are no current plans for it to be removed.

    For new code the typed load functions `trimesh.load_scene` or `trimesh.load_mesh`
    are recommended over `trimesh.load` which is a backwards-compatibility wrapper
    that mimics the behavior of the old function and can return any geometry type.

    Parameters
    -----------
    file_obj : str, or file- like object
      The source of the data to be loadeded
    file_type: str
      What kind of file type do we have (eg: 'stl')
    resolver : trimesh.visual.Resolver
      Object to load referenced assets like materials and textures
    force : None or str
      For 'mesh': try to coerce scenes into a single mesh
      For 'scene': try to coerce everything into a scene
    allow_remote
      If True allow this load call to work on a remote URL.
    kwargs : dict
      Passed to geometry __init__

    Returns
    ---------
    geometry : Trimesh, Path2D, Path3D, Scene
      Loaded geometry as trimesh classes
    r=   r>   r?   rA   meshzO`trimesh.load(force='mesh')` is a compatibility wrapper for `trimesh.load_mesh`scenezQ`trimesh.load(force='scene')` is a compatibility wrapper for `trimesh.load_scene`>   glbzipgltf3dxmltar.gzr   >	   dxfmshobjoffplystlsvgxamlbinvoxr)   )
load_scener   debugto_meshsourcer>   lengeometrynextitervaluesmetadatar8   r.   r   )
r=   r>   r?   r@   rA   kwargsloadedkindalways_scenegeoms
             r+   loadrc   I   s1   L  !	 
  F 	]	
 	
 	
 ~~	'			_	
 	
 	
  ="D<<<L<C$8$8A$=$=D//112233V_---dJ'' 	4 
4
 
,
 
,
 KMr*   r]   c           
         t          | |||          }	 t          | t                    rt          |           }n|j        t                      v rt          d|j        |j        |d|}n|j        t          v rZt          |          }|
                    t          |j                 d|j        |j        |j        |d|           t          di |}ny|j        t          v rt          |j        fd|j        i|}nQ|j        t          v r+t          |j                 d|j        |j        |j        d|}nt          d|j         d          |j        r|j                                         n&# |j        r|j                                         w w xY wt          |t$                    s||_        t%          |          }||_        |j                                        D ]	}	||	_        
|S )	aR  
    Load geometry into the `trimesh.Scene` container. This may contain
    any `parent.Geometry` object, including `Trimesh`, `Path2D`, `Path3D`,
    or a `PointCloud`.

    Parameters
    -----------
    file_obj : str, or file- like object
      The source of the data to be loadeded
    file_type: str
      What kind of file type do we have (eg: 'stl')
    resolver : trimesh.visual.Resolver
      Object to load referenced assets like materials and textures
    force : None or str
      For 'mesh': try to coerce scenes into a single mesh
      For 'scene': try to coerce everything into a scene
    allow_remote
      If True allow this load call to work on a remote URL.
    kwargs : dict
      Passed to geometry __init__

    Returns
    ---------
    geometry : Trimesh, Path2D, Path3D, Scene
      Loaded geometry as trimesh classes
    rC   )r=   r>   r]   )r=   r>   r?   r]   r>   r=   r>   r?   zfile_type 'z' not supportedr)   )_parse_file_argsr.   dict_load_kwargsr>   r$   r#   r=   r4   r   r8   r?   r9   _load_compressedvoxel_loadersNotImplementedError
was_openedcloser   _sourcerY   r\   )
r=   r>   r?   rA   r]   r^   argr_   parsedgs
             r+   rT   rT      sM   H !	  C+!h%% $	T!(++FF]lnn,, -!  	 FF ]l**f%%FMMS]+  \!m \%	 
     "++F++FF]000%clVVcmVvVVFF]m++"3=1 -  	 FF &&RCM&R&R&RSSS
 > 	!L    > 	!L    	! fe$$ v FN_##%%  		Ms   D7E- -#Fc                  >    t          | i |                                S )aJ  
    Load a file into a Trimesh object.

    Parameters
    -----------
    file_obj : str or file object
      File name or file with mesh data
    file_type : str or None
      Which file type, e.g. 'stl'
    kwargs : dict
      Passed to Trimesh constructor

    Returns
    ----------
    mesh
      Loaded geometry data.
    )rT   rV   )argsr^   s     r+   	load_meshrt     s#    $ t&v&&..000r*   c           
         t          | ||          }g }t          j        |j        |j                  }t          j        |          }i }|rt                      }	n\d |                                D             }
|
	                    t                                rt                      }	nt                      }	|                                D ]\  }} 	 t          j        |                                          }|dv rddl}5|dk    rddl} |j        |           ||<   S||	vrX|                    t)          d| ||d|           |# t*          $ r t-          j        dd	
           Y w xY w|j        r|j                                         t5          |          }t7          |t8                    r|j                            |           |S )a  
    Given a compressed archive load all the geometry that
    we can from it.

    Parameters
    ----------
    file_obj : open file-like object
      Containing compressed data
    file_type : str
      Type of the archive file
    mixed : bool
      If False, for archives containing both 2D and 3D
      data will only load the 3D data into the Scene.

    Returns
    ----------
    scene : trimesh.Scene
      Geometry loaded in to a Scene object
    re   )r=   r>   c                 Z    h | ](}t          j        |                                          )S r)   )r   split_extensionlower)r0   ns     r+   r3   z#_load_compressed.<locals>.<setcomp>?  s/    MMMD(++1133MMMr*   )yamlymlr   Njsonzfailed to load file in zipT)exc_infor)   )rf   r   
decompressr=   r>   r   ZipResolverr<   r:   
isdisjointr6   r$   r5   rw   rx   rz   	safe_loadr|   rc   appendrT   BaseExceptionr   rU   rl   rm   r   r.   r   r]   r8   )r=   r>   r?   mixedr^   ro   
geometriesarchivemeta_archive	availablecontains	file_namecompressed_typerz   r|   results                   r+   ri   ri     s+   , H	H
U
U
UC J os|s}MMMG$W--H L  	'%''		 NMX]]__MMM|~~.. 	'$II$I&}} C C	8	C"29==CCEEO /11 F***3$)H*=*=Y' 	11  %-%  	      	C 	C 	CI2TBBBBBB	C
 ~  :&&F &%   -|,,,Ms$   .EEE$#E E+*E+urlc                      t          d| dd|S )ar  
    Load a mesh at a remote URL into a local trimesh object.

    This is a thin wrapper around:
      `trimesh.load_scene(file_obj=url, allow_remote=True, **kwargs)`

    Parameters
    ------------
    url
      URL containing mesh file
    **kwargs
      Passed to `load_scene`

    Returns
    ------------
    loaded : Trimesh, Path, Scene
      Loaded result
    T)r=   rA   r)   )rT   )r   r^   s     r+   load_remoter   v  s    & @s@@@@@r*   c                     dt           ffd}dt          ffd}fd}fd}fd}t                    dk    r6t          |           dk    r#t          | d         t                    r| d         |d	f|d
f|df|df|dff}d                                 D             |D ],\  }}	t          fd|	D                       r |            c S -t          d                                           )z@
    Load geometry from a properly formatted dict or kwargs
    r%   c                                          dd          } d d                                         D             }| t                      }|j                            |           | D ]w}t          |t                    r |j        j        di | *t          j	        |          r9t          |          dk    r& |j        j        |d         |d         fi |d          xnt          |          }                     d	          }|r!||_                             d
          |_        dv rd         |j        _                             d          t          t                    r!|j                            d                    not          t                    rDfdfdg}|D ]6}	 |j                             |                        n# t           $ r Y 3w xY wnt#          j        d           |S )z
        Load a scene from our kwargs.

        class:      Scene
        geometry:   dict, name: Trimesh kwargs
        graph:      list of dict, kwargs for scene.graph.update
        base_frame: str, base frame of graph
        graphNc                 4    i | ]\  }}|t          |          S r)   )rh   r/   s      r+   
<dictcomp>z6_load_kwargs.<locals>.handle_scene.<locals>.<dictcomp>  s$    NNN41aA|ANNNr*   rY      r   r   r   cameracamera_transform
base_framer]   c                  ,    t          j                   S r'   )r|   loadsr]   s   r+   <lambda>z4_load_kwargs.<locals>.handle_scene.<locals>.<lambda>  s    
8,, r*   c                  T    t          j                             dd                    S )N'")r|   r   replacer   s   r+   r   z4_load_kwargs.<locals>.handle_scene.<locals>.<lambda>  s!    
8#3#3C#=#=>> r*   zunloadable metadatar)   )getr5   r   rY   r8   r.   rg   r   r   is_sequencerX   r   r   r   r]   strr   r   warning)	r   rY   rE   r1   r   
candidatescr]   r^   s	          @r+   handle_scenez"_load_kwargs.<locals>.handle_scene  s:    

7D))NN6*3E3K3K3M3MNNNGGEN!!(+++ ; ;a&& ;&EK&++++++%a(( ;SVVq[[&EK&qtQqT::QqT:::	; (OOE H%% 	D!EL%+ZZ0B%C%CE"6!!%+L%9EK"::j))h%% 	/N!!&"45555#&& 	/
 -,,,>>>>J    N))!!##...E$   D!K-...s   ."G
GGc                      t           d         t                    st           d         t                    rt          di t          j                   S t          di  S )zC
        Handle the keyword arguments for a Trimesh object
        verticesfacesr)   )r.   rg   r   r   	load_dictr^   s   r+   handle_meshz!_load_kwargs.<locals>.handle_mesh  sc    
 fZ($// 	5:fWot3T3T 	544T^F33444     r*   c                      d         d         }} t          | t                    rt          |           S |t          v r!t	          di t          |         | |          S t          d| d          )z*
        Handle an exported mesh.
        datar>   )r>   `z` is not supportedNr)   )r.   rg   rh   r4   r   rk   )r   r>   r^   s     r+   handle_exportz#_load_kwargs.<locals>.handle_export  s     !.&*=idD!! 	Q%%%,&&PP\)4TYOOOPPP!"Ci"C"C"CDDDr*   c                      ddl m} m} t          j        d                   }t          |          dk     r
 |             S |d         dk    r | di S |d         dk    r |di S t          d          )Nr   )Path2DPath3Dr   r   r   zVertices must be 2D or 3D!r)   )pathr   r   npshaperX   
ValueError)r   r   r   r^   s      r+   handle_pathz!_load_kwargs.<locals>.handle_path  s    ))))))))
+,,u::>>688O8q==6##F###1X]]6##F###9:::r*   c                      t          di  S )Nr)   r   r   s   r+   handle_pointcloudz'_load_kwargs.<locals>.handle_pointcloud  s    ##F###r*   r   r   )rY   )r   r   )entitiesr   )r   )r>   r   c                     i | ]
\  }}|||S r'   r)   r/   s      r+   r   z _load_kwargs.<locals>.<dictcomp>  s    ???tq!ar*   c              3       K   | ]}|v V  	d S r'   r)   )r0   ir^   s     r+   	<genexpr>z_load_kwargs.<locals>.<genexpr>  s'      --qqF{------r*   zunable to determine type: )	r   r   rX   r.   rg   r5   allr   r:   )
rs   r^   r   r   r   r   r   handlersfuncexpecteds
    `        r+   rh   rh     s   
3% 3 3 3 3 3 3j! ! ! ! ! ! !
E 
E 
E 
E 
E; ; ; ; ;$ $ $ $ $
 6{{aCIINNz$q'4/H/HNa
 
}%	+,	./	M*	-.H @?v||~~???F"  h----H----- 	466MMM	 A&++--AA
B
BBr*   c                 r   d}d}t          j        |           r!t          |                                           } t          j        |           r|t          d          t          | t                    r	 t          j        	                    t          j        
                    |                     }t          j                            |          }n# t          $ r d}d}Y nw xY w|rC|t          j        |          }|t          j        |ddg          }t!          |d          } d}nd	| v rd
}t          j        |           } nd| v sd| v r|st          d          ddl}t          j        |j                            |                               dd          d                             d          d                                                   }t          j        |           }t          j        |                                          } n|t          d|  d          t          |t                    rd|v rt          j        	                    t          j        
                    |                    }	t          j        |          }t          j                            |	          r|	}|t          j        |          }||                                }|Ht7          | d          r8| j        1t;          | j                  dk    rt          j        | j                  }t=          | ||||          S )a  
    Given a file_obj and a file_type try to magically convert
    arguments to a file-like object and a lowercase string of
    file type.

    Parameters
    -----------
    file_obj : str
      if string represents a file path, returns:
        file_obj:   an 'rb' opened file object of the path
        file_type:  the extension from the file path

     if string is NOT a path, but has JSON-like special characters:
        file_obj:   the same string passed as file_obj
        file_type:  set to 'json'

     if string is a valid-looking URL
        file_obj: an open 'rb' file object with retrieved data
        file_type: from the extension

     if string is none of those:
        raise ValueError as we can't do anything with input

     if file like object:
        ValueError will be raised if file_type is None
        file_obj:  same as input
        file_type: same as input

     if other object: like a shapely.geometry.Polygon, etc:
        file_obj:  same as input
        file_type: if None initially, set to the class name
                    (in lower case), otherwise passed through

    file_type : str
         type of file and handled according to above

    Returns
    -----------
    args
      Populated `_FileArg` message
    NFz)`file_type` must be set for file objects!rJ   tar.bz2)specialrbT{r|   zhttps://zhttp://z,unable to load URL with `allow_remote=False`r   ?r   /)r   zstring is not a file: `r   .name)r=   r>   	file_pathrl   r?   )r   
is_pathlibr   absoluteis_filer   r.   osr   abspath
expanduserisfiler   r   FilePathResolverrw   openwrap_as_streamurllibparseunquotesplitstripWebResolverget_baseexistsrx   hasattrr   rX   r
   )
r=   r>   r?   rA   r^   r   rl   r   r   r   s
             r+   rf   rf     sC   b I Jx   ,x((**++|H F)"3DEEE(C   ,H	(:(:8(D(DEEIW^^I..FF 	 	 	FIII	
  !	H$5i@@   0XyDYZZZ	It,,HJJh"	.x88x''9+@+@# U$%STTT !0L((2288a@@CII#NNrRXXZZ 	 %0X>>>.x/@/@/B/BCC" !F8!F!F!FGGG)S!! AcY&6&6 wrw11)<<==(33	7>>$ 	AI$5i@@ OO%%	 	Hf%% 	M%""-hm<<   s   6AC C#"C#)rG   r   rJ   bz2)NNNF)NNFN)NNF)NF)Kr|   r   copyr   numpyr    r   r   baser   
exceptionsr   parentr	   r
   pointsr   scene.scener   r   typedr   r   r   r   r   r   rS   r   cascader   daer   rH   r   r   rM   r   rN   r   rO   r   rP   r   	threedxmlr   threemfr    rR   r!   xyzr"   path.exchange.loadr#   r$   r   Er(   r   r6   r<   ResolverLikeboolrc   rT   rt   ri   r   rh   rf   r9   r4   r8   rj   r)   r*   r+   <module>r      s    				                         ) ) ) ) ) ) ) ) ) ) ) ) ) )       . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1             # # # # # # % % % % % % ! ! ! ! ! !                                     ) ) ) ) ) ) # # # # # #            <<<<<<<<<     ##I#         Wc#h W W W W3s8    (  $15Q QQ}Q y-.Q C=	Q
 Q Q Q Q Ql  $15#b bb}b y-.b 	b
 tnb b b b bJ1' 1 1 1 1*\ \ \ \~AS Au A A A A,wCX wC wC wC wCz 26	I I}I y-.I 	I I I I I\ 	      M " " "   L ! ! !   L ! ! !   L ! ! !   L ! ! !   $ % % %   M " " "   M " " "   & ' ' '   N # # #   L ! ! !   $ % % %    _ % % % % %s   $B- -C2CC