Ë
    £èh"  ã                  óz   — d dl mZ d dlmZmZ d dlZd dlmZmZ ddl	m
Z
 ddlmZ ddlmZ d	Zd
gZ G d„ d
«      Zy)é    )Úannotations)ÚSequenceÚIterableN)ÚVec2ÚUVecé   )ÚBoundingBox2d)ÚConstructionLine©Úpoint_to_line_relationgê-�™—q=ÚConstructionBoxc                  óÒ  — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 dd„Zed d„«       Zd!d„Zed"d„«       Z	ed#d„«       Z
e
j                  d$d„«       Z
ed%d„«       Zej                  d&d	„«       Zed%d
„«       Zej                  d'd„«       Zed%d„«       Zed%d„«       Zed%d„«       Zej                  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d0d„Zd1d„Zd1d„Zd2d„Zd3d„Zy)4r   zÌConstruction tool for 2D rectangles.

    Args:
        center: center of rectangle
        width: width of rectangle
        height: height of rectangle
        angle: angle of rectangle in degrees

    c                óž   — t        |«      | _        t        |«      | _        t        |«      | _        || _        t        «       | _        d| _        y ©NT)	r   Ú_centerÚabsÚ_widthÚ_heightÚ_angleÚtupleÚ_cornersÚ_tainted)ÚselfÚcenterÚwidthÚheightÚangles        ú.lib/python3.12/site-packages/ezdxf/math/box.pyÚ__init__zConstructionBox.__init__   s<   € ô ˜F“|ˆŒÜ  ›ZˆŒÜ! &›kˆŒØ"ˆŒä(-«ˆŒØ"ˆ�ó    c                óî   — t        |«      }t        |«      }t        |j                  |j                  z
  «      }t        |j                  |j                  z
  «      }|j	                  |«      } | |||¬«      S )zóCreates a box from two opposite corners, box sides are parallel to x-
        and y-axis.

        Args:
            p1: first corner as :class:`Vec2` compatible object
            p2: second corner as :class:`Vec2` compatible object

        )r   r   r   )r   r   ÚxÚyÚlerp)ÚclsÚp1Úp2Ú_p1Ú_p2r   r   r   s           r   Úfrom_pointszConstructionBox.from_points+   s^   € ô �2‹hˆÜ�2‹hˆÜ˜3Ÿ5™5 3§5¡5™=Ó)ˆÜ˜CŸE™E C§E¡E™MÓ*ˆØ—x‘x “}ˆÙ˜&¨°fÔ=Ð=r    c                óD  — | j                   sy | j                  }t        j                  | j                  | j
                  dz  «      }t        j                  | j                  dz   | j                  dz  «      }||z
  |z
  ||z   |z
  ||z   |z   ||z
  |z   f| _        d| _         y )Nç       @éZ   F)r   r   r   Úfrom_deg_angler   r   r   r   )r   r   Úw2Úh2s       r   ÚupdatezConstructionBox.update<   sš   € Ø�}Š}ØØ—‘ˆÜ× Ñ  §¡¨d¯k©k¸CÑ.?Ó@ˆÜ× Ñ  §¡¨rÑ!1°4·<±<À#Ñ3EÓFˆà�R‰K˜"ÑØ�R‰K˜"ÑØ�R‰K˜"ÑØ�R‰K˜"Ñð	
