
    h!                    H   S SK Jr  S SKJrJrJrJr  S SKJrJ	r	J
r
Jr  S SKJrJrJr  \(       a  S SKJr  / SQr/ SQr/ SQr/ S	Qr/ S
Qr\\\\/r/ SQr/ SQr/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/r " S S5      rSS jrSS jr S       SS jjr    S         SS jjrg)     )annotations)TYPE_CHECKINGIteratorSequenceOptional)Vec3UVecMatrix44UCS)MeshVertexMergerMeshTransformerMeshBuilder)GenericLayoutType)r   r   r      r   r      r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r!   r#   r$   r%   r&   r'   r)   r*   r+   r,   )r   r   r   r   r   r   r   r    r"   r$   r&   r(   r*   r,   )r   r   r   r   r   r   r   r!   r#   r%   r'   r)   r+   )Lr   r   r   )   r   r   )   r   r   r   r   )r-   r   r   )r.   r   r   r   )r.   r   r   )r   r-   r   )r   r-   r   )r-   r-   r   )r.   r-   r   )r   r.   r   )r   r.   r   )r   r.   r   )r-   r.   r   )r.   r.   r   r   r   )r-   r   r   )r.   r   r   r   r   )r-   r   r   )r.   r   r   )r   r-   r   )r   r-   r   )r-   r-   r   )r.   r-   r   )r   r.   r   )r   r.   r   )r-   r.   r   )r.   r.   r   r$   )r.   r   r   )r   r.   r   )r.   r.   r   )r   r   r-   )r   r   r-   )r-   r   r-   )r.   r   r-   )r   r   r-   )r   r   r-   )r-   r   r-   )r.   r   r-   )r   r-   r-   )r   r-   r-   )r-   r-   r-   )r.   r-   r-   )r   r.   r-   )r   r.   r-   )r-   r.   r-   )r.   r.   r-   )r   r   r.   )r   r   r.   )r   r   r.   )r-   r   r.   )r.   r   r.   )r   r   r.   )r   r   r.   )r-   r   r.   )r.   r   r.   )r   r   r.   )r.   r   r.   )r   r-   r.   )r   r-   r.   )r-   r-   r.   )r.   r-   r.   )r   r.   r.   )r   r.   r.   )r   r.   r.   )r-   r.   r.   )r.   r.   r.   )      @r/   r/   g      @)r   r   r   r   r   r   r   r   )r   r-   r   r   )r.            )r   r   r0   r.   )r   r   r1   r0   )r-   r2   r1   r   )r   r.   r2   r-   c                      \ rS rSrSr    S       SS jjrSS jr\r\SS j5       r	    S         SS jjr
SS jrSS	 jrS
rg)MengerSpongeS   a*  

Args:
    location: location of lower left corner as (x, y, z) tuple
    length: side length
    level: subdivide level
    kind: type of menger sponge

=== ===========================
0   Original Menger Sponge
1   Variant XOX
2   Variant OXO
3   Jerusalem Cube
=== ===========================

c                "    [        XX4S9U l        g )N)locationlengthlevelkind)_menger_spongecube_definitions)selfr7   r8   r9   r:   s        L/var/www/html/env/lib/python3.13/site-packages/ezdxf/addons/menger_sponge.py__init__MengerSponge.__init__e   s     !/E!
    c              #     #    U R                    HD  u  pUu  p4n[         VVVs/ s H"  u  pgn[        X6U-  -   XGU-  -   XXU-  -   5      PM$     snnnv   MF     gs  snnnf 7f)z5Yields the cube vertices as list of (x, y, z) tuples.N)r<   _cube_verticesr   )	r=   r7   r8   xyzxfyfzfs	            r>   verticesMengerSponge.verticesp   sg      $ 5 5HGA! #1"0JBB Qf_av+oq;G"0  !6s   !A)A
Ac                     [         $ )zeReturns list of cube faces. All cube vertices have the same order, so
one faces list fits them all.

)
cube_faces rA   r>   facesMengerSponge.faces{   s
     rA   Nc                    U(       a!  U R                  5       nUR                  XXES9  gU R                  5        H  nUR                  XXES9  M     g)a  Renders the menger sponge into layout, set `merge` to ``True`` for
rendering the whole menger sponge into one MESH entity, set `merge` to
``False`` for rendering the individual cubes of the menger sponge as
MESH entities.

Args:
    layout: DXF target layout
    merge: ``True`` for one MESH entity, ``False`` for individual MESH
        entities per cube
    dxfattribs: DXF attributes for the MESH entities
    matrix: apply transformation matrix at rendering
    ucs: apply UCS transformation at rendering

)
dxfattribsmatrixucs)rS   rT   N)meshrender_meshcubes)r=   layoutmergerR   rS   rT   rU   cubes           r>   renderMengerSponge.render   sO    , 99;Df   

  F L %rA   c              #     #    U R                  5       nU  H4  n[        5       nUR                  X!S9  [        R                  " U5      v   M6     g7f)zVYields all cubes of the menger sponge as individual
