
    'j0^                       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d4dZd5dZd6dZd4dZd5dZd7dZd8dZd9dZddd         Z d:d Z!d9d!Z"d9d"Z#d9d#Z$d:d$Z%d;d%Z&d<d'Z' G d( d)e	j(                  Z) G d* d+          Z*e)j+        fd,d-d.d=d2Z,e)j+        fd,d-d.d>d3Z-dS )?    )annotations)UnionSequenceN)Vec3normal_vector_3pBoundingBox)MeshTransformerMeshVertexMergerMeshBuilder)__version__c                      e Zd ZdS )UnsupportedFileFormatN__name__
__module____qualname__     M/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/addons/meshex.pyr   r              Dr   r   c                      e Zd ZdS )ParsingErrorNr   r   r   r   r   r      r   r   r   filenameUnion[str, os.PathLike]returnr	   c                   t          | d          5 }|                                }ddd           n# 1 swxY w Y   |                    d          r&|                    dd          }t	          |          S t          |          S )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)r   fpbufferss       r   stl_readfiler*      s     
h		               "" !MM'(M33||   s   266contentstrc                0   dd}t                      }g }t          |                     d          d          D ]\  }}|                    d	          }|                    d
          rJ	 |                     ||                     O# t          t          f$ r t          d| d|           w xY w|                    d          r<t          |          dk    r|
                    |           |                                 t          j        |          S )zLoad a mesh from an ascii `STL`_ content string as :class:`ezdxf.render.MeshTransformer`
    instance.

    Raises:
        ParsingError: vertex parsing error

    liner,   r   r   c                    |                                  }t          t          |d                   t          |d                   t          |d                             S )N         splitr   float)r.   datas     r   parse_vertexzstl_loads.<locals>.parse_vertex5   s?    zz||E$q'NNE$q'NNE$q'NNCCCr   
r0   start vertexzSTL parsing error in line : endloopr2   )r.   r,   r   r   )r
   	enumerater4   stripr#   append
IndexError
ValueErrorr   lenadd_faceclearr	   from_builder)r+   r7   meshfacenumr.   s         r   r%   r%   *   s9   D D D D DDw}}T22!<<< 
 
	Tzz%  ??8$$ 	OLL..////
+ O O O"#M#M#Mt#M#MNNNO__Y'' 	4yyA~~d###JJLLL'---s   )B'B/r(   bytesc                   d}t          j        d| |          d         }|dz  }t                      }t          |          D ]}	 t          j        d| |          }n"# t           j        $ r t          d          w xY w|dz  }t          |dd	                   }t          |d	d
                   }t          |d
d                   }|                    |||f           t          j	        |          S )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   r2      	      )
structunpack_fromr
   rangeerrorr   r   rE   r	   rG   )	r(   indexn_facesrH   _rI   v1v2v3s	            r   r&   r&   I   s    E vu55a8G	QJED7^^ 	$ 	$	;%gvu==DD| 	; 	; 	;9:::	;$qs)__$qs)__$qt*r2rl####'---s   AA:c                    t          | ddd          5 }|                                }ddd           n# 1 swxY w Y   t          |          S )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'   r+   s      r   off_readfilere   d        
hwx	@	@	@ B''))              W   599c           	     :   t                      }g }|                     d          D ]N}|                    d          }|                    d          s|dk    s|dk    r9|                    |           Ot          |          dk    rt          d          |d                             d          r|d         dd	         |d<   |d                                         }	 t          |d                   t          |d
                   }}n&# t          $ r t          d|d                    w xY wt          |          ||z   k     rt          d          |d
|d
z            D ]}|                                }	 t          t          |d                   t          |d
                   t          |d                             }	n'# t          t          f$ r t          d|           w xY w|j                            |	           |d
z   }
g }||
|
|z            D ]}|                                }	 t          |d                   }n # t          $ r t          d|           w xY wt          |          D ]U}
	 |                    t          |d
|
z                                 /# t          t          f$ r t          d|           w xY w|j                            t          |                     |                                 t#          j        |          S )zLoad a mesh from a `OFF`_ content string as :class:`ezdxf.render.MeshTransformer`
    instance.

    Raises:
        ParsingError: vertex or face parsing error

    r8   z 
