Ë
    £èhÕV  ã                  óä  — U d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
Z
d dlZd dlZ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mZ erd d	lmZ g d
¢ZdZ ed«      Zej>                  dz  Z  G d„ de«      Z! G d„ de«      Z" G d„ de«      Z#dZ$de%d<    G d„ d«      Z& G d„ de&«      Z' G d„ d«      Z( G d„ de(«      Z) G d„ d e(«      Z*d2d!„Z+d2d"„Z,d2d#„Z-e#j\                  e+e#j^                  e,e#j`                  e-iZ1 G d$„ d%«      Z2d3d&„Z3e#j^                  f	 	 	 	 	 d4d'„Z4	 	 	 	 	 	 d5d(„Z5 G d)„ d*ejl                  «      Z7 G d+„ d,e2«      Z8 G d-„ d.e2«      Z9	 d6	 	 	 	 	 	 	 d7d/„Z:d8d0„Z;	 	 	 	 	 	 	 	 	 	 d9d1„Z<y):é    )Úannotations)ÚIterableÚTYPE_CHECKINGÚTypeVarÚOptional)ÚEnumÚautoN)ÚTextEntityAlignment)ÚVec2ÚVec3ÚUVecÚBoundingBoxÚBoundingBox2dÚAbstractBoundingBoxÚMatrix44é   )Úgenetic_algorithm)ÚGenericLayoutType)ÚItemÚFlatItemÚBoxÚEnvelopeÚAbstractPackerÚPackerÚ
FlatPackerÚRotationTypeÚPickStrategyÚshuffle_packÚpack_item_subsetÚ
export_dxfg.Ÿ‡¢®B}TÚTé   c                  ód   — e Zd ZdZ e«       Z e«       Z e«       Z e«       Z e«       Z	 e«       Z
y)r   zQRotation type of an item:

    - W = width
    - H = height
    - D = depth

    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   ÚWHDÚHWDÚHDWÚDHWÚDWHÚWDH© ó    ú7lib/python3.12/site-packages/ezdxf/addons/binpacking.pyr   r   H   s3   „ ññ ‹&€CÙ
‹&€CÙ
‹&€CÙ
‹&€CÙ
‹&€CÙ
‹&�Cr/   r   c                  ó6   — e Zd Z e«       Z e«       Z e«       Zy)ÚAxisN)r$   r%   r&   r	   ÚWIDTHÚHEIGHTÚDEPTHr.   r/   r0   r2   r2   Y   s   „ Ù‹F€EÙ‹V€FÙ‹F�Er/   r2   c                  ó:   — e Zd ZdZ e«       Z e«       Z e«       Zy)r   z)Order of how to pick items for placement.N)r$   r%   r&   r'   r	   ÚSMALLER_FIRSTÚBIGGER_FIRSTÚSHUFFLEr.   r/   r0   r   r   _   s   „ Ù3á“F€MÙ“6€LÙ‹f�Gr/   r   )r   r   r   útuple[float, float, float]ÚSTART_POSITIONc                  óÞ   — e Zd ZdZ	 d	 	 	 	 	 	 	 dd„Zd„ Zd„ Zedd„«       Zdd„Z	d„ Z
edd„«       Zej                  dd	„«       Zedd
„«       Zej                  dd„«       Zdd„Zdd„Zdd„Zy)r   z3D container item.c                óà   — || _         t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        j                  | _        t        | _
        d | _        y ©N)ÚpayloadÚfloatÚwidthÚheightÚdepthÚweightr   r(   Ú_rotation_typer;   Ú	_positionÚ_bbox)Úselfr?   rA   rB   rC   rD   s         r0   Ú__init__zItem.__init__m   sS   € ð ˆŒÜ˜5“\ˆŒ
Ü˜F“mˆŒÜ˜5“\ˆŒ
Ü˜F“mˆŒÜ*×.Ñ.ˆÔÜ'ˆŒØ48ˆ�
r/   c                ó  — t        | j                  «      › d| j                  › d| j                  › d| j                  › d| j
                  › dt        | j                  «      › d| j                  › d| j                  «       › d�S )NÚ(Úxú
, weight: ú) pos(ú) rt(ú) vol(Ú))	Ústrr?   rA   rB   rC   rD   ÚpositionÚrotation_typeÚ
get_volume©rH   s    r0   Ú__str__zItem.__str__~   sz   € ä�4—<‘<Ó Ð!  4§:¡: ,¨a°·±¨}¸A¸d¿j¹j¸\ð JØ—{‘{�m 6¬#¨d¯m©mÓ*<Ð)=ð >Ø×$Ñ$Ð% V¨D¯O©OÓ,=Ð+>¸aðAð	
r/   c                ó,   — t        j                   | «      S )zXReturns a copy, all copies have a reference to the same payload
        object.
        )ÚcopyrV   s    r0   rY   z	Item.copy…   s   € ô �y‰y˜‹Ðr/   c                óR   — | j                   €| j                  «        | j                   S r>   )rG   Ú_update_bboxrV   s    r0   Úbboxz	Item.bbox‹   s"   € à�:‰:ÐØ×ÑÔØ�z‰zÐr/   c                ó†   — t        | j                  «      }t        ||t        | j                  «       «      z   g«      | _        y r>   )r   rF   r   Úget_dimensionrG   ©rH   Úv1s     r0   r[   zItem._update_bbox‘   s4   € Ü�$—.‘.Ó!ˆÜ  " b¬4°×0BÑ0BÓ0DÓ+EÑ&EÐ!FÓGˆ�
