
    OgE                       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jz                  e       edd ej|                  e      d       Z? ee?      Z@ G d! d"e#      ZA G d# d$e$      ZBd.d%ZCd/d&ZDd0d'ZEd1d(ZF	 	 	 	 	 	 	 	 d2d)ZGd3d*ZHd+ZIe2 G d, de/             ZJ G d- d      ZKy)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                  0    e Zd ZdZddZddZd	dZd
dZy)	EdgeArrayLc                2    t        | j                        dz  S )Nr0   lenvaluesselfs    X/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/entities/mesh.py__len__zEdgeArray.__len__b   s    4;;1$$    c              #  H   K   t        | j                        D ]  }|  y wN)r   r?   )rA   edges     rB   __iter__zEdgeArray.__iter__e   s#     $++& 	DJ	s    "c                t    t        j                   | j                  t        j                  |            | _        y rF   )arrayDTYPEr   from_iterabler?   rA   edgess     rB   set_datazEdgeArray.set_datai   s#    kk$**e.A.A%.HIrD   c                    |j                  dt        | j                        dz         | j                  D ]  }|j                  d|        y )N^   r0   Z   )
write_tag2r>   r?   )rA   	tagwriterindexs      rB   
export_dxfzEdgeArray.export_dxfl   sC    RT[[!1Q!67[[ 	,E  U+	,rD   Nreturnint)rX   zIterator[tuple[int, int]]rN   zIterable[tuple[int, int]]rX   NonerT   r)   )__name__
__module____qualname__rK   rC   rH   rO   rV    rD   rB   r:   r:   _   s    E%J,rD   r:   c                  4    e Zd ZddZddZd	dZddZd
dZy)FaceListc                ,    t        | j                        S rF   r=   r@   s    rB   rC   zFaceList.__len__t   s    4;;rD   c                ,    t        | j                        S rF   )iterr?   r@   s    rB   rH   zFaceList.__iter__w   s    DKK  rD   c                    |j                  d| j                                | j                  D ]6  }|j                  dt        |             |D ]  }|j                  d|        8 y )N]   rR   )rS   	tag_countr?   r>   )rA   rT   facerU   s       rB   rV   zFaceList.export_dxfz   s_    R!12KK 	0D  SY/ 0$$R/0	0rD   c                f    t        | j                        t        d | j                  D              z   S )Nc              3  2   K   | ]  }t        |        y wrF   )r>   ).0fs     rB   	<genexpr>z%FaceList.tag_count.<locals>.<genexpr>   s     %Bc!f%Bs   )r>   r?   sumr@   s    rB   rh   zFaceList.tag_count   s%    4;;#%Bdkk%B"BBBrD   c                X    g }|D ]  }|j                  t        |              || _        y rF   )appendface_to_arrayr?   )rA   faces_facesri   s       rB   rO   zFaceList.set_data   s.     	/DMM--.	/rD   NrW   )rX   zIterable[array.array]r\   rs   zIterable[Sequence[int]]rX   r[   )r]   r^   r_   rC   rH   rV   rh   rO   r`   rD   rB   rb   rb   s   s     !0CrD   rb   c                h    t        |       }|dk  rd}n
|dk  rd}nd}t        j                  ||       S )N   Bi   Ir;   )maxrJ   )ri   	max_indexdtypes      rB   rr   rr      s:    D	I3	U	;;ud##rD   c                z    | j                  d|      }t        |D cg c]  }|j                   c}      S c c}w )N)
   codesstartdata)collect_consecutive_tagsr   value)tagsstart_indexvertex_tagsts       rB   create_vertex_arrayr      s4    //e;/OKk:QWW:;;:s   8c                >   t               }|j                  }g }d}| j                  d|      D ]P  }|s,|j                  }|s|j	                  t        |             g }1|dz  }|j	                  |j                         R |r|j	                  t        |             |S )Nr   )rR   r   r    )rb   r?   r   r   rq   rr   )r   r   rs   