#OFF r   z!OFF format parsing error: no datarO   Nr0   zOFF format parsing error: z,OFF format parsing error: invalid data countr1   z!OFF format vertex parsing error: zOFF format face parsing error: z%OFF format face index parsing error: )r
   r4   r@   r#   rA   rD   r   intrC   r   r5   rB   verticesrW   facestuplerF   r	   rG   )r+   rH   linesr.   n
n_verticesrZ   r<   vvtxrY   face_indicesrI   fvertex_counts                  r   rc   rc   q   sb    DEd##  zz'""??3 	45==DBJJT
5zzQ?@@@Qx5!!  8ABB<aaAD!!A$iiQqTG

 D D DBaBBCCCD 5zzJ(((JKKKJN*+ " "LLNN	MuQqT{{E!A$KKqt==CCJ' 	M 	M 	MK6KKLLL	MS!!!!NELeego-.  JJLL	Iqt99LL 	I 	I 	IGGGHHH	I<(( 	 	E##C!e)$5$56666
+   "BDBB   	
%--...'---s1    *D #D.:A
G$G)2II%:+J&&$K
list[MeshTransformer]c                    t          | ddd          5 }|                                }ddd           n# 1 swxY w Y   t          |          S )zRead `OBJ`_ file content as list of :class:`ezdxf.render.MeshTransformer`
    instances.

    Raises:
        ParsingError: vertex or face parsing error

    r`   r   r   ra   N)r!   r"   	obj_loadsrd   s      r   obj_readfiler{      rf   rg   c           
     "   dd}dd}t                      gg }t                      }t          |                     d          d	
          D ]\  }}|                    d          }|                    d          rU	  ||dd                   }n*# t          t          f$ r t          d| d|           w xY w	                    |           |                    d          r	 |
                    fd ||dd                   D                        # t          $ r t          d| d|           t          $ r& t          dt                     d| d|           w xY w|                    d          rMt          |j                  dk    r5|	                    t          j        |                     t                      }t          |j                  dk    r'|	                    t          j        |                     |S )zLoad one or more meshes from an `OBJ`_ content string as list of
    :class:`ezdxf.render.MeshTransformer` instances.

    Raises:
        ParsingError: vertex parsing error

    lr,   r   r   c                    |                                  }t          t          |d                   t          |d                   t          |d                             S )Nr   r0   r1   r3   )r}   rs   s     r   r7   zobj_loads.<locals>.parse_vertex   s?    GGIIE!A$KKqteAaDkk:::r   Sequence[int]c                X    t          d |                                 D                       S )Nc              3  f   K   | ],}t          |                    d           d                   V  -dS )/r   N)rl   r4   ).0r)   s     r   	<genexpr>z0obj_loads.<locals>.parse_face.<locals>.<genexpr>   s8      ==aSa))======r   )ro   r4   )r}   s    r   
parse_facezobj_loads.<locals>.parse_face   s'    ==17799======r   r8   r0   r9   r;   rs   r1   Nz!OBJ vertex parsing error in line r=   rv   c              3  (   K   | ]}|         V  d S Nr   )r   irm   s     r   r   zobj_loads.<locals>.<genexpr>   s'      HHahqkHHHHHHr   zOBJ face parsing error in line zOBJ face index error (n=z
) in line gr   )r}   r,   r   r   )r}   r,   r   r   )r   r
   r?   r4   r@   r#   rB   rC   r   rA   rE   rD   rm   r	   rG   )	r+   r7   r   meshesrH   rJ   r.   rt   rm   s	           @r   rz   rz      sy   ; ; ; ;> > > > !FF8H$&FDw}}T22!<<< & &	Tzz%  ??3 	&"l48,,
+   "EEEtEE   OOC    __S!! 	&	HHHH::d122h3G3GHHHHHHH   "CcCCTCC      "Us8}}UUUUtUU  
 __S!! 	&c$-&8&81&<&<MM/6t<<===#%%D
4=Ao2488999Ms   >B'B9(2DAE)rH   r   c           
        dt            g}|                     d          D ]}t          |          dk     r	 t          |d         |d         |d                   }n# t          $ r Y Gw xY w|                    d          }|                    d|j         d	|j         d	|j	                    |                    d
           |D ]/}|                    d|j         d	|j         d	|j	                    0|                    d           |                    d           |                    d           d
                    |          S )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 r2   max_vertex_countr   r0   r1      z  facet normal  z    outer loopz      vertex z    endloopz
  endfacetz	endsolid
r8   )r   tessellationrD   r   ZeroDivisionErrorroundrA   xyzjoin)rH   rp   rI   rq   rs   s        r   	stl_dumpsr      sl     FEEFE!!1!55 # #t99q==	 a$q'47;;AA  	 	 	H	GGAJJ8qs88QS881388999%&&& 	< 	<ALL:::qs::QS::;;;;]###\""""	LL99Us   #A
A*)A*sc   STL generated ezdxf                                                                                rM   c                   t           dg}d}|                     d          D ]}	 t          |d         |d         |d                   }n# t          $ r Y 3w xY w|dz  }t	          |j                  }|D ]}|                    |j                   |                    d           |                    t          j	        dg|R             t          j	        d|          |d<   d	
                    |          S )
z|Returns the `STL`_ binary data as bytes for the given `mesh`.

    For more information see function: :func:`stl_dumps`
    s   0000r   r2   r   r0   r1   rP   rN   r   )STL_SIGNATUREr   r   r   listxyzextendrA   rU   packr   )rH   r6   countrI   rq   valuesrs   s          r   	stl_dumpbr     s   
 '0DE!!1!55 
3 
3	 a$q'47;;AA  	 	 	H	
ae 	! 	!AMM!%    aFK1&1112222k$&&DG88D>>s   #A		
AAc           	        dt          | j                   dt          | j                   dg}| j        D ]C}|                    d          }|                    |j         d|j         d|j                    D|                                 D ]F}|                    t          |           dd	                    d |D                                   G|dxx         dz  cc<   d	                    |          S )zlReturns the `OFF`_ data as string for the given `mesh`.
    The `OFF`_ format supports ngons as faces.

    rj   r   z 0rR   c              3  4   K   | ]}t          |          V  d S r   r,   r   r   s     r   r   zoff_dumps.<locals>.<genexpr>6  s(      ,B,BSVV,B,B,B,B,B,Br   r8   )
rD   rm   rn   r   rA   r   r   r   
open_facesr   rH   rp   rs   rI   s       r   	off_dumpsr   ,  s	   
 #dm"4"4JJs4:JJJKE] + +GGAJJ))ac))AC))****!! F FD		DDCHH,B,BT,B,B,B$B$BDDEEEE	"IIIIII99Ur   c           	        dt            g}| j        D ]D}|                    d          }|                    d|j         d|j         d|j                    E|                                 D ]7}|                    dd                    d |D                       z              8|dxx         dz  cc<   d                    |          S )	zlReturns the `OBJ`_ data as string for the given `mesh`.
    The `OBJ`_ format supports ngons as faces.

    z# OBJ generated by ezdxf rR   zv r   zf c              3  :   K   | ]}t          |d z             V  dS r0   Nr   r   s     r   r   zobj_dumps.<locals>.<genexpr>F  s,      $>$>ASQZZ$>$>$>$>$>$>r   r   r8   )	r   rm   r   rA   r   r   r   r   r   r   s       r   	obj_dumpsr   ;  s    
 BKAABE] - -GGAJJ+!#++++ac++,,,,!! @ @TCHH$>$>$>$>$>>>>????	"IIIIII99Ur   c           
        dg}| j         D ]E}|                    d          }|                    d|j         d|j         d|j         d           F|                    d           |                                 D ]:}|                    dd                    d |D                       z   dz              ;|                    d           d	                    |          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 = [rR   z  [z, z],z], faces = [c              3  4   K   | ]}t          |          V  d S r   r   r   s     r   r   zscad_dumps.<locals>.<genexpr>_  s(      &<&<!s1vv&<&<&<&<&<&<r   z], convexity = 10);
r8   )rm   r   rA   r   r   r   r   r   r   s       r   
scad_dumpsr   K  s     00E] 2 2GGAJJ01300!#000001111	LL   !! E EUTYY&<&<t&<&<&<<<<tCDDDD	LL()))99Ur   c                   t          d | j        D                       rd}d}nd}d}d                    ddd	t          j                    z   d
t          t          | j                                                            z   ddddt          t          | j                                                            z   |dg
          }|g}| j        D ];}|                    t          j
        d|j        |j        |j                             <|                                 D ]L}t          |          }|                    |          }|                    t          j
        ||g|R             Md                    |          S )zrReturns the `PLY`_ binary data as bytes for the given `mesh`.
    The `PLY`_ format supports ngons as faces.

    c              3  <   K   | ]}t          |          d k    V  dS )   N)rD   )r   rv   s     r   r   zply_dumpb.<locals>.<genexpr>j  s,      
,
,A3q66C<
,
,
,
,
,
,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   )anyrn   r   r   encoder,   rD   rm   rA   rU   r   r   r   r   r   format)	rH   face_hdr_fmtface_fmtheaderr6   r<   rI   r   fmts	            r   	ply_dumpbr   e  sx   
 
,
,
,
,
,,, <>JJ.*[-?-A-AAS%7%7!8!8!?!?!A!AAs3tz??33::<<<	
 F  D- F FFKvx68DDEEEE!! 4 4D		ooe$$FKU2T222333388D>>r   c                 L    t          t          j                    j                  S r   )_guid_compressuuiduuid4hexr   r   r   ifc_guidr     s    $*,,*+++r   r   c           	          d fdt          dt                     d          D             ddfd	d
                     d         d          gfdt          ddd          D             z             S )Nz@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$c                F    g | ]}t          ||d z            d          S )r1      )rl   )r   r   r   s     r   
<listcomp>z"_guid_compress.<locals>.<listcomp>  s/    	=	=	=A#aAE	lB

	=	=	=r   r   r1   rO   rs   rl   sizec                v     d                      fdt          |          D             d d d                   S )Nrk   c                2    g | ]}d |z  z  d z           S )@   r   )r   r   charsrs   s     r   r   z/_guid_compress.<locals>.b64.<locals>.<listcomp>  s+    ===AUA"a%LB&'===r   r   )r   rW   )rs   r   r   s   ` r   b64z_guid_compress.<locals>.b64  sE    ww=====t===dddC
 
 	
r   rk   c                n    g | ]1} |         d z  |dz            dz  z   |dz            z             2S )r   r0   r   r1   r   )r   r   r   bss     r   r   z"_guid_compress.<locals>.<listcomp>  sY     
 
 
 CA"AEa02a!e9<==
 
 