r/   c                ó   — d | _         y r>   )rG   rV   s    r0   Ú_taintzItem._taint•   s	   € Øˆ�
r/   c                ó   — | j                   S r>   )rE   rV   s    r0   rT   zItem.rotation_type˜   s   € à×"Ñ"Ð"r/   c                ó2   — || _         | j                  «        y r>   )rE   rb   ©rH   Úvalues     r0   rT   zItem.rotation_typeœ   s   € à#ˆÔØ�‰�r/   c                ó   — | j                   S )zŒReturns the position of then lower left corner of the item in the
        container, the lower left corner is the origin (0, 0, 0).
        )rF   rV   s    r0   rS   zItem.position¡   s   € ð
 �~‰~Ðr/   c                ó2   — || _         | j                  «        y r>   )rF   rb   re   s     r0   rS   zItem.position¨   s   € àˆŒØ�‰�r/   c                óN   — | j                   | j                  z  | j                  z  S )zReturns the volume of the item.©rA   rB   rC   rV   s    r0   rU   zItem.get_volume­   ó   € à�z‰z˜DŸK™KÑ'¨$¯*©*Ñ4Ð4r/   c                ó¸  — | j                   }|t        j                  k(  r#| j                  | j                  | j
                  fS |t        j                  k(  r#| j                  | j                  | j
                  fS |t        j                  k(  r#| j                  | j
                  | j                  fS |t        j                  k(  r#| j
                  | j                  | j                  fS |t        j                  k(  r#| j
                  | j                  | j                  fS |t        j                  k(  r#| j                  | j
                  | j                  fS t        |«      ‚)z?Returns the item dimension according the :attr:`rotation_type`.)rT   r   r(   rA   rB   rC   r)   r*   r+   r,   r-   Ú
ValueError)rH   Úrts     r0   r^   zItem.get_dimension±   s  € à×ÑˆØ”×!Ñ!Ò!Ø—:‘:˜tŸ{™{¨D¯J©JÐ6Ð6Ø”<×#Ñ#Ò#Ø—;‘; §
¡
¨D¯J©JÐ6Ð6Ø”<×#Ñ#Ò#Ø—;‘; §
¡
¨D¯J©JÐ6Ð6Ø”<×#Ñ#Ò#Ø—:‘:˜tŸ{™{¨D¯J©JÐ6Ð6Ø”<×#Ñ#Ò#Ø—:‘:˜tŸz™z¨4¯;©;Ð6Ð6Ø”<×#Ñ#Ò#Ø—:‘:˜tŸz™z¨4¯;©;Ð6Ð6Ü˜‹nÐr/   c                óè  — | j                   \  }}}| j                  }|t        j                  k(  rt	        j
                  |||«      S |t        j                  k(  r>t	        j                  t        «      t	        j
                  || j                  z   ||«      z  S |t        j                  k(  rQt	        j                  t        dt        «      t	        j
                  || j                  z   || j                  z   |«      z  S |t        j                  k(  r?t	        j                  t         «      t	        j
                  || j                  z   ||«      z  S |t        j                  k(  r7t	        j                  dt        t        «      t	        j
                  |||«      z  S |t        j                   k(  r>t	        j"                  t        «      t	        j
                  ||| j                  z   |«      z  S t%        |«      ‚)zÛReturns the transformation matrix to transform the source entity
        located with the minimum extension corner of its bounding box in
        (0, 0, 0) to the final location including the required rotation.
        r   )rS   rT   r   r(   r   Ú	translater)   Úz_rotateÚPI_2rB   r*   Ú
xyz_rotaterC   r+   Úy_rotater,   r-   Úx_rotateÚ	TypeError)rH   rL   ÚyÚzrn   s        r0   Úget_transformationzItem.get_transformationÂ   s©  € ð
 —-‘-‰ˆˆ1ˆaØ×ÑˆØ”×!Ñ!Ò!Ü×%Ñ% a¨¨AÓ.Ð.Ø”×!Ñ!Ò!Ü×$Ñ$¤TÓ*¬X×-?Ñ-?Ø�D—K‘K‘  Aó.ñ ð ð ”×!Ñ!Ò!Ü×&Ñ&¤t¨Q´Ó5¼×8JÑ8JØ�D—K‘K‘  T§Z¡Z¡°ó9ñ ð ð ”×!Ñ!Ò!Ü×$Ñ$¤d UÓ+¬h×.@Ñ.@Ø�D—J‘J‘  1ó/ñ ð ð ”×!Ñ!Ò!Ü×&Ñ& q¬$´Ó5¼×8JÑ8JØ�1�aó9ñ ð ð ”×!Ñ!Ò!Ü×$Ñ$¤TÓ*¬X×-?Ñ-?Ø�1�t—z‘z‘> 1ó.ñ ð ô ˜‹mÐr/   N©ç        )rA   r@   rB   r@   rC   r@   rD   r@   )Úreturnr   ©r|   ÚNone)r|   r   )rf   r   r|   r~   )r|   r:   )rf   r:   r|   r~   ©r|   r@   )r|   r   )r$   r%   r&   r'   rI   rW   rY   Úpropertyr\   r[   rb   rT   ÚsetterrS   rU   r^   ry   r.   r/   r0   r   r   j   sÉ   „ Ùð ð9ð ð9ð ð	9ð
 ð9ð ó9ò"
