
    jL                        d dl Z 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 ZddZd	ej                  d
fdZd Z	 d dlZd dlmZ deiZdeiZy# e$ r$ZddlmZ d ee      iZd ee      iZY dZ[ydZ[ww xY w)    N)defaultdict   )graphutil)log)unique_namec                    | j                  d      }| j                  d      }dj                  |j                  d      D cg c]3  }|j                  d    d|j                  d    d|j                  d    5 c}      }t	        j
                  |t        j                  d      j                  d	      }dj                  |j                  d
      D cg c]3  }|j                  d    d|j                  d    d|j                  d    5 c}      }t	        j
                  |t        j                  d      j                  d	      }||fS c c}w c c}w )a  
    Read a `<mesh ` XML element into Numpy vertices and faces.

    This is generally the most expensive operation in the load as it
    has to operate in Python-space on every single vertex and face.

    Parameters
    ----------
    mesh : lxml.etree.Element
      Input mesh element with `vertex` and `triangle` children.

    Returns
    ----------
    vertex_array : (n, 3) float64
      Vertices
    face_array : (n, 3) int64
      Indexes of vertices forming triangles.
    z{*}verticesz{*}triangles z	{*}vertexxyz)dtypesep)   z{*}trianglev1v2v3)	findjoiniterattribnp
fromstringfloat64reshapeint64)meshverticesfacesivsv_arrayfsf_arrays           E/DATA/.local/lib/python3.12/site-packages/trimesh/exchange/threemf.py
_read_meshr'      s<   ( yy'HIIn%E 
 ]];/	
/ xx}oQqxx}oQqxx}o>/	

B mmBbjjc:BB7KG 
 ZZ.	
. xx~a/q$0@A.	

B mmBbhhC8@@IGG#	
	
s   8E8Ec           
         t        j                  | d      }t        t        d |j	                         D                    }t        t        j                  |dd            \  }}d|j                  v rd|j                  d   i}ndd	i}i }t        t              }	t        t              }
t        t              }g }i }t               }|j                  d
       t        j                  |dd      D ]f  \  }}d|j                  v r|j                  d   }t        |j                  j                  dt        |            ||      }|j!                  |       |||<   |j                  d      D ]8  }t#        |      \  }}|	|   j%                  |       |
|   j%                  |       : |j                  d      D ]#  }|j                  d   }t'        |j                        }||   j%                  ||f       t        d |j                  j	                         D        d      }|l||v sq||   j                  d
       t        |j                  j                  dt        |            ||      }|j!                  |       |||<   t        j                  ||   dd      D ];  \  }}t#        |      \  }}|	|   j%                  |       |
|   j%                  |       = & d|j                  v s|j                  d      D ]T  }t'        |j                        }|j                  j                  dd      }|j%                  |j                  d   ||f       V i i }|	j)                         D ]v  }t        j*                  |	|   |
|         \  }}||   }|||j-                         d||<   ||   j/                  |j	                         D ci c]  \  }}|	|| c}}       x t1        j2                         } |D ]  \  }}!}| j5                  d|||!        |j	                         D ]#  \  }"}#|#D ]  \  }}!| j5                  |"||!        % g }$t        t              }%t               }&t7        j8                  | d      D ]  }t7        j:                  | |d      }'t=        |'      dk(  r|'d
   }nt        j>                  |'      }|d    d
   }(|(|vrtA        jB                  d!|( d"       kt=        |d          dkD  rtE        |d    d   t              r	|d    d   }n||(   }t        ||&      }|&j!                  |       ||(   })t=        |      d#kD  r|d$   d
   }*|%|*   j!                  |(       |$j%                  d|||)d%        |rtG        d& |j)                         D              r|j)                         D ci c]  }|| }+}|%j	                         D ]C  \  }*},t=        |,      dk7  r||*   jI                  d'      d
   |+|t        t        |,               <   E |j	                         D ci c]  \  }}|+|   | }}}|$D ]  }-d(|-v s|+|-d(      |-d(<    d|$||d)}|S c c}}w c c}w c c}}w )*z
    Load a 3MF formatted file into a Trimesh scene.

    Parameters
    ------------
    file_obj : file-like
      Contains 3MF formatted data

    Returns
    ------------
    kwargs : dict
      Constructor arguments for `trimesh.Scene`
    zip)	file_typec              3   L   K   | ]  \  }}d |j                         v s|  yw)z3d/3dmodel.modelNlower.0kvs      r&   	<genexpr>zload_3MF.<locals>.<genexpr>O   s#     WODAq7IQWWY7VaOs   $$z{*}model)start)tageventsunitunitsmillimetersr   )z	{*}objectz{*}build)endobjectidnamez{*}meshz{*}componentobjectidc              3   h   K   | ]*  \  }}|j                  d       s|j                  d       , yw)path/N)endswithstripr.   s      r&   r2   zload_3MF.<locals>.<genexpr>   s*     U.>da!**VBTQWWS\.>s   22Nbuildz{*}item
