
    'jE                       d dl mZ d dlmZmZmZmZmZmZ d dl	m
Z
 d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZ d d
lmZmZmZmZm Z  d dl!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z( d dl)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 ddlm3Z3 erd dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: d dlm;Z; ddgZ< ed edd           edd ej=        e           edd ej>        e          d           Z? ee?          Z@ G d! d"e#          ZA G d# d$e$          ZBd9d)ZCd:d/ZDd;d0ZEd<d1ZFd=d4ZGd>d5ZHd6ZIe2 G d7 de/                      ZJ G d8 d          ZKdS )?    )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                  2    e Zd ZdZddZddZdd
ZddZdS )	EdgeArrayLreturnintc                0    t          | j                  dz  S )Nr0   lenvaluesselfs    M/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/entities/mesh.py__len__zEdgeArray.__len__b   s    4;1$$    Iterator[tuple[int, int]]c              #  @   K   t          | j                  D ]}|V  d S N)r   rA   )rC   edges     rD   __iter__zEdgeArray.__iter__e   s4      $+&& 	 	DJJJJ	 	rF   edgesIterable[tuple[int, int]]Nonec                h    t          j         | j        t          j        |                    | _        d S rI   )arrayDTYPEr   from_iterablerA   rC   rL   s     rD   set_datazEdgeArray.set_datai   s&    k$*e.A%.H.HIIrF   	tagwriterr)   c                    |                     dt          | j                  dz             | j        D ]}|                     d|           d S )N^   r0   Z   )
write_tag2r@   rA   )rC   rU   indexs      rD   
export_dxfzEdgeArray.export_dxfl   s[    RT[!1!1Q!6777[ 	, 	,E  U++++	, 	,rF   Nr<   r=   )r<   rG   rL   rM   r<   rN   rU   r)   )__name__
__module____qualname__rQ   rE   rK   rT   r[    rF   rD   r:   r:   _   sm        E% % % %   J J J J, , , , , ,rF   r:   c                  6    e Zd ZddZddZddZdd	ZddZdS )FaceListr<   r=   c                *    t          | j                  S rI   r?   rB   s    rD   rE   zFaceList.__len__t   s    4;rF   Iterable[array.array]c                *    t          | j                  S rI   )iterrA   rB   s    rD   rK   zFaceList.__iter__w   s    DK   rF   rU   r)   c                    |                     d|                                            | j        D ]@}|                     dt          |                     |D ]}|                     d|           Ad S )N]   rX   )rY   	tag_countrA   r@   )rC   rU   facerZ   s       rD   r[   zFaceList.export_dxfz   s    R!1!1222K 	0 	0D  SYY/// 0 0$$R////0	0 	0rF   c                h    t          | j                  t          d | j        D                       z   S )Nc              3  4   K   | ]}t          |          V  d S rI   )r@   ).0fs     rD   	<genexpr>z%FaceList.tag_count.<locals>.<genexpr>   s(      %B%Bc!ff%B%B%B%B%B%BrF   )r@   rA   sumrB   s    rD   rk   zFaceList.tag_count   s0    4;#%B%Bdk%B%B%B"B"BBBrF   facesIterable[Sequence[int]]rN   c                f    g }|D ]$}|                     t          |                     %|| _        d S rI   )appendface_to_arrayrA   )rC   rs   _facesrl   s       rD   rT   zFaceList.set_data   s>     	/ 	/DMM---....rF   Nr\   )r<   rf   r^   rs   rt   r<   rN   )r_   r`   ra   rE   rK   r[   rk   rT   rb   rF   rD   rd   rd   s   s|               ! ! ! !0 0 0 0C C C C     rF   rd   rl   Sequence[int]r<   array.arrayc                r    t          |           }|dk     rd}n|dk     rd}nd}t          j        ||           S )N   Bi   Ir;   )maxrP   )rl   	max_indexdtypes      rD   rw   rw      sF    D		I3	U		;ud###rF   tagsr*   start_indexr=   r   c                d    |                      d|          }t          d |D                       S )N)
   codesstartc                    g | ]	}|j         