òð òó ðó
Hòð ò#ó ð#ð ×Ñòó ðð òó ðð ‡_�_òó ðó5óô"r/   r   c                  ó@   ‡ — e Zd ZdZ	 d	 	 	 	 	 dˆ fd„Zdd„Zd„ Zˆ xZS )r   zU2D container item, inherited from :class:`Item`. Has a default depth of
    1.0.
    c                ó,   •— t         ‰| �  |||d|«       y ©Ng      ð?©ÚsuperrI   )rH   r?   rA   rB   rD   Ú	__class__s        €r0   rI   zFlatItem.__init__ç   s   ø€ ô 	‰Ñ˜ %¨°°fÕ=r/   c                ó†   — t        | j                  «      }t        ||t        | j                  «       «      z   g«      | _        y r>   )r   rF   r   r^   rG   r_   s     r0   r[   zFlatItem._update_bboxð   s4   € Ü�$—.‘.Ó!ˆÜ" B¨¬T°$×2DÑ2DÓ2FÓ-GÑ(GÐ#HÓIˆ�
r/   c                óè   — t        | j                  «      › d| j                  › d| j                  › d| j                  › dt        | j
                  «      › d| j                  › d| j                  «       › d�S )NrK   rL   rM   rN   rO   ú) area(rQ   )rR   r?   rA   rB   rD   rS   rT   rU   rV   s    r0   rW   zFlatItem.__str__ô   so   € ä�4—<‘<Ó Ð!  4§:¡: ,¨a°·±¨}ð =Ø—{‘{�m 6¬#¨d¯m©mÓ*<Ð)=ð >Ø×$Ñ$Ð% W¨T¯_©_Ó->Ð,?¸qðBð	
r/   rz   )rA   r@   rB   r@   rD   r@   r}   )r$   r%   r&   r'   rI   r[   rW   Ú__classcell__©r‡   s   @r0   r   r   â   s;   ø„ ñð ð>ð ð>ð ð	>ð
 õ>óJö
r/   r   c                  óˆ   — e Zd Zef	 	 	 	 	 	 	 dd„Zd„ Zd„ Zd„ Z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y)ÚBinc                ó<  — || _         t        |«      | _        | j                  dk  rt        d«      ‚t        |«      | _        | j                  dk  rt        d«      ‚t        |«      | _        | j
                  dk  rt        d«      ‚t        |«      | _        g | _        y )Nr{   zinvalid widthzinvalid heightzinvalid depth)Únamer@   rA   rm   rB   rC   Ú
max_weightÚitems)rH   r�   rA   rB   rC   r‘   s         r0   rI   zBin.__init__ý   s…   € ð ˆŒ	Ü˜5“\ˆŒ
Ø�:‰:˜ÒÜ˜_Ó-Ð-Ü˜F“mˆŒØ�;‰;˜#ÒÜÐ-Ó.Ð.Ü˜5“\ˆŒ
Ø�:‰:˜ÒÜ˜_Ó-Ð-Ü 
Ó+ˆŒØ!#ˆ�
r/   c                ó,   — t        | j                  «      S r>   ©Úlenr’   rV   s    r0   Ú__len__zBin.__len__  s   € Ü�4—:‘:‹Ðr/   c                ó,   — t        | j                  «      S r>   )Úiterr’   rV   s    r0   Ú__iter__zBin.__iter__  s   € Ü�D—J‘JÓÐr/   c                ód   — t        j                   | «      }t        | j                  «      |_        |S )zReturns a copy.)rY   Úlistr’   ©rH   Úboxs     r0   rY   zBin.copy  s$   € ä�i‰i˜‹oˆÜ˜Ÿ™Ó$ˆŒ	Øˆ
r/   c                ó8   — | j                   j                  «        y)z#Reset the container to empty state.N)r’   ÚclearrV   s    r0   Úresetz	Bin.reset  s   € à�
‰
×ÑÕr/   c                ó.   — t        | j                  «       S r>   r”   rV   s    r0   Úis_emptyzBin.is_empty"  s   € ä�t—z‘z“?Ð"Ð"r/   c                óÄ   — t        | j                  «      › d| j                  d›d| j                  d›d| j                  d›d| j
                  › d| j                  «       d›d�S )NrK   ú.3frL   ú, max_weight:rP   rQ   )rR   r�   rA   rB   rC   r‘   Úget_capacityrV   s    r0   rW   zBin.__str__&  si   € ä�4—9‘9‹~Ð˜a §
¡
¨3Ð/¨q°·±¸SÐ0AÀÀ4Ç:Á:ÈcÐBRð SØŸ/™/Ð*ð +Ø×$Ñ$Ó& sÐ+¨1ð.ð	
r/   c                óø  ‡— |j                   }||_         |\  }}}| j                  «       D ]Æ  }||_        |j                  «       \  }}	}
| j                  ||z   k  s$| j
                  ||	z   k  s| j                  ||