ˆŒð ˆ�r    c                ó,   — t        | j                  «      S )z:class:`BoundingBox2d`)r	   Úcorners©r   s    r   Úbounding_boxzConstructionBox.bounding_boxJ   s   € ô ˜TŸ\™\Ó*Ð*r    c                ó   — | j                   S )z
box center)r   r4   s    r   r   zConstructionBox.centerO   ó   € ð �|‰|Ðr    c                ó2   — t        |«      | _        d| _        y r   )r   r   r   )r   Úcs     r   r   zConstructionBox.centerT   s   € ä˜A“wˆŒØˆ�r    c                ó   — | j                   S )z	box width)r   r4   s    r   r   zConstructionBox.widthY   ó   € ð �{‰{Ðr    c                ó2   — t        |«      | _        d| _        y r   )r   r   r   )r   Úws     r   r   zConstructionBox.width^   s   € ä˜!“fˆŒØˆ�r    c                ó   — | j                   S )z
box height)r   r4   s    r   r   zConstructionBox.heightc   r7   r    c                ó2   — t        |«      | _        d| _        y r   )r   r   r   )r   Úhs     r   r   zConstructionBox.heighth   s   € ä˜1“vˆŒØˆ�r    c                óH   — t        | j                  | j                  «      dz  S )zincircle radiusç      à?)Úminr   r   r4   s    r   Úincircle_radiuszConstructionBox.incircle_radiusm   s   € ô �4—;‘; §¡Ó-°Ñ3Ð3r    c                ó\   — t        j                  | j                  | j                  «      dz  S )zcircum circle radiusrB   )ÚmathÚhypotr   r   r4   s    r   Úcircumcircle_radiusz#ConstructionBox.circumcircle_radiusr   s"   € ô �z‰z˜$Ÿ+™+ t§|¡|Ó4°sÑ:Ð:r    c                ó   — | j                   S )zrotation angle in degrees)r   r4   s    r   r   zConstructionBox.anglew   r;   r    c                ó    — || _         d| _        y r   )r   r   )r   Úas     r   r   zConstructionBox.angle|   s   € àˆŒØˆ�r    c                ó:   — | j                  «        | j                  S )z1box corners as sequence of :class:`Vec2` objects.)r1   r   r4   s    r   r3   zConstructionBox.corners�   s   € ð 	�‰ŒØ�}‰}Ðr    c                ó,   — t        | j                  «      S )z1Iterable of box corners as :class:`Vec2` objects.)Úiterr3   r4   s    r   Ú__iter__zConstructionBox.__iter__‡   s   € ä�D—L‘LÓ!Ð!r    c                ó    — | j                   |   S )zAGet corner by index `corner`, ``list`` like slicing is supported.)r3   )r   Úcorners     r   Ú__getitem__zConstructionBox.__getitem__‹   s   € à�|‰|˜FÑ#Ð#r    c           	     óp   — d| j                   › d| j                  › d| j                  › d| j                  › d�	S )zaReturns string representation of box as
        ``ConstructionBox(center, width, height, angle)``zConstructionBox(z, Ú))r   r   r   r   r4   s    r   Ú__repr__zConstructionBox.__repr__�   s6   € ð " $§+¡+ ¨b°·±°¸B¸t¿{¹{¸mÈ2ÈdÏjÉjÈ\ÐYZÐ[Ð[r    c                óD   — | xj                   t        ||f«      z  c_         y)zœMove box about `dx` in x-axis and about `dy` in y-axis.

        Args:
            dx: translation in x-axis
            dy: translation in y-axis

        N)r   r   )r   ÚdxÚdys      r   Ú	translatezConstructionBox.translate”   s   € ð 	�Š”t˜R ˜H“~Ñ%Žr    c                óX   — | xj                   |z  c_         | xj                  |z  c_        y)z2Expand box: `dw` expand width, `dh` expand height.N©r   r   )r   ÚdwÚdhs      r   ÚexpandzConstructionBox.expandž   ó   € à�
Š
�bÑ�
Ø�Š�rÑŽr    c                óX   — | xj                   |z  c_         | xj                  |z  c_        y)z1Scale box: `sw` scales width, `sh` scales height.Nr[   )r   ÚswÚshs      r   ÚscalezConstructionBox.scale£   r_   r    c                ó.   — | xj                   |z  c_         y)z!Rotate box by `angle` in degrees.N)r   )r   r   s     r   ÚrotatezConstructionBox.rotate¨   s   € à�
Š
�eÑŽ
r    c                óÂ  ‡— t        ‰«      Š| j                  ‰z
  }t        | j                  «      t        k  rLt        |j
                  «      | j                  dz  k  xr% t        |j                  «      | j                  dz  k  S |j                  }|| j                  kD  ry|| j                  k  ry| j                  \  }}}}t        ˆfd„||f||f||f||ffD «       «      S )z-Returns ``True`` if `point` is inside of box.r,   FTc              3  óD   •K  — | ]  \  }}t        ‰||«      d k  –— Œ y­w)r   Nr   )Ú.0rK   ÚbÚpoints      €r   Ú	<genexpr>z,ConstructionBox.is_inside.<locals>.<genexpr>¾   s+   øè ø€ ð á$L™D˜A˜qô /¨u°a¸Ó;¸aÕ?Ù$Lùs   ƒ )r   r   r   r   ÚABS_TOLr"   r   r#   r   Ú	magnituderH   rD   r3   Úall)r   rj   ÚdeltaÚdistancer&   r'   Úp3Úp4s    `      r   Ú	is_insidezConstructionBox.is_inside¬   sÛ   ø€ ä�U“ˆØ—‘˜eÑ#ˆÜˆt�z‰z‹?œWÒ$Ü�u—w‘w“< D§K¡K°#Ñ$5Ñ6ò ¼3¸u¿w¹w»<Ø—‘˜sÑ"ñ<ð ð —‘ˆHØ˜$×2Ñ2Ò2ØØ˜T×1Ñ1Ò1Øð "&§¡‘��B˜˜BÜóà&(¨" X°°B¨x¸"¸b¸ÀBÈÀ8Ñ$Lóóð r    c                ó@   ‡ — t        ˆ fd„|j                  D «       «      S )zAReturns ``True`` if any corner of `other` box is inside this box.c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w)N)rs   )rh   Úpr   s     €r   rk   z7ConstructionBox.is_any_corner_inside.<locals>.<genexpr>Æ   s   øè ø€ Ð<©m¨�4—>‘> !×$©mùs   ƒ)Úanyr3   )r   Úothers   ` r   Úis_any_corner_insidez$ConstructionBox.is_any_corner_insideÄ   s   ø€ äÓ<¨e¯mªmÓ<Ó<Ð<r    c                ó>  — | j                   |j                   z
  j                  }| j                  |j                  z   }||kD  ry| j                  |j                  z   }||k  ry| j	                  |«      ry|j	                  | «      ry| j
                  \  }}}}t        ||«      }	t        ||«      }
