
    Ti&                         d dl ZddlmZ ddlmZmZ  G d de          Z ej	        g d          Z
 ej	        dej        d	fd
g          ZdedefdZdedefdZdedefdZdefdZdefdZeedZdS )    N   )util)DictStreamc                       e Zd ZdS )HeaderErrorN)__name__
__module____qualname__     N/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trimesh/exchange/stl.pyr   r      s        Dr   r   ))normals<f4   )verticesr   )r   r   )
attributesz<u2headerP   )
face_countz<u4file_objreturnc                     |                                  }	 t          |           S # t          $ r' |                     |           t	          |           cY S w xY w)a  
    Load a binary or an ASCII STL file from a file object.

    Parameters
    ----------
    file_obj
      Containing STL data

    Returns
    ----------
    loaded
      Keyword arguments for a Trimesh constructor with
      data loaded into properly shaped numpy arrays.
    )tellload_stl_binaryr   seekload_stl_ascii)r   kwargsfile_poss      r   load_stlr       si      }}H(
 x((( ( ( (h h'''''(s   % .AAc                 6   t           j        }|                     |          }t          |          |k     rt	          d          	 t          j        |t                     }n# t          $ r t	          d          w xY w	 dt          j	        t          |d         d                                                             i}n# t          $ r i }Y nw xY w|                                 }|                     dd           |                                 }|                     |           ||z
  }|d         t          j        z  }||k    rt	          d| d	|           t          j        |                                 t                    }	t          |	d
                   sdi iS t          j        |d         d         dz                                d          }
|	d
                             d          |	d                             d          |
d|	d         i|d}|S )a&  
    Load a binary STL file from a file object.

    Parameters
    ----------
    file_obj : open file- like object
      Containing STL data

    Returns
    ----------
    loaded
      Keyword arguments for a Trimesh constructor with data
      loaded into properly shaped numpy arrays.
    z'Binary STL shorter than a fixed header!dtypezBinary header incorrect typer   r   r   r   z+Binary STL has incorrect length in header: z vs r   geometryr   r   r   stlr   )r   face_normalsfacesface_attributesmetadata)_stl_dtype_headeritemsizereadlenr   np
frombufferBaseExceptionr   decode_textbytesstripr   r   
_stl_dtypearangereshape)r   header_lengthheader_datar   r+   
data_startdata_endlen_datalen_expectedblobr)   results               r   r   r   7   s<   " &.M--..K
;-''CDDD:{2CDDD : : :8999: d.uVH5Ea5H/I/IJJPPRRS   
 J MM!Q }}HMM*
 *$H,'**==L <V(VVVV
 
 	
 =
;;;D tJ    B If\*1-122::7CCE
 $,,W55Y//88!4#56 F Ms   A! !A;?AC CCc           	         t          j        |                                                                           }|                                }i }d}t          t          |                    D ]}|                    d|          }|                    d|          }|t          d          z   }|dk     s|dk     r nE||k    rt          d          |||         }|	                    d          }	t          j        d                    d |	dd	         D                       dt          j        
          }
t          |
          dk     rt          |
          dz  dk    rt          d          |
                    d          }
t          j        t          |
                                        d          }d	}	 |	                    d          }t          j        d                    d |dd	         D                       dt          j        
          }t          |          t          |
          k    r|                    d          }n1# t           $ r$ t           j                            dd           Y nw xY w	 ||||                    d          z            dd	                                         }n# t           $ r d	}Y nw xY wt          j        ||          }|
                    d          ||d|id||<   t          |          dk    r.t)          t+          |                                                    S d|iS )a(  
    Load an ASCII STL file from a file object.

    Parameters
    ----------
    file_obj : open file- like object
      Containing input data

    Returns
    ----------
    loaded
      Keyword arguments for a Trimesh constructor with
      data loaded into properly shaped numpy arrays.
    r   solidendsolidz`endsolid` precedes `solid`!vertex c              3   P   K   | ]!}|d |                     d                   V  "d S N
find.0lines     r   	<genexpr>z!load_stl_ascii.<locals>.<genexpr>   s7      IIT+DIIdOO+,IIIIIIr      N)sepr#   r   zincorrect number of verticesr%   normalc              3   P   K   | ]!}|d |                     d                   V  "d S rG   rI   rK   s     r   rN   z!load_stl_ascii.<locals>.<genexpr>   s7      MMT/		$/0MMMMMMr   zfailed to extract face_normalsT)exc_inforH      name)r   r(   r)   r+   r$   )r   r3   r.   r5   lowerranger/   rJ   
ValueErrorsplitr0   
fromstringjoinfloat64r8   r7   r2   logwarningunique_namenextitervalues)r   	raw_mixed	raw_lowerr   position_solid_start	solid_endrB   vertex_textr   r)   r(   normal_textr   rU   s                   r   r   r      s_   "  117799I!!I F H 3y>>"" B
 B
nnWh77NN:x88	 s:. q==K!OOE "";<<< +i/0 kk(++=HHIIQRRIIIII*
 
 

 x==1x==1!!;<<< ##G,,	#h--((0099 
	N++h//KmMM[_MMMMMj  G
 7||s8}},,&w77 	N 	N 	NH=MMMMM	N	 [;D9I9I+IIJ122NTTVVDD 	 	 	DDD	
 f-- !((11(	
 
t 6{{aD))***s%   <BI+I;:I;?:J::K	K	c                    t          j        dt                    }t          | d          rt	          | j                  |d<   |                                }t          | d          rXt          j        t	          | j                  t                    }| j        |d<   | j	        |d<   ||                                z  }|S )z
    Convert a Trimesh object into a binary STL file.

    Parameters
    ---------
    mesh
      Trimesh object to export.

    Returns
    ---------
    export
      Represents mesh in binary STL form
    rO   r"   r)   r   r   r   )
r0   zerosr,   hasattrr/   r)   tobytesr6   r(   	triangles)meshr   exportpackeds       r   
export_stlrs      s     Xa0111FtW /"4:|^^FtW ##dj//<<< -y!^z&.."""Mr   c                    t          j        t          | j                  ddf          }| j        |dddddf<   | j        |ddddddf<   d                    g d          t          | j                  z  }| j                            dd	          }t          |t                    sd	}t          |          d
k    sd|v rd	}d                    d|  |j        |                    d           dg          S )z
    Convert a Trimesh object into an ASCII STL file.

    Parameters
    ---------
    mesh : trimesh.Trimesh

    Returns
    ---------
    export
      Mesh represented as an ASCII STL file
       r   Nr   rO   rH   )zfacet normal {} {} {}z
outer loopz/vertex {} {} {}
vertex {} {} {}
vertex {} {} {}endloopendfacet rU   rx   r   zsolid r&   z	endsolid
)r0   rl   r/   r)   r(   ro   r[   r+   get
isinstancestrformatr8   )rp   r?   	formatterrU   s       r   export_stl_asciir~     s    8S__a+,,D%DAqqqM^DABBN 			  		
 		
 	DJI =VR((DdC   
4yy2~~ 99otoo'7y'7b9I9I'JLYZZZr   )r'   	stl_ascii)numpyr0   rx   r   typedr   r   	Exceptionr   r#   r6   voidr,   r    r   r   r4   rs   r{   r~   _stl_loadersr   r   r   <module>r      sj                            	 	 	 	 	) 	 	 	 RXQQQ 
 BHx"57LMNN (v (D ( ( ( (@Of O O O O Odc V c  c  c  c  c L    8)[c )[ )[ )[ )[X  h77r   