z   k  rŒU|j                  Št        ˆfd„| j                  D «       «      rŒ€| j                  «       |j                  z   | j                  k  sŒ«| j                  j                  |«        y ||_         y)Nc              3  óT   •K  — | ]  }‰j                  |j                  «      –— Œ! y ­wr>   )Úhas_intersectionr\   )Ú.0ÚiÚ	item_bboxs     €r0   Ú	<genexpr>zBin.put_item.<locals>.<genexpr>;  s!   øè ø€ ÐOÁJ¸q˜	×2Ñ2°1·6±6×:ÁJùs   ƒ%(TF)rS   Ú	rotationsrT   r^   rA   rB   rC   r\   Úanyr’   Úget_total_weightrD   r‘   Úappend)rH   ÚitemÚpivotÚvalid_item_positionrL   rw   rx   rT   ÚwÚhÚdr¬   s              @r0   Úput_itemzBin.put_item-  sÙ   ø€ Ø"Ÿm™mÐØˆŒØ‰ˆˆ1ˆað "Ÿ^™^Ö-ˆMØ!.ˆDÔØ×(Ñ(Ó*‰GˆAˆq�!Ø�z‰z˜A ™EÒ! T§[¡[°1°q±5Ò%8¸D¿J¹JÈÈQÉÒ<NØàŸ	™	ˆIäÓOÀDÇJÂJÓOÕOØ×)Ñ)Ó+¨d¯k©kÑ9¸T¿_¹_ÓLà—
‘
×!Ñ! $Ô'Ùð .ð ,ˆŒØr/   c                óN   — | j                   | j                  z  | j                  z  S )z+Returns the maximum fill volume of the bin.rj   rV   s    r0   r¦   zBin.get_capacityD  rk   r/   c                ó:   — t        d„ | j                  D «       «      S )z-Returns the total weight of all fitted items.c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr>   )rD   ©rª   r²   s     r0   r­   z'Bin.get_total_weight.<locals>.<genexpr>J  s   è ø€ Ð6©: 4�4—;•;©:ùó   ‚©Úsumr’   rV   s    r0   r°   zBin.get_total_weightH  s   € äÑ6¨4¯:ª:Ó6Ó6Ð6r/   c                ó:   — t        d„ | j                  D «       «      S )z-Returns the total volume of all fitted items.c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr>   ©rU   r¼   s     r0   r­   z'Bin.get_total_volume.<locals>.<genexpr>N  ó   è ø€ Ð<±¨�4—?‘?×$±ùó   ‚r¾   rV   s    r0   Úget_total_volumezBin.get_total_volumeL  ó   € äÑ<°·²Ó<Ó<Ð<r/   c                ód   — 	 | j                  «       | j                  «       z  S # t        $ r Y yw xY w)zReturn the fill ratio.r{   )rÅ   r¦   ÚZeroDivisionErrorrV   s    r0   Úget_fill_ratiozBin.get_fill_ratioP  s6   € ð	Ø×(Ñ(Ó*¨T×->Ñ->Ó-@Ñ@Ð@øÜ ò 	Ùð	ús   ‚ # £	/®/c                ó   — t         S r>   )r   rV   s    r0   r®   zBin.rotationsW  s   € ÜÐr/   N)rA   r@   rB   r@   rC   r@   r‘   r@   ©r|   Úbool©r|   rR   )r²   r   r³   r:   r|   rÌ   r   ©r|   zIterable[RotationType])r$   r%   r&   ÚUNLIMITED_WEIGHTrI   r–   r™   rY   r    r€   r¢   rW   r¸   r¦   r°   rÅ   rÉ   r®   r.   r/   r0   rŽ   rŽ   ü   s   „ ð -ð$ð ð$ð ð	$ð
 ð$ð ó$ò*ò òòð ò#ó ð#ó
óó.5ó7ó=óôr/   rŽ   c                  ó   — e Zd ZdZy)r   z)3D container inherited from :class:`Bin`.N)r$   r%   r&   r'   r.   r/   r0   r   r   [  s   „ Ù3àr/   r   c                  óB   ‡ — e Zd ZdZef	 	 	 	 	 dˆ fd„Zdd„Zdd„Zˆ xZS )r   z)2D container inherited from :class:`Bin`.c                ó,   •— t         ‰| �  |||d|«       y r„   r…   )rH   r�   rA   rB   r‘   r‡   s        €r0   rI   zEnvelope.__init__d  s   ø€ ô 	‰Ñ˜˜u f¨c°:Õ>r/   c           
     ó¨   — t        | j                  «      › d| j                  d›d| j                  d›d| j                  › d| j                  «       d›d�
S )NrK   r¤   rL   r¥   rŠ   rQ   )rR   r�   rA   rB   r‘   r¦   rV   s    r0   rW   zEnvelope.__str__m  s\   € ä�4—9‘9‹~Ð˜a §
¡
¨3Ð/¨q°·±¸SÐ0Að BØŸ/™/Ð*ð +Ø×%Ñ%Ó'¨Ð,¨Að/ð	
r/   c                óB   — t         j                  t         j                  fS r>   )r   r(   r)   rV   s    r0   r®   zEnvelope.rotationst  s   € Ü×Ñ¤×!1Ñ!1Ð1Ð1r/   )rA   r@   rB   r@   r‘   r@   rÍ   rÎ   )	r$   r%   r&   r'   rÏ   rI   rW   r®   r‹   rŒ   s   @r0   r   r   a  s8   ø„ Ù3ð -ð?ð ð?ð ð	?ð
 õ?ó
÷2r/   r   c                óP   — | j                  d„ ¬«       |j                  d„ ¬«       y )Nc                ó"   — | j                  «       S r>   ©r¦   ©Úbs    r0   Ú<lambda>z _smaller_first.<locals>.<lambda>{  ó   € ˜AŸN™NÔ,r/   )Úkeyc                ó"   — | j                  «       S r>   rÂ   ©r«   s    r0   rÚ   z _smaller_first.<locals>.<lambda>|  ó
   € ˜QŸ\™\œ^r/   ©Úsort©Úbinsr’   s     r0   Ú_smaller_firsträ   x  s"   € ð 	‡I�IÑ,€IÔ-Ø	‡J�JÑ+€JÕ,r/   c                óT   — | j                  d„ d¬«       |j                  d„ d¬«       y )Nc                ó"   — | j                  «       S r>   r×   rØ   s    r0   rÚ   z_bigger_first.<locals>.<lambda>�  rÛ   r/   T)rÜ   Úreversec                ó"   — | j                  «       S r>   rÂ   rÞ   s    r0   rÚ   z_bigger_first.<locals>.<lambda>‚  rß   r/   rà   râ   s     r0   Ú_bigger_firstré     s$   € à‡I�IÑ,°d€IÔ;Ø	‡J�JÑ+°T€JÕ:r/   c                óX   — t        j                  | «       t        j                  |«       y r>   )ÚrandomÚshufflerâ   s     r0   Ú_shufflerí   …  s   € ä
