
    hE                       S SK Jr  S SKJrJrJrJrJrJr  S SK	J
r
  S SKrS SKrS SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJrJr  S S
KJrJrJrJrJ r   S SK!J"r"J#r#J$r$  S SK%J&r&J'r'J(r(  S SK)J*r*  SSK+J,r,J-r-  SSK.J/r/J0r0  SSK1J2r2  SSKJ3r3  \(       a  S SK4J5r5J6r6  S SK7J8r8  S SK9J:r:  S SKJ;r;  SS/r<\" S\" SSS9\" SS \Rz                  \S9\" SS \R|                  \S9S .5      r?\" \?5      r@ " S! S"\#5      rA " S# S$\$5      rBS.S% jrCS/S& jrDS0S' jrES1S( jrF        S2S) jrGS3S* jrHS+rI\2 " S, S\/5      5       rJ " S- S5      rKg)4    )annotations)TYPE_CHECKINGIterableSequenceUnionIteratorOptional)SelfN)chain)contextmanager)
AuditError)	validator)DXFAttrDXFAttributesDefSubclassRETURN_DEFAULTgroup_code_mapping)SUBCLASS_MARKERDXF2000DXFValueErrorDXFStructureErrorDXFIndexError)VertexArrayTagArrayTagList)Matrix44UVecVec3)take2   )
base_classSubclassProcessor)
DXFGraphicacdb_entity)register_entity)default_copy)DXFNamespace	DXFEntity)AbstractTagWriter)Tags)AuditorMeshMeshDataAcDbSubDMeshG      )defaultH   )r1   r   fixer[   versionblend_creasesubdivision_levelsc                  @    \ rS rSrSrS	S jrS
S jrSS jrSS jrSr	g)	EdgeArray_   Lc                2    [        U R                  5      S-  $ )Nr0   lenvaluesselfs    E/var/www/html/env/lib/python3.13/site-packages/ezdxf/entities/mesh.py__len__EdgeArray.__len__b   s    4;;1$$    c              #  L   #    [        U R                  5       H  nUv   M	     g 7fN)r   r@   )rB   edges     rC   __iter__EdgeArray.__iter__e   s     $++&DJ 's   "$c                x    [         R                   " U R                  [        R                  " U5      5      U l        g rH   )arrayDTYPEr   from_iterabler@   rB   edgess     rC   set_dataEdgeArray.set_datai   s#    kk$**e.A.A%.HIrF   c                    UR                  S[        U R                  5      S-  5        U R                   H  nUR                  SU5        M     g )N^   r0   Z   )
write_tag2r?   r@   )rB   	tagwriterindexs      rC   
export_dxfEdgeArray.export_dxfl   s>    RT[[!1Q!67[[E  U+ !rF   r@   Nreturnint)r^   zIterator[tuple[int, int]]rQ   zIterable[tuple[int, int]]r^   NonerX   r)   )
__name__
__module____qualname____firstlineno__rN   rD   rJ   rR   rZ   __static_attributes__ rF   rC   r:   r:   _   s    E%J,rF   r:   c                  F    \ rS rSrS	S jrS
S jrSS jrS	S jrSS jrSr	g)FaceLists   c                ,    [        U R                  5      $ rH   r>   rA   s    rC   rD   FaceList.__len__t   s    4;;rF   c                ,    [        U R                  5      $ rH   )iterr@   rA   s    rC   rJ   FaceList.__iter__w   s    DKK  rF   c                    UR                  SU R                  5       5        U R                   H9  nUR                  S[        U5      5        U H  nUR                  SU5        M     M;     g )N]   rV   )rW   	tag_countr@   r?   )rB   rX   facerY   s       rC   rZ   FaceList.export_dxfz   sU    R!12KKD  SY/$$R/   rF   c                f    [        U R                  5      [        S U R                   5       5      -   $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7frH   )r?   ).0fs     rC   	<genexpr>%FaceList.tag_count.<locals>.<genexpr>   s     %Bkc!ffk   )r?   r@   sumrA   s    rC   rs   FaceList.tag_count   s%    4;;#%Bdkk%B"BBBrF   c                Z    / nU H  nUR                  [        U5      5        M     X l        g rH   )appendface_to_arrayr@   )rB   faces_facesrt   s       rC   rR   FaceList.set_data   s'    DMM--. rF   r\   Nr]   )r^   zIterable[array.array]rb   r   zIterable[Sequence[int]]r^   ra   )
rc   rd   re   rf   rD   rJ   rZ   rs   rR   rg   rh   rF   rC   rj   rj   s   s     !0CrF   rj   c                l    [        U 5      nUS:  a  SnOUS:  a  SnOSn[        R                  " X 5      $ )N   Bi   Ir<   )maxrM   )rt   	max_indexdtypes      rC   r   r      s8    D	I3	U	;;u##rF   c                r    U R                  SUS9n[        U Vs/ s H  o3R                  PM     snS9$ s  snf )N)
   codesstartdata)collect_consecutive_tagsr   value)tagsstart_indexvertex_tagsts       rC   create_vertex_arrayr      s6    //e;/OKk:kWWk:;;:s   4c                ^   [        5       nUR                  n/ nSnU R                  SUS9 H]  nU(       d3  UR                  nU(       a  UR	                  [        U5      5        / nM;  M=  US-  nUR	                  UR                  5        M_     U(       a  UR	                  [        U5      5        U$ )Nr   )rV   r   r    )rj   r@   r   r   r   r   )r   r   r   