r   r0   r   r2   )rO   )rs   rl   r   rl   )rW   rD   r   )r   r   r   r   s   `@@@r   r   r     s    NE	=	=	=	=q#a&&!)<)<	=	=	=B
 
 
 
 
 
 

 77	RUA
 
 
 
 
1b!__
 
 
	
  r   c                      e Zd ZdZdZdZdS )IfcEntityTypePOLY_FACE_SETCLOSED_SHELL
OPEN_SHELLN)r   r   r   POLYGON_FACE_SETr   r   r   r   r   r   r     s        &!LJJJr   r   c                      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dS )Recordsr   Nonec                    g | _         d S r   recordsselfs    r   __init__zRecords.__init__  s     #%r   rl   c                *    t          | j                  S r   )rD   r   r   s    r   last_numzRecords.last_num  s    4<   r   c                    | j         dz
  S Nr0   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   r   recordr,   rJ   c                    |                     d          s
J d            | j                            |           |dk    r'|t          | j                  k    rt	          d          t          | j                  }d| S )N);zinvalid structurer   zunexpected record numberri   )endswithr   rA   rD   rC   )r   r   rJ   s      r   addzRecords.add  s    t$$99&999$F###!88s4<00007888$,3yyr   c                :    | j                             d           d S )Nrk   )r   rA   r   s    r   	add_dummyzRecords.add_dummy  s    Br   c                "    | j         |dz
           S r   r   )r   rJ   s     r   getzRecords.get  s    |C!G$$r   tag
record_numc                p    t          | j                  D ] \  }}||v r|                     |||           !d S r   )r?   r   update_record)r   r   r   rY   r   s        r   
update_allzRecords.update_all  sK    &t|44 	; 	;ME6f}}""5#z:::	; 	;r   c                X    | j         |                             ||          | j         |<   d S r   )r   replace)r   rY   r   r   s       r   r   zRecords.update_record  s+    "l5199#zJJUr   c                d    d                     d t          | j                  D                       S )Nr8   c              3  6   K   | ]\  }}|d |dz    d| V  dS )ri   r0   z= Nr   )r   rJ   r6   s      r   r   z Records.dumps.<locals>.<genexpr>  sS       
 
$-CD
A
 
 
 
 
 
r   )r   r?   r   r   s    r   dumpszRecords.dumps  s>    yy 
 
1:4<1H1H
 
 
 
 
 	
r   N)r   r   )r   rl   )r   )r   r,   rJ   rl   r   r,   )rJ   rl   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     s       % % % %
 ! ! ! X! ! ! ! X! ! ! ! X!         % % % %; ; ; ;
K K K K
 
 
 
 
 
r   r   
MeshExport)      ?r   r   layercolorr   r   tuple[float, float, float]c                  	
 d }d	
fd}d fd
d fdt           j                  d	k    rd
S t           j                  }t                      	|j        J |j        j        d	k     s |j        j        d	k     s|j        j        d	k     rD|j        	t          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                                                                         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  sk     $$&&00223B37 !  HS  ^i   	r   r   r   c            	     
   t                      } 	t          j        k    rd}n8	t          j        k    rd}n%	t          j        k    rd}nt          d	           |                     dt                       dd           |                     dd           |                     d	d
           |                     dd           |                     dd           |                     dt           dd           |                     dd           |                     dd           |                     dd           |                     dd           |                     dd           |                     dd           |                     dd           |                     d d!           |                     d"d#           |                     d$d%           |                     d&d'           |                     d(d)           |                     d*d+           |                     d,d-           |                     d.t                       d/d0          }| 	                                 |                     d1t                       d2d3          }|                     d4d5           |                     d6d7           |                     d8d9           |                     d:j
         d;j         d;j         d<d=           |                     dd>           |                     d?d@           |                     dA| dBdC          }|                     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}|                     |           |                     dK| j        dz    dL           |                     dM| j        dz    d<           |                     dN| j        dz    d<           |                     dO| j        dz    dP           |                     dQ
 dR| dS| j        dz    d<           |                     dM| j        dz    d<           |                     dK| j        dz    dL           |                     |           |                     dTt                       dU| dV| dJ           |                     dWt                       dX| d<           |                     dY|           | S )ZNSurfaceModelBrepinvalid entity type: zIFCPROJECT('z$',#2,'MeshExport',$,$,$,$,(#7),#13);r0   z#IFCOWNERHISTORY(#3,#6,$,$,$,$,$,0);r1   z"IFCPERSONANDORGANIZATION(#4,#5,$);r2   z%IFCPERSON($,$,'Undefined',$,$,$,$,$);rO   z%IFCORGANIZATION($,'Undefined',$,$,$);   zIFCAPPLICATION(#5,'z','ezdxf','ezdxf');rR   zLIFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.000000000000000E-05,#8,#12);   z IFCAXIS2PLACEMENT3D(#9,#10,#11);r   zIFCCARTESIANPOINT((0.,0.,0.));rS   zIFCDIRECTION((0.,0.,1.));
   zIFCDIRECTION((1.,0.,0.));   zIFCDIRECTION((1.,0.));rT   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   rC   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  s   ))-888!DDM444!DDM666DDB[BBCCCS8::SSSUVWWW91===8!<<<;Q???;Q???J+JJJANNNbdefff6:::4a888/444/444,b111CRHHH:B????DDD@"EEE?DDD92>>>7<<<.333;;kxzzkkkmopp\

\\\^`aa126660"5557<<<G$&GG46GGDFGGGLLL/444;R@@@V$VVVXZ[[giklll -888**733FFM666Z((FFM444Z((FTeAhTTTU1XTTTE!HTTTT	IHw/?/AHHHIIIMg6Fq6HMMMNNNO8H8JOOOPPPI0@0BIIIJJJrerr%rr[b[klm[mrrrsssMg6Fq6HMMMNNNHw/?/AHHHIIIIe(**eePUeeYaeeefffOOO(OOOPPP:v...r   r   r,   c                   |                      d| j        dz    d          }| j        }d                    d j        D                       }|                      d| d           g }                                D ]M}d                    d |D                       }|                    |                      d	| d                     N|                     |dz
  d