‡N�N�4ÔÜ
‡N�N�5Õr/   c                  óÀ   — e Zd Zdd„Zd„ Ze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ej"                  fdd„Zdd„Zdd„Zedd„«       Zy)r   c                ó.   — g | _         g | _        d| _        y )NT)rã   r’   Ú_init_staterV   s    r0   rI   zAbstractPacker.__init__“  s   € Ø!ˆŒ	Ø!#ˆŒ
ØˆÕr/   c                ój  — | j                   rt        d«      ‚t        d„ | j                  D «       «      st        d«      ‚| j	                  «       }| j                  D �cg c]  }|j                  «       ‘Œ c}|_        | j                  D �cg c]  }|j                  «       ‘Œ c}|_        |S c c}w c c}w )z=Copy packer in init state to apply different pack strategies.zcannot copy packed statec              3  ó4   K  — | ]  }|j                   –— Œ y ­wr>   )r¢   ©rª   r�   s     r0   r­   z&AbstractPacker.copy.<locals>.<genexpr>œ  s   è ø€ Ð5©9 C�3—<•<©9ùr½   z#bins contain data in unpacked state)Ú	is_packedrv   Úallrã   r‡   rY   r’   )rH   Úpackerr�   r²   s       r0   rY   zAbstractPacker.copy˜  sŒ   € à�>Š>ÜÐ6Ó7Ð7ÜÑ5¨4¯9ª9Ó5Ô5ÜÐAÓBÐBØ—‘Ó!ˆØ-1¯YªYÓ7©Y c�s—x‘x•z¨YÑ7ˆŒØ04·
²
Ó;±
¨˜Ÿ	™	�°
Ñ;ˆŒØˆùò 8ùÚ;s   ÁB+Â
B0c                ó   — | j                    S )zYReturns ``True`` if packer is packed, each packer can only be used
        once.
        )rð   rV   s    r0   rô   zAbstractPacker.is_packed£  s   € ð
 ×#Ñ#Ð#Ð#r/   c                ó   — | j                   S )zReturns the unfitted items.)r’   rV   s    r0   Úunfitted_itemszAbstractPacker.unfitted_itemsª  s   € ð �z‰zÐr/   c                ó¦   — d}| j                   rd| j                  «       › �}| j                  j                  › dt	        | j
                  «      › d|› �S )NÚ z, fill ratio: z, z bins)rô   rÉ   r‡   r$   r•   rã   )rH   Úfills     r0   rW   zAbstractPacker.__str__¯  sO   € ØˆØ�>Š>Ø# D×$7Ñ$7Ó$9Ð#:Ð;ˆDØ—.‘.×)Ñ)Ð*¨"¬S°·±«^Ð,<¸EÀ$ÀÐHÐHr/   c                ó–   — | j                   rt        d«      ‚|j                  st        d«      ‚| j                  j	                  |«       y)zAppend a container.z"cannot append bins to packed statezcannot append bins with contentN)rô   rv   r¢   rã   r±   rœ   s     r0   Ú
append_binzAbstractPacker.append_binµ  s:   € à�>Š>ÜÐ@ÓAÐAØ�|Š|ÜÐ=Ó>Ð>Ø�	‰	×Ñ˜Õr/   c                óh   — | j                   rt        d«      ‚| j                  j                  |«       y)zAppend a item.z#cannot append items to packed stateN)rô   rv   r’   r±   )rH   r²   s     r0   Úappend_itemzAbstractPacker.append_item½  s'   € à�>Š>ÜÐAÓBÐBØ�
‰
×Ñ˜$Õr/   c                óT   — | j                  «       }|dk(  ry| j                  «       |z  S )z"Return the fill ratio of all bins.r{   )r¦   rÅ   )rH   Útotal_capacitys     r0   rÉ   zAbstractPacker.get_fill_ratioÃ  s/   € à×*Ñ*Ó,ˆØ˜SÒ ØØ×$Ñ$Ó&¨Ñ7Ð7r/   c                ó:   — t        d„ | j                  D «       «      S )z,Returns the maximum fill volume of all bins.c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr>   r×   ró   s     r0   r­   z.AbstractPacker.get_capacity.<locals>.<genexpr>Ì  s   è ø€ Ð;±¨#�3×#Ñ#×%±ùrÄ   ©r¿   rã   rV   s    r0   r¦   zAbstractPacker.get_capacityÊ  s   € äÑ;°·²Ó;Ó;Ð;r/   c                ó:   — t        d„ | j                  D «       «      S )z9Returns the total weight of all fitted items in all bins.c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr>   )r°   ró   s     r0   r­   z2AbstractPacker.get_total_weight.<locals>.<genexpr>Ð  ó   è ø€ Ð?±Y¨c�3×'Ñ'×)±YùrÄ   r  rV   s    r0   r°   zAbstractPacker.get_total_weightÎ  ó   € äÑ?°T·Y²YÓ?Ó?Ð?r/   c                ó:   — t        d„ | j                  D «       «      S )z9Returns the total volume of all fitted items in all bins.c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr>   )rÅ   ró   s     r0   r­   z2AbstractPacker.get_total_volume.<locals>.<genexpr>Ô  r  rÄ   r  rV   s    r0   rÅ   zAbstractPacker.get_total_volumeÒ  r	  r/   c                ó:   — t        d„ | j                  D «       «      S )z/Returns the total volume of all unfitted items.c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr>   rÂ   r¼   s     r0   r­   z5AbstractPacker.get_unfitted_volume.<locals>.<genexpr>Ø  rÃ   rÄ   r¾   rV   s    r0   Úget_unfitted_volumez"AbstractPacker.get_unfitted_volumeÖ  rÆ   r/   c                ó¨   — t        |   | j                  | j                  «       | j                  | j                  t	        | j                  «      «       y)z<Pack items into bins. Distributes all items across all bins.N)ÚPICK_STRATEGYrã   r’   Ú_packr›   )rH   Úpicks     r0   ÚpackzAbstractPacker.packÚ  s4   € ä�dÑ˜DŸI™I t§z¡zÔ2à�
‰
�4—9‘9œd 4§:¡:Ó.Õ/r/   c                óŠ   — d| _         |D ]7  }|D ]0  }| j                  ||«      sŒ| j                  j                  |«       Œ2 Œ9 y)z;Pack items into bins, removes packed items from self.items!FN)rð   Úpack_to_binr’   Úremove)rH   rã   r’   r�   r²   s        r0   r  zAbstractPacker._packá  s@   € à ˆÔÛˆCÛ�Ø×#Ñ# C¨Õ.Ø—J‘J×%Ñ% dÕ+ñ ñ r/   c                óÄ  — |j                   s|j                  |t        «      S | j                  «       D ]«  }|j                   D ]š  }|j	                  «       \  }}}|j
                  \  }}	}
