Ë
    £èhª>  ã                  ó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    ú;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   € ä�D—L‘LÓ!Ð!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   € Ø�<Š<Ø�L‰L×ÑÕð r$   c                óF   — | j                   d d d…   D ]  } ||«      rŒ y  y ©NéÿÿÿÿrY   )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   ø€ àÐ%Ð%Ð%Ø�ŠÜ˜eŸo™o×7Ñ7¸Ó?Ó@�Ø—\‘\×,Ñ,¨VÓ4ˆFØ Ð%Ð%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�   so   ø€ Ü˜“LˆEØ�L‰LŒNÛ‘��1Ø—?’?Ø Ÿ?™?×<Ñ<¸aÀ¸VÓD‘D�A�qØ—‘˜eŸl™l×4Ñ4°Q¸Ó:Õ;ð ô ˜“<Ð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ž   s_   ø€ Ü˜V›ˆIØ�L‰LŒNÛ%�Ø—?’?Ø×.Ñ.¨u¯©Ô?Ø—‘˜eŸl™l×8Ñ8¸ÓBÕCð &ô ˜“<Ð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¬   s_   ø€ Ü˜F“|ˆHØ�L‰LŒNÛ#�Ø—?’?Ø×-Ñ-¨e¯o©oÔ>Ø—‘˜eŸl™l×7Ñ7¸Ó@ÕAð $ô ˜“<Ð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¼   sa   ø€ Ü˜“LˆEØ�L‰LŒNÛ�Ø—?“?Ø×*Ñ*¨5¯?©?Õ;ð ð �M‰M˜%Ÿ,™,×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Ì   sa   ø€ Ü˜“LˆEØ�L‰LŒNÛ�Ø—?“?Ø×*Ñ*¨5¯?©?Õ;ð ð �M‰M˜%Ÿ,™,×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Ù   s3   € Ø ŸL™L©¨2¨Ô.‰LˆAˆyØÑ$Ø�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   € Ø�z‰zÐr$   c                óT   — | j                   j                  t        |«      «      }|sy |S r   )r™   Ú	is_insider   )r!   r,   rœ   s      r"   r-   zClippingPolygon.clip_pointï   s%   € Ø—L‘L×*Ñ*¬4°«;Ó7ˆ	ÙØØˆr$   c                ó:   — | j                   j                  ||«      S r   )r™   r2   r/   s      r"   r2   zClippingPolygon.clip_lineõ   s   € Ø�|‰|×%Ñ% e¨SÓ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‹;˜!ÒÜ“7ˆNÜ% f§n¡nÓ&6Ó7ˆØ×%Ñ% mÔ4Ü“7ˆNØ×$Ñ$ ]Ô3Ø�9Ðð  ×-Ñ-¨f¯o©oÓ.?Ô@ó
á@�Ü�4‹y˜1Š}ô ˜$ÕØ@ñ
ð 	
ùò 
ó   Â 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‹;˜Š?Ü“7ˆNÜ$ V§^¡^Ó%5Ó6ˆØ×%Ñ% lÔ3Ü“7ˆNØ×$Ñ$ \Ô2Ø�9Ðð  ×,Ñ,¨V¯_©_Ó->Ô?ó
á?�Ü�4‹y˜1Š}ô ˜$ÕØ?ñ
ð 	
ùò 
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Ã   è ø€ ð —,‘,ˆÛˆDØ ŸN™NÖ,�Ü)¨(×*CÑ*CÓ*EÓF�	Ø ×)Ò)ØØ×,Ñ,¨YÔ7Ø"’NØØ×-Ñ-¨iÔ8ØÜŸ9™9 X×%8Ñ%8¸ÈqÐ%8Ó%QÓR�Ø#×1Ñ1°(Ö;�DÜ˜4“y 1“}Ü)×7Ñ7¸ÀEÔJÓJñ <ñ -ñ ùó   ‚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Æ   è ø€ ð —,‘,ˆÛˆDØ ŸN™NÖ,�Ü�x“= 1Ò$ØÜ)¨(×*CÑ*CÓ*EÓF�	Ø×,Ñ,¨YÔ7Ø"’NØØ×-Ñ-¨iÔ8ØØ#×0Ñ0Ü—I‘I˜h×1Ñ1°+ÈÐ1ÓJÓKö�Dô ˜4“y 1“}Ü)×7Ñ7¸ÀDÔIÓIñ	ñ -ñ ù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   z¹Represents 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Ó%ˆØ�}Š}ÜÐ:Ó;Ð;Ø—Y‘YˆØŸ&™& 4§6¡6™/¨DÑ0ˆŒä‰Ñ˜™~¨d¯k©k¸4¿;¹;ÓGÕHr$   c                ó8   — | j                   j                  |«      S r   )r˜   Úcontainsr&   s     r"   r(   z!ClippingRect.is_completely_insideQ  s   € Ø�z‰z×"Ñ" 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'   € Ø�?Š?Ü“7ˆNØ�|‰|×%Ñ% e¨SÓ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Ø*ð6Ø9>ð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   zßRepresents 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   € ô �Y‰Y�wÓ€FÜ# FÔ+Ü˜FÓ#Ð#Ü	˜f¨UÕ	3Ü$ VÓ,Ð,Ü! &Ó)Ð)r$   c                ó   — t        | |«      S )zúReturns 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   € ô # 7¨LÓ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áÝ,ò	€ô;$�C—G‘Gô ;$ô|�Jô ÷
rñ rôj[J�mô [Jô|9=�?ô 9=ôx6˜Oô 6ô&6˜_ô 6ô&6˜oô 6ó0*ð$:Øð:Ø+8ð:àô:r$   