
    Og0^                       d dl mZ d dlmZmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZ d dlmZmZmZ d dlmZ  G d de      Z G d	 d
e      Zd%dZd&dZd'dZd%dZd&dZd(dZd)dZd*dZddd Z d+dZ!d*dZ"d*dZ#d*dZ$d+dZ%d,dZ&d-dZ' G d de	jP                        Z) G d d      Z*e)jV                  fd d!d"	 	 	 	 	 	 	 d.d#Z,e)jV                  fd d!d"	 	 	 	 	 	 	 d/d$Z-y)0    )annotations)UnionSequenceN)Vec3normal_vector_3pBoundingBox)MeshTransformerMeshVertexMergerMeshBuilder)__version__c                      e Zd Zy)UnsupportedFileFormatN__name__
__module____qualname__     X/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/addons/meshex.pyr   r          r   r   c                      e Zd Zy)ParsingErrorNr   r   r   r   r   r      r   r   r   c                    t        | d      5 }|j                         }ddd       j                  d      r|j                  dd      }t	        |      S t        |      S # 1 sw Y   CxY w)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(      se     
h	 "MM'(M3|   s   A  A)c                   dd}t               }g }t        | j                  d      d      D ]  \  }}|j                  d      }|j	                  d      r	 |j                   ||             A|j	                  d	      sSt        |      d
k(  r|j                  |       |j                           t        j                  |      S # t        t        f$ r t        d| d|       w xY w)zLoad a mesh from an ascii `STL`_ content string as :class:`ezdxf.render.MeshTransformer`
    instance.

    Raises:
        ParsingError: vertex parsing error

    c                    | j                         }t        t        |d         t        |d         t        |d               S )N         splitr   float)linedatas     r   parse_vertexzstl_loads.<locals>.parse_vertex5   s4    zz|E$q'NE$q'NE$q'NCCr   
r+   start vertexzSTL parsing error in line : endloopr-   )r1   strreturnr   )r
   	enumerater/   stripr    append
IndexError
ValueErrorr   lenadd_faceclearr	   from_builder)contentr3   meshfacenumr1   s         r   r"   r"   *   s    D DDw}}T2!< 
	Tzz% ??8$OL./ __Y'4yA~d#JJL
 ''-- 
+ O"%?uBtf#MNNOs   C!C'c                   d}t        j                  d| |      d   }|dz  }t               }t        |      D ]]  }	 t        j                  d| |      }|dz  }t        |dd	       }t        |d	d
       }t        |d
d       }|j                  |||f       _ t        j                  |      S # t         j                  $ r t        d      w xY w)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   r-      	      )
structunpack_fromr
   rangeerrorr   r   rC   r	   rE   )	r&   indexn_facesrG   _rH   v1v2v3s	            r   r#   r#   I   s     E  vu5a8G	QJED7^ 	$	;%%gvu=D 	$q)_$q)_$q*r2rl#	$ ''-- || 	;9::	;s   B,,Cc                    t        | ddd      5 }|j                         }ddd       t        |      S # 1 sw Y   t              S xY w)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%   rF   s      r   off_readfilerc   d   E     
hwx	@ B'')WW	   4Ac           	        t               }g }| j                  d      D ]@  }|j                  d      }|j                  d      s
|dk(  s|dk(  r0|j	                  |       B t        |      dk(  rt        d      |d   j                  d      r|d   dd	 |d<   |d   j                         }	 t        |d         t        |d
         }}t        |      ||z   k  rt        d      |d
|d
z    D ]_  }|j                         }	 t        t        |d         t        |d
         t        |d               }	|j                  j	                  |	       a |d
z   }
g }||
|
|z    D ]  }|j                         }	 t        |d         }t        |      D ]#  }
	 |j	                  t        |d
|
z                   % |j                  j	                  t        |             |j!                           t#        j$                  |      S # t        $ r t        d|d          w xY w# t        t        f$ r t        d|       w xY w# t        $ r t        d|       w xY w# t        t        f$ r t        d|       w xY w)zLoad a mesh from a `OFF`_ content string as :class:`ezdxf.render.MeshTransformer`
    instance.

    Raises:
        ParsingError: vertex or face parsing error

    r4   z 
#OFF r   z!OFF format parsing error: no datarM   Nr+   zOFF format parsing error: z,OFF format parsing error: invalid data countr,   z!OFF format vertex parsing error: zOFF format face parsing error: z%OFF format face index parsing error: )r
   r/   r>   r    r?   rB   r   intrA   r   r0   r@   verticesrU   facestuplerD   r	   rE   )rF   rG   linesr1   n