partnumber)r   r    metadataworld)keymatrix)rH   )GsourcerH   )rI   	traversalr      r   zid z included but not defined!r   )
frame_fromframe_torH   geometryc              3   @   K   | ]  }d |j                         v   yw)bodyNr,   r/   r!   s     r&   r2   zload_3MF.<locals>.<genexpr>   s     F16QWWY.s   (rP   )
base_framer   rP   rE   )%r   
decompressnextr   itemsetree	iterparser   r   listsetseekr4   r   getstraddr'   append_attrib_to_transformkeysappend_facescopyupdatenxMultiDiGraphadd_edger   multigraph_pathsmultigraph_collectlen	multi_dotr   warning
isinstanceallsplit).file_objpostprocesskwargsarchivemodel_eventrootrE   id_namev_seqf_seq
componentsbuild_itemsconsumed_countsconsumed_names_objindexr<   r   r1   fc
mesh_index	transformr?   mitemrD   meshesgidr0   gtfr3   group
graph_argsparents
used_names
transformslastgeomparentrename	mesh_nameargs.                                                 r&   load_3MFr   =   sG     ooh%8GWGMMOWWXE J
STLFDT[[01 ]+ GEE T"J K OUN 
JJqM//%-FxXX3swwJJt$E
 

vs5z2NOD t$!GEN +!$'1e##A&e##A& , XXn-XXj1
0:	5!((*i)@A Uahhnn.>U #DM&&q)&

vs:?&'D
 #&&t,*.GJ' %Ix!1  *!}1j)003j)003!+ .: cgg+0=	![[__\4@
""DKK
$;Y
#ST ,m Y~ Fzz|  sU3Z81s| 
t 	tfllnNndaQTnNO  	A  +R	

7CZ
;  + #((*uGCJJuc"J-  + J#GJ&&7;;--T(S
z?a"1Iz2I Bx{wKK#dV#=>?tBx=1DHQK!=8A;D 4=D 4,t t} t9q="Xa[FFO%% # 		
G <\ sFFF &.1!Q$.!(FI 9~"5<V_5J5J35OPQ5RF74Y012 "1 ,2<<>:>41a&)Q,>:CS "(Z"9J  	F M} OL / ;s   

Y!Y!9
Y'.Y,i      c                 T    ddl m} t        | |      s ||       } | j                  }| j                  j                         }| j                  j                  }ddddddd	}d
di}	g   fd}
t        j                         }d|i}||d<   t        j                  |fddi|5 }|j                  dd      5 }t        j                  |d      5 }|j                          |j                  dddi|      5  |j                  d      5  t!        |j#                               D ]  \  }\  }} |
|      |dt%        t'        j(                               d} |j                  dAi |5  |j                  d      5  |j                  d      5  |j+                          t-        dt/        |j0                        |      D ]]  }|j0                  |||z    }dt/        |      z  }|j3                   |j4                  |j7                          j9                  d             _ 	 d
d
d
       |j                  d      5  |j+                          t-        dt/        |j:                        |      D ]]  }|j:                  |||z    }d t/        |      z  }|j3                   |j4                  |j7                          j9                  d             _ 	 d
