
    l0j<                        d Z ddlZddlZddlZddlmZmZ 	 ddlmZ n# e	$ r	 ddlmZ Y nw xY w G d dej
                  Z G d d	e          Z G d
 de          Z G d de          Z G d de          ZddZdS )z
resolvers.py
---------------

Provides a common interface to load assets referenced by name
like MTL files, texture images, etc. Assets can be from ZIP
archives, web assets, or a local file path.
    N   )cachingutil)urlparsec                       e Zd ZdZej        d             Zej        d             Zej        d             Zej        d             Z	d Z
d Zd Zd	S )
Resolverz'
    The base class for resolvers.
    c                      t          d          )NzUse a resolver subclass!NotImplementedError)selfargskwargss      T/home/wildlama/miniconda3/envs/lam/lib/python3.11/site-packages/trimesh/resolvers.py__init__zResolver.__init__       !"<===    c                     t                      Nr
   r   keys     r   getzResolver.get"   s    !###r   c                      t          d          Nz`write` not implemented!r
   r   namedatas      r   writezResolver.write&   r   r   c                      t          d          )Nz`namespaced` not implemented!r
   r   	namespaces     r   
namespacedzResolver.namespaced*   s    !"ABBBr   c                 ,    |                      |          S r   )r   r   s     r   __getitem__zResolver.__getitem__.   s    xx}}r   c                 .    |                      ||          S r   )r   r   r   values      r   __setitem__zResolver.__setitem__1   s    zz#u%%%r   c                 .    ||                                  v S r   )keysr   s     r   __contains__zResolver.__contains__4   s    diikk!!r   N)__name__
__module____qualname____doc__abcabstractmethodr   r   r   r!   r#   r'   r*    r   r   r   r      s          	> > > 	$ $ $ 	> > > 	C C C  & & &" " " " "r   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )FilePathResolverz>
    Resolve files from a source path on the file system.
    c                    t           j                            t           j                            t	          |                              }|| _        t           j                            |          r|| _        n,t           j                            |          }|d         | _        t           j                            | j                  st          d| j         d          dS )z
        Resolve files based on a source path.

        Parameters
        ------------
        source : str
          File path where mesh was loaded from
        r   zpath `z `not a directory!N)
ospath
expanduserabspathstrcleanisdirparentsplit
ValueError)r   sourcer:   r=   s       r   r   zFilePathResolver.__init__=   s     ""27??3v;;#?#?@@
7== 	#DKK GMM%((E(DK w}}T[)) 	GEdkEEEFFF	G 	Gr   c              #      K   | j         }t          j        | j                   D ]Y\  }}}|                    |          r|t	          |          d         }|D ]$}t          j                            ||          V  %ZdS )z
        List all files available to be loaded.

        Yields
        -----------
        name : str
          Name of a file which can be accessed.
        N)r<   r5   walk
startswithlenr6   join)r   r<   r6   _namesr   s         r   r)   zFilePathResolver.keysV   s        gdk22 	/ 	/ND!Uv&& +CKKMM* / /gll4....../	/ 	/r   c                 f    t          t          j                            | j        |                    S )aI  
        Return a resolver which changes the root of the
        resolver by an added namespace.

        Parameters
        -------------
        namespace : str
          Probably a subdirectory

        Returns
        --------------
        resolver : FilePathResolver
          Resolver with root directory changed.
        )r3   r5   r6   rD   r<   r   s     r   r!   zFilePathResolver.namespacedh   s$      T[) D DEEEr   c                    t           j                            | j        |                                          }t           j                            |          sHt           j                            | j        t           j                            |          d                   }t          |d          5 }|                                }ddd           n# 1 swxY w Y   |S )z
        Get an asset.

        Parameters
        -------------
        name : str
          Name of the asset

        Returns
        ------------
        data : bytes
          Loaded data from asset
        rbN)	r5   r6   rD   r<   stripexistsr=   openread)r   r   r6   fr   s        r   r   zFilePathResolver.gety   s     w||DK66w~~d## 	F7<<RW]]4-@-@-DEED$ 	6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   /CCCc                     t          t          j                            | j        |                                          d          5 }t          j        ||           ddd           dS # 1 swxY w Y   dS )z
        Write an asset to a file path.

        Parameters
        -----------
        name : str
          Name of the file to write
        data : str or bytes
          Data to write to the file
        wb)file_objstuffN)rM   r5   r6   rD   r<   rK   r   write_encoded)r   r   r   rO   s       r   r   zFilePathResolver.write   s     "',,t{DJJLL994@@ 	7A6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   A**A.1A.N)	r+   r,   r-   r.   r   r)   r!   r   r   r1   r   r   r3   r3   8   so         G G G2/ / /$F F F"  ,7 7 7 7 7r   r3   c                   8    e Zd ZdZd	dZd Zd Zd Zd Zd Z	dS )