n_verticesrX   r8   vvtxrW   face_indicesrH   fvertex_counts                  r   ra   ra   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eego. 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   -G< 1H2H; I<HH8;II4c                    t        | ddd      5 }|j                         }ddd       t        |      S # 1 sw Y   t              S xY w)zRead `OBJ`_ file content as list of :class:`ezdxf.render.MeshTransformer`
    instances.

    Raises:
        ParsingError: vertex or face parsing error

    r^   r   r   r_   N)r   r   	obj_loadsrb   s      r   obj_readfilerx      rd   re   c           
     r   dd}dd}t               gg }t               }t        | j                  d      d      D ]  \  }}|j	                  d      }|j                  d      r	  ||dd	       }j                  |       F|j                  d      r%	 |j                  fd ||dd	       D               ||j                  d      st        |j                        dkD  s|j                  t        j                  |             t               } t        |j                        dkD  r$|j                  t        j                  |             |S # t        t        f$ r t        d
| d|       w xY w# t        $ r t        d| d|       t        $ r t        dt               d| d|       w xY w)zLoad one or more meshes from an `OBJ`_ content string as list of
    :class:`ezdxf.render.MeshTransformer` instances.

    Raises:
        ParsingError: vertex parsing error

    c                    | j                         }t        t        |d         t        |d         t        |d               S )Nr   r+   r,   r.   )lrq   s     r   r3   zobj_loads.<locals>.parse_vertex   s4    GGIE!A$KqteAaDk::r   c                B    t        d | j                         D              S )Nc              3  V   K   | ]!  }t        |j                  d       d          # yw)/r   N)rj   r/   ).0r'   s     r   	<genexpr>z0obj_loads.<locals>.parse_face.<locals>.<genexpr>   s!     =aSa)=s   '))rm   r/   )r{   s    r   
parse_facezobj_loads.<locals>.parse_face   s    =1779===r   r4   r+   r5   r7   rq   r,   Nz!OBJ vertex parsing error in line r9   rt   c              3  (   K   | ]	  }|     y wNr   )r   irk   s     r   r   zobj_loads.<locals>.<genexpr>   s     HahqkHs   zOBJ face parsing error in line zOBJ face index error (n=z
) in line gr   )r{   r;   r<   r   )r{   r;   r<   zSequence[int])r   r
   r=   r/   r>   r    r@   rA   r   r?   rC   rB   rk   r	   rE   )	rF   r3   r   meshesrG   rI   r1   rr   rk   s	           @r   rw   rw      s   ;> !F8H$&FDw}}T2!< &	T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#E6!E36A F6c           
     j   dt          g}| j                  d      D ]  }t        |      dk  r	 t        |d   |d   |d         }|j                  d      }|j                  d|j                   d	|j                   d	|j                          |j                  d
       |D ]:  }|j                  d|j                   d	|j                   d	|j                          < |j                  d       |j                  d        |j                  d       dj                  |      S # t        $ r Y w xY w)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 r-   max_vertex_countr   r+   r,      z  facet normal  z    outer loopz      vertex z    endloopz
  endfacetz	endsolid
r4   )r   tessellationrB   r   ZeroDivisionErrorroundr?   xyzjoin)rG   rn   rH   ro   rq   s        r   	stl_dumpsr      s'     8}EFE!!1!5 #t9q=	 a$q'47;A GGAJqsse1QSSE133%89%& 	<ALL=Qqsse1QSSE:;	<]#\"# 
LL99U ! 		s   D%%	D21D2sc   STL generated ezdxf                                                                                rK   c                   t         dg}d}| j                  d      D ]  }	 t        |d   |d   |d         }|dz  }t	        |j
                        }|D ]  }|j                  |j
                          |j                  d       |j                  t        j                  dg|         t        j                  d|      |d<   d	j                  |      S # t        $ r Y w xY w)
z|Returns the `STL`_ binary data as bytes for the given `mesh`.

    For more information see function: :func:`stl_dumps`
    s   0000r   r-   r   r+   r,   rN   rL   r   )STL_SIGNATUREr   r   r   listxyzextendr?   rS   packr   )rG   r2   countrH   ro   valuesrq   s          r   	stl_dumpbr     s    
 '0DE!!1!5 
3	 a$q'47;A 	
aee 	!AMM!%% 	!aFKK1&12
3 kk$&DG88D> ! 		s   C	C! C!c           	        dt        | j                         dt        | j                         dg}| j                  D ]J  }|j                  d      }|j	                  |j
                   d|j                   d|j                          L | j                         D ]7  }|j	                  t        |       ddj                  d |D                      9 |dxx   dz  cc<   dj                  |      S )zlReturns the `OFF`_ data as string for the given `mesh`.
    The `OFF`_ format supports ngons as faces.

    rh   r   z 0rP   c              3  2   K   | ]  }t        |        y wr   r;   r   r   s     r   r   zoff_dumps.<locals>.<genexpr>6  s     ,BSV,B   r4   )
