Ë
    £èhÓ`  ã                  óÜ  — 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__© ó    ú3lib/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)zµRead 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(      s^   € ô 
ˆh˜Ô	 Ø—‘“ˆ÷ 
à×Ñ˜Ô"Ø�M‰M˜'¨(ˆ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)z¤Load 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   € Ø�z‰z‹|ˆÜ”E˜$˜q™'“N¤E¨$¨q©'£N´E¸$¸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Ø�z‰z˜%Ó ˆØ�?‰?˜8Ô$ðOØ—‘™L¨Ó.Õ/ð �_‰_˜YÕ'Ü�4‹y˜AŠ~Ø—‘˜dÔ#Ø�J‰J�Lð =ô ×'Ñ'¨Ó-Ð-øô ¤
Ð+ò OÜ"Ð%?À¸uÀBÀtÀfÐ#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)z°Load 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 erroré2   r-   é   é	   é   )
ÚstructÚunpack_fromr
   ÚrangeÚerrorr   r   rC   r	   rE   )	r&   ÚindexÚn_facesrG   Ú_rH   Úv1Úv2Úv3s	            r   r#   r#   I   sÙ   € ð €EÜ× Ñ   v¨uÓ5°aÑ8€GØ	ˆQ�J€EäÓ€DÜ�7Ž^ˆð	;Ü×%Ñ% g¨v°uÓ=ˆDð 	�‰ˆÜ�$�q˜�)‹_ˆÜ�$�q˜�)‹_ˆÜ�$�q˜�*ÓˆØ�‰�r˜2˜r�lÕ#ð ô ×'Ñ'¨Ó-Ð-øô �|‰|ò 	;ÜÐ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)z•Read `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   óB   € ô 
ˆh˜ w°xÕ	@ÀBØ—'‘'“)ˆ÷ 
Aä�WÓÐ÷ 
Aä�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)z¥Load 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Ö#ˆØ�z‰z˜'Ó"ˆà�?‰?˜3Ô 4¨5¢=°D¸B²JØØ�‰�TÕð $ô ˆ5ƒz�Q‚ÜÐ>Ó@Ð@àˆQ�x×Ñ˜5Ô!à˜‘8˜A˜B�<ˆˆa‰àˆa‰�‰Ó€AðDÜ! ! A¡$›i¬¨Q¨q©T«�Gˆ
ô ˆ5ƒz�J Ñ(Ò(ÜÐIÓKÐKà˜˜J¨™NÓ+ˆØ�L‰L‹Nˆð	MÜ”u˜Q˜q™T“{¤E¨!¨A©$£K´°q¸±t³Ó=ˆCð 	�‰×Ñ˜SÕ!ð ,ð ˜‰N€EØ€LØ�e˜e g™oÓ.ˆØ�J‰J‹Lˆð	IÜ˜q ™t›9ˆLô ˜<Ö(ˆEðØ×#Ñ#¤C¨¨!¨e©)©Ó$5Õ6ð )ð 	�
‰
×Ñœ% Ó-Ô.Ø×ÑÕð /ô ×'Ñ'¨Ó-Ð-øô? ò DÜÐ7¸¸a¹°zÐBÓCÐCðDûô œJÐ'ò 	MÜÐ!BÀ6À(ÐKÓLÐLð	Mûô ò 	IÜÐ!@ÀÀÐGÓHÐHð	Iûô
 ¤
Ð+ò Ü"Ø;¸D¸6Ð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)zžRead `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)z³Load 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   € Ø�G‰G‹IˆÜ”E˜!˜A™$“K¤ q¨¡t£¬e°A°a±D«kÓ:Ð: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"   è ø€ Ð=±9¨a”S˜Ÿ™ › a™×)±9ùs   ‚'))rm   r/   )r{   s    r   Ú
parse_facezobj_loads.<locals>.parse_faceË   s   € ÜÑ=°1·7±7´9Ó=Ó=Ð=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   øè ø€ ÐHÑ3G¨a˜h q�kÑ3Gùs   ƒ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«  ø€ ó;ó>ô !›F˜8€HØ$&€FÜÓ€DÜ˜wŸ}™}¨TÓ2¸!×<‰	ˆˆTØ�z‰z˜%Ó ˆØ�?‰?˜3ÔðÙ" 4¨¨ 8Ó,�ð
 �O‰O˜CÕ Ø�_‰_˜SÔ!ð	Ø—‘ÓH±:¸dÀ1À2¸hÔ3GÓHÕHð �_‰_˜SÕ!¤c¨$¯-©-Ó&8¸1Ó&<Ø�M‰Mœ/×6Ñ6°tÓ<Ô=Ü#Ó%‰Dð1 =ô4 ˆ4�=‰=Ó˜AÒØ�‰”o×2Ñ2°4Ó8Ô9Ø€Møô/ ¤
Ð+ò Ü"Ø7¸°u¸B¸t¸fÐEóð ðûô ò Ü"Ø5°c°U¸"¸T¸FÐCóð ô ò Ü"Ø.¬s°8«}¨o¸ZÈÀuÈBÈtÈfÐ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ÐF€EØ×!Ñ!°1Ð!Ö5ˆÜˆt‹9�qŠ=Øð	Ü   a¡¨$¨q©'°4¸±7Ó;ˆAð �G‰G�A‹JˆØ�‰� q§s¡s e¨1¨Q¯S©S¨E°°1·3±3°%Ð8Ô9Ø�‰Ð%Ô&ÛˆAØ�L‰L˜=¨¯©¨¨Q¨q¯s©s¨e°1°Q·S±S°EÐ:Õ;ð à�‰�]Ô#Ø�‰�\Õ"ð 6ð 
‡L�L�ÔØ�9‰9�UÓÐøô !ò 	Úð	ú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Ú   € ô
 '¨Ð0€DØ€EØ×!Ñ!°1Ð!Ö5ˆð	Ü   a¡¨$¨q©'°4¸±7Ó;ˆAð 	�‰