faces_listrt   countertags          rC   create_face_listr      s    JEJDG,,5,LiiG!!-"56  qLGKK		" M --.LrF   c                $    [        [        XSS9S9$ )NrV   coder   )r:   collect_valuesr   r   s     rC   create_edge_arrayr      s    .DEErF   c                6    U R                  U4US9nS U 5       $ )Nr   c              3  8   #    U  H  oR                   v   M     g 7frH   )r   )rx   r   s     rC   rz   !collect_values.<locals>.<genexpr>   s     $VGGVr|   )r   )r   r   r   r@   s       rC   r   r      s&     **$*LF$V$$rF   c           	     @    [         R                   " S[        XSS95      $ )Nry      r   )rM   r   r   s     rC   create_crease_arrayr      s    ;;sN43GHHrF   z'MESH (#{}) without {} count.'c                    ^  \ rS rSrSrSr\" \\\	5      r
\rU 4S jr\4SS jjr S   SU 4S jjjrSS jrSS jrS U 4S	 jjrS!S
 jrS"S jrS!S jr\S#S j5       r\R2                  S$S j5       r\S 5       r\R2                  S%S j5       r\S 5       r\R2                  S&S j5       r\S 5       r\R2                  S'S j5       rS(S jrS)S jr\S*S j5       r S+S jr!S,U 4S jjr"Sr#U =r$$ )-r,      zDXF MESH entityMESHc                   > [         TU ]  5         [        5       U l        [	        5       U l        [        5       U l        [        R                  " S5      U l	        g Nry   )