|j
                  \  }}}}t        ||«      }|j                  |	«      s|j                  |
«      ryt        ||«      }|j                  |	«      s|j                  |
«      ryy)z8Returns ``True`` if this box and `other` box do overlap.FT)r   rm   rH   rD   ry   r3   r
   Úhas_intersection)r   rx   rp   Úmax_distanceÚmin_distanceÚc1Úc2Úc3Úc4Údiag1Údiag2Út1Út2Út3Út4Ú	test_diags                   r   Úis_overlappingzConstructionBox.is_overlappingÈ   s  € à—K‘K %§,¡,Ñ.×9Ñ9ˆØ×/Ñ/°%×2KÑ2KÑKˆØ�lÒ"ØØ×+Ñ+¨e×.CÑ.CÑCˆØ�|Ò#Øà×$Ñ$ UÔ+ØØ×%Ñ% dÔ+Øð Ÿ™‰ˆˆB��BÜ   RÓ(ˆÜ   RÓ(ˆàŸ™‰ˆˆB��BÜ$ R¨Ó,ˆ	Ø×%Ñ% eÔ,°	×0JÑ0JØô1
ð Ü$ R¨Ó,ˆ	Ø×%Ñ% eÔ,°	×0JÑ0JØô1
ð àr    c                ó€   — | j                   \  }}}}t        ||«      t        ||«      t        ||«      t        ||«      fS )zDReturns borderlines of box as sequence of :class:`ConstructionLine`.)r3   r
   )r   r&   r'   rq   rr   s        r   Úborder_lineszConstructionBox.border_linesê   sE   € àŸ™‰ˆˆB��Bä˜R Ó$Ü˜R Ó$Ü˜R Ó$Ü˜R Ó$ð	
ð 	
r    c                ó    — t        «       }| j                  «       D ]'  }|j                  |«      }|€Œ|j                  |«       Œ) t	        |«      S )a?  Returns 0, 1 or 2 intersection points between `line` and box
        borderlines.

        Args:
            line: line to intersect with borderlines

        Returns:
            list of intersection points

            =========== ==================================
            list size   Description
            =========== ==================================
            0           no intersection
            1           line touches box at one corner
            2           line intersects with box
            =========== ==================================

        )Úsetr‹   Ú	intersectÚaddÚsorted)r   ÚlineÚresultÚborder_linerv   s        r   rŽ   zConstructionBox.intersectô   sH   € ô& “ˆØ×,Ñ,Ö.ˆKØ—‘˜{Ó+ˆAØ‰}Ø—
‘
˜1•ð /ô �f‹~Ðr    N))r   r   r   r   r   )r   r   r   Úfloatr   r”   r   r”   )r&   r   r'   r   Úreturnr   )r•   ÚNone)r•   r	   )r•   r   )r9   r   r•   r–   )r•   r”   )r=   r”   r•   r–   )r@   r”   r•   r–   )rK   r”   r•   r–   )r•   zSequence[Vec2])r•   zIterable[Vec2])r•   Ústr)rW   r”   rX   r”   r•   r–   )r\   r”   r]   r”   r•   r–   )ra   r”   rb   r”   r•   r–   )r   r”   r•   r–   )rj   r   r•   Úbool)rx   r   r•   r˜   )r•   zSequence[ConstructionLine])r‘   r
   r•   z
list[Vec2])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úclassmethodr*   r1   Úpropertyr5   r   Úsetterr   r   rD   rH   r   r3   rO   rR   rU   rY   r^   rc   re   rs   ry   r‰   r‹   rŽ   © r    r   r   r      s—  „ ñð ØØØð#àð#ð ð#ð ð	#ð
 ó#ð ò>ó ð>ó ð ò+ó ð+ð òó ðð ‡]�]òó ðð òó ðð ‡\�\òó ðð òó ðð ‡]�]òó ðð ò4ó ð4ð ò;ó ð;ð òó ðð ‡\�\òó ðð òó ðó
"ó$ó\ó
&óó
ó
óó0=ó óD
ôr    )Ú
__future__r   Útypingr   r   rF   Ú
ezdxf.mathr   r   Úbboxr	   r‘   r
   Úconstruct2dr   rl   Ú__all__r   r    r    r   Ú<module>r§      s7   ðõ #ß %Û ß !Ý Ý "Ý /ð €àÐ
€÷{ò {r    