S rb   valuero   ts     rD   
<listcomp>z'create_vertex_array.<locals>.<listcomp>   s    :::QW:::rF   data)collect_consecutive_tagsr   )r   r   vertex_tagss      rD   create_vertex_arrayr      s:    //e;/OOK::k:::;;;;rF   c                R   t                      }|j        }g }d}|                     d|          D ]Q}|s.|j        }|r$|                    t          |                     g }2|dz  }|                    |j                   R|r"|                    t          |                     |S )Nr   )rX   r   r    )rd   rA   r   r   rv   rw   )r   r   rs   
faces_listrl   countertags          rD   create_face_listr      s    JJEJDG,,5,LL # # 
	#iG !!-"5"5666 qLGKK	""""  /---...LrF   c                B    t          t          | |d                    S )NrX   coder   )r:   collect_valuesr   r   s     rD   create_edge_arrayr      s"    .{DDDEEEErF   r   Iterable[Union[float, int]]c                J    |                      |f|          }d |D             S )Nr   c              3  $   K   | ]}|j         V  d S rI   r   r   s     rD   rq   z!collect_values.<locals>.<genexpr>   s$      $$AG$$$$$$rF   )r   )r   r   r   rA   s       rD   r   r      s2     **$*LLF$$V$$$$rF   c                L    t          j         dt          | |d                    S )Nrp      r   )rP   r   r   s     rD   create_crease_arrayr      s#    ;sN43GGGHHHrF   z'MESH (#{}) without {} count.'c                      e Zd ZdZdZ eeee          Z	e
Z fdZefd9dZ	 d:d; fdZd<dZd=dZd> fdZd?dZd@dZd?dZedAd            Zej        dBd             Zed!             Zej        dCd$            Zed%             Zej        dDd(            Zed)             Zej        dEd,            ZdFd.ZdGd0ZedHd2            ZdId5Z dJ fd8Z! xZ"S )Kr,   zDXF MESH entityMESHc                    t                                                       t                      | _        t	                      | _        t                      | _        t          j        d          | _	        d S Nrp   )
super__init__r   	_verticesrd   rx   r:   _edgesrP   _creases)rC   	__class__s    rD   r   zMesh.__init__   sO    $jjkkC((rF   entityr
   r<   rN   c                $   t          |t                    sJ t          j        | j                  |_        t          j        | j                  |_        t          j        | j                  |_        t          j        | j                  |_        dS )z+Copy data: vertices, faces, edges, creases.N)