rB   rk   rl   r   r?   r   r   r   
open_facesr   rG   rn   rq   rH   s       r   	off_dumpsr   ,  s    
 #dmm"4!5Qs4::6GrJKE]] +GGAJuAaccU!ACC5)*+ ! FD	{!CHH,BT,B$B#CDEF	"II99Ur   c           	        dt          g}| j                  D ]K  }|j                  d      }|j                  d|j                   d|j
                   d|j                          M | j                         D ],  }|j                  ddj                  d |D              z          . |dxx   dz  cc<   dj                  |      S )	zlReturns the `OBJ`_ data as string for the given `mesh`.
    The `OBJ`_ format supports ngons as faces.

    z# OBJ generated by ezdxf rP   zv r   zf c              3  8   K   | ]  }t        |d z           ywr+   Nr   r   s     r   r   zobj_dumps.<locals>.<genexpr>F  s     $>ASQZ$>   r   r4   )	r   rk   r   r?   r   r   r   r   r   r   s       r   	obj_dumpsr   ;  s    
 4K=ABE]] -GGAJr!##auAaccU+,- ! @TCHH$>$>>>?@ 
"II99Ur   c           
        dg}| j                   D ]L  }|j                  d      }|j                  d|j                   d|j                   d|j
                   d       N |j                  d       | j                         D ]/  }|j                  ddj                  d |D              z   dz          1 |j                  d       d	j                  |      S )
at  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 = [rP   z  [z, z],z], faces = [c              3  2   K   | ]  }t        |        y wr   r   r   s     r   r   zscad_dumps.<locals>.<genexpr>_  s     &<!s1v&<r   z], convexity = 10);
r4   )rk   r   r?   r   r   r   r   r   r   s       r   
scad_dumpsr   K  s     00E]] 2GGAJs133%r!##bR012 
LL ! EUTYY&<t&<<<tCDE 
LL()99Ur   c                   t        d | j                  D              rd}d}nd}d}dj                  ddd	t        j                         z   d
t        t        | j                              j	                         z   ddddt        t        | j                              j	                         z   |dg
      }|g}| j                  D ]G  }|j                  t        j                  d|j                  |j                  |j                               I | j                         D ]D  }t        |      }|j                  |      }|j                  t        j                  ||g|        F dj                  |      S )zrReturns the `PLY`_ binary data as bytes for the given `mesh`.
    The `PLY`_ format supports ngons as faces.

    c              3  8   K   | ]  }t        |      d kD    yw)   N)rB   )r   rt   s     r   r   z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   )anyrl   r   r   encoder;   rB   rk   r?   rS   r   r   r   r   r   format)	rG   face_hdr_fmtface_fmtheaderr2   r8   rH   r   fmts	            r   	ply_dumpbr   e  s>   
 
,
,,<>JJ.*[-?-?-AAS%7!8!?!?!AAs3tzz?3::<<	
F  D-- FFKKvxx688DEF! 4D	ooe$FKKU2T234 88D>r   c                 P    t        t        j                         j                        S r   )_guid_compressuuiduuid4hexr   r   r   ifc_guidr     s    $**,**++r   c                B   dt        dt        |       d      D cg c]  }t        | ||dz    d       }}d
dfd}dj                   ||d   d      gt        ddd      D cg c]%  } |||   dz  ||dz      d	z  z   ||dz      z         ' c}z         S c c}w c c}w )Nz@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$r   r,      c           	         dj                  t        |      D cg c]  }| d|z  z  dz      c}d d d         S c c}w )Nri   @   r   )r   rU   )rq   sizer   charss      r   b64z_guid_compress.<locals>.b64  sD    ww16t=AUA"a%LB&'=ddC
 	
=s   <ri   r+   r-   r   )rM   )rq   rj   r   rj   )rU   rB   rj   r   )r   r   bsr   r   s       @r   r   r     s    NE).q#a&!)<	=A#aAElB
	=B	=

 77	RUA 1b!_
 A"AEa02a!e9<=
	
  