ZipResolverz-
    Resolve files inside a ZIP archive.
    Nc                     || _         t          |t                    r1|                                                    d          dz   | _        dS d| _        dS )a{  
        Resolve files inside a ZIP archive as loaded by
        trimesh.util.decompress

        Parameters
        -------------
        archive : dict
          Contains resources as file object
        namespace : None or str
          If passed will only show keys that start
          with this value and this substring must be
          removed for any get calls.
        /N)archive
isinstancer9   rK   rstripr    )r   rY   r    s      r   r   zZipResolver.__init__   sP     i%% 	"&__..55c::S@DNNN!DNNNr   c                     | j         <| j         t                    fd| j                                        D             S | j                                        S )z
        Get the available keys in the current archive.

        Returns
        -----------
        keys : iterable
          Keys in the current archive.
        Nc                 t    g | ]4}|                               rt          |          k    *|d          5S r   rB   rC   ).0klengthr    s     r   
<listcomp>z$ZipResolver.keys.<locals>.<listcomp>   sN       <<	** 031vv &''
/>r   )r    rC   rY   r)   )r   ra   r    s    @@r   r)   zZipResolver.keys   st     >%I^^F    **,,   
 |  """r   c                 6    | j         i | _         || j         |<   dS )z
        Store a value in the current archive.

        Parameters
        -----------
        key : hashable
          Key to store data under.
        value : str, bytes, file-like
          Value to store.
        N)rY   r%   s      r   r   zZipResolver.write   s%     <DL!Sr   c                 v   |dS t          |d          r|                    d          }| j        }||vr t          || j                  D ]
}||v r|} n||         }t          |t          t          f          r|S |                    d           |	                                }|                    d           |S )z
        Get an asset from the ZIP archive.

        Parameters
        -------------
        name : str
          Name of the asset

        Returns
        -------------
        data : bytes
          Loaded data from asset
        Ndecodeutf-8r   )
hasattrre   rY   nearby_namesr    rZ   bytesr9   seekrN   )r   r   rY   optionobjr   s         r   r   zZipResolver.get   s     <F4"" 	(;;w''D, w&tT^<<  W$$ "DE	 % dmcE3<(( 	J 	xxzzr   c                 .    t          | j        |          S )  
        Return a "sub-resolver" with a root namespace.

        Parameters
        -------------
        namespace : str
          The root of the key to clip off, i.e. if
          this resolver has key `a/b/c` you can get
          'a/b/c' with resolver.namespaced('a/b').get('c')

        Returns
        -----------
        resolver : Resolver
          Namespaced resolver.
        )rY   r    )rV   rY   r   s     r   r!   zZipResolver.namespaced  s      4<9EEEEr   c                 4    t          j        | j                  S )z
        Export the contents of the current archive as
        a ZIP file.

        Returns
        ------------
        compressed : bytes
          Compressed data in ZIP format.
        )r   compressrY   r   s    r   exportzZipResolver.export  s     }T\***r   )NN)
r+   r,   r-   r.   r   r)   r   r   r!   rr   r1   r   r   rV   rV      s         " " " "(# # #," " ", , ,\F F F$
+ 
+ 
+ 
+ 
+r   rV   c                   *    e Zd ZdZd Zd Zd Zd ZdS )WebResolverz+
    Resolve assets from a remote URL.
    c                    t          |d          r|                    d          }t          |          }d |j                            d          D             }t          |          dk    rd}n=d|d         v rd                    |d	d                   }nd                    |          }d                    d
 |j        dz   |j        	                    d          |	                    d          fD                       dz   | _
        d| j
        t          |j                  dz   d	         vsJ | j
                            d          sJ d	S )z
        Resolve assets from a base URL.

        Parameters
        --------------
        url : str
          Location where a mesh was stored or
          directory where mesh was stored
        re   rf   c                 8    g | ]}t          |          d k    |S )r   rC   r_   is     r   rb   z(WebResolver.__init__.<locals>.<listcomp>A  s#    AAAqc!ffqjjjjjr   rX   r    .rI   Nc              3   @   K   | ]}t          |          d k    |V  dS )r   Nrw   rx   s     r   	<genexpr>z'WebResolver.__init__.<locals>.<genexpr>N  s:        q66A:: ::: r   z:/z//   )rg   re   r   r6   r=   rC   rD   schemenetlocrK   base_urlendswith)r   urlparsedr=   r6   s        r   r   zWebResolver.__init__0  se    3!! 	&**W%%C # BAFK--c22AAA u::??DDE"I88E#2#J''DD 88E??DHH   -$.0C0CC0H0H$**UX//Z    
  	 4=V]););a)?)A)ABBBBB}%%c*******r   c                 <   ddl }|                                }| j        |z   }|                    |d          }|j        dk    r>|                    d          r
|dd         }|                    | j        |z   d          }|                                 |j        S )z
        Get a resource from the remote site.

        Parameters
        -------------
        name : str
          Asset name, i.e. 'quadknot.obj.mtl'
        r   NT)follow_redirectsi,  ./   )httpxrK   r   r   status_coderB   raise_for_statuscontent)r   r   r   r   responses        r   r   zWebResolver.get[  s     	 zz|| md"99S49883&&t$$  ABBxyy!5yMMH 	!!### r   c                 2    t          | j        |z             S )a  
        Return a namespaced version of current resolver.

        Parameters
        -------------
        namespace : str
          URL fragment

        Returns
        -----------
        resolver : WebResolver
          With sub-url: `https://example.com/{namespace}`
        )r   )rt   r   r   s     r   r!   zWebResolver.namespaced|  s     t}y89999r   c                      t          d          )Nzcan't write to remoter
   r%   s      r   r   zWebResolver.write  s    !"9:::r   N)r+   r,   r-   r.   r   r   r!   r   r1   r   r   rt   rt   +  s\         )+ )+ )+V     B: : :"; ; ; ; ;r   rt   c                   D    e Zd ZddZd Zd Zed             Zd Zd Z	dS )	GithubResolverNc                     |d                     ||          | _        nd                     ||          | _        |t          j        |          | _        dS d| _        dS )a  
        Get files from a remote Github repository by
        downloading a zip file with the entire branch
        or a specific commit.

        Parameters
        -------------
        repo : str
          In the format of `owner/repo`
        branch : str
          The remote branch you want to get files from.
        commit : str
          The full commit hash: pass either this OR branch.
        save : None or str
          A path if you want to save results locally.
        Nz9https://github.com/{repo}/archive/refs/heads/{branch}.zip)repobranchz.https://github.com/{repo}/archive/{commit}.zip)r   commit)formatr   r   	DiskCachecache)r   r   r   r   saves        r   r   zGithubResolver.__init__  st    $ >Pf$vf.. HH
 NUU& V  DH  *400DJJJDJJJr   c                 4    | j                                         S )z
        List the available files in the repository.

        Returns
        ----------
        keys : iterable
          Keys available to the resolved.
        )zippedr)   rq   s    r   r)   zGithubResolver.keys  s     {!!!r   c                      t          d          r   r
   r   s      r   r   zGithubResolver.write  s    !"<===r   c                       fd}t           d          r j        S  j                             j        |          }t          t          j        t          j        |          d                     _         j        S )zk

        - opened zip file
        - locally saved zip file
        - retrieve zip file and saved
        c                      ddl } |                     j                  }|j        st	          |j                  |j        S )z4
            Fetch the remote zip file.
            r   N)requestsr   r   okr>   r   )r   r   r   s     r   fetchz$GithubResolver.zipped.<locals>.fetch  sE     OOO||DH--H; 3 !1222##r   _zipzip)	file_type)	rg   r   r   r   r   rV   r   
decompresswrap_as_stream)r   r   raws   `  r   r   zGithubResolver.zipped  s    		$ 		$ 		$ 		$ 		$ 4   	9jnnTXu--OD/44FFF
 
	 yr   c                 6    | j                             |          S r   )r   r   r   s     r   r   zGithubResolver.get  s    {s###r   c                 6    | j                             |          S )rn   )r   r!   r   s     r   r!   zGithubResolver.namespaced  s      {%%i000r   )NNN)
r+   r,   r-   r   r)   r   propertyr   r   r!   r1   r   r   r   r     s           B	" 	" 	"> > >   X<$ $ $1 1 1 1 1r   r   c              #   @  	K   d 	d d 	fd	fd	fdd d g}|d
}t                      }|D ].} ||           }||v r|                    |           ||z   V  /t          j        |d          D ]o\  }} | ||                     }||v r|                    |           ||z   V   | ||                     }||v rS|                    |           ||z   V  pd| v r||                    d                              d          d	|                     d                    }|                    |                     d          d                             d                              d                     d                    |          V  d	S d	S d	S )z
    Try to find nearby variants of a specified name.

    Parameters
    ------------
    name : str
      Initial name.

    Yields
    -----------
    nearby : str
      Name that is a lightly permutated version
      of the initial name.
    c                 ^    |                     |           r|t          |           d          S |S r   r^   )prefixitems     r   trimznearby_names.<locals>.trim  s0    ??6"" 	'F&&r   c                     | S r   r1   xs    r   <lambda>znearby_names.<locals>.<lambda>  s    ! r   c                 *    |                                  S r   )rK   r   s    r   r   znearby_names.<locals>.<lambda>  s    !'')) r   c                      d|           S )Nr   r1   r   r   s    r   r   znearby_names.<locals>.<lambda>      $$tQ-- r   c                      d|           S )Nz.\r1   r   s    r   r   znearby_names.<locals>.<lambda>  s    $$ua.. r   c                      d|           S )N\r1   r   s    r   r   znearby_names.<locals>.<lambda>  r   r   c                 L    t           j                            |           d         S )NrI   )r5   r6   r=   r   s    r   r   znearby_names.<locals>.<lambda>  s    "'--""2& r   c                 .    |                      dd          S )Nz%20 )replacer   s    r   r   znearby_names.<locals>.<lambda>  s    !))E3'' r   Nrz   r   z..rX   rI   )	setadd	itertoolscombinationsrK   r=   countextendrD   )
r   r    cleanershitrO   currentabrK   r   s
            @r   rh   rh     s     "   	    &&''H 	 %%C " "!D''c>>'!!!!!&x33 " "1!AAdGG**c>>'!!!! !AAdGG**c>>'!!!!!t||	-$$**3//0C4::d3C3C2C0CDTZZ%%b)//44::3??@@@hhuoo	 |--r   r   )r.   r/   r   r5   rz   r   r   urllib.parser   ImportErrorABCr   r3   rV   rt   r   rh   r1   r   r   <module>r      s    


     				        "%%%%%%% " " "!!!!!!!!"
" " " " "tx " " ">e7 e7 e7 e7 e7x e7 e7 e7PH+ H+ H+ H+ H+( H+ H+ H+Vc; c; c; c; c;( c; c; c;Lb1 b1 b1 b1 b1X b1 b1 b1J@ @ @ @ @ @s    --