
    h0^                       S SK Jr  S SKJrJr  S SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKJrJrJr  S SKJrJrJr  S SKJr   " S S\5      r " S	 S
\5      rS%S jrS&S jrS'S jrS%S jrS&S jrS(S jrS)S jrS*S jrSSS r S+S jr!S*S jr"S*S jr#S*S jr$S+S jr%S,S jr&S-S jr' " S S\	RP                  5      r) " S S5      r*\)RV                  4S S!S".       S.S# jjjr,\)RV                  4S S!S".       S/S$ jjjr-g)0    )annotations)UnionSequenceN)Vec3normal_vector_3pBoundingBox)MeshTransformerMeshVertexMergerMeshBuilder)__version__c                      \ rS rSrSrg)UnsupportedFileFormat    N__name__
__module____qualname____firstlineno____static_attributes__r       E/var/www/html/env/lib/python3.13/site-packages/ezdxf/addons/meshex.pyr   r          r   r   c                      \ rS rSrSrg)ParsingError   r   Nr   r   r   r   r   r      r   r   r   c                    [        U S5       nUR                  5       nSSS5        WR                  S5      (       a  UR                  SSS9n[	        U5      $ [        U5      $ ! , (       d  f       NJ= f)zRead ascii or binary `STL`_ file content as :class:`ezdxf.render.MeshTransformer`
instance.

Raises:
    ParsingError: vertex parsing error or invalid/corrupt data

rbNs   solidasciiignore)errors)openread
startswithdecode	stl_loads	stl_loadb)filenamefpbufferss       r   stl_readfiler,      sa     
h	 
""MM'(M3|   
	s   A""
A0c                   SS jn[        5       n/ n[        U R                  S5      SS9 H  u  pEUR                  S5      nUR	                  S5      (       a   UR                  U" U5      5        MF  UR	                  S	5      (       d  M^  [        U5      S
:X  a  UR                  U5        UR                  5         M     [        R                  " U5      $ ! [        [        4 a    [        SU SU 35      ef = f)zLoad a mesh from an ascii `STL`_ content string as :class:`ezdxf.render.MeshTransformer`
instance.

Raises:
    ParsingError: vertex parsing error

c                    U R                  5       n[        [        US   5      [        US   5      [        US   5      5      $ )N         splitr   float)linedatas     r   parse_vertexstl_loads.<locals>.parse_vertex5   s4    zz|E$q'NE$q'NE$q'NCCr   
r/   start vertexzSTL parsing error in line : endloopr1   )r5   strreturnr   )r
   	enumerater3   stripr$   append
IndexError
ValueErrorr   lenadd_faceclearr	   from_builder)contentr7   meshfacenumr5   s         r   r&   r&   *   s    D DDw}}T2!<	zz% ??8$$OL./ __Y''4yA~d#JJL = ''-- 
+ O"%?uBtf#MNNOs   C"C5c                   Sn[         R                  " SX5      S   nUS-  n[        5       n[        U5       H]  n [         R                  " SX5      nUS-  n[        USS	 5      n[        US	S
 5      n[        US
S 5      nUR                  XgU45        M_     [        R                  " U5      $ ! [         R                   a    [        S5      ef = f)zLoad a mesh from a binary `STL`_ data :class:`ezdxf.render.MeshTransformer`
instance.

Raises:
    ParsingError: invalid/corrupt data or not a binary STL file

P   <Ir      <12fHzbinary STL parsing error2   r1      	      )
structunpack_fromr
   rangeerrorr   r   rH   r	   rJ   )	r*   indexn_facesrL   _rM   v1v2v3s	            r   r'   r'   I   s     E  v5a8G	QJED7^	;%%gv=D 	$q)_$q)_$q*rrl#  ''-- || 	;9::	;s   B.. Cc                    [        U SSSS9 nUR                  5       nSSS5        [        W5      $ ! , (       d  f       N= f)zRead `OFF`_ file content as :class:`ezdxf.render.MeshTransformer`
instance.

Raises:
    ParsingError: vertex or face parsing error

rtr   r    encodingr!   N)r"   r#   	off_loadsr(   r)   rK   s      r   off_readfilerh   d   :     
hwx	@B'') 
AW 
A	@   1
?c           	        [        5       n/ nU R                  S5       HI  nUR                  S5      nUR                  S5      (       d  US:X  d  US:X  a  M8  UR	                  U5        MK     [        U5      S:X  a  [        S5      eUS   R                  S5      (       a  US   SS	 US'   US   R                  5       n [        US   5      [        US
   5      pe[        U5      XV-   :  a  [        S5      eUS
US
-     H`  nUR                  5       n [        [        US   5      [        US
   5      [        US   5      5      n	UR                  R	                  U	5        Mb     US
-   n
/ nX*X-     H  nUR                  5       n [        US   5      n[        U5       H$  n
 UR	                  [        US
U
-      5      5        M&     UR                  R	                  [        U5      5        UR!                  5         M     ["        R$                  " U5      $ ! [         a    [        SUS    35      ef = f! [        [        4 a    [        SU 35      ef = f! [         a    [        SU 35      ef = f! [        [        4 a    [        SU 35      ef = f)zLoad a mesh from a `OFF`_ content string as :class:`ezdxf.render.MeshTransformer`
instance.

Raises:
    ParsingError: vertex or face parsing error

r9   z 
#OFF r   z!OFF format parsing error: no datarR   Nr/   zOFF format parsing error: z,OFF format parsing error: invalid data countr0   z!OFF format vertex parsing error: zOFF format face parsing error: z%OFF format face index parsing error: )r
   r3   rC   r$   rD   rG   r   intrF   r   r4   rE   verticesrZ   facestuplerI   r	   rJ   )rK   rL   linesr5   n
n_verticesr]   r=   vvtxr\   face_indicesrM   fvertex_counts                  r   rf   rf   q   s    DEd#zz'"??345=DBJT $ 5zQ>@@Qx5!!8AB<aaAD!!A$iQqTG 5zJ((IKKJN+LLN	MuQqT{E!A$Kqt=C 	S! , NELeo.JJL	Iqt9L <(E##C!e)$56 ) 	

%-. / ''--?  D7azBCCD J' 	M!B6(KLL	M  	I!@GHH	I
 
+ ";D6B s0   =H 1H/I I-H,/II*-Jc                    [        U SSSS9 nUR                  5       nSSS5        [        W5      $ ! , (       d  f       N= f)zRead `OBJ`_ file content as list of :class:`ezdxf.render.MeshTransformer`
instances.

Raises:
    ParsingError: vertex or face parsing error

rc   r   r    rd   N)r"   r#   	obj_loadsrg   s      r   obj_readfiler}      ri   rj   c           
       ^ SS jnSS jn[        5       /m/ n[        5       n[        U R                  S5      SS9 H  u  pVUR	                  S5      nUR                  S5      (       a   U" USS	 5      nTR                  U5        MK  UR                  S5      (       a'   UR                  U4S jU" USS	 5       5       5        M  UR                  S5      (       d  M  [        UR                  5      S:  d  M  UR                  [        R                  " U5      5        [        5       nM     [        UR                  5      S:  a%  UR                  [        R                  " U5      5        U$ ! [        [        4 a    [        S
U SU 35      ef = f! [         a    [        SU SU 35      e[         a    [        S[        T5       SU SU 35      ef = f)zLoad one or more meshes from an `OBJ`_ content string as list of
:class:`ezdxf.render.MeshTransformer` instances.

Raises:
    ParsingError: vertex parsing error

c                    U R                  5       n[        [        US   5      [        US   5      [        US   5      5      $ )Nr   r/   r0   r2   )lrv   s     r   r7   obj_loads.<locals>.parse_vertex   s4    GGIE!A$KqteAaDk::r   c                B    [        S U R                  5        5       5      $ )Nc              3  \   #    U  H"  n[        UR                  S 5      S   5      v   M$     g7f)/r   N)ro   r3   ).0r+   s     r   	<genexpr>0obj_loads.<locals>.parse_face.<locals>.<genexpr>   s$     =9aSa))9s   *,)rr   r3   )r   s    r   
parse_faceobj_loads.<locals>.parse_face   s    =1779===r   r9   r/   r:   r<   rv   r0   Nz!OBJ vertex parsing error in line r>   ry   c              3  .   >#    U  H
  nTU   v   M     g 7fNr   )r   irp   s     r   r   obj_loads.<locals>.<genexpr>   s     H3Gahqk3Gs   zOBJ face parsing error in line zOBJ face index error (n=z
) in line gr   )r   r@   rA   r   )r   r@   rA   zSequence[int])r   r
   rB   r3   rC   r$   rE   rF   r   rD   rH   rG   rp   r	   rJ   )	rK   r7   r   meshesrL   rN   r5   rw   rp   s	           @r   r|   r|      s   ;> !F8H$&FDw}}T2!<	zz% ??3"48,
 OOC __S!!	H:d12h3GHH __S!!c$--&81&<MM/66t<=#%D1 =4 4==Ao22489M/ 
+ "7uBtfE   "5cU"TFC   ".s8}oZuBtfU s   )E*$F*"FAGc           
     t   S[          3/nU R                  SS9 H  n[        U5      S:  a  M   [        US   US   US   5      nUR                  S5      nUR                  SUR                   S	UR                   S	UR                   35        UR                  S
5        U H;  nUR                  SUR                   S	UR                   S	UR                   35        M=     UR                  S5        UR                  S5        M     UR                  S5        SR                  U5      $ ! [         a     GM  f = f)a  Returns the `STL`_ data as string for the given `mesh`.
This function triangulates the meshes automatically because the `STL`_
format supports only triangles as faces.

This function does not check if the mesh obey the
`STL`_ format `rules <http://www.fabbers.com/tech/STL_Format>`_:

    - The direction of the face normal is outward.
    - The face vertices are listed in counter-clockwise order when looking
      at the object from the outside (right-hand rule).
    - Each triangle must share two vertices with each of its adjacent triangles.
    - The object represented must be located in the all-positive octant
      (non-negative and nonzero).

zsolid STL generated by ezdxf r1   max_vertex_countr   r/   r0      z  facet normal  z    outer loopz      vertex z    endloopz
  endfacetz	endsolid
r9   )r   tessellationrG   r   ZeroDivisionErrorroundrD   xyzjoin)rL   rs   rM   rt   rv   s        r   	stl_dumpsr      s     8}EFE!!1!5t9q=	 a$q'47;A GGAJqsse1QSSE133%89%&ALL=Qqsse1QSSE:; ]#\" 6 
LL99U ! 		s   D((
D76D7sc   STL generated ezdxf                                                                                rP   c                   [         S/nSnU R                  SS9 H  n [        US   US   US   5      nUS-  n[	        UR
                  5      nU H  nUR                  UR
                  5        M      UR                  S5        UR                  [        R                  " S/UQ76 5        M     [        R                  " SU5      US'   S	R                  U5      $ ! [         a     M  f = f)
ztReturns the `STL`_ binary data as bytes for the given `mesh`.

For more information see function: :func:`stl_dumps`
s   0000r   r1   r   r/   r0   rS   rQ   r   )STL_SIGNATUREr   r   r   listxyzextendrD   rX   packr   )rL   r6   countrM   rt   valuesrv   s          r   	stl_dumpbr     s    
 '0DE!!1!5	 a$q'47;A 	
aeeAMM!%%  aFKK1&12 6 kk$&DG88D> ! 		s   C
C&%C&c           	        S[        U R                  5       S[        U R                  5       S3/nU R                   HK  nUR                  S5      nUR	                  UR
                   SUR                   SUR                   35        MM     U R                  5        H8  nUR	                  [        U5       SSR                  S U 5       5       35        M:     US==   S-  ss'   SR                  U5      $ )zdReturns the `OFF`_ data as string for the given `mesh`.
The `OFF`_ format supports ngons as faces.

rm   r   z 0rU   c              3  8   #    U  H  n[        U5      v   M     g 7fr   r@   r   r   s     r   r   off_dumps.<locals>.<genexpr>6  s     ,BTSVVT   r9   )
rG   rp   rq   r   rD   r   r   r   
open_facesr   rL   rs   rv   rM   s       r   	off_dumpsr   ,  s    
 #dmm"4!5Qs4::6GrJKE]]GGAJuAaccU!ACC5)*  !D	{!CHH,BT,B$B#CDE "	"II99Ur   c           	        S[          3/nU R                   HL  nUR                  S5      nUR                  SUR                   SUR
                   SUR                   35        MN     U R                  5        H-  nUR                  SSR                  S U 5       5      -   5        M/     US==   S-  ss'   SR                  U5      $ )	zdReturns the `OBJ`_ data as string for the given `mesh`.
The `OBJ`_ format supports ngons as faces.

z# OBJ generated by ezdxf rU   zv r   zf c              3  >   #    U  H  n[        US -   5      v   M     g7fr/   Nr   r   s     r   r   obj_dumps.<locals>.<genexpr>F  s     $>ASQZZ   r   r9   )	r   rp   r   rD   r   r   r   r   r   r   s       r   	obj_dumpsr   ;  s    
 4K=ABE]]GGAJr!##auAaccU+,  !TCHH$>$>>>? " 
"II99Ur   c           
        S/nU R                    HM  nUR                  S5      nUR                  SUR                   SUR                   SUR
                   S35        MO     UR                  S5        U R                  5        H0  nUR                  SSR                  S U 5       5      -   S-   5        M2     UR                  S5        S	R                  U5      $ )
aX  Returns the `OpenSCAD`_ `polyhedron`_ definition as string for the given
`mesh`. `OpenSCAD`_ supports ngons as faces.

.. Important::

    `OpenSCAD`_ requires the face normals pointing inwards, the method
    :meth:`~ezdxf.render.MeshBuilder.flip_normals` of the
    :class:`~ezdxf.render.MeshBuilder` class can flip the normals
    inplace.

zpolyhedron(points = [rU   z  [z, z],z], faces = [c              3  8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   scad_dumps.<locals>.<genexpr>_  s     &<t!s1vvtr   z], convexity = 10);
r9   )rp   r   rD   r   r   r   r   r   r   s       r   
scad_dumpsr   K  s     00E]]GGAJs133%r!##bR01  
LL !UTYY&<t&<<<tCD " 
LL()99Ur   c                   [        S U R                   5       5      (       a  SnSnOSnSnSR                  SSS	[        R                  " 5       -   S
[        [        U R                  5      5      R	                  5       -   SSSS[        [        U R                  5      5      R	                  5       -   US/
5      nU/nU R                   HI  nUR                  [        R                  " SUR                  UR                  UR                  5      5        MK     U R                  5        HE  n[        U5      nUR                  U5      nUR                  [        R                  " X/UQ76 5        MG     SR                  U5      $ )zjReturns the `PLY`_ binary data as bytes for the given `mesh`.
The `PLY`_ format supports ngons as faces.

c              3  >   #    U  H  n[        U5      S :  v   M     g7f)   N)rG   )r   ry   s     r   r   ply_dumpb.<locals>.<genexpr>j  s     
,A3q6C<r   s"   property list int int vertex_indexz<i{}is$   property list uchar int vertex_indexz<B{}i   
s   plys   format binary_little_endian 1.0s   comment generated by ezdxf s   element vertex s   property float xs   property float ys   property float zs   element face s   end_header
z<3fr   )anyrq   r   r   encoder@   rG   rp   rD   rX   r   r   r   r   r   format)	rL   face_hdr_fmtface_fmtheaderr6   r=   rM   r   fmts	            r   	ply_dumpbr   e  s3   
 
,
,,,<>JJ.*[-?-?-AAS%7!8!?!?!AAs3tzz?3::<<	
F  D--FKKvxx688DE  !D	ooe$FKK2T23 " 88D>r   c                 R    [        [        R                  " 5       R                  5      $ r   )_guid_compressuuiduuid4hexr   r   r   ifc_guidr     s    $**,**++r   c                L  ^ Sm[        S[        U 5      S5       Vs/ s H  n[        XUS-    S5      PM     nnS
SU4S jjjnSR                  U" US   S5      /[        SSS5       Vs/ s H#  nU" X!   S-  X!S-      S	-  -   X!S-      -   5      PM%     sn-   5      $ s  snf s  snf )Nz@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$r   r0      c           	        > SR                  [        U5       Vs/ s H  nTU SU-  -  S-     PM     snS S S2   5      $ s  snf )Nrn   @   r   )r   rZ   )rv   sizer   charss      r   b64_guid_compress.<locals>.b64  sH    ww16t=AUA"a%LB&'=ddC
 	
=s   ?rn   r/   r1   r   )rR   )rv   ro   r   ro   )rZ   rG   ro   r   )r   r   bsr   r   s       @r   r   r     s    NE).q#a&!)<	=)<A#aAElB
)<B	=
 

 77	RUA 1b!_
$ "Ea02!e9<=$
	
  
>
s   B)*B!
c                       \ rS rSrSrSrSrSrg)IfcEntityTypei  POLY_FACE_SETCLOSED_SHELL
OPEN_SHELLr   N)r   r   r   r   POLYGON_FACE_SETr   r   r   r   r   r   r   r     s    &!LJr   r   c                      \ rS rSrSS jr\SS j5       r\SS j5       r\SS j5       rSSS jjr	S r
SS jrSS	 jrSS
 jrSS jrSrg)Recordsi  c                    / U l         g r   recordsselfs    r   __init__Records.__init__  s     #%r   c                ,    [        U R                  5      $ r   )rG   r   r   s    r   last_numRecords.last_num  s    4<<  r   c                     U R                   S-
  $ Nr/   r   r   s    r   prev_numRecords.prev_num      }}q  r   c                     U R                   S-   $ r   r   r   s    r   next_numRecords.next_num  r   r   c                    UR                  S5      (       d   S5       eU R                  R                  U5        US:w  a$  U[        U R                  5      :w  a  [	        S5      e[        U R                  5      nSU 3$ )N);zinvalid structurer   zunexpected record numberrl   )endswithr   rD   rG   rF   )r   recordrN   s      r   addRecords.add  sl    t$$9&99$F#!8s4<<00788$,,3%yr   c                :    U R                   R                  S5        g )Nrn   )r   rD   r   s    r   	add_dummyRecords.add_dummy  s    Br   c                &    U R                   US-
     $ r   r   )r   rN   s     r   getRecords.get  s    ||C!G$$r   c                r    [        U R                  5       H  u  p4X;   d  M  U R                  X1U5        M      g r   )rB   r   update_record)r   tag