isinstancer,   copydeepcopyr   rx   r   r   )rC   r   copy_strategys      rD   	copy_datazMesh.copy_data   si    &$'''''=88dk22dk22-66rF   N	processorOptional[SubclassProcessor]r'   c                    t                                          |          }|ri|                    d          }|r:|                     ||j                   |                    |t          dd           nt          d|j         d          |S )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   )rC   r   dxfr   r   s       rD   r   zMesh.load_dxf_attribs   s     gg&&y11 	..q11D 
##D#*555...4 /     (LszLLL   
rF   	mesh_tagsr*   r   strc                    fd}fd}fd}fd} |            | _          |            | _         |            | _         |            | _        d S )Nc                     	                      d          } n6# t          $ r) t          t                              d                    w xY wt          | dz             }| dz   t          |          z   }| |= |S )N\   vertexr    )	tag_indexr   r   COUNT_ERROR_MSGformatr   r@   )vertex_count_indexvertices	end_indexr   r   s      rD   process_verticesz-Mesh.load_mesh_data.<locals>.process_vertices   s    R%.%8%8%<%<""  R R R'(>(>vx(P(PQQQR*96H16LMMH*Q.X>I,Y67Os	    3Ac                    	                      d          } t          | dz             }| dz   |                                z   }| |= |S # t          $ r) t	          t
                              d                    w xY w)Nrj   r    rl   )r   r   rk   r   r   r   r   )face_count_indexrs   r   r   r   s      rD   process_facesz*Mesh.load_mesh_data.<locals>.process_faces   s    	#,#6#6r#:#: 
 )4Dq4HII,q05??3D3DD	.y89 ! P P P'(>(>vv(N(NOOOP   A 3A?c                    	                      d          } t          | dz             }| dz   t          |j                  z   }| |= |S # t          $ r) t          t                              d                    w xY w)NrW   r    rJ   )r   r   r@   rA   r   r   r   r   )edge_count_indexrL   r   r   r   s      rD   process_edgesz*Mesh.load_mesh_data.<locals>.process_edges
  s    	#,#6#6r#:#:  *)5E5IJJ,q03u|3D3DD	.y89 ! P P P'(>(>vv(N(NOOOPr   c                     	                      d          } t          | dz             }| dz   t          |          z   }| |= |S # t          $ r) t	          t
                              d                    w xY w)N_   r    crease)r   r   r@   r   r   r   r   )crease_count_indexcreasesr   r   r   s      rD   process_creasesz,Mesh.load_mesh_data.<locals>.process_creases  s    	%.%8%8%<%<" .i9Ka9OPP.2S\\A	0:; ! R R R'(>(>vx(P(PQQQRs   A 3A:)r   rx   r   r   )rC   r   r   r   r   r   r   s    ``    rD   r   zMesh.load_mesh_data   s    		 		 		 		 		 		
	 
	 
	 
	 
	 
	
	 
	 
	 
	 
	 
	
	 
	 
	 
	 
	 
	 *)++#moo#moo'))rF   rU   r)   boolc                j    t          | j                  dk    st          | j                  dk    rdS dS )aL  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   rs   rC   rU   s     rD   preprocess_exportzMesh.preprocess_export'  s5     t}""c$*oo&:&:5trF   c                "   t                                          |           |                    t          t          j                   | j                            |g d           |                     |           | 	                    |           dS )z(Export entity specific data as DXF tags.r5   N)
r   export_entityrY   r   	acdb_meshnamer   export_dxf_attribsexport_mesh_dataexport_override_data)rC   rU   r   s     rD   r   zMesh.export_entity5  s    i(((_in===##HHH	
 	
 	
 	i(((!!),,,,,rF   c                   |                     dt          | j                             | j                            |d           | j                            |           | j                            |           |                                 }|                     dt          | j                             |D ]}|                     d|           d S )Nr   r   r   r   r   )	rY   r@   r   r   r[   rx   r   _fixed_crease_valuesr   )rC   rU   r   crease_values       rD   r   zMesh.export_mesh_data?  s    RT]!3!3444!!)"!555y)))y)))++--RT\!2!2333# 	4 	4L  l3333	4 	4rF   list[float]c                
   t          | j                  }t          | j                  }t          |          }||k     r
|d |         }|t          |          k    r(|                    d           |t          |          k    (|S )Ng        )r@   r   listr   rv   )rC   
edge_countr   crease_counts       rD   r   zMesh._fixed_crease_valuesJ  s     %%
t|$$7||$$kzk*G3w<<''NN3 3w<<''rF   c                2    |                     dd           d S )NrX   r   )rY   r   s     rD   r   zMesh.export_override_dataV  s    R#####rF   r{   c                    | j         S )z-Creases as :class:`array.array`. (read/write))r   rB   s    rD   r   zMesh.creasesY  s     }rF   rA   Iterable[float]c                :    t          j         d|          | _        d S r   )rP   r   )rC   rA   s     rD   r   zMesh.creases^  s    C00rF   c                    | j         S )zaVertices as list like :class:`~ezdxf.lldxf.packedtags.VertexArray`.
        (read/write)
        )r   rB   s    rD   r   zMesh.verticesb  s    
 ~rF   pointsIterable[UVec]c                .    t          |          | _        d S rI   )r   r   )rC   r   s     rD   r   zMesh.verticesi  s    $V,,rF   c                    | j         S )z[Edges as list like :class:`~ezdxf.lldxf.packedtags.TagArray`.
        (read/write)
        )r   rB   s    rD   rL   z
Mesh.edgesm      
 {rF   rL   rM   c                :    | j                             |           d S rI   )r   rT   rS   s     rD   rL   z
Mesh.edgest      U#####rF   c                    | j         S )zZFaces as list like :class:`~ezdxf.lldxf.packedtags.TagList`.
        (read/write)
        )rx   rB   s    rD   rs   z
Mesh.facesx  r   rF   rs   rt   c                :    | j                             |           d S rI   )rx   rT   )rC   rs   s     rD   rs   z
Mesh.faces  r   rF   r-   c                     t          |           S rI   )r-   rB   s    rD   get_datazMesh.get_data  s    ~~rF   r   c                J   |j         | _         | j                            |j                   | j                            |j                   t          j        d|j                  | _        t          | j                  t          | j                  k    rt          d          d S )Nrp   z*count of edges must match count of creases)r   rx   rT   rs   r   rL   rP   edge_crease_valuesr   r@   r   rC   r   s     rD   rT   zMesh.set_data  s    TZ(((TZ((({3(?@@tz??c$,//// LMMM 0/rF   Iterator[MeshData]c              #  d   K   |                                  }|V  |                     |           dS )a  Context 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   rT   r  s     rD   	edit_datazMesh.edit_data  s6       }}


drF   mr   c                d    | j                             |           |                     |           | S )z?Transform the MESH entity by transformation matrix `m` inplace.)r   	transformpost_transform)rC   r  s     rD   r  zMesh.transform  s1      ###ArF   auditorr+   c                8   | j         sd S t                                          |           t          | j                  t          | j                  k    rK|                                 | _        |                    t          j	        dt          |            |            t          | j                  dk    st          | j                  dk    rI|                    t          j        dt          |            d           |                    |            d S d S )Nz(fixed invalid count of crease values in )r   message
dxf_entityr   zremoved z without vertices or faces)r   r  )is_aliver   auditr@   rL   r   r   fixed_errorr   INVALID_CREASE_VALUE_COUNTr   r   rs   INVALID_VERTEX_COUNTtrash)rC   r
  r   s     rD   r  z
Mesh.audit  s   } 	Fgtz??c$,////4466DL:N3t99NN     
 t}""c$*oo&:&: 4H3t99HHH      MM$ ';&:rF   )r   r
   r<   rN   rI   )r   r   r<   r'   )r   r*   r   r   r<   rN   )rU   r)   r<   r   )rU   r)   r<   rN   r^   )r<   r   )r<   r{   )rA   r   r<   rN   )r   r   r<   rN   r]   ry   )r<   r-   )r   r-   r<   rN   )r<   r  )r  r   r<   r,   )r
  r+   r<   rN   )#r_   r`   ra   __doc__DXFTYPEr   r!   r$   r   
DXFATTRIBSr   MIN_DXF_VERSION_FOR_EXPORTr   r&   r   r   r   r   r   r   r   r   propertyr   setterr   rL   rs   r   rT   r   r  r  r  __classcell__)r   s   @rD   r,   r,      s       Gz;	BBJ!() ) ) ) ) 5A 7 7 7 7 7 8<      &3* 3* 3* 3*j   - - - - - -	4 	4 	4 	4
 
 
 
$ $ $ $    X ^1 1 1 ^1   X _- - - _-   X \$ $ $ \$   X \$ $ $ \$   N N N N 	 	 	 ^	                      rF   c                  4    e Zd ZddZdd	ZddZddZd ZdS )r-   meshr,   r<   rN   c                    t          j        |j                  | _        t          |j                  | _        t          |j                  | _        t          |j                  | _        d S rI   )r   r   r   rs   rL   r   r  )rC   r  s     rD   r   zMeshData.__init__  sO    $(Idm$<$<*.tz*:*:
,0,<,<
/3DL/A/ArF   r   r   rz   c                r     t           fd|D                       } j                            |           |S )z!Add a face by a list of vertices.c              3  B   K   | ]}                     |          V  d S rI   )
add_vertex)ro   r   rC   s     rD   rq   z$MeshData.add_face.<locals>.<genexpr>  s/      GGF//GGGGGGrF   )tuplers   rv   )rC   r   indicess   `  rD   add_facezMeshData.add_face  s@    GGGGhGGGGG
'"""rF   v1r=   v2r   floatc                &   |dk     s|t          | j                  k    rt          d          |dk     s|t          | j                  k    rt          d          | j                            ||f           | j                            |           dS )aX  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   rL   rv   r  )rC   r$  r%  r   s       rD   add_edge_creasezMeshData.add_edge_crease  s     66R#dm,,,, @AAA66R#dm,,,, @AAA
2r(###&&v.....rF   r   r   c                    t          |          dk    rt          d          t          | j                  }| j                            t	          |                     |S )N   z/Parameter vertex has to be a 3-tuple (x, y, z).)r@   r   r   rv   r   )rC   r   rZ   s      rD   r   zMeshData.add_vertex  sR    v;;! QRRRDM""T&\\***rF   c                |     d fd}d fd}d fd}dfd
 |             |              |             dS )z3Reduce vertex count by merging coincident vertices.r<   dict[int, int]c                 \   d t          j                  D             } |                                  g _        i }t                      x}}d}| D ]Z\  }}}||u s|                    |          s6t          j                  }j                            |           |||<   |}U|||<   [|S )Nc                (    g | ]\  }}|j         ||fS rb   )xyz)ro   rZ   vs      rD   r   zHMeshData.optimize.<locals>.merge_coincident_vertices.<locals>.<listcomp>  s2     ! ! !&.eQq!! ! !rF   r   )	enumerater   sortr   iscloser@   rv   )	original_vertices	index_mapprev_vertexsentinelrZ   _original_indexr   rC   s	           rD   merge_coincident_verticesz4MeshData.optimize.<locals>.merge_coincident_vertices  s    ! !2;DM2J2J! ! ! ""$$$DM(*I%)VV+K(E-> 6 6)>6(**&..2M2M*..EM((00005In-"(KK05In--rF   rN   c                 2      j                   _         d S rI   )rs   remap_indicesrC   s   rD   remap_facesz&MeshData.optimize.<locals>.remap_faces      &tz22DJJJrF   c                 2      j                   _         d S rI   )rL   r<  s   rD   remap_edgesz&MeshData.optimize.<locals>.remap_edges  r?  rF   r"  Sequence[Sequence[int]]list[Sequence[int]]c                r    g }| D ]0}|                     t          fd|D                                  1|S )Nc              3  (   K   | ]}|         V  d S rI   rb   )ro   rZ   r5  s     rD   rq   z;MeshData.optimize.<locals>.remap_indices.<locals>.<genexpr>  s(      +P+PIe,<+P+P+P+P+P+PrF   )rv   r!  )r"  mapped_indicesentryr5  s      rD   r=  z(MeshData.optimize.<locals>.remap_indices  sS    24N  R R%%e+P+P+P+P%+P+P+P&P&PQQQQ!!rF   N)r<   r,  )r<   rN   )r"  rB  r<   rC  rb   )rC   r:  r>  rA  r5  r=  s   `   @@rD   optimizezMeshData.optimize  s    	 	 	 	 	 	&	3 	3 	3 	3 	3 	3 	3	3 	3 	3 	3 	3 	3 	3	" 	" 	" 	" 	" 	" .-//	rF   N)r  r,   r<   rN   )r   r   r<   rz   )r$  r=   r%  r=   r   r&  )r   r   r<   r=   )r_   r`   ra   r   r#  r(  r   rH  rb   rF   rD   r-   r-     sw        B B B B   / / / /    $ $ $ $ $rF   )rl   rz   r<   r{   )r   r*   r   r=   r<   r   )r   r*   r   r=   r<   rd   )r   r*   r   r=   r<   r:   )r   r*   r   r=   r   r=   r<   r   )r   r*   r   r=   r<   r{   )L
__future__r   typingr   r   r   r   r   r	   typing_extensionsr
   rP   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:   rd   rw   r   r   r   r   r   r   r,   r-   rb   rF   rD   <module>r^     sJ   # " " " " "                # " " " " "         % % % % % % " " " " " " ! ! ! ! ! !                           B A A A A A A A A A + + + + + + + + + +       4 4 4 4 4 4 4 4 + + + + + + + + $ $ $ $ $ $       $66666666777777%%%%%%######:
K72q)))/ 	
 
 
 &g8 	
 
 
& &) )	T +*955 , , , , , , , ,(    w   2$ $ $ $< < < <
   4F F F F% % % %I I I I 3 i  i  i  i  i : i  i  i XH H H H H H H H H HrF   