|t        j                  k(  r	||z   |	|
f}nC|t        j                  k(  r	||	|z   |
f}n'|t        j                  k(  r	||	|
|z   f}nt        |«      ‚|j                  ||«      sŒ™  y Œ­ y)NTF)r’   r¸   r;   Ú_axisr^   rS   r2   r3   r4   r5   rv   )rH   r�   r²   ÚaxisÚplaced_itemrµ   r¶   r·   rL   rw   rx   r³   s               r0   r  zAbstractPacker.pack_to_binê  sÎ   € Ø�yŠyØ—<‘< ¤nÓ5Ð5à—J‘J–LˆDØ"Ÿyœy�Ø%×3Ñ3Ó5‘��1�aØ%×.Ñ.‘��1�aØœ4Ÿ:™:Ò%Ø ™U A q˜M‘EØœTŸ[™[Ò(Ø  A¡ q˜M‘EØœTŸZ™ZÒ'Ø  1 q¡5˜M‘Eä# D›/Ð)Ø—<‘<  eÕ,Úñ  )ð !ð r/   c                 ó   — t         S r>   )r2   r.   r/   r0   r  zAbstractPacker._axisþ  s   € äˆr/   Nr}   rË   )r|   ú
list[Item]rÍ   )r�   rŽ   r|   r~   )r²   r   r|   r~   r   )rã   zIterable[Bin]r’   zIterable[Item]r|   r~   )r�   rŽ   r²   r   r|   rÌ   ©r|   zIterable[Axis])r$   r%   r&   rI   rY   r€   rô   rù   rW   rþ   r   rÉ   r¦   r°   rÅ   r  r   r8   r  r  r  Ústaticmethodr  r.   r/   r0   r   r   ’  s�   „ ó ò
	ð ò$ó ð$ð òó ðóIóó ó8ó<ó@ó@ó=ð %×1Ñ1ô 0ó,óð( òó ñr/   r   c                óà   — |dk  rt        d«      ‚d}| }t        |«      D ]K  }| j                  «       }|j                  t        j
                  «       |j                  «       }||kD  sŒH|}|}ŒM |S )zrRandom shuffle packing. Returns a new packer with the best packing result,
    the input packer is unchanged.
    r   zexpected attempts >= 1r{   )rm   ÚrangerY   r  r   r9   rÉ   )rö   ÚattemptsÚ
best_ratioÚbest_packerÚ_Ú
new_packerÚ	new_ratios          r0   r   r     st   € ð �!‚|ÜÐ1Ó2Ð2Ø€JØ€KÜ�8Ž_ˆØ—[‘[“]ˆ
Ø�‰œ×,Ñ,Ô-Ø×-Ñ-Ó/ˆ	Ø�zÓ!Ø"ˆJØ$‰Kð ð Ðr/   c                ó¼   — | j                   du sJ ‚t        | j                  |«      \  }}|| _        | j                  |«       | j                  j	                  |«       y)zwPack a subset of `packer.items`, which are chosen by an iterable
    yielding a True or False value for each item.
    FN)rô   Úget_item_subsetr’   r  Úextend)rö   ÚpickerÚstrategyÚchosenÚrejectss        r0   r   r     sQ   € ð ×Ñ˜uÑ$Ð$Ð$Ü% f§l¡l°FÓ;�O€FˆGØ€F„LØ
