
    Og<                    b   d dl mZ d dlmZmZmZmZmZmZm	Z	 d dl
Z
d dlmZmZmZmZmZmZ d dlmZmZ e	rd dlmZ g dZ G d d	e
j0                        Z G d
 de      Z G d d      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z ddZ!	 	 	 	 	 	 ddZ"y)    )annotations)OptionalIterableIteratorSequence
NamedTupleCallableTYPE_CHECKINGN)Matrix44Vec2BoundingBox2dUVecis_convex_polygon_2dis_axes_aligned_rectangle_2d)NumpyPath2dNumpyPoints2d)Clipping)ClippingShapeClippingPortalClippingRectConvexClippingPolygonInvertedClippingPolygon	MultiClipfind_best_clipping_shapemake_inverted_clipping_shapec                  ~   e Zd ZdZej
                  dd       Zej
                  dd       Zej
                  dd       Zej
                  dd       Z	ej
                  dd       Z
ej
                  dd       Zej
                  dd       Zej
                  	 	 	 	 	 	 dd	       Zej
                  	 	 	 	 	 	 dd
       Zy)r   a  The ClippingShape defines a single clipping path and executes the clipping on
    basic geometries:

    - point: a single point
    - line: a line between two vertices
    - polyline: open polyline with one or more straight line segments
    - polygon: closed shape with straight line as edges
    - path: open shape with straight lines and Bezier-curves as segments
    - filled-path: closed shape with straight lines and Bezier-curves as edges

    Difference between open and closed shapes:

        - an open shape is treated as a linear shape without a filling
        - clipping an open shape returns one or more open shapes
        - a closed shape is treated as a filled shape, where the first vertex is
          coincident to the last vertex.
        - clipping a closed shape returns one or more closed shapes

    Notes:

        An arbitrary clipping polygon can split any basic geometry (except point) into
        multiple parts.

        All current implemented clipping algorithms flatten Bezier-curves into polylines.

    c                     y N selfs    `/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/tools/clipping_portal.pybboxzClippingShape.bboxD   s    %(    c                     y r   r   r!   others     r"   is_completely_insidez"ClippingShape.is_completely_insideG   s    BEr$   c                     y r   r   r&   s     r"   is_completely_outsidez#ClippingShape.is_completely_outsideL   s    CFr$   c                     y r   r   )r!   points     r"   
clip_pointzClippingShape.clip_pointO   s    9<r$   c                     y r   r   r!   startends      r"   	clip_linezClippingShape.clip_lineR   s    PSr$   c                     y r   r   r!   pointss     r"   clip_polylinezClippingShape.clip_polylineU   s    ORr$   c                     y r   r   r4   s     r"   clip_polygonzClippingShape.clip_polygonX   s    NQr$   c                     y r   r   r!   pathsmax_sagittas      r"   
clip_pathszClippingShape.clip_paths[        !$r$   c                     y r   r   r:   s      r"   clip_filled_pathszClippingShape.clip_filled_paths`   r>   r$   Nreturnr   r'   r   rB   boolr,   r   rB   zOptional[Vec2]r0   r   r1   r   rB   zSequence[tuple[Vec2, Vec2]]r5   r   rB   zSequence[NumpyPoints2d]r;   Iterable[NumpyPath2d]r<   floatrB   zIterator[NumpyPath2d])__name__
__module____qualname____doc__abcabstractmethodr#   r(   r*   r-   r2   r6   r8   r=   r@   r   r$   r"   r   r   (   s    6 	( (E E 	F F< <S SR RQ Q$*$9>$	$ $ 	$*$9>$	$ $r$   r   c                  "    e Zd ZU ded<   ded<   y)ClippingStager   portalMatrix44 | None	transformN)rK   rL   rM   __annotations__r   r$   r"   rR   rR   f   s    r$   rR   c                      e Zd ZdZddZe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Z	 	 	 	 	 	 ddZddZy)r   z1The ClippingPortal manages a clipping path stack.c                    g | _         y r   _stagesr    s    r"   __init__zClippingPortal.__init__n   s	    ,.r$   c                ,    t        | j                        S r   )rD   rZ   r    s    r"   	is_activezClippingPortal.is_activeq   s    DLL!!r$   c                N    | j                   j                  t        ||             y r   )rZ   appendrR   )r!   rS   rU   s      r"   pushzClippingPortal.pushu   s    M&)<=r$   c                R    | j                   r| j                   j                          y y r   )rZ   popr    s    r"   rb   zClippingPortal.popx   s    <<LL r$   c                F    | j                   d d d   D ]  } ||      r y  y NrY   )r!   commandstages      r"   foreach_stagezClippingPortal.foreach_stage|   s(    \\$B$' 	E5>	r$   c                :    |dfd}| j                  |       S )Nc                    J | j                   r$t        | j                   j                              | j                  j                        d uS r   )rU   r   rS   r-   )rg   results    r"   doz%ClippingPortal.clip_point.<locals>.do   sN    %%%eoo77?@\\,,V4F%%r$   rg   rR   rB   rD   rh   )r!   r,   rl   rk   s      @r"   r-   zClippingPortal.clip_point   s"    #	& 	2r$   c                @    dfd}||fg| j                  |       S )Nc                   t              }j                          |D ]\  \  }}| j                  r | j                  j                  ||f      \  }}j	                  | j
                  j                  ||             ^ t              S r   )listclearrU   fast_2d_transformextendrS   r2   rD   )rg   linesserk   s       r"   rl   z$ClippingPortal.clip_line.<locals>.do   st    LELLN <1?? ??<<aVDDAqell44Q:;< <r$   rm   rn   )r!   r0   r1   rl   rk   s       @r"   r2   zClippingPortal.clip_line   s(    	  #,2r$   c                <    dfd}|g| j                  |       S )Nc                    t              }j                          |D ]S  }| j                  r|j                  | j                         j	                  | j
                  j                  |             U t              S r   )rq   rr   rU   transform_inplacert   rS   r6   rD   )rg   	polylinespolylinerk   s      r"   rl   z(ClippingPortal.clip_polyline.<locals>.do   sf    VILLN% D??..u?ell88BCD <r$   rm   rn   r!   r5   rl   rk   s      @r"   r6   zClippingPortal.clip_polyline   $    	  2r$   c                <    dfd}|g| j                  |       S )Nc                    t              }j                          |D ]S  }| j                  r|j                  | j                         j	                  | j
                  j                  |             U t              S r   )rq   rr   rU   rz   rt   rS   r8   rD   )rg   polygonspolygonrk   s      r"   rl   z'ClippingPortal.clip_polygon.<locals>.do   sf    F|HLLN# B??--eoo>ell77@AB <r$   rm   rn   r}   s      @r"   r8   zClippingPortal.clip_polygon   r~   r$   c                P    dfd}t        |      | j                  |       S )Nc                   t              }j                          |D ]*  }| j                  s|j                  | j                         , j	                  | j
                  j                  |             t              S r   )rq   rr   rU   rz   rt   rS   r=   rD   rg   r;   pathr<   rk   s      r"   rl   z%ClippingPortal.clip_paths.<locals>.do   sf    LELLN <??**5??;< MM%,,11%EF<r$   rm   rq   rh   r!   r;   r<   rl   rk   s     ` @r"   r=   zClippingPortal.clip_paths   &    	  e2r$   c                P    dfd}t        |      | j                  |       S )Nc                   t              }j                          |D ]*  }| j                  s|j                  | j                         , j	                  | j
                  j                  |             t              S r   )rq   rr   rU   rz   rt   rS   r@   rD   r   s      r"   rl   z,ClippingPortal.clip_filled_paths.<locals>.do   sf    LELLN <??**5??;< MM%,,88LM<r$   rm   r   r   s     ` @r"   r@   z ClippingPortal.clip_filled_paths   r   r$   c                J    | j                   d d d   D ]  \  }}|	||z  } |S rd   rY   )r!   m_rU   s       r"   transform_matrixzClippingPortal.transform_matrix   s8     LL2. 	LAy$Y	 r$   N)rB   None)rB   rD   )rS   r   rU   rT   rB   r   )rf   zCallable[[ClippingStage], bool]rB   r   rE   )r0   r   r1   r   rB   zlist[tuple[Vec2, Vec2]])r5   r   rB   zlist[NumpyPoints2d])r;   rI   r<   rJ   rB   zlist[NumpyPath2d])r   r   rB   r   )rK   rL   rM   rN   r[   propertyr]   r`   rb   rh   r-   r2   r6   r8   r=   r@   r   r   r$   r"   r   r   k   s    ;/ " ">