:class:`MeshTransformer` objects.
rJ   rO   N)rO   r   add_meshr   from_builder)r=   rO   rJ   rU   s       r>   rW   MengerSponge.cubes   sC      

H#%DMM8M9!..t44 s   AAc                |    U R                  5       n[        5       nU  H  nUR                  X1S9  M     [        U5      $ )z8Returns geometry as one :class:`MeshTransformer` object.r^   )rO   r   r_   remove_duplicate_inner_faces)r=   rO   rU   rJ   s       r>   rU   MengerSponge.mesh   s8    

!HMM8M9 +D11rA   )r<           rg   rg         ?r   r   )r7   r	   r8   floatr9   intr:   rj   )returnzIterator[list[Vec3]])rk   zlist[list[int]])FNNN)
rX   r   rY   boolrS   zOptional[Matrix44]rT   zOptional[UCS]rk   None)rk   zIterator[MeshTransformer])rk   r   )__name__
__module____qualname____firstlineno____doc__r?   rJ   __iter__staticmethodrO   r[   rW   rU   __static_attributes__rN   rA   r>   r4   r4   S   s    & )	
	
 	
 		

 	
 H  %)!M!M M
 #M M 
M>52rA   r4   c                    [        5       nU R                  Ul        [        [        U R                  5      5      Ul        U$ N)r   rJ   listmanifold_facesrO   )rU   new_meshs     r>   rc   rc      s0     HH.45HNOrA   c              #     #    0 nU  H+  n[        [        U5      5      n X   R                  U5        M-     UR	                  5        H  n [        U 5      S:X  d  M  U S   v   M     g ! [         a	    U/X'    Mq  f = f7f)Nr   r   )tuplesortedappendKeyErrorvalueslen)rO   ledgerfacekeys       r>   ry   ry      sv     9;FF4L!	!Kt$  u:?(N !  	!&FK	!s-   A<A&$A<A<&A95A<8A99A<c                   ^^^^	 U u  mmm[        U5      [        U   -  m	[        U   nSUUUU	4S jjnU Vs/ s H  oT" U5      T	4PM     sn$ s  snf )a;  Divides a cube in sub-cubes and keeps only cubes determined by the
building schema.

All sides are parallel to x-, y- and z-axis, location is a (x, y, z) tuple
and represents the coordinates of the lower left corner (nearest to the axis
origin) of the cube, length is the side-length of the cube

Args:
    location: (x, y, z) tuple, coordinates of the lower left corner of the cube
    length: side length of the cube
    kind: int for 0: original menger sponge; 1: Variant XOX; 2: Variant OXO;
        3: Jerusalem Cube;

Returns: list of sub-cubes (location, length)

c                L   > U u  pn[        TUT-  -   TUT-  -   TUT-  -   5      $ rw   )r   )indicesrD   rE   rF   init_xinit_yinit_z	step_sizes       r>   sub_location _subdivide.<locals>.sub_location   s=    aQ]"Q]"Q]"
 	
rA   )rk   r   )ri   
cube_sizesbuilding_schemas)
r7   r8   r:   remaining_cubesr   r   r   r   r   r   s
         @@@@r>   
_subdivider      s]    ( &FFFf
4 00I&t,O
 
 ?NNo7\'"I.oNNNs   Ac           
        [        U5      nUS;  a  [        S5      e[        U5      nUS:  a  [        S5      e[        XUS9n[        US-
  5       H+  n/ nU H  u  pUR	                  [        XUS95        M      UnM-     U$ )at  Builds a menger sponge for given level.

Args:
    location: (x, y, z) tuple, coordinates of the lower left corner of the cube
    length: side length of the cube
    level: level of menger sponge, has to be 1 or bigger
    kind: int for 0: original menger sponge; 1: Variant XOX; 2: Variant OXO;
        3: Jerusalem Cube;

Returns: list of sub-cubes (location, length)

)r   r   r   r-   zkind has to be 0, 1, 2 or 3.r   zlevel has to be 1 or bigger.)r:   )rj   
ValueErrorr   rangeextend)r7   r8   r9   r:   rW   _next_level_cubess          r>   r;   r;      s    $ t9D<788JEqy788xd3E519 %H##Jxd$KL !& 	 
 LrA   N)rU   r   rk   r   )rO   zlist[Sequence[int]]rk   zIterator[Sequence[int]])rf   rh   r   )r7   r	   r8   ri   r:   rj   rk   list[tuple[Vec3, float]]re   )
r7   r	   r8   ri   r9   rj   r:   rj   rk   r   ) 
__future__r   typingr   r   r   r   
ezdxf.mathr   r	   r
   r   ezdxf.render.meshr   r   r   ezdxf.eztypesr   all_cubes_size_3_templateoriginal_menger_cubes	menger_v1	menger_v2jerusalem_cuber   r   rC   rM   r4   rc   ry   r   r;   rN   rA   r>   <module>r      s   # > > 0 0 L L/  			 	  
	 
_2 _2D
 HI O O.3 OAD O OH %	  	
 rA   