faces_listri   countertags          rB   create_face_listr      s    JEJDG,,5,L #iiG!!-"56 qLGKK		"# --.LrD   c                2    t        t        | |d            S )NrR   coder   )r:   collect_valuesr   r   s     rB   create_edge_arrayr      s    .{DEErD   c                <    | j                  |f|      }d |D        S )Nr   c              3  4   K   | ]  }|j                     y wrF   )r   )rl   r   s     rB   rn   z!collect_values.<locals>.<genexpr>   s     $AGG$s   )r   )r   r   r   r?   s       rB   r   r      s&     **$*LF$V$$rD   c                F    t        j                   dt        | |d            S )Nrm      r   )rJ   r   r   s     rB   create_crease_arrayr      s    ;;sN43GHHrD   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dd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d!d       Zej0                  d"d       Zed        Zej0                  d#d       Zed        Zej0                  d$d       Zed        Zej0                  d%d       Zd&dZd'dZed(d       Zd)dZ d* fdZ! xZ"S )+r,   zDXF MESH entityMESHc                    t         |           t               | _        t	               | _        t               | _        t        j                  d      | _	        y Nrm   )
super__init__r   	_verticesrb   rt   r:   _edgesrJ   _creases)rA   	__class__s    rB   r   zMesh.__init__   s9    $jkC(rD   c                H   t        |t              sJ t        j                  | j                        |_        t        j                  | j
                        |_        t        j                  | j                        |_        t        j                  | j                        |_        y)z+Copy data: vertices, faces, edges, creases.N)