*9>	 *9>	 r$   r   c                  h    e Zd Z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	Zy
)ClippingPolygonzpRepresents an arbitrary polygon as clipping shape.  Removes the geometry
    outside the clipping polygon.

    c                N    |j                   st        d      || _        || _        y )Nclipping box not detectable)has_data
ValueError_bboxclipper)r!   r#   r   s      r"   r[   zClippingPolygon.__init__   s#    }}:;;
r$   c                    | j                   S r   )r   r    s    r"   r#   zClippingPolygon.bbox   s    zzr$   c                T    | j                   j                  t        |            }|sy |S r   )r   	is_insider   )r!   r,   r   s      r"   r-   zClippingPolygon.clip_point   s%    LL**4;7	r$   c                :    | j                   j                  ||      S r   )r   r2   r/   s      r"   r2   zClippingPolygon.clip_line   s    ||%%eS11r$   c                l   | j                   }t        |      dk(  r
t               S t        |j	                               }| j                  |      r
t               S | j                  |      r|fS |j                  |j                               D cg c]  }t        |      dkD  rt        |       c}S c c}w )Nr   )
r   lentupler   extentsr*   r(   r6   verticesr   )r!   r5   r   polyline_bboxparts        r"   r6   zClippingPolygon.clip_polyline   s    ,,v;!7N%fnn&67%%m47N$$]39  --foo.?@
4y1} $
 	
 
    B1c                l   | j                   }t        |      dk  r