>
s   B$*B
c                      e Zd ZdZdZdZy)IfcEntityTypePOLY_FACE_SETCLOSED_SHELL
OPEN_SHELLN)r   r   r   POLYGON_FACE_SETr   r   r   r   r   r   r     s    &!LJr   r   c                  z    e Zd ZddZedd       Zedd       Zedd       ZdddZd Z	ddZ
ddZdd	Zdd
Zy)Recordsc                    g | _         y r   recordsselfs    r   __init__zRecords.__init__  s     #%r   c                ,    t        | j                        S r   )rB   r   r   s    r   last_numzRecords.last_num  s    4<<  r   c                     | j                   dz
  S Nr+   r   r   s    r   prev_numzRecords.prev_num      }}q  r   c                     | j                   dz   S r   r   r   s    r   next_numzRecords.next_num  r   r   c                    |j                  d      sJ d       | j                  j                  |       |dk7  r#|t        | j                        k7  rt	        d      t        | j                        }d| S )N);zinvalid structurer   zunexpected record numberrg   )endswithr   r?   rB   rA   )r   recordrI   s      r   addzRecords.add  si    t$9&99$F#!8s4<<00788$,,3%yr   c                :    | j                   j                  d       y )Nri   )r   r?   r   s    r   	add_dummyzRecords.add_dummy  s    Br   c                &    | j                   |dz
     S r   r   )r   rI   s     r   getzRecords.get  s    ||C!G$$r   c                n    t        | j                        D ]  \  }}||v s| j                  |||        y r   )r=   r   update_record)r   tag
record_numrW   r   s        r   
update_allzRecords.update_all  s7    &t||4 	;ME6f}""5#z:	;r   c                \    | j                   |   j                  ||      | j                   |<   y r   )r   replace)r   rW   r   r   s       r   r   zRecords.update_record  s&    "ll5199#zJUr   c                X    dj                  d t        | j                        D              S )Nr4   c              3  >   K   | ]  \  }}|s	d |dz    d|   yw)rg   r+   z= Nr   )r   rI   r2   s      r   r   z Records.dumps.<locals>.<genexpr>  s,      
$-CDaAwb
s   
)r   r=   r   r   s    r   dumpszRecords.dumps  s)    yy 
1:4<<1H
 
 	
r   N)r<   None)r<   rj   )r   )r   r;   rI   rj   r<   r;   )rI   rj   r<   r;   )r   r;   r   r;   r<   r;   )r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r     sb    %
 ! ! ! ! ! ! %;
K
r   r   
MeshExport)      ?r   r   layercolorc               Z   	
 d }d	
fd}d	 fd
d	 fdt         j                        dk(  ryt         j                        }t               	|j                  J |j                  j
                  dk  s2|j                  j                  dk  s|j                  j                  dk  rU|j                  	t        j                           j                  	j
                   	j                   	j                           |       } |       }||j                         z   dz   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                     t         j                   j                         j                         d d } d|  dt         dt         dS )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_headerzifc4_dumps.<locals>.make_header  sR      $$&0023B7 !6!F{mS\]h\i j 	r   c            	     t	   t               } 	t        j                  k(  rd}n:	t        j                  k(  rd}n$	t        j                  k(  rd}nt        d	       | j                  dt                dd       | j                  dd       | j                  d	d
       | j                  dd       | j                  dd       | j                  dt         dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  d d!       | j                  d"d#       | j                  d$d%       | j                  d&d'       | j                  d(d)       | j                  d*d+       | j                  d,d-       | j                  d.t                d/d0      }| j                          | j                  d1t                d2d3      }| j                  d4d5       | j                  d6d7       | j                  d8d9       | j                  d:j                   d;j                   d;j                   d<d=       | j                  dd>       | j                  d?d@       | j                  dA| dBdC      }| j                  dDdE       dF}	t        j                  k(  r	 |       }n7	t        j                  k(  r	 |       }n	t        j                  k(  r |       }dGdH   dId;d   dId;d   dIdJ}| j                  |       | j                  dK| j                  dz    dL       | j                  dM| j                  dz    d<       | j                  dN| j                  dz    d<       | j                  dO| j                  dz    dP       | j                  dQ
 dR| dS| j                  dz    d<       | j                  dM| j                  dz    d<       | j                  dK| j                  dz    dL       | j                  |       | j                  dTt                dU| dV| dJ       | j                  dWt                dX| d<       | j                  dY|       | S )ZNSurfaceModelBrepinvalid entity type: zIFCPROJECT('z$',#2,'MeshExport',$,$,$,$,(#7),#13);r+   z#IFCOWNERHISTORY(#3,#6,$,$,$,$,$,0);r,   z"IFCPERSONANDORGANIZATION(#4,#5,$);r-   z%IFCPERSON($,$,'Undefined',$,$,$,$,$);rM   z%IFCORGANIZATION($,'Undefined',$,$,$);   zIFCAPPLICATION(#5,'z','ezdxf','ezdxf');rP   zLIFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.000000000000000E-05,#8,#12);   z IFCAXIS2PLACEMENT3D(#9,#10,#11);r   zIFCCARTESIANPOINT((0.,0.,0.));rQ   zIFCDIRECTION((0.,0.,1.));
   zIFCDIRECTION((1.,0.,0.));   zIFCDIRECTION((1.,0.));rR   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.);   z#IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.);   z!IFCSIUNIT(*,.MASSUNIT.,$,.GRAM.);   zIFCLOCALPLACEMENT($,#8);   zIFCBUILDING('z0',#2,'MeshExport',$,$, #20,$,$,.ELEMENT.,$,$,$);   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   rA   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_recordsz%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                    | j                  d| j                  dz    d      }| j                  }dj                  j                  D cg c]  }t        |j                         c}      }| j                  d| d       g }j                         D ]>  }dj                  d |D              }|j                  | j                  d| d             @ | j                  |dz
  d	dj                  |             |S c c}w )