ˆÜ�a—e‘e“ˆÛˆAØ�M‰M˜!Ÿ%™%Õ ð à�‰�aÔØ�‰”F—K‘K Ð1¨&Ò1Õ2ð 6ô �k‰k˜$ Ó&€Dˆ�GØ�8‰8�D‹>Ðøô !ò 	Ùð	ú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¹T¸¬S°¯V¹Tùó   ‚éÿÿÿÿr4   )
rB   rk   rl   rŽ   r?   r�   r�   r‘   Ú
open_facesr’   ©rG   rn   rq   rH   s       r   Ú	off_dumpsr¥   ,  sÍ   € ð
 ¤# d§m¡mÓ"4Ð!5°Q´s¸4¿:¹:³Ð6GÀrÐJÐK€EØ�]Œ]ˆØ�G‰G�A‹JˆØ�‰˜Ÿ™�u˜A˜aŸc™c˜U ! A§C¡C 5Ð)Õ*ð ð —‘Ö!ˆØ�‰œ˜D›	�{ ! C§H¡HÑ,B¹TÓ,BÓ$BÐ#CÐDÕEð "à	ˆ"ƒI�ÑƒIØ�9‰9�UÓÐ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   è ø€ Ð$>¹°A¤S¨¨Q©§Z¹ùó   ‚r¢   r4   )	r   rk   rŽ   r?   r�   r�   r‘   r£   r’   r¤   s       r   Ú	obj_dumpsrª   ;  s«   € ð
 4´K°=ÐAÐB€EØ�]Œ]ˆØ�G‰G�A‹JˆØ�‰�r˜!Ÿ#™#˜˜a §¡˜u A a§c¡c UÐ+Õ,ð ð —‘Ö!ˆà�‰�T˜CŸH™HÑ$>¹Ó$>Ó>Ñ>Õ?ð "ð 
ˆ"ƒI�ÑƒIØ�9‰9�UÓÐ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   è ø€ Ð&<±t°!¤s¨1§v±tùr¡   z], convexity = 10);
r4   )rk   rŽ   r?   r�   r�   r‘   r£   r’   r¤   s       r   Ú
scad_dumpsr­   K  s¶   € ð 0Ð0€EØ�]Œ]ˆØ�G‰G�A‹JˆØ�‰�s˜1Ÿ3™3˜%˜r !§#¡#  b¨¯©¨¨RÐ0Õ1ð ð 
‡L�L�Ô Ø—‘Ö!ˆØ�‰�U˜TŸY™YÑ&<±tÓ&<Ó<Ñ<¸tÑCÕDð "ð 
‡L�LÐ(Ô)Ø�9‰9�UÓÐ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   è ø€ Ð
,¡˜AŒ3ˆq‹6�C�<¡ù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  s2  € ô
 Ñ