super__init__r   	_verticesrj   r   r:   _edgesrM   _creases)rB   	__class__s    rC   r   Mesh.__init__   s9    $jkC(rF   c                Z   [        U[        5      (       d   e[        R                  " U R                  5      Ul        [        R                  " U R
                  5      Ul        [        R                  " U R                  5      Ul        [        R                  " U R                  5      Ul        g)z+Copy data: vertices, faces, edges, creases.N)
isinstancer,   copydeepcopyr   r   r   r   )rB   entitycopy_strategys      rC   	copy_dataMesh.copy_data   sf    &$''''==8dkk2dkk2--6rF   c                   > [         TU ]  U5      nU(       ad  UR                  S5      nU(       a3  U R                  X2R                  5        UR                  U[        SSS9  U$ [        SUR                   S35      eU$ )Nr0   T)recoverz(missing 'AcDbSubMesh' subclass in MESH(#))r   load_dxf_attribssubclass_by_indexload_mesh_datahandlefast_load_dxfattribsacdb_mesh_group_codesr   )rB   	processordxfr   r   s       rC   r   Mesh.load_dxf_attribs   s     g&y1..q1D##D**5...4 /  
 (>szzl!L  
rF   c                   ^^ UU4S jnUU4S jnUU4S jnUU4S jnU" 5       U l         U" 5       U l        U" 5       U l        U" 5       U l        g )Nc                    >  TR                  S5      n [        TU S-   5      nU S-   [        U5      -   nTX2	 U$ ! [         a     [        [        R	                  TS5      5      ef = f)N\   vertexr    )	tag_indexr   r   COUNT_ERROR_MSGformatr   r?   )vertex_count_indexvertices	end_indexr   	mesh_tagss      rC   process_vertices-Mesh.load_mesh_data.<locals>.process_vertices   s}    R%.%8%8%<" +96H16LMH*Q.X>I,67O ! R'(>(>vx(PQQR	   : *A$c                    >  TR                  S5      n [        TU S-   5      nU S-   UR                  5       -   nTX2	 U$ ! [         a     [	        [
        R                  TS5      5      ef = f)Nrr   r    rt   )r   r   rs   r   r   r   r   )face_count_indexr   r   r   r   s      rC   process_faces*Mesh.load_mesh_data.<locals>.process_faces   s    	#,#6#6r#: 
 )4Dq4HI,q05??3DD	.89 ! P'(>(>vv(NOOPs	   ? *A)c                    >  TR                  S5      n [        TU S-   5      nU S-   [        UR                  5      -   nTX2	 U$ ! [         a     [        [        R                  TS5      5      ef = f)NrU   r    rI   )r   r   r?   r@   r   r   r   r   )edge_count_indexrQ   r   r   r   s      rC   process_edges*Mesh.load_mesh_data.<locals>.process_edges
  s    	#,#6#6r#:  *)5E5IJ,q03u||3DD	.89 ! P'(>(>vv(NOOPs   A *A.c                    >  TR                  S5      n [        TU S-   5      nU S-   [        U5      -   nTX2	 U$ ! [         a     [	        [
        R                  TS5      5      ef = f)Nr;   r    crease)r   r   r?   r   r   r   r   )crease_count_indexcreasesr   r   r   s      rC   process_creases,Mesh.load_mesh_data.<locals>.process_creases  s|    	%.%8%8%<" .i9Ka9OP.2S\A	0:; ! R'(>(>vx(PQQRr   )r   r   r   r   )rB   r   r   r   r   r   r   s    ``    rC   r   Mesh.load_mesh_data   s?    		
	
	
	 *+#o#o')rF   c                j    [        U R                  5      S:X  d  [        U R                  5      S:X  a  gg)a$  Pre requirement check and pre-processing for export.

Returns ``False``  if entity should not be exported at all.

    - MESH without vertices creates an invalid DXF file for AutoCAD and BricsCAD.
    - MESH without faces creates an invalid DXF file for AutoCAD and BricsCAD.

(internal API)
r   FT)r?   r   r   rB   rX   s     rC   preprocess_exportMesh.preprocess_export'  s*     t}}"c$**o&:rF   c                   > [         TU ]  U5        UR                  [        [        R
                  5        U R                  R                  U/ SQ5        U R                  U5        U R                  U5        g)z(Export entity specific data as DXF tags.r5   N)
r   export_entityrW   r   	acdb_meshnamer   export_dxf_attribsexport_mesh_dataexport_override_data)rB   rX   r   s     rC   r   Mesh.export_entity5  sZ    i(_inn=##H	
 	i(!!),rF   c                   UR                  S[        U R                  5      5        U R                  R	                  USS9  U R
                  R	                  U5        U R                  R	                  U5        U R                  5       nUR                  S[        U R                  5      5        U H  nUR                  SU5        M     g )Nr   r   r   r;   r   )	rW   r?   r   r   rZ   r   r   _fixed_crease_valuesr   )rB   rX   r   crease_values       rC   r   Mesh.export_mesh_data?  s    RT]]!34!!)"!5y)y)++-RT\\!23#L  l3 $rF   c                    [        U R                  5      n[        U R                  5      n[        U5      nX:  a  US U nU[        U5      :  a"  UR	                  S5        U[        U5      :  a  M"  U$ )Ng        )r?   r   listr   r   )rB   
edge_countr   crease_counts       rC   r   Mesh._fixed_crease_valuesJ  sf     %
t||$7|$kz*G3w<'NN3 3w<'rF   c                (    UR                  SS5        g )NrV   r   )rW   r   s     rC   r   Mesh.export_override_dataV  s    R#rF   c                    U R                   $ )z-Creases as :class:`array.array`. (read/write))r   rA   s    rC   r   Mesh.creasesY  s     }}rF   c                <    [         R                   " SU5      U l        g r   )rM   r   )rB   r@   s     rC   r   r  ^  s    C0rF   c                    U R                   $ )zQVertices as list like :class:`~ezdxf.lldxf.packedtags.VertexArray`.
(read/write)
)r   rA   s    rC   r   Mesh.verticesb  s    
 ~~rF   c                $    [        U5      U l        g rH   )r   r   )rB   pointss     rC   r   r  i  s    $V,rF   c                    U R                   $ )zKEdges as list like :class:`~ezdxf.lldxf.packedtags.TagArray`.
(read/write)
)r   rA   s    rC   rQ   
Mesh.edgesm      
 {{rF   c                :    U R                   R                  U5        g rH   )r   rR   rP   s     rC   rQ   r  t      U#rF   c                    U R                   $ )zJFaces as list like :class:`~ezdxf.lldxf.packedtags.TagList`.
(read/write)
)r   rA   s    rC   r   
Mesh.facesx  r	  rF   c                :    U R                   R                  U5        g rH   )r   rR   )rB   r   s     rC   r   r    r  rF   c                    [        U 5      $ rH   )r-   rA   s    rC   get_dataMesh.get_data  s    ~rF   c                t   UR                   U l         U R                  R                  UR                  5        U R                  R                  UR
                  5        [        R                  " SUR                  5      U l        [        U R
                  5      [        U R                  5      :w  a  [        S5      eg )Nry   z*count of edges must match count of creases)r   r   rR   r   r   rQ   rM   edge_crease_valuesr   r?   r   rB   r   s     rC   rR   Mesh.set_data  s{    TZZ(TZZ({{3(?(?@tzz?c$,,// LMM 0rF   c              #  V   #    U R                  5       nUv   U R                  U5        g7f)zContext manager for various mesh data, returns a :class:`MeshData` instance.

Despite that vertices, edge and faces are accessible as packed data types, the
usage of :class:`MeshData` by context manager :meth:`edit_data` is still
recommended.
N)r  rR   r  s     rC   	edit_dataMesh.edit_data  s#      }}
ds   ')c                ^    U R                   R                  U5        U R                  U5        U $ )z?Transform the MESH entity by transformation matrix `m` inplace.)r   	transformpost_transform)rB   ms     rC   r  Mesh.transform  s'      #ArF   c                  > U R                   (       d  g [        TU ]	  U5        [        U R                  5      [        U R
                  5      :w  a@  U R                  5       U l        UR                  [        R                  S[        U 5       3U S9  [        U R                  5      S:X  d  [        U R                  5      S:X  a=  UR                  [        R                  S[        U 5       S3S9  UR                  U 5        g g )Nz(fixed invalid count of crease values in )r   message
dxf_entityr   zremoved z without vertices or faces)r   r  )is_aliver   auditr?   rQ   r   r   fixed_errorr   INVALID_CREASE_VALUE_COUNTstrr   r   INVALID_VERTEX_COUNTtrash)rB   auditorr   s     rC   r"  
Mesh.audit  s    }}gtzz?c$,,//446DL::B3t9+N   
 t}}"c$**o&: 44"3t9+-GH    MM$ ';rF   )r   r   r   r   r   r   )r   r
   r^   ra   rH   )r   zOptional[SubclassProcessor]r^   r'   )r   r*   r   r%  r^   ra   )rX   r)   r^   bool)rX   r)   r^   ra   rb   )r^   zlist[float])r^   array.array)r@   zIterable[float]r^   ra   )r  Iterable[UVec]r^   ra   r`   r   )r^   r-   )r   r-   r^   ra   )r^   zIterator[MeshData])r  r   r^   r,   )r(  r+   r^   ra   )%rc   rd   re   rf   __doc__DXFTYPEr   r!   r$   r   
DXFATTRIBSr   MIN_DXF_VERSION_FOR_EXPORTr   r&   r   r   r   r   r   r   r   r   propertyr   setterr   rQ   r   r  rR   r   r  r  r"  rg   __classcell__)r   s   @rC   r,   r,      sK   Gz;	BJ!() 5A 7 8<4	 &3*j-	4
$   ^^1 1   __- -   \\$ $   \\$ $N 	 	   rF   c                  B    \ rS rSrS	S jrS
S jrSS jrSS jrS rSr	g)r-   i  c                    [         R                  " UR                  5      U l        [        UR                  5      U l        [        UR                  5      U l        [        UR
                  5      U l        g rH   )r   r   r   r   rQ   r   r  )rB   meshs     rC   r   MeshData.__init__  sG    $(IIdmm$<*.tzz*:
,0,<
/3DLL/ArF   c                h   ^  [        U 4S jU 5       5      nT R                  R                  U5        U$ )z!Add a face by a list of vertices.c              3  F   >#    U  H  nTR                  U5      v   M     g 7frH   )
add_vertex)rx   r   rB   s     rC   rz   $MeshData.add_face.<locals>.<genexpr>  s     GhF//hs   !)tupler   r   )rB   r   indicess   `  rC   add_faceMeshData.add_face  s*    GhGG

'"rF   c                   US:  d  U[        U R                  5      :  a  [        S5      eUS:  d  U[        U R                  5      :  a  [        S5      eU R                  R	                  X45        U R
                  R	                  U5        g)a0  Add an edge crease value, the edge is defined by the vertex indices
`v1` and `v2`.

The crease value defines the amount of subdivision that will be applied
to this edge.  A crease value of the subdivision level prevents the edge from
deformation and a value of 0.0 means no protection from subdividing.

r   zvertex index `v1` out of rangezvertex index `v2` out of rangeN)r?   r   r   rQ   r   r  )rB   v1v2r   s       rC   add_edge_creaseMeshData.add_edge_crease  sr     6R#dmm,, @AA6R#dmm,, @AA

2(#&&v.rF   c                    [        U5      S:w  a  [        S5      e[        U R                  5      nU R                  R                  [	        U5      5        U$ )N   z/Parameter vertex has to be a 3-tuple (x, y, z).)r?   r   r   r   r   )rB   r   rY   s      rC   r:  MeshData.add_vertex  sC    v;! QRRDMM"T&\*rF   c                x   ^ ^^ SU 4S jjnSUU 4S jjnSUU 4S jjnSU4S jjmU" 5       mU" 5         U" 5         g)	z3Reduce vertex count by merging coincident vertices.c                   > [        T	R                  5       V Vs/ s H  u  pUR                  X4PM     nn nUR                  5         / T	l        0 n[	        5       =pESn U H\  u  pgnXEL d  UR                  U5      (       d8  [        T	R                  5      n T	R                  R                  U5        XU'   UnMX  XU'   M^     U$ s  snn f )Nr   )	enumerater   xyzsortr   iscloser?   r   )
rY   voriginal_vertices	index_mapprev_vertexsentinel_original_indexr   rB   s
            rC   merge_coincident_vertices4MeshData.optimize.<locals>.merge_coincident_vertices  s    2;DMM2J!2Jhe!2J  ! ""$DM(*I%)V+KE->)6*&..2M2M.EMM((005n-"(K05n- .? !!s   Cc                 4   > T " TR                   5      Tl         g rH   )r   remap_indicesrB   s   rC   remap_faces&MeshData.optimize.<locals>.remap_faces      &tzz2DJrF   c                 4   > T " TR                   5      Tl         g rH   )rQ   rX  s   rC   remap_edges&MeshData.optimize.<locals>.remap_edges  r\  rF   c                f   > / nU  H'  nUR                  [        U4S jU 5       5      5        M)     U$ )Nc              3  .   >#    U  H
  nTU   v   M     g 7frH   rh   )rx   rY   rP  s     rC   rz   ;MeshData.optimize.<locals>.remap_indices.<locals>.<genexpr>  s     +P%Ie,<%s   )r   r<  )r=  mapped_indicesentryrP  s      rC   rY  (MeshData.optimize.<locals>.remap_indices  s1    24N %%e+P%+P&PQ !!!rF   N)r^   zdict[int, int])r^   ra   )r=  zSequence[Sequence[int]]r^   zlist[Sequence[int]]rh   )rB   rU  rZ  r^  rP  rY  s   `   @@rC   optimizeMeshData.optimize  s5    	&	3 	3	3 	3	" ./	rF   )r  rQ   r   r   N)r6  r,   r^   ra   )r   r,  r^   Sequence[int])rA  r_   rB  r_   r   float)r   r   r^   r_   )
rc   rd   re   rf   r   r>  rC  r:  rf  rg   rh   rF   rC   r-   r-     s    B/ $rF   )rt   rh  r^   r+  )r   r*   r   r_   r^   r   )r   r*   r   r_   r^   rj   )r   r*   r   r_   r^   r:   )r   r*   r   r_   r   r_   r^   zIterable[Union[float, int]])r   r*   r   r_   r^   r+  )L
__future__r   typingr   r   r   r   r   r	   typing_extensionsr
   rM   r   	itertoolsr   
contextlibr   ezdxf.auditr   ezdxf.lldxfr   ezdxf.lldxf.attributesr   r   r   r   r   ezdxf.lldxf.constr   r   r   r   r   ezdxf.lldxf.packedtagsr   r   r   
ezdxf.mathr   r   r   ezdxf.toolsr   	dxfentityr!   r"   dxfgfxr#   r$   factoryr%   r&   ezdxf.entitiesr'   r(   ezdxf.lldxf.tagwriterr)   ezdxf.lldxf.tagsr*   r+   __all__is_integer_boolis_greater_or_equal_zeror   r   r:   rj   r   r   r   r   r   r   r   r,   r-   rh   rF   rC   <module>r     s`   #  #    % " !   B A + +  4 + $ 67%#:
2q)// 	
 &88 	
&)	T +95 , ,(w 2$<
4F%
% %(+% %I 3 i : i  i XH HrF   