d                    |                     |S )NzIFCPOLYGONALFACESET(#r0   z,$,($FACES$), $);r  c                6    g | ]}t          |j                  S r   )r,   r   )r   rs   s     r   r   z=ifc4_dumps.<locals>.make_polygon_face_set.<locals>.<listcomp>J  s     ???ASZZ???r   zIFCCARTESIANPOINTLIST3D((r  c              3  :   K   | ]}t          |d z             V  dS r   r   r   s     r   r   z<ifc4_dumps.<locals>.make_polygon_face_set.<locals>.<genexpr>N  s,      88as1q5zz888888r   zIFCINDEXEDPOLYGONALFACE(($FACES$)r   r   r   r   rm   r   rA   r   )r   r'  
entity_numrm   face_recordsrI   indicesrH   s          r   r+  z)ifc4_dumps.<locals>.make_polygon_face_setE  s   IG$4Q$6III
 
 %
88?????@@====>>>"$OO%% 	 	Dhh88488888GDDDDEE    	j1ni,9O9OPPPr   c                z   t           j        k    r7|                     d| j        dz    d          }|                     d           nYt           j        k    r7|                     d| j        dz    d          }|                     d           nt          d           | j        }| j        	j        D ]-}|                     d	t          |j	                   d           .g }	
                                D ]}d
                    fd|D                       }|                     d| d           |                     d| j        dz    d           |                    |                     d| j        dz    d                     |                     |dz
  dd
                    |                     |S )NzIFCFACETEDBREP(#r0   r   zIFCCLOSEDSHELL(($FACES$));zIFCSHELLBASEDSURFACEMODEL((#r  zIFCOPENSHELL(($FACES$));r  zIFCCARTESIANPOINT(r  c              3  B   K   | ]}d t          |z             z   V  dS )ri   Nr   )r   r   first_vertexs     r   r   z1ifc4_dumps.<locals>.make_shell.<locals>.<genexpr>i  s5      JJc,*:&;&; ;JJJJJJr   zIFCPOLYLOOP((zIFCFACEOUTERBOUND(#z,.T.);z
IFCFACE((#r1  )r   r   r   r   r   rC   r   rm   r,   r   r   r   r   rA   r   )
r   r'  	shell_numrs   r3  rI   rm   r7  r*  rH   s
          @r   r,  zifc4_dumps.<locals>.make_shellV  s   -444[[!JG4DQ4F!J!J!JKKFKK56666M444[[Hw/?!/CHHH F KK34444B[BBCCC$	' 	= 	=AKK;SZZ;;;<<<<"$OO%% 	 	DxxJJJJTJJJJJHKK5555666KKHg.>q.@HHHIII@)9!);@@@AA    	i!mY8N8NOOOr   r   rk   Nz
ENDSEC;
END-ISO-10303-21;
)r   r   )r   r   r   r,   )rD   rm   r   r   extminr   r   r   r	   rG   	translater   )rH   r*  r   r   r  r-  bboxr   r6   r)  r+  r,  s   ````     @@@r   
ifc4_dumpsr<    sw   B
 
 
B B B B B B B B B B BH     "      : 4=Qrt}%%D66D;"""{}qDKMA--1B1B {+D11w$&111[]]FDDJJLL #CCCr   c          	     6   t           j                            |           dz   }t          j        | dt          j                  }	 |                    |t          ||||                     |                                 dS # |                                 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writestrr<  close)r   rH   r*  r   r   namezfs          r   export_ifcZIPrK    s    . 7H%%.D	9M	N	N	NB
*T;e5III	
 	
 	
 	








s   'B B)r   r   r   r	   )r+   r,   r   r	   )r(   rK   r   r	   )r   r   r   rx   )r+   r,   r   rx   )rH   r   r   r,   )rH   r   r   rK   r   )r   r,   r   r,   )rH   r   r   r,   r   r   r   r,   )r   r   rH   r   r   r,   r   r   ).
__future__r   typingr   r   rA  rU   r   r  enumrD  
ezdxf.mathr   r   r   ezdxf.renderr	   r
   r   ezdxfr   	Exceptionr   r   r*   r%   r&   re   rc   r{   rz   r   r   r   r   r   r   r   r   r   Enumr   r   r   r<  rK  r   r   r   <module>rT     s   # " " " " " " " " " " " " " 				      : : : : : : : : : : G G G G G G G G G G      	 	 	 	 	I 	 	 		 	 	 	 	9 	 	 	! ! ! !". . . .>. . . .6
 
 
 
;. ;. ;. ;.|
 
 
 
1 1 1 1h       F 4SbS9   ,          4! ! ! !H, , , ,   &    DI   +
 +
 +
 +
 +
 +
 +
 +
` .nD (7nD nD nD nD nD nDh .
 (7       r   