‡K�K�ÔØ
‡L�L×Ñ˜Õ r/   c                óÖ   — g }g }d}t        | |«      D ]/  \  }}|dz  }|r|j                  |«       Œ|j                  |«       Œ1 |t        | «      k  r|j                  | |d «       ||fS )zyReturns a subset of `items`, where items are chosen by an iterable
    yielding a True or False value for each item.
    r   r   N)Úzipr±   r•   r)  )r’   r*  r,  r-  Úcountr²   r  s          r0   r(  r(  "  sv   € ð €FØ€GØ€EÜ˜% Ö(‰
ˆˆdØ�‰
ˆÙØ�M‰M˜$Õà�N‰N˜4Õ ð )ð Œs�5‹zÒØ�‰�u˜U˜V�}Ô%Ø�7ˆ?Ðr/   c                  ó$   — e Zd Zdd„Zdd„Zdd„Zy)ÚSubSetEvaluatorc                ó   — || _         y r>   )rö   )rH   rö   s     r0   rI   zSubSetEvaluator.__init__8  s	   € Øˆ�r/   c                óD   — | j                  |«      }|j                  «       S r>   )Ú
run_packerrÉ   ©rH   Údnarö   s      r0   ÚevaluatezSubSetEvaluator.evaluate;  s   € Ø—‘ Ó%ˆØ×$Ñ$Ó&Ð&r/   c                óR   — | j                   j                  «       }t        ||«       |S r>   )rö   rY   r   r6  s      r0   r5  zSubSetEvaluator.run_packer?  s#   € Ø—‘×!Ñ!Ó#ˆÜ˜ Ô%Øˆr/   N)rö   r   )r7  úga.DNAr|   r@   )r7  r:  r|   r   )r$   r%   r&   rI   r8  r5  r.   r/   r0   r2  r2  7  s   „ óó'ôr/   r2  c                  óP   — e Zd ZdZef	 	 	 	 	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 	 	 dd„Zy)r   z13D Packer inherited from :class:`AbstractPacker`.c                óF   — t        |||||«      }| j                  |«       |S )z Add a 3D :class:`Box` container.)r   rþ   )rH   r�   rA   rB   rC   r‘   r�   s          r0   Úadd_binzPacker.add_binH  s'   € ô �$˜˜v u¨jÓ9ˆØ�‰˜ÔØˆ
r/   c                óF   — t        |||||«      }| j                  |«       |S )zAdd a 3D :class:`Item` to pack.)r   r   )rH   r?   rA   rB   rC   rD   r²   s          r0   Úadd_itemzPacker.add_itemU  s)   € ô �G˜U F¨E°6Ó:ˆØ×Ñ˜ÔØˆr/   N)r�   rR   rA   r@   rB   r@   rC   r@   r‘   r@   r|   r   rz   )
rA   r@   rB   r@   rC   r@   rD   r@   r|   r   )r$   r%   r&   r'   rÏ   r=  r?  r.   r/   r0   r   r   E  s…   „ Ù;ð -ðàðð ðð ð	ð
 ðð ðð 
óð& ðð ðð ð	ð
 ðð ðð 
ôr/   r   c                  óZ   — e Zd ZdZef	 	 	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Zed	d„«       Zy)
r   zz2D Packer inherited from :class:`AbstractPacker`. All containers and
    items used by this packer must have a depth of 1.c                óD   — t        ||||«      }| j                  |«       |S )z%Add a 2D :class:`Envelope` container.)r   rþ   )rH   r�   rA   rB   r‘   Úenvelopes         r0   r=  zFlatPacker.add_bing  s%   € ô ˜D %¨°Ó<ˆØ�‰˜Ô!Øˆr/   c                óD   — t        ||||«      }| j                  |«       |S )z#Add a 2D :class:`FlatItem` to pack.)r   r   )rH   r?   rA   rB   rD   r²   s         r0   r?  zFlatPacker.add_items  s'   € ô ˜ ¨°Ó7ˆØ×Ñ˜ÔØˆr/   c                 óB   — t         j                  t         j                  fS r>   )r2   r3   r4   r.   r/   r0   r  zFlatPacker._axis  s   € ä�z‰zœ4Ÿ;™;Ð&Ð&r/   N)
r�   rR   rA   r@   rB   r@   r‘   r@   r|   r   rz   )rA   r@   rB   r@   rD   r@   r|   r   r  )	r$   r%   r&   r'   rÏ   r=  r?  r  r  r.   r/   r0   r   r   c  s‡   „ ñ9ð -ð
àð
ð ð
ð ð	
ð
 ð
ð 
ó
ð" ð
ð ð
ð ð	
ð
 ð
ð 
ó
ð ò'ó ñ'r/   r   c           	     óÀ  — ddl m} t        |«      }t        «       }d}|j                  |j                  |j
                  |j                  |j                  f}|D ]ƒ  }t        j                  |j                  |j                  |j                  «      }	t        | |d|	«       |j                  D ]*  }
t        | |
d||   |	«       |dz  }|t!        |«      k\  sŒ)d}Œ, ||z  }Œ… y )Nr   )ÚcolorsÚFRAMEÚITEMSr   )ÚezdxfrF  r   ÚREDÚGREENÚBLUEÚMAGENTAÚCYANr   rp   rL   rw   rx   Ú
_add_framer’   Ú	_add_meshr•   )Úlayoutrã   ÚoffsetrF  Ú
offset_vecÚstartÚindexÚrgbr�   Úmr²   s              r0   r    r    „  sÀ   € õ ä�f“€JÜ‹F€EØ€EØ�:‰:�v—|‘| V§[¡[°&·.±.À&Ç+Á+Ð
N€CÛˆÜ×Ñ˜uŸw™w¨¯©°·±Ó9ˆÜ�6˜3 ¨Ô+Ø—I”IˆDÜ�f˜d G¨S°©Z¸Ô;Ø�Q‰JˆEØœ˜C›Ó Ø‘ð	 ð
 	�Ñ‰ñ r/   c                ó  ‡ ‡‡— ˆˆ ˆfd„}d|iŠd\  }}}t        |j                  «      }t        |j                  «      }	t        |j                  «      }