t               S t        |j	                               }| j                  |      r
t               S | j                  |      r|fS |j                  |j                               D cg c]  }t        |      dkD  rt        |       c}S c c}w )N   r   )
r   r   r   r   r   r*   r(   r8   r   r   )r!   r5   r   polygon_bboxr   s        r"   r8   zClippingPolygon.clip_polygon  s    ,,v;?7N$V^^%56%%l37N$$\29  ,,V__->?
4y1} $
 	
 
r   c              #    K   | j                   }|D ]  }|j                         D ]  }t        |j                               }|j                  s)| j                  |      r| ?| j                  |      rQt        j                  |j                  |d            }|j                  |      D ]*  }t        |      dkD  st        j                  |d       ,   y w)N   segmentsr   Fclose)r   	sub_pathsr   control_verticesr   r(   r*   r   rq   
flatteningr6   r   r   from_vertices)	r!   r;   r<   r   r   sub_path	path_bboxr|   r   s	            r"   r=   zClippingPolygon.clip_paths  s      ,, 	KD NN, K)(*C*C*EF	 )),,Y7"N--i899X%8%8q%8%QR#11(; KD4y1})77EJJKK	K   B;C> Cc           
   #    K   | j                   }|D ]  }|j                         D ]  }t        |      dk  rt        |j	                               }| j                  |      r| A| j                  |      rS|j                  t        j                  |j                  |d                  D ]*  }t        |      dkD  st        j                  |d       ,   y w)Nr   r   r   r   Tr   )r   r   r   r   r   r(   r*   r8   r   rq   r   r   r   )r!   r;   r<   r   r   r   r   r   s           r"   r@   z!ClippingPolygon.clip_filled_paths)  s      ,, 	JD NN, Jx=1$)(*C*C*EF	,,Y7"N--i8#00IIh11+1JK JD 4y1})77DII	JJ	Jr   N)r#   r   r   r   rB   r   rA   rE   rF   rG   rH   )rK   rL   rM   rN   r[   r#   r-   r2   r6   r8   r=   r@   r   r$   r"   r   r      sg    
2

K*K9>K	K&J*J9>J	Jr$   r   c                       e Zd ZdZd fdZddZddZd fdZddZd fdZ	d fdZ
	 	 	 	 	 	 d fd	Z	 	 	 	 	 	 d fd
Z xZS )r   zRepresents a rectangle as clipping shape where the edges are parallel to
    the x- and  y-axis of the coordinate system.  Removes the geometry outside the
    clipping rectangle.

    c                0   ddl m} t        j                  |      }t	        |      }|j
                  st        d      |j                  }|j                  |j                  z  dk  | _
        t        | 1  | ||j                  |j                               y )Nr   )ClippingRect2dr   g&.>)ezdxf.math.clippingr   r   rq   r   r   r   sizexy