, §¢Ó
,Ô,Ø<ˆØ‰à>ˆØˆà—J‘JàØ.Ø*¬[×-?Ñ-?Ó-AÑAØ¤¤S¨¯©Ó%7Ó!8×!?Ñ!?Ó!AÑAØØØØœs¤3 t§z¡z£?Ó3×:Ñ:Ó<Ñ<ØØð	
ó€Fð  ˜€DØ—-”-ˆØ�‰”F—K‘K  v§x¡x°·±¸6¿8¹8ÓDÕEð  à—‘Ö!ˆÜ�D“	ˆØ�o‰o˜eÓ$ˆØ�‰”F—K‘K  UÐ2¨TÒ2Õ3ð "ð �8‰8�D‹>Ð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’  sH   ø€ Ø�w‰wÜ16°t´Ó=±¨AˆU�A˜"˜a™%‘L BÑ&Ó'°Ñ=¹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Â   ø€ àN€EÜ).¨q´#°a³&¸!Ô)<Ó	=Ñ)< AŒ#ˆa��A˜‘Eˆl˜BÕ
Ð)<€BÐ	=ö
ð
 �7‰7Ù	ˆR�‰U�A‹ˆô ˜1˜b !”_ó
á$�ñ ��A‘˜"‘  A¨¡E¡¨a¡Ñ0°2°a¸!±e±9Ñ<Õ=Ø$ñ
ñ	
óð ùò 
>ùò
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˜œs 4§<¡<Ó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Æ  s2   € Ü& t§|¡|Ö4‰MˆE�6Ø�fŠ}Ø×"Ñ" 5¨#¨zÕ:ñ 5r   c                ó\   — | j                   |   j                  ||«      | j                   |<   y rƒ   )rÒ   Úreplace)rÔ   rW   rê   rë   s       r   ré   zRecords.update_recordË  s&   € Ø"Ÿl™l¨5Ñ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,   è ø€ ð 
Ù1H¡I C¨ÊDˆa��A‘ˆw�b˜˜ÔÑ1Hùs   ‚
�)r’   r=   rÒ   rÓ   s    r   ÚdumpszRecords.dumpsÎ  s)   € Ø�y‰yñ 
Ü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 )NiùÿÿÿzuISO-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Ó2°3°BÐ7ˆðð !˜6Ð!FÄ{ÀmÐS\Ô]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à�‰�l¤8£: ,Ð.RÐSÐUVÔWØ�‰Ð9¸1Ô=Ø�‰Ð8¸!Ô<Ø�‰Ð;¸QÔ?Ø�‰Ð;¸QÔ?Ø�‰Ð)¬+¨Ð6IÐJÈAÔNØ�‰ÐbÐdeÔfØ�‰Ð6¸Ô:Ø�‰Ð4°aÔ8Ø�‰Ð/°Ô4Ø�‰Ð/°Ô4Ø�‰Ð,¨bÔ1Ø�‰ÐCÀRÔHØ�‰Ð:¸BÔ?Ø�‰Ð?ÀÔDØ�‰Ð@À"ÔEØ�‰Ð?ÀÔDØ�‰Ð9¸2Ô>Ø�‰Ð7¸Ô<Ø�‰Ð.°Ô3Ø—;‘; ¬x«z¨lÐ:jÐkÐmoÓpˆØ×ÑÔØ—‘Ð7¼»
°|ÐC[Ð\Ð^`ÓaˆØ�‰Ð1°2Ô6Ø�‰Ð0°"Ô5Ø�‰Ð7¸Ô<Ø�‰Ð)¨$¯&©&¨°°4·6±6°(¸!¸D¿F¹F¸8À3ÐGÈÔLØ�‰Ð/°Ô4Ø�‰Ð;¸RÔ@Ø—‘ÐAÀ$ÀÀ~ÐVÐXZÓ[ˆØ�‰ÐgÐikÔlð ˆØœ-×8Ñ8Ò8Ù*¨7Ó3‰FØœM×6Ñ6Ò6Ù Ó(‰FØœM×4Ñ4Ò4Ù Ó(ˆFØ% e¨A¡h¨s ^°1°U¸1±X¸c°NÀ!ÀEÈ!ÁHÈSÀ>ÐQSÐTˆ	Ø�‰�IÔØ�‰Ð.¨w×/?Ñ/?ÀÑ/AÐ.BÀ%ÐHÔIØ�‰Ð5°g×6FÑ6FÀqÑ6HÐ5IÈÐMÔNØ�‰Ð7¸×8HÑ8HÈÑ8JÐ7KÈ3ÐOÔPØ�‰Ð/°×0@Ñ0@ÀÑ0BÐ/CÀ5ÐIÔJØ�‰Ð5°e°W¸EÀ%ÀÐHZÐ[b×[kÑ[kÐlmÑ[mÐZnÐnqÐrÔsØ�‰Ð5°g×6FÑ6FÀqÑ6HÐ5IÈÐMÔNØ�‰Ð.¨w×/?Ñ/?ÀÑ/AÐ.BÀ%ÐHÔIØ�‰�IÔØ�‰Ð9¼(»*¸ÀZÐPUÈwÐVXÐYaÐXbÐbdÐ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   è ø€ Ð8±4¨aœs 1 q¡5Ÿz±4ùr©   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Ñ$4°QÑ$6Ð#7Ð7HÐIó
ˆð ×%Ñ%ˆ
Ø—8‘8°·²Ó?±¨AœS §¡�Z°Ñ?Ó@ˆØ�‰Ð/°¨z¸Ð=Ô>Ø"$ˆØ—O‘OÖ%ˆDØ—h‘hÑ8±4Ó8Ó8ˆGØ×ÑØ—‘Ð7¸°yÀÐDÓEõð &ð 	×Ñ˜j¨1™n¨i¸¿¹À,Ó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ÁTÀ ¤c¨,¸Ñ*:Ó&;Õ ;ÁTùs   ƒ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Ø—[‘[Ð#3°G×4DÑ4DÀQÑ4FÐ3GÀrÐ!JÓKˆFØ�K‰KÐ4Õ6ØœM×4Ñ4Ò4Ø—[‘[Ø.¨w×/?Ñ/?À!Ñ/CÐ.DÀCÐHóˆFð �K‰KÐ2Õ4äÐ4°[°MÐBÓCÐCØ×$Ñ$ˆ	à×'Ñ'ˆØ—”ˆAØ�K‰KÐ,¬S°·±«Z¨L¸Ð;Õ<ð ð #%ˆØ—O‘OÖ%ˆDØ—x‘xÓJÁTÓJÓJˆHØ�K‰K˜-¨ z°Ð5Ô6Ø�K‰KÐ-¨g×.>Ñ.>¸qÑ.@Ð-AÀÐHÔIØ×ÑØ—‘˜j¨×)9Ñ)9¸!Ñ);Ð(<¸CÐ@ÓAõð	 &ð 	×Ñ˜i¨!™m¨Y¸¿¹ÀÓ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Ü‹6€DØ�;‰;Ð"Ð"Ð"Ø‡{�{‡}�}�qÒ˜DŸK™KŸM™M¨AÒ-°·±·±ÀÒ1Bð �{‰{ˆÜ×+Ñ+¨DÓ1ˆØ�‰˜Ÿ™�w §¡ ¨$¯&©&¨Ô1á‹]€FÙÓ€DØ�D—J‘J“LÑ Ð#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   € ô. �7‰7×Ñ˜HÓ%¨Ñ.€DÜ	�‰˜¨¼×9MÑ9MÔ	N€BðØ
�‰Ø”*˜T ;°eÀ5Ô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 4°S°bÐ9€óó,óó ó4!óH,óô&�D—I‘Iô ÷+
ñ +
ð` ×.Ñ.ðnDð Ø(7ñnDØ
ðnDð ð	nDð
 &ðnDð 	ónDðh ×.Ñ.ðð
 Ø(7ñØ%ðà
ðð
 ðð &ôr   