NzIFCPOLYGONALFACESET(#r+   z,$,($FACES$), $);r  zIFCCARTESIANPOINTLIST3D((r  c              3  8   K   | ]  }t        |d z           ywr   r   r   s     r   r   z<ifc4_dumps.<locals>.make_polygon_face_set.<locals>.<genexpr>N  s     8as1q5z8r   zIFCINDEXEDPOLYGONALFACE(($FACES$)
r   r   r   r   rk   r;   r   r   r?   r   )	r   r   
entity_numrq   rk   face_recordsrH   indicesrG   s	           r   r$  z)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   	C;c                `   t         j                  k(  r4| j                  d| j                  dz    d      }| j                  d       nUt         j                  k(  r4| j                  d| j                  dz    d      }| j                  d       nt        d       | j                  }| j                  	j                  D ]*  }| j                  d	t        |j                         d       , g }	j                         D ]  }d
j                  fd|D              }| j                  d| d       | j                  d| j                  dz    d       |j                  | j                  d| j                  dz    d              | j                  |dz
  dd
j                  |             |S )NzIFCFACETEDBREP(#r+   r   zIFCCLOSEDSHELL(($FACES$));zIFCSHELLBASEDSURFACEMODEL((#r  zIFCOPENSHELL(($FACES$));r  zIFCCARTESIANPOINT(r  c              3  @   K   | ]  }d t        |z         z     yw)rg   Nr   )r   r   first_vertexs     r   r   z1ifc4_dumps.<locals>.make_shell.<locals>.<genexpr>i  s      Jc,*:&; ;Js   zIFCPOLYLOOP((zIFCFACEOUTERBOUND(#z,.T.);z
IFCFACE((#r)  )r   r   r   r   r   rA   r   rk   r;   r   r   r   r   r?   r   )
r   r   	shell_numrq   r+  rH   rk   r/  r#  rG   s
          @r   r%  z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   ri   z
ENDSEC;
END-ISO-10303-21;
)r<   r   )r   r   r<   r;   )rB   rk   r   r   extminr   r   r   r	   rE   	translater   )rG   r#  r   r   r   r&  bboxr   r2   r"  r$  r%  s   ````     @@@r   
ifc4_dumpsr4    s    B
B BH": 4==Qt}}%D6D;;"""{{}}qDKKMMA-1B {{++D1w$&&1]FDDJJL #CCCr   c          	        t         j                  j                  |       dz   }t        j                  | dt        j
                        }	 |j                  |t        ||||             |j                          y# |j                          w xY w)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writestrr4  close)r$   rG   r#  r   r   namezfs          r   export_ifcZIPrC    sk    . 77H%.D	9M9M	NB
*T;e5I	
 	

s   
A: :B)r$   Union[str, os.PathLike]r<   r	   )rF   r;   r<   r	   )r&   bytesr<   r	   )r$   rD  r<   list[MeshTransformer])rF   r;   r<   rF  )rG   r   r<   r;   )rG   r   r<   rE  r   )r   r;   r<   r;   )rG   r   r   r;   r   tuple[float, float, float]r<   r;   )r$   rD  rG   r   r   r;   r   rG  ).
__future__r   typingr   r   r9  rS   r   r   enumr<  
ezdxf.mathr   r   r   ezdxf.renderr	   r
   r   ezdxfr   	Exceptionr   r   r(   r"   r#   rc   ra   rx   rw   r   r   r   r   r   r   r   r   r   Enumr   r   r   r4  rC  r   r   r   <module>rP     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   