remove_allsuperr[   extminextmax)r!   r   r   r   r#   r   	__class__s         r"   r[   zClippingRect.__init__E  sp    6))H%W%}}:;;YY&&466/D0~dkk4;;GHr$   c                8    | j                   j                  |      S r   )r   containsr&   s     r"   r(   z!ClippingRect.is_completely_insideQ  s    zz""5))r$   c                :    | j                   j                  |       S r   r   has_intersectionr&   s     r"   r*   z"ClippingRect.is_completely_outsideT      ::..u555r$   c                <    | j                   ry t        | 	  |      S r   )r   r   r-   )r!   r,   r   s     r"   r-   zClippingRect.clip_pointW  s    ??w!%((r$   c                f    | j                   r
t               S | j                  j                  ||      S r   )r   r   r   r2   r/   s      r"   r2   zClippingRect.clip_line\  s'    ??7N||%%eS11r$   c                b    | j                   rt        t                     fS t        |   |      S r   )r   r   r   r   r6   r!   r5   r   s     r"   r6   zClippingRect.clip_polylinea  s*    ??!%'*,,w$V,,r$   c                b    | j                   rt        t                     fS t        |   |      S r   )r   r   r   r   r8   r   s     r"   r8   zClippingRect.clip_polygonf  s*    ??!%'*,,w#F++r$   c                b    | j                   rt        t                     S t        |   ||      S r   )r   iterr   r   r=   r!   r;   r<   r   s      r"   r=   zClippingRect.clip_pathsk  s*     ??= w!%55r$   c                b    | j                   rt        t                     S t        |   ||      S r   )r   r   r   r   r@   r   s      r"   r@   zClippingRect.clip_filled_pathsr  s*     ??= w(<<r$   r   Iterable[UVec]rB   r   rC   rE   rF   rG   rH   )rK   rL   rM   rN   r[   r(   r*   r-   r2   r6   r8   r=   r@   __classcell__r   s   @r"   r   r   >  sk    
I*6)
2
-
,
6*69>6	6=*=9>=	= =r$   r   c                  4     e Zd ZdZd fdZddZddZ xZS )r   zwRepresents an arbitrary convex polygon as clipping shape.  Removes the geometry
    outside the clipping polygon.

    c                z    ddl m} t        j                  |      }t        |   t        |       ||             y )Nr   )ConvexClippingPolygon2d)r   r   r   rq   r   r[   r   )r!   r   r   r   r   s       r"   r[   zConvexClippingPolygon.__init__  s.    ?))H%w/1H1QRr$   c                     yNFr   r&   s     r"   r(   z*ConvexClippingPolygon.is_completely_inside      r$   c                :    | j                   j                  |       S r   r   r&   s     r"   r*   z+ConvexClippingPolygon.is_completely_outside  r   r$   r   rC   rK   rL   rM   rN   r[   r(   r*   r   r   s   @r"   r   r   z  s    
S6r$   r   c                  4     e Zd ZdZd fdZddZddZ xZS )ConcaveClippingPolygonzxRepresents an arbitrary concave polygon as clipping shape.  Removes the geometry
    outside the clipping polygon.

    c                z    ddl m} t        j                  |      }t        |   t        |       ||             y )Nr   )ConcaveClippingPolygon2d)r   r   r   rq   r   r[   r   )r!   r   r   r   r   s       r"   r[   zConcaveClippingPolygon.__init__  s.    @))H%w/1I'1RSr$   c                     yr   r   r&   s     r"   r(   z+ConcaveClippingPolygon.is_completely_inside  r   r$   c                :    | j                   j                  |       S r   r   r&   s     r"   r*   z,ConcaveClippingPolygon.is_completely_outside  r   r$   r   rC   r   r   s   @r"   r   r     s    
T6r$   r   c                  4     e Zd ZdZd fdZddZddZ xZS )r   zRepresents an arbitrary inverted clipping polygon.  Removes the geometry
    inside the clipping polygon.

    .. Important:: 
    
        The `outer_bounds` must be larger than the content to clip to work correctly.

    c                j    ddl m} t        j                  |      }t        |   | |||             y )Nr   )InvertedClippingPolygon2d)r   r   r   rq   r   r[   )r!   r   outer_boundsr   r   r   s        r"   r[   z InvertedClippingPolygon.__init__  s+    A))H%'@,'WXr$   c                     yr   r   r&   s     r"   r(   z,InvertedClippingPolygon.is_completely_inside  s    r$   c                :    | j                   j                  |       S r   r   r&   s     r"   r*   z-InvertedClippingPolygon.is_completely_outside  r   r$   )r   r   r   r   rB   r   rC   r   r   s   @r"   r   r     s    Y6r$   r   c                    t        j                  |       }t        |      rt        |      S t	        |d      rt        |      S t        |      S )a  Returns the best clipping shape for the given clipping polygon.

    The function analyses the given polygon (rectangular, convex or concave polygon, ...)
    and returns the optimized (fastest) clipping shape.

    Args:
        polygon: clipping polygon as iterable vertices

    F)strict)r   rq   r   r   r   r   r   )r   r5   s     r"   r   r     sE     YYwF#F+F##	fU	3$V,,!&))r$   c                    t        | |      S )zReturns an inverted clipping shape that removes the geometry inside the clipping
    polygon and beyond the outer bounds.

    Args:
        polygon: clipping polygon as iterable vertices
        outer_bounds: outer bounds of the clipping shape

    )r   )r   r   s     r"   r   r     s     #7L99r$   )r   r   rB   r   )r   r   r   r   rB   r   )#
__future__r   typingr   r   r   r   r   r	   r
   rO   
ezdxf.mathr   r   r   r   r   r   ezdxf.npshapesr   r   r   r   __all__ABCr   rR   r   r   r   r   r   r   r   r   r   r$   r"   <module>r      s    #     6,	;$CGG ;$|J 
r rj[Jm [J|9=? 9=x6O 6&6_ 6&6o 60*$::+8::r$   