||f||f||	f||	f||fg}t	        ||dd  «      D ])  \  \  }}\  }} ||||f|||f«        ||||
f|||
f«       Œ+ |d d D ]  \  }} ||||f|||
f«       Œ ‰ j                  |j                  d‰¬«      }|j                  |dz   |	dz
  |
f«       |j                  ‰«       y )	Nc                óP   •— ‰j                  | |‰¬«      }|j                  ‰«       y )N)Ú
dxfattribs)Úadd_lineÚ	transform)r`   Úv2ÚlineÚattribsrQ  rW  s      €€€r0   r[  z_add_frame.<locals>.add_line™  s#   ø€ Ø�‰˜r 2°'ˆÓ:ˆØ�‰�qÕr/   Úlayer)r{   r{   r{   r   éÿÿÿÿç      Ð?©rB   rZ  g      à?)	r@   rA   rB   rC   r/  Úadd_textr�   Úset_placementr\  )rQ  r�   r`  rW  r[  Úx0Úy0Úz0Úx1Úy1Úz1ÚcornersÚsxÚsyÚexÚeyrL   rw   Útextr_  s   `  `               @r0   rO  rO  ˜  s4  ú€ öð ˜Ð€GØ �J€BˆˆBÜ	ˆs�y‰yÓ	€BÜ	ˆs�z‰zÓ	€BÜ	ˆs�y‰yÓ	€Bà	ˆRˆØ	ˆRˆØ	ˆRˆØ	ˆRˆØ	ˆRˆð€Gô " '¨7°1°2¨;Ö7Ñ‰ˆˆR‘(�2�rÙ�"�b˜"�  B¨˜|Ô,Ù�"�b˜"�  B¨˜|Õ,ð 8ð ˜˜“‰ˆˆ1Ù�!�Q˜�˜a  B˜ZÕ(ð ð �?‰?˜3Ÿ8™8¨D¸Wˆ?ÓE€DØ×Ñ˜˜T™	 2¨¡8¨RÐ0Ô1Ø‡N�N�1Õr/   c                ó  — ddl m} ||dœ} |d¬«      }|j                  «       \  }}	}
|j                  ||	|
«       |j                  \  }}}|j                  |||«       |j                  | ||¬«       | j                  t        |j                  «      ddd	i¬
«      }|	|kD  r"d|j                  _        t        j                  }nt        j                  }|j                  |dz   |dz   ||
z   f|¬«       |j!                  |«       y )Nr   )Úcube)r`  ÚcolorF)Úcenter)Úmatrixrb  r`  ÚTEXTrc  éZ   )Úalign)Úezdxf.render.formsrs  r^   ÚscalerS   rp   Úrender_polyfacerd  rR   r?   ÚdxfÚrotationr
   ÚTOP_LEFTÚBOTTOM_LEFTre  r\  )rQ  r²   r`  rt  rW  rs  r_  Úmeshrm  rn  ÚszrL   rw   rx   rq  ry  s                   r0   rP  rP  ´  sÿ   € õ (ð Øñ€Gñ �uÔ€DØ×#Ñ#Ó%�J€BˆˆBØ‡J�Jˆr�2�rÔØ�m‰m�G€A€qˆ!Ø‡N�N�1�a˜ÔØ×Ñ˜ °ÐÔ3Ø�?‰?ÜˆD�L‰LÓ $°G¸VÐ3Dð ó €Dð 
ˆB‚wØˆ�‰ÔÜ#×,Ñ,‰ä#×/Ñ/ˆØ×Ñ˜˜D™ ! d¡(¨A°©FÐ3¸5ÐÔAØ‡N�N�1Õr/   )rã   r›   r’   r›   r|   r~   )rö   r   r!  Úintr|   r   )rö   r   r*  r   r|   r~   )r’   r  r*  r   r|   ztuple[list[Item], list[Item]]))r   r   r   )rQ  ú'GenericLayoutType'rã   z	list[Bin]rR  r   r|   r~   )rQ  r„  r�   rŽ   r`  rR   rW  r   )
rQ  r„  r²   r   r`  rR   rt  rƒ  rW  r   )=Ú
__future__r   Útypingr   r   r   r   Úenumr   r	   rY   Úmathrë   Úezdxf.enumsr
   Ú
ezdxf.mathr   r   r   r   r   r   r   rû   r   ÚgaÚezdxf.eztypesr   Ú__all__rÏ   r!   Úpirr   r   r2   r   r;   Ú__annotations__r   r   rŽ   r   r   rä   ré   rí   r7   r8   r9   r  r   r   r   r(  Ú	Evaluatorr2  r   r   r    rO  rP  r.   r/   r0   Ú<module>r‘     sí  ðö0 #÷ó ÷ Û Û Û õ ,÷÷ ñ õ &áÝ/ò€ð Ð ÙˆCƒL€Ø‡w�w��{€ô�4ô ô"ˆ4ô ô�4ô ð .7€Ð*Ó 6÷uñ uôp
ˆtô 
÷4\ñ \ô~	ˆ#ô 	ô2ˆsô 2ó.-ó;óð ×Ñ Ø×Ñ˜}Ø×Ñ˜(ð€÷nñ nóbð& 8D×7PÑ7Pð
!Øð
!Ø$,ð
!à	ó
!ðØðØ'ðà"óô*�b—l‘lô ôˆ^ô ô<'�ô 'ðD BKðØðØ'0ðØ:>ðà	óó(ð8ØðØ'+ðØ47ðØ@CðØHPôr/   