d
d
       d
d
d
       d
d
d
        |j<                  D ]1  }||k(  s|j?                  d!      rt/        ||         dk(  r- |
|      |dt%        t'        j(                               d} |j                  dAi |5  |j                  d"      5  ||   j#                         D ]  \  }}d#jA                  d$ tC        jD                  |d%         d
d&d
d'f   jF                  j7                         D              }|j3                  t        jH                  d(d)|v r |
|d)         n |
|      |d*              	 d
d
d
       d
d
d
       4 	 d
d
d
       |j                  d+d,t%        t'        j(                               i      5  ||   j#                         D ]  \  }}|j?                  d!      rd#jA                  d- tC        jD                  |d%         d
d&d
d'f   jF                  j7                         D              }d.j5                  |d/         }|j3                  t        jH                  d0d1 |
|jK                  d)|            d2||t%        t'        j(                               d3|i|              	 d
d
d
       d
d
d
       d
d
d
       d
d
d
       |j                  d4d      5 }t        j                  |d      5 }|j                          |j                  d5|	      5  d6}|j3                  t        jH                  d7|d8d9:             d
d
d
       d
d
d
       d
d
d
       |j                  d;d      5 }t        j                  |d      5 }|j                          d
d<i}g d=}|j                  d>|      5  |D ],  \  }}|j3                  t        jH                  d?||@             . 	 d
d
d
       d
d
d
       d
d
d
       d
d
d
       |jM                         S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   bxY w# 1 sw Y   gxY w# 1 sw Y   lxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   |jM                         S xY w)Ba  
    Converts a Trimesh object into a 3MF file.

    Parameters
    ---------
    mesh trimesh.trimesh
      Mesh or Scene to export.
    batch_size : int
      Number of nodes to write per batch.
    compression : zipfile.ZIP_*
      Type of zip compression to use in this export.
    compresslevel : int
      For Python > 3.7 specify the 0-9 compression level.

    Returns
    ---------
    export : bytes
      Represents geometry as a 3MF file.
    r   )Scenez9http://schemas.microsoft.com/3dmanufacturing/core/2015/02z=http://schemas.microsoft.com/3dmanufacturing/material/2015/02z?http://schemas.microsoft.com/3dmanufacturing/production/2015/06z@http://schemas.microsoft.com/3dmanufacturing/beamlattice/2017/02z:http://schemas.microsoft.com/3dmanufacturing/slice/2015/07zBhttp://schemas.microsoft.com/3dmanufacturing/securecontent/2019/04)Nr   pbsscNz<http://schemas.openxmlformats.org/package/2006/relationshipsc                 h    | vrj                  |        t        j                  |       dz         S )NrL   )ra   r_   r   )r   modelss    r&   model_idzexport_3MF.<locals>.model_idE  s.    F?MM!6<<?Q&''    compressioncompresslevelmodewz3D/3dmodel.model)r   zutf-8)encodingrv   r6   