record_numr\   r   s        r   
update_allRecords.update_all  s,    &t||4ME}""5z: 5r   c                Z    U R                   U   R                  X#5      U R                   U'   g r   )r   replace)r   r\   r   r   s       r   r   Records.update_record  s$    "ll5199#JUr   c                X    SR                  S [        U R                  5       5       5      $ )Nr9   c              3  N   #    U  H  u  pU(       d  M  S US-    SU 3v   M     g7f)rl   r/   z= Nr   )r   rN   r6   s      r   r    Records.dumps.<locals>.<genexpr>  s,      
1HICDaAwb1Hs   %%)r   rB   r   r   s    r   dumpsRecords.dumps  s)    yy 
1:4<<1H
 
 	
r   r   N)rA   None)rA   ro   )r   )r   r@   rN   ro   rA   r@   )rN   ro   rA   r@   )r   r@   r   r@   rA   r@   )r   r   r   r   r   propertyr   r   r   r   r   r   r  r   r	  r   r   r   r   r   r     sb    %
 ! ! ! ! ! ! %;
K
r   r   
MeshExport)      ?r  r  layercolorc               p  ^ ^^^^	^
^ S nSUU	UUU
U4S jjnS	U 4S jjm
S	UU 4S jjm[        T R                  5      S:X  a  g[        T R                  5      n[        5       m	UR                  c   eUR                  R
                  S:  d4  UR                  R                  S:  d  UR                  R                  S:  aV  UR                  m	[        R                  " T 5      m T R                  T	R
                  * T	R                  * T	R                  * 5        U" 5       nU" 5       nXxR                  5       -   S-   $ )
a  Returns the `IFC4`_ string for the given `mesh`. The caller is
responsible for checking if the mesh is a closed or open surface
(e.g. :code:`mesh.diagnose().euler_characteristic == 2`) and using the
appropriate entity type.

Args:
    mesh: :class:`~ezdxf.render.MeshBuilder`
    entity_type: :class:`IfcEntityType`
    layer: layer name as string
    color: entity color as RGB tuple, values in the range [0,1]

.. warning::

    `IFC4`_ is a very complex data format and this is a minimal effort
    exporter, so the exported data may not be importable by all CAD
    applications.

    The exported `IFC4`_ data can be imported by the following applications:

    - BricsCAD
    - FreeCAD (IfcOpenShell)
    - Allplan
    - Tekla BIMsight

c                     [         R                   R                  5       R                  5       S S n SU  S[         S[         S3$ )NizuISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('undefined.ifc','z%',('Undefined'),('Undefined'),'ezdxf z	','ezdxf z6','Undefined');
FILE_SCHEMA(('IFC4'));
ENDSEC;

DATA;
)datetimenow	isoformatr   )dates    r   make_headerifc4_dumps.<locals>.make_header  sR      $$&0023B7 !6!F{mS\]h\i j 	r   c            	     	  > [        5       n T	[        R                  :X  a  SnO<T	[        R                  :X  a  SnO%T	[        R                  :X  a  SnO[        ST	 35      eU R                  S[        5        S3S5        U R                  SS5        U R                  S	S
5        U R                  SS5        U R                  SS5        U R                  S[         S3S5        U R                  SS5        U R                  SS5        U R                  SS5        U R                  SS5        U R                  SS5        U R                  SS5        U R                  SS5        U R                  S S!5        U R                  S"S#5        U R                  S$S%5        U R                  S&S'5        U R                  S(S)5        U R                  S*S+5        U R                  S,S-5        U R                  S.[        5        S/3S05      nU R                  5         U R                  S1[        5        S23S35      nU R                  S4S55        U R                  S6S75        U R                  S8S95        U R                  S:TR                   S;TR                   S;TR                   S<3S=5        U R                  SS>5        U R                  S?S@5        U R                  SAU SB3SC5      nU R                  SDSE5        SFnT	[        R                  :X  a	  T" U 5      nO9T	[        R                  :X  a	  T" U 5      nOT	[        R                  :X  a  T" U 5      nSGTSH   SI S;TS   SI S;TS   SI SJ3nU R                  U5        U R                  SKU R                  S-    SL35        U R                  SMU R                  S-    S<35        U R                  SNU R                  S-    S<35        U R                  SOU R                  S-    SP35        U R                  SQT
 SRU SSU R                  S-    S<35        U R                  SMU R                  S-    S<35        U R                  SKU R                  S-    SL35        U R                  U5        U R                  ST[        5        SUU SVU SJ35        U R                  SW[        5        SXU S<35        U R                  SYU5        U $ )ZNSurfaceModelBrepinvalid entity type: zIFCPROJECT('z$',#2,'MeshExport',$,$,$,$,(#7),#13);r/   z#IFCOWNERHISTORY(#3,#6,$,$,$,$,$,0);r0   z"IFCPERSONANDORGANIZATION(#4,#5,$);r1   z%IFCPERSON($,$,'Undefined',$,$,$,$,$);rR   z%IFCORGANIZATION($,'Undefined',$,$,$);   zIFCAPPLICATION(#5,'z','ezdxf','ezdxf');rU   zLIFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.000000000000000E-05,#8,#12);   z IFCAXIS2PLACEMENT3D(#9,#10,#11);r   zIFCCARTESIANPOINT((0.,0.,0.));rV   zIFCDIRECTION((0.,0.,1.));
   zIFCDIRECTION((1.,0.,0.));   zIFCDIRECTION((1.,0.));rW   z-IFCUNITASSIGNMENT((#14,#15,#16,#17,#18,#19));   z$IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);   z)IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);   z*IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);r   z)IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);r   z#IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.);   z!IFCSIUNIT(*,.MASSUNIT.,$,.GRAM.);   zIFCLOCALPLACEMENT($,#8);   zIFCBUILDING('z0',#2,'MeshExport',$,$, #20,$,$,.ELEMENT.,$,$,$);r   zIFCBUILDINGELEMENTPROXY('z',#2,$,$,$,#24,#29,$,$);   zIFCLOCALPLACEMENT(#25,#26);   zIFCLOCALPLACEMENT(#20,#8);   z!IFCAXIS2PLACEMENT3D(#27,#10,#28);   zIFCCARTESIANPOINT((,));      z%IFCPRODUCTDEFINITIONSHAPE($,$,(#30));   z#IFCSHAPEREPRESENTATION(#31,'Body','z',($ENTITY$));   zQIFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#7,$,.MODEL_VIEW.,$);   z#0zIFCCOLOURRGB($,r   z.3fr   zIFCSURFACESTYLESHADING(#z,0.);zIFCSURFACESTYLE($,.POSITIVE.,(#z!IFCPRESENTATIONSTYLEASSIGNMENT((#zIFCSTYLEDITEM($ENTITY$,(#z),$);zIFCPRESENTATIONLAYERWITHSTYLE('z',$,(z),$,.T.,.F.,.F.,(#z#IFCRELCONTAINEDINSPATIALSTRUCTURE('z
',#2,$,$,(z),zIFCRELAGGREGATES('z',#2,$,$,#1,(z$ENTITY$)r   r   r   r   r   rF   r   r   r   r   r   r   r   r   r   r  )r   kindbuildingproxyshapeentity	color_strr  eminentity_typer  make_polygon_face_set
make_shells          r   make_data_records%ifc4_dumps.<locals>.make_data_records  st   )-888!DM444!DM666D4[MBCCl8:,.RSUVW91=8!<;Q?;Q?)+6IJANbdef6:4a8/4/4,b1CRH:B??D@"E?D92>7<.3;;xzl:jkmop7
|C[\^`a1260"57<)$&&466(!DFF83GL/4;R@A$~VXZ[gikl -888*73FM666(FM444(F%eAhs^1U1XcN!E!HS>QST	I.w/?/?/A.B%HI5g6F6Fq6H5IMN78H8H8J7K3OP/0@0@0B/C5IJ5eWE%HZ[b[k[klm[mZnnqrs5g6F6Fq6H5IMN.w/?/?/A.B%HII9(*ZPUwVXYaXbbdef(M(3OP:v.r   c                
  > U R                  SU R                  S-    S35      nU R                  nSR                  TR                   Vs/ s H  n[        UR                  5      PM     sn5      nU R                  SU S35        / nTR                  5        H?  nSR                  S U 5       5      nUR                  U R                  SU S35      5        MA     U R                  US-
  S	SR                  U5      5        U$ s  snf )
NzIFCPOLYGONALFACESET(#r/   z,$,($FACES$), $);r-  zIFCCARTESIANPOINTLIST3D((r.  c              3  >   #    U  H  n[        US -   5      v   M     g7fr   r   r   s     r   r   <ifc4_dumps.<locals>.make_polygon_face_set.<locals>.<genexpr>N  s     84as1q5zz4r   zIFCINDEXEDPOLYGONALFACE(($FACES$)
r   r   r   r   rp   r@   r   r   rD   r   )	r   r8  
entity_numrv   rp   face_recordsrM   indicesrL   s	           r   r<  )ifc4_dumps.<locals>.make_polygon_face_setE  s    #G$4$4Q$6#77HI
 %%
88?ASZ?@/z=>"$OO%Dhh8488G7yDE & 	j1ni,9OP @s   	D c                n  >^ T[         R                  :X  a4  U R                  SU R                  S-    S35      nU R                  S5        OVT[         R                  :X  a4  U R                  SU R                  S-    S35      nU R                  S5        O[        ST 35      eU R                  nU R                  mT	R                   H+  nU R                  S	[        UR                  5       S35        M-     / nT	R                  5        H  nS
R                  U4S jU 5       5      nU R                  SU S35        U R                  SU R                  S-    S35        UR                  U R                  SU R                  S-    S35      5        M     U R                  US-
  SS
R                  U5      5        U$ )NzIFCFACETEDBREP(#r/   r   zIFCCLOSEDSHELL(($FACES$));zIFCSHELLBASEDSURFACEMODEL((#r.  zIFCOPENSHELL(($FACES$));r  zIFCCARTESIANPOINT(r-  c              3  F   >#    U  H  nS [        TU-   5      -   v   M     g7f)rl   Nr   )r   r   first_vertexs     r   r   1ifc4_dumps.<locals>.make_shell.<locals>.<genexpr>i  s      JTc,*:&; ;Ts   !zIFCPOLYLOOP((zIFCFACEOUTERBOUND(#z,.T.);z
IFCFACE((#rC  )r   r   r   r   r   rF   r   rp   r@   r   r   r   r   rD   r   )
r   r8  	shell_numrv   rE  rM   rp   rJ  r;  rL   s
          @r   r=  ifc4_dumps.<locals>.make_shellV  s   -444[[#3G4D4DQ4F3Gr!JKFKK46M444[[.w/?/?!/C.DCHF KK244[MBCC$$	''AKK,SZL;<  #%OO%DxxJTJJHKK-z56KK-g.>.>q.@-AHIj)9)9!);(<C@A	 & 	i!mY8NOr   r   rn   z
ENDSEC;
END-ISO-10303-21;
)rA   r   )r   r   rA   r@   )rG   rp   r   r   extminr   r   r   r	   rJ   	translater	  )rL   r;  r  r  r  r>  bboxr   r6   r:  r<  r=  s   ````     @@@r   
ifc4_dumpsrQ    s    B
B BH" : 4==Qt}}%D6D;;"""{{}}qDKKMMA-1B {{++D1w$&&1]FDJJL #CCCr   c          
        [         R                  R                  U 5      S-   n[        R                  " U S[        R
                  S9n UR                  U[        XX4S95        UR                  5         g! UR                  5         f = f)a  Export the given `mesh` as zip-compressed `IFC4`_ file. The filename
suffix should be ``.ifcZIP``. For more information see function
:func:`ifc4_dumps`.

Args:
    filename: zip filename, the data file has the same name with suffix ``.ifc``
    mesh: :class:`~ezdxf.render.MeshBuilder`
    entity_type: :class:`IfcEntityType`
    layer: layer name as string
    color: entity color as RGB tuple, values in the range [0,1]

Raises:
    IOError: IO error when opening the zip-file for writing

z.ifcw)modecompressionr  N)	ospathbasenamezipfileZipFileZIP_DEFLATEDwritestrrQ  close)r(   rL   r;  r  r  namezfs          r   export_ifcZIPr`    sg    . 77H%.D	9M9M	NB
*TeI	
 	

s   A3 3B)r(   Union[str, os.PathLike]rA   r	   )rK   r@   rA   r	   )r*   bytesrA   r	   )r(   ra  rA   list[MeshTransformer])rK   r@   rA   rc  )rL   r   rA   r@   )rL   r   rA   rb  r  )r   r@   rA   r@   )rL   r   r  r@   r  tuple[float, float, float]rA   r@   )r(   ra  rL   r   r  r@   r  rd  ).
__future__r   typingr   r   rV  rX   r   r  enumrY  
ezdxf.mathr   r   r   ezdxf.renderr	   r
   r   ezdxfr   	Exceptionr   r   r,   r&   r'   rh   rf   r}   r|   r   r   r   r   r   r   r   r   r   Enumr   r   r   rQ  r`  r   r   r   <module>rm     sO   # " 	      : : G G 	I 		9 	!".>.6
;.|
1h F 4Sb9, 4!H,&DII +
 +
` ..nD (7nD
nD 	nD
 &nD 	nDh ..
 (7%

  &r   