isinstancer,   copydeepcopyr   rt   r   r   )rA   entitycopy_strategys      rB   	copy_datazMesh.copy_data   sc    &$'''==8dkk2dkk2--6rD   c                    t         |   |      }|rc|j                  d      }|r7| j                  ||j                         |j                  |t        dd       |S 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   )rA   	processordxfr   r   s       rB   r   zMesh.load_dxf_attribs   s     g&y1..q1D##D#**5...4 /  
 (>szzl!L  
rD   c                    fd}fd}fd}fd} |       | _          |       | _         |       | _         |       | _        y )Nc                     	 j                  d      } t        | dz         }| dz   t        |      z   }| |= |S # t        $ r  t        t        j	                  d            w xY w)N\   vertexr    )	tag_indexr   r   COUNT_ERROR_MSGformatr   r>   )vertex_count_indexvertices	end_indexr   	mesh_tagss      rB   process_verticesz-Mesh.load_mesh_data.<locals>.process_vertices   s    R%.%8%8%<" +96H16LMH*Q.X>I,Y67O ! R'(>(>vx(PQQR	   ; )A$c                     	 j                  d      } t        | dz         }| dz   |j                         z   }| |= |S # t        $ r  t	        t
        j                  d            w xY w)Nrg   r    ri   )r   r   rh   r   r   r   r   )face_count_indexrs   r   r   r   s      rB   process_facesz*Mesh.load_mesh_data.<locals>.process_faces   s    	#,#6#6r#: 
 )4Dq4HI,q05??3DD	.y89 ! P'(>(>vv(NOOPs   A   )A)c                     	 j                  d      } t        | dz         }| dz   t        |j                        z   }| |= |S # t        $ r  t        t        j                  d            w xY w)NrQ   r    rG   )r   r   r>   r?   r   r   r   r   )edge_count_indexrN   r   r   r   s      rB   process_edgesz*Mesh.load_mesh_data.<locals>.process_edges
  s    	#,#6#6r#:  *)5E5IJ,q03u||3DD	.y89 ! P'(>(>vv(NOOPs   A )A.c                     	 j                  d      } t        | dz         }| dz   t        |      z   }| |= |S # t        $ r  t	        t
        j                  d            w xY w)N_   r    crease)r   r   r>   r   r   r   r   )crease_count_indexcreasesr   r   r   s      rB   process_creasesz,Mesh.load_mesh_data.<locals>.process_creases  s~    	%.%8%8%<" .i9Ka9OP.2S\A	0:; ! R'(>(>vx(PQQRr   )r   rt   r   r   )rA   r   r   r   r   r   r   s    ``    rB   r   zMesh.load_mesh_data   s?    		
	
	
	 *+#o#o')rD   c                f    t        | j                        dk(  st        | j                        dk(  ryy)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   rA   rT   s     rB   preprocess_exportzMesh.preprocess_export'  s*     t}}"c$**o&:rD   c                    t         |   |       |j                  t        t        j
                         | j                  j                  |g d       | j                  |       | j                  |       y)z(Export entity specific data as DXF tags.r5   N)
r   export_entityrS   r   	acdb_meshnamer   export_dxf_attribsexport_mesh_dataexport_override_data)rA   rT   r   s     rB   r   zMesh.export_entity5  sZ    i(_inn=##H	
 	i(!!),rD   c                   |j                  dt        | j                               | j                  j	                  |d       | j
                  j	                  |       | j                  j	                  |       | j                         }|j                  dt        | j                               |D ]  }|j                  d|        y )Nr   r~   r   r   r   )	rS   r>   r   r   rV   rt   r   _fixed_crease_valuesr   )rA   rT   r   crease_values       rB   r   zMesh.export_mesh_data?  s    RT]]!34!!)"!5y)y)++-RT\\!23# 	4L  l3	4rD   c                    t        | j                        }t        | j                        }t        |      }||k  r|d | }|t        |      kD  r |j	                  d       |t        |      kD  r |S )Ng        )r>   r   listr   rq   )rA   
edge_countr   crease_counts       rB   r   zMesh._fixed_crease_valuesJ  sh     %
t||$7|$kz*G3w<'NN3 3w<'rD   c                (    |j                  dd       y )NrR   r   )rS   r   s     rB   r   zMesh.export_override_dataV  s    R#rD   c                    | j                   S )z-Creases as :class:`array.array`. (read/write))r   r@   s    rB   r   zMesh.creasesY  s     }}rD   c                :    t        j                   d|      | _        y r   )rJ   r   )rA   r?   s     rB   r   zMesh.creases^  s    C0rD   c                    | j                   S )zaVertices as list like :class:`~ezdxf.lldxf.packedtags.VertexArray`.
        (read/write)
        )r   r@   s    rB   r   zMesh.verticesb  s    
 ~~rD   c                $    t        |      | _        y rF   )r   r   )rA   pointss     rB   r   zMesh.verticesi  s    $V,rD   c                    | j                   S )z[Edges as list like :class:`~ezdxf.lldxf.packedtags.TagArray`.
        (read/write)
        )r   r@   s    rB   rN   z
Mesh.edgesm      
 {{rD   c                :    | j                   j                  |       y rF   )r   rO   rM   s     rB   rN   z
Mesh.edgest      U#rD   c                    | j                   S )zZFaces as list like :class:`~ezdxf.lldxf.packedtags.TagList`.
        (read/write)
        )rt   r@   s    rB   rs   z
Mesh.facesx  r   rD   c                :    | j                   j                  |       y rF   )rt   rO   )rA   rs   s     rB   rs   z
Mesh.faces  r   rD   c                    t        |       S rF   )r-   r@   s    rB   get_datazMesh.get_data  s    ~rD   c                p   |j                   | _         | j                  j                  |j                         | j                  j                  |j
                         t        j                  d|j                        | _        t        | j
                        t        | j                        k7  rt        d      y )Nrm   z*count of edges must match count of creases)r   rt   rO   rs   r   rN   rJ   edge_crease_valuesr   r>   r   rA   r   s     rB   rO   zMesh.set_data  s{    TZZ(TZZ({{3(?(?@tzz?c$,,// LMM 0rD   c              #  V   K   | j                         }| | j                  |       yw)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   rO   r   s     rB   	edit_datazMesh.edit_data  s$      }}
ds   ')c                ^    | j                   j                  |       | j                  |       | S )z?Transform the MESH entity by transformation matrix `m` inplace.)r   	transformpost_transform)rA   ms     rB   r   zMesh.transform  s'      #ArD   c                   | j                   sy t        | 	  |       t        | j                        t        | j
                        k7  rC| j                         | _        |j                  t        j                  dt        |        |        t        | j                        dk(  st        | j                        dk(  r@|j                  t        j                  dt        |        d       |j                  |        y y )Nz(fixed invalid count of crease values in )r   message
dxf_entityr   zremoved z without vertices or faces)r   r   )is_aliver   auditr>   rN   r   r   fixed_errorr   INVALID_CREASE_VALUE_COUNTstrr   rs   INVALID_VERTEX_COUNTtrash)rA   auditorr   s     rB   r   z
Mesh.audit  s    }}gtzz?c$,,//446DL::B3t9+N   
 t}}"c$**o&: 44"3t9+-GH    MM$ ';rD   )r   r
   rX   r[   rF   )r   zOptional[SubclassProcessor]rX   r'   )r   r*   r   r   rX   r[   )rT   r)   rX   bool)rT   r)   rX   r[   r\   )rX   zlist[float])rX   array.array)r?   zIterable[float]rX   r[   )r   Iterable[UVec]rX   r[   rZ   ru   )rX   r-   )r   r-   rX   r[   )rX   zIterator[MeshData])r   r   rX   r,   )r  r+   rX   r[   )#r]   r^   r_   __doc__DXFTYPEr   r!   r$   r   
DXFATTRIBSr   MIN_DXF_VERSION_FOR_EXPORTr   r&   r   r   r   r   r   r   r   r   propertyr   setterr   rN   rs   r   rO   r   r   r   r   __classcell__)r   s   @rB   r,   r,      sF   Gz;	BJ!() 5A 7 8<4	&3*j-	4
$   ^^1 1   __- -   \\$ $   \\$ $N 	 	   rD   c                  2    e Zd ZddZddZd	dZd
dZd Zy)r-   c                    t        j                  |j                        | _        t        |j                        | _        t        |j                        | _        t        |j
                        | _        y rF   )r   r   r   rs   rN   r   r   )rA   meshs     rB   r   zMeshData.__init__  sG    $(IIdmm$<*.tzz*:
,0,<
/3DLL/ArD   c                f     t         fd|D              } j                  j                  |       |S )z!Add a face by a list of vertices.c              3  @   K   | ]  }j                  |        y wrF   )
add_vertex)rl   r   rA   s     rB   rn   z$MeshData.add_face.<locals>.<genexpr>  s     GF/Gs   )tuplers   rq   )rA   r   indicess   `  rB   add_facezMeshData.add_face  s*    GhGG

'"rD   c                   |dk  s|t        | j                        kD  rt        d      |dk  s|t        | j                        kD  rt        d      | j                  j	                  ||f       | j
                  j	                  |       y)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   rN   rq   r   )rA   v1v2r   s       rB   add_edge_creasezMeshData.add_edge_crease  st     6R#dmm,, @AA6R#dmm,, @AA

2r(#&&v.rD   c                    t        |      dk7  rt        d      t        | j                        }| j                  j                  t	        |             |S )N   z/Parameter vertex has to be a 3-tuple (x, y, z).)r>   r   r   rq   r   )rA   r   rU   s      rB   r  zMeshData.add_vertex  sC    v;! QRRDMM"T&\*rD   c                h     d fd}d fd}d fd}dfd |        |         |        y)	z3Reduce vertex count by merging coincident vertices.c                    t        	j                        D  cg c]  \  } }|j                  | |f }} }|j                          g 	_        i }t	               x}}d} |D ]X  \  }}}||u s|j                  |      s8t        	j                        } 	j                  j                  |       | ||<   |}T| ||<   Z |S c c}} w )Nr   )	enumerater   xyzsortr   iscloser>   rq   )
rU   voriginal_vertices	index_mapprev_vertexsentinel_original_indexr   rA   s
            rB   merge_coincident_verticesz4MeshData.optimize.<locals>.merge_coincident_vertices  s    2;DMM2J!&.eQq!! ! ""$DM(*I%)V+K(E-> 6)>6(*&..2M.EMM((005In-"(K05In-6 !!s   B<c                 4      j                         _         y rF   )rs   remap_indicesrA   s   rB   remap_facesz&MeshData.optimize.<locals>.remap_faces      &tzz2DJrD   c                 4      j                         _         y rF   )rN   r+  s   rB   remap_edgesz&MeshData.optimize.<locals>.remap_edges  r.  rD   c                `    g }| D ]%  }|j                  t        fd|D                     ' |S )Nc              3  (   K   | ]	  }|     y wrF   r`   )rl   rU   r$  s     rB   rn   z;MeshData.optimize.<locals>.remap_indices.<locals>.<genexpr>  s     +PIe,<+Ps   )rq   r  )r  mapped_indicesentryr$  s      rB   r,  z(MeshData.optimize.<locals>.remap_indices  s8    24N  R%%e+P%+P&PQR!!rD   N)rX   zdict[int, int])rX   r[   )r  zSequence[Sequence[int]]rX   zlist[Sequence[int]]r`   )rA   r)  r-  r0  r$  r,  s   `   @@rB   optimizezMeshData.optimize  s+    	&	3	3	" ./	rD   N)r  r,   rX   r[   )r   r  rX   Sequence[int])r  rY   r  rY   r   float)r   r   rX   rY   )r]   r^   r_   r   r  r  r  r5  r`   rD   rB   r-   r-     s    B/ $rD   )ri   r6  rX   r  )r   r*   r   rY   rX   r   )r   r*   r   rY   rX   rb   )r   r*   r   rY   rX   r:   )r   r*   r   rY   r   rY   rX   zIterable[Union[float, int]])r   r*   r   rY   rX   r  )L
__future__r   typingr   r   r   r   r   r	   typing_extensionsr
   rJ   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:   rb   rr   r   r   r   r   r   r   r,   r-   r`   rD   rB   <module>rM     s`   #  #    % " !   B A + +  4 + $ 67%#:
2q)// 	
 &88 	
&)	T +95 , ,(w 2$<
4F%
% %(+% %I 3 i : i  i XH HrD   