millimeter)nsmap	resources)r;   r<   typep:UUIDr   r   r   z<vertex x="{}" y="{}" z="{}" />	trianglesz$<triangle v1="{}" v2="{}" v3="{}" />camerar|   r
   c              3   2   K   | ]  }t        |        y wNr_   rS   s     r&   r2   zexport_3MF.<locals>.<genexpr>  s       9&26A ),A26   rH   r      	componentrP   )r=   r   rC   r   c              3   2   K   | ]  }t        |        y wr   r   rS   s     r&   r2   zexport_3MF.<locals>.<genexpr>  s      -,XqCF,Xr   z
{{{}}}UUIDr   r   r=   r   rD   z_rels/.relsRelationshipsz<http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodelRelationshipz/3D/3dmodel.modelrel0)TypeTargetIdz[Content_Types].xmlz<http://schemas.openxmlformats.org/package/2006/content-types))jpeg
image/jpeg)jpgr   )rv   z6application/vnd.ms-package.3dmanufacturing-3dmodel+xml)pngz	image/png)relsz8application/vnd.openxmlformats-package.relationships+xml)texturez9application/vnd.ms-package.3dmanufacturing-3dmodeltextureTypesDefault)	ExtensionContentType)r:   )'scene.scener   ro   rP   r   to_networkxrU   ioBytesIOzipfileZipFileopenrY   xmlfilewrite_declarationelement	enumeraterX   r_   uuiduuid4flushrangerl   r   writeformatflattenencoder    nodes
startswithr   r   arrayTElementr^   getvalue)!r   
batch_sizer   r   r   rP   r   rU   model_nsmap
rels_nsmapr   rr   
zip_kwargsr   r   xfr!   r<   r   attribsbatchfragmentnoderW   datar   uuid_tagrtr   typesextctyper   s!                                   @r&   
export_3MFr     s   * $dE"T{}}HJJ""$E&&J JLNOIRK VWJ F( zz|H  -J"/J		:	:z	:aVV&SV1Q9
  " Gfl%;;OZZ,(1(..2B(C9D! #+4.$($+&)$**,&7	# (RZZ<G<!#F!3%'ZZ
%; %'HHJ-21c!**oz-R01

1q:~0N,MPSTYPZ,Z )1 )*,;HOOU]]_,M,T,T07-.)* .S	 &< &(ZZ%<$&HHJ-21c!''lJ-O01A
N0K,R.1%j-9 )1 )*,;HOOU]]_,M,T,T07-.)* .P &= "4 =< )DN !&:-1J$uT{+q0$ #+4.$($+&)$**,&7	# (RZZ<G<!#L!927+2C2C2EJD$03 9&13$x.1I,.QBF2**+!GGI269& 1&I %'HH(-,7 4>3E =ET*EU<V5=d^=F	-.)*
%& 3F ": =< !,S -V ZZ(C

4E)FG&+J&7&=&=&?
d??84$$'HH -,.HHT(^,DRaR!V,L,N,N,V,V,X- %	 $0#6#6{37G#H!MM &$.*d9S0T$/$,c$**,.?$0$	!" '2	 '@ H[ P9
1R VVM3'1emmA.PTV  "O:>SMM&2!	 ? /Q' VV)3/1emm7
  "YZE
E G51"'JCHHU]]9QVWX #( 2'7
/u 
;b w &<%; &=%< "4!3 =<X ":!9 =<k -,V HG[ PO9
 9
11X ?> /Q.P''D 21'7
 7
//u 
;b s  !^5\7'\*4\	A\$[6[BZ5[3B[[[A>\[6%B([)[6\"7\	C1\\	\*\7#^=]$]9+]	$],]4^^&,]72]+	]7^^5Z?:[[[[[[&!\)[3.[66\ ;\\\	\\	\'"\**\4/\77]	<^]	]]]](	#^+]40]77^ <^^	^^'c                    t        j                  dt         j                        }d| v rZt        j                  | d   j	                         t         j                        j                  d      j                  }||ddddf<   |S )z
    Extract a homogeneous transform from a dictionary.

    Parameters
    ------------
    attrib: dict, optionally containing 'transform'

    Returns
    ------------
    transform: (4, 4) float, homogeonous transformation
    r   )r   r   )r   r   Nr   )r   eyer   r   rq   r   r   )r   r   valuess      r&   rb   rb     sp     q

+If&-335RZZHPPQWXZZ"	"1"bqb&r   )rY   3mf)ExceptionWrapper)T)r   r   r   collectionsr   numpyr    r   r   	constantsr   r   r'   r   ZIP_DEFLATEDr   rb   networkxrg   lxmlrY   _three_loaders_3mf_exportersBaseExceptionE
exceptionsr    r   r&   <module>r     s    	   #    -`Xv !%'2F2FVW K\,
2X&NZ(N 2--a01N-a01N	2s   A BA>>B