
    'j	T                       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*dKd&Z+dKd'Z,dKd(Z-e#j.        e+e#j/        e,e#j0        e-iZ1 G d) d*          Z2dLd.Z3e#j/        fdMd1Z4dNd4Z5 G d5 d6ej6                  Z7 G d7 d8e2          Z8 G d9 d:e2          Z9	 dOdPdAZ:dQdGZ;dRdJZ<dS )S    )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                      e Zd ZdZ e            Z e            Z e            Z e            Z e            Z	 e            Z
dS )r   zQRotation type of an item:

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

    N)__name__
__module____qualname____doc__r	   WHDHWDHDWDHWDWHWDH     Q/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/addons/binpacking.pyr   r   H   s\          $&&C
$&&C
$&&C
$&&C
$&&C
$&&CCCr/   r   c                  J    e Zd Z e            Z e            Z e            ZdS )AxisN)r$   r%   r&   r	   WIDTHHEIGHTDEPTHr.   r/   r0   r2   r2   Y   s/        DFFETVVFDFFEEEr/   r2   c                  N    e Zd ZdZ e            Z e            Z e            ZdS )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   _   s5        33DFFM466LdffGGGr/   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dS )'r   z3D container item.        widthfloatheightdepthweightc                    || _         t          |          | _        t          |          | _        t          |          | _        t          |          | _        t          j        | _        t          | _
        d | _        d S N)payloadr?   r>   r@   rA   rB   r   r(   _rotation_typer;   	_position_bbox)selfrE   r>   r@   rA   rB   s         r0   __init__zItem.__init__m   s\     5\\
Fmm5\\
Fmm*.'48


r/   c                    t          | j                   d| j         d| j         d| j         d| j         dt          | j                   d| j         d|                                  dS )N(x
, weight: ) pos() rt() vol())	strrE   r>   r@   rA   rB   positionrotation_type
get_volumerI   s    r0   __str__zItem.__str__~   s    4<   A A4: A A A Adj A A{A A*-dm*<*<A A$A A,0OO,=,=A A A	
r/   c                *    t          j         |           S )zXReturns a copy, all copies have a reference to the same payload
        object.
        copyrW   s    r0   r[   z	Item.copy   s     yr/   returnr   c                F    | j         |                                  | j         S rD   )rH   _update_bboxrW   s    r0   bboxz	Item.bbox   s$    :zr/   Nonec                    t          | j                  }t          ||t          |                                           z   g          | _        d S rD   )r   rG   r   get_dimensionrH   rI   v1s     r0   r^   zItem._update_bbox   sB    $.!! "b40B0B0D0D+E+E&E!FGG


r/   c                    d | _         d S rD   )rH   rW   s    r0   _taintzItem._taint   s    


r/   r   c                    | j         S rD   )rF   rW   s    r0   rU   zItem.rotation_type   s    ""r/   valuec                <    || _         |                                  d S rD   )rF   rf   rI   rh   s     r0   rU   zItem.rotation_type   s    #r/   r:   c                    | j         S )zReturns the position of then lower left corner of the item in the
        container, the lower left corner is the origin (0, 0, 0).
        )rG   rW   s    r0   rT   zItem.position   s    
 ~r/   c                <    || _         |                                  d S rD   )rG   rf   rj   s     r0   rT   zItem.position   s    r/   c                0    | j         | j        z  | j        z  S )zReturns the volume of the item.r>   r@   rA   rW   s    r0   rV   zItem.get_volume       zDK'$*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`.)rU   r   r(   r>   r@   rA   r)   r*   r+   r,   r-   
ValueError)rI   rts     r0   rb   zItem.get_dimension   s    !!!:t{DJ66<###;
DJ66<###;
DJ66<###:t{DJ66<###:tz4;66<###:tz4;66nnr/   r   c                ~   | j         \  }}}| j        }|t          j        k    rt	          j        |||          S |t          j        k    r8t	          j        t                    t	          j        || j	        z   ||          z  S |t          j
        k    rGt	          j        t          dt                    t	          j        || j	        z   || j        z   |          z  S |t          j        k    r9t	          j        t                     t	          j        || j        z   ||          z  S |t          j        k    r7t	          j        dt          t                    t	          j        |||          z  S |t          j        k    r8t	          j        t                    t	          j        ||| j        z   |          z  S t%          |          )zReturns 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   )rT   rU   r   r(   r   	translater)   z_rotatePI_2r@   r*   
xyz_rotaterA   r+   y_rotater,   r-   x_rotate	TypeError)rI   rM   yzrr   s        r0   get_transformationzItem.get_transformation   s   
 -1a!!!%aA...!!!$T**X-?DKA. .   !!!&tQ558JDKTZ9 9   !!!$dU++h.@DJ1/ /   !!!&q$558J1a9 9   !!!$T**X-?1tz>1. .   mmr/   Nr=   )r>   r?   r@   r?   rA   r?   rB   r?   )r\   r   r\   r`   )r\   r   )rh   r   r\   r`   )r\   r:   )rh   r:   r\   r`   r\   r?   )r\   r   )r$   r%   r&   r'   rJ   rX   r[   propertyr_   r^   rf   rU   setterrT   rV   rb   r}   r.   r/   r0   r   r   j   s_        9 9 9 9 9"
 
 
      X
H H H H   # # # X#        X _   _5 5 5 5   "     r/   r   c                  6     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.
    r=   r>   r?   r@   rB   c                R    t                                          |||d|           d S Ng      ?superrJ   )rI   rE   r>   r@   rB   	__class__s        r0   rJ   zFlatItem.__init__   s+     	%f=====r/   r\   r`   c                    t          | j                  }t          ||t          |                                           z   g          | _        d S rD   )r   rG   r   rb   rH   rc   s     r0   r^   zFlatItem._update_bbox   sB    $.!!"BT$2D2D2F2F-G-G(G#HII


r/   c                    t          | j                   d| j         d| j         d| j         dt          | j                   d| j         d|                                  dS )NrL   rM   rN   rO   rP   ) area(rR   )rS   rE   r>   r@   rB   rT   rU   rV   rW   s    r0   rX   zFlatItem.__str__   s    4<   B B4: B B B B{B B*-dm*<*<B B$B B-1__->->B B B	
r/   r~   )r>   r?   r@   r?   rB   r?   r   )r$   r%   r&   r'   rJ   r^   rX   __classcell__r   s   @r0   r   r      sx          > > > > > > >J J J 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dS )"Binr>   r?   r@   rA   
max_weightc                ^   || _         t          |          | _        | j        dk    rt          d          t          |          | _        | j        dk    rt          d          t          |          | _        | j        dk    rt          d          t          |          | _        g | _        d S )Nr=   zinvalid widthzinvalid heightzinvalid depth)namer?   r>   rq   r@   rA   r   items)rI   r   r>   r@   rA   r   s         r0   rJ   zBin.__init__   s     	5\\
:_---Fmm;#-...5\\
:_---
++!#


r/   c                *    t          | j                  S rD   lenr   rW   s    r0   __len__zBin.__len__  s    4:r/   c                *    t          | j                  S rD   )iterr   rW   s    r0   __iter__zBin.__iter__  s    DJr/   c                `    t          j         |           }t          | j                  |_        |S )zReturns a copy.)r[   listr   rI   boxs     r0   r[   zBin.copy  s%    ioo$$	
r/   c                8    | j                                          dS )z#Reset the container to empty state.N)r   clearrW   s    r0   resetz	Bin.reset  s    
r/   r\   boolc                ,    t          | j                   S rD   r   rW   s    r0   is_emptyzBin.is_empty"  s    tz??""r/   rS   c                    t          | j                   d| j        dd| j        dd| j        dd| j         d|                                 ddS )NrL   .3frM   , max_weight:rQ   rR   )rS   r   r>   r@   rA   r   get_capacityrW   s    r0   rX   zBin.__str__&  s    49~~ . .
U . .U . .4:U . ./. .$$&&-. . .	
r/   itemr   pivotr:   c                   |j         }||_         |\  }}}|                                 D ]}||_        |                                \  }}	}
| j        ||z   k     s| j        ||	z   k     s| j        ||
z   k     rL|j        t          fd| j	        D                       sB| 
                                |j        z   | j        k    r| j	                            |            dS ||_         dS )Nc              3  L   K   | ]}                     |j                  V  d S rD   )has_intersectionr_   ).0i	item_bboxs     r0   	<genexpr>zBin.put_item.<locals>.<genexpr>;  s3      OOq	2216::OOOOOOr/   TF)rT   	rotationsrU   rb   r>   r@   rA   r_   anyr   get_total_weightrB   r   append)rI   r   r   valid_item_positionrM   r{   r|   rU   whdr   s              @r0   put_itemzBin.put_item-  s   "m1a "^^-- 	 	M!.D((**GAq!zAE!!T[1q5%8%8DJQ<N<N	IOOOODJOOOOO))++dk9T_LL
!!$'''tt+ur/   c                0    | j         | j        z  | j        z  S )z+Returns the maximum fill volume of the bin.rn   rW   s    r0   r   zBin.get_capacityD  ro   r/   c                >    t          d | j        D                       S )z-Returns the total weight of all fitted items.c              3  $   K   | ]}|j         V  d S rD   )rB   r   r   s     r0   r   z'Bin.get_total_weight.<locals>.<genexpr>J  s$      6644;666666r/   sumr   rW   s    r0   r   zBin.get_total_weightH  s!    664:666666r/   c                >    t          d | j        D                       S )z-Returns the total volume of all fitted items.c              3  >   K   | ]}|                                 V  d S rD   rV   r   s     r0   r   z'Bin.get_total_volume.<locals>.<genexpr>N  ,      <<4??$$<<<<<<r/   r   rW   s    r0   get_total_volumezBin.get_total_volumeL  !    <<<<<<<<r/   c                x    	 |                                  |                                 z  S # t          $ r Y dS w xY w)zReturn the fill ratio.r=   )r   r   ZeroDivisionErrorrW   s    r0   get_fill_ratiozBin.get_fill_ratioP  sL    	((**T->->-@-@@@  	 	 	33	s   (+ 
99Iterable[RotationType]c                    t           S rD   )r   rW   s    r0   r   zBin.rotationsW  s    r/   N)r>   r?   r@   r?   rA   r?   r   r?   r\   r   r\   rS   )r   r   r   r:   r\   r   r   r\   r   )r$   r%   r&   UNLIMITED_WEIGHTrJ   r   r   r[   r   r   r   rX   r   r   r   r   r   r   r.   r/   r0   r   r      s        -$ $ $ $ $*            # # # X#
 
 
 
   .5 5 5 57 7 7 7= = = =        r/   r   c                      e Zd ZdZdS )r   z)3D container inherited from :class:`Bin`.N)r$   r%   r&   r'   r.   r/   r0   r   r   [  s        33Dr/   r   c                  8     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`.r>   r?   r@   r   c                R    t                                          |||d|           d S r   r   )rI   r   r>   r@   r   r   s        r0   rJ   zEnvelope.__init__d  s+     	ufc:>>>>>r/   r\   rS   c           
         t          | j                   d| j        dd| j        dd| j         d|                                 dd
S )NrL   r   rM   r   r   rR   )rS   r   r>   r@   r   r   rW   s    r0   rX   zEnvelope.__str__m  sn    49~~ / /
D / /D / /// /%%''./ / /	
r/   r   c                2    t           j        t           j        fS rD   )r   r(   r)   rW   s    r0   r   zEnvelope.rotationst  s    !111r/   )r>   r?   r@   r?   r   r?   r   r   )	r$   r%   r&   r'   r   rJ   rX   r   r   r   s   @r0   r   r   a  su        33 -? ? ? ? ? ? ?
 
 
 
2 2 2 2 2 2 2 2r/   r   binsr   r   r\   r`   c                b    |                      d            |                     d            d S )Nc                *    |                                  S rD   r   bs    r0   <lambda>z _smaller_first.<locals>.<lambda>{      ANN,, r/   )keyc                *    |                                  S rD   r   r   s    r0   r   z _smaller_first.<locals>.<lambda>|      Q\\^^ r/   sortr   r   s     r0   _smaller_firstr   x  s:     	II,,I---	JJ++J,,,,,r/   c                f    |                      d d           |                     d d           d S )Nc                *    |                                  S rD   r   r   s    r0   r   z_bigger_first.<locals>.<lambda>  r   r/   T)r   reversec                *    |                                  S rD   r   r   s    r0   r   z_bigger_first.<locals>.<lambda>  r   r/   r   r   s     r0   _bigger_firstr     s<    II,,dI;;;	JJ++TJ:::::r/   c                V    t          j        |            t          j        |           d S rD   )randomshuffler   s     r0   _shuffler     s(    
N4
N5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d S )+r   r\   r`   c                0    g | _         g | _        d| _        d S )NT)r   r   _init_staterW   s    r0   rJ   zAbstractPacker.__init__  s    !	!#
r/   c                   | j         rt          d          t          d | j        D                       st          d          |                                 }d | j        D             |_        d | j        D             |_        |S )z=Copy packer in init state to apply different pack strategies.zcannot copy packed statec              3  $   K   | ]}|j         V  d S rD   )r   r   r   s     r0   r   z&AbstractPacker.copy.<locals>.<genexpr>  s$      55C3<555555r/   z#bins contain data in unpacked statec                6    g | ]}|                                 S r.   rZ   r   s     r0   
<listcomp>z'AbstractPacker.copy.<locals>.<listcomp>  s     777csxxzz777r/   c                6    g | ]}|                                 S r.   rZ   r   s     r0   r   z'AbstractPacker.copy.<locals>.<listcomp>  s     ;;;		;;;r/   )	is_packedrz   allr   r   r   rI   packers     r0   r[   zAbstractPacker.copy  s    > 	86777554955555 	CABBB!!77TY777;;
;;;r/   r   c                    | j          S )zYReturns ``True`` if packer is packed, each packer can only be used
        once.
        )r   rW   s    r0   r   zAbstractPacker.is_packed  s    
 ###r/   
list[Item]c                    | j         S )zReturns the unfitted items.)r   rW   s    r0   unfitted_itemszAbstractPacker.unfitted_items  s     zr/   rS   c                    d}| j         rd|                                  }| j        j         dt	          | j                   d| S )N z, fill ratio: z, z bins)r   r   r   r$   r   r   )rI   fills     r0   rX   zAbstractPacker.__str__  sS    > 	<;D$7$7$9$9;;D.)HHS^^HH$HHHr/   r   r   c                    | j         rt          d          |j        st          d          | j                            |           dS )zAppend a container.z"cannot append bins to packed statezcannot append bins with contentN)r   rz   r   r   r   r   s     r0   
append_binzAbstractPacker.append_bin  sQ    > 	B@AAA| 	?=>>>	r/   r   r   c                f    | j         rt          d          | j                            |           dS )zAppend a item.z#cannot append items to packed stateN)r   rz   r   r   )rI   r   s     r0   append_itemzAbstractPacker.append_item  s8    > 	CABBB
$r/   r?   c                h    |                                  }|dk    rdS |                                 |z  S )z"Return the fill ratio of all bins.r=   )r   r   )rI   total_capacitys     r0   r   zAbstractPacker.get_fill_ratio  s:    **,,S  3$$&&77r/   c                >    t          d | j        D                       S )z,Returns the maximum fill volume of all bins.c              3  >   K   | ]}|                                 V  d S rD   r   r   s     r0   r   z.AbstractPacker.get_capacity.<locals>.<genexpr>  s.      ;;#3##%%;;;;;;r/   r   r   rW   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   | ]}|                                 V  d S rD   )r   r   s     r0   r   z2AbstractPacker.get_total_weight.<locals>.<genexpr>  .      ??c3''))??????r/   r
  rW   s    r0   r   zAbstractPacker.get_total_weight  !    ??TY??????r/   c                >    t          d | j        D                       S )z9Returns the total volume of all fitted items in all bins.c              3  >   K   | ]}|                                 V  d S rD   )r   r   s     r0   r   z2AbstractPacker.get_total_volume.<locals>.<genexpr>  r  r/   r
  rW   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   | ]}|                                 V  d S rD   r   r   s     r0   r   z5AbstractPacker.get_unfitted_volume.<locals>.<genexpr>  r   r/   r   rW   s    r0   get_unfitted_volumez"AbstractPacker.get_unfitted_volume  r   r/   c                    t          |         | j        | j                   |                     | j        t	          | j                             dS )z<Pack items into bins. Distributes all items across all bins.N)PICK_STRATEGYr   r   _packr   )rI   picks     r0   packzAbstractPacker.pack  sA    dDItz222

49d4:../////r/   r   Iterable[Bin]r   Iterable[Item]c                    d| _         |D ]7}|D ]2}|                     ||          r| j                            |           38dS )z;Pack items into bins, removes packed items from self.items!FN)r   pack_to_binr   remove)rI   r   r   r   r   s        r0   r  zAbstractPacker._pack  sf      	, 	,C , ,##C.. ,J%%d+++,	, 	,r/   c                   |j         s|                    |t                    S |                                 D ]}|j         D ]}|                                \  }}}|j        \  }}	}
|t          j        k    r	||z   |	|
f}nA|t          j        k    r	||	|z   |
f}n(|t          j	        k    r	||	|
|z   f}nt          |          |                    ||          r  dS dS )NTF)r   r   r;   _axisrb   rT   r2   r3   r4   r5   rz   )rI   r   r   axisplaced_itemr   r   r   rM   r{   r|   r   s               r0   r  zAbstractPacker.pack_to_bin  s   y 	6<<n555JJLL 	  	 D"y    %33551a%.1a4:%%UAqMEET[((AqMEETZ''1q5MEE#D//)<<e,,  444   ur/   Iterable[Axis]c                     t           S rD   )r2   r.   r/   r0   r  zAbstractPacker._axis  s    r/   Nr   r   )r\   r   r   )r   r   r\   r`   )r   r   r\   r`   r   )r   r  r   r  r\   r`   )r   r   r   r   r\   r   r\   r"  )r$   r%   r&   rJ   r[   r   r   r   rX   r  r  r   r   r   r   r  r   r8   r  r  r  staticmethodr  r.   r/   r0   r   r     s              
	 	 	 $ $ $ X$    XI I I I          8 8 8 8< < < <@ @ @ @@ @ @ @= = = = %1 0 0 0 0 0, , , ,   (    \  r/   r   r   attemptsintc                    |dk     rt          d          d}| }t          |          D ]S}|                                 }|                    t          j                   |                                }||k    r|}|}T|S )zrRandom shuffle packing. Returns a new packer with the best packing result,
    the input packer is unchanged.
    r   zexpected attempts >= 1r=   )rq   ranger[   r  r   r9   r   )r   r&  
best_ratiobest_packer_
new_packer	new_ratios          r0   r   r     s     !||1222JK8__ % %[[]]
,-----//	z!!"J$Kr/   pickerr   c                    | j         du sJ t          | j        |          \  }}|| _        |                     |           | j                            |           dS )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   r/  strategychosenrejectss        r0   r   r     sb     u$$$$%flF;;OFGFL
KK
L     r/   r   tuple[list[Item], list[Item]]c                   g }g }d}t          | |          D ]7\  }}|dz  }|r|                    |           "|                    |           8|t          |           k     r|                    | |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   r2  )r   r/  r4  r5  countr   r  s          r0   r1  r1  "  s     FGE%(( ! !
d
 	!MM$NN4    s5zzuUVV}%%%7?r/   c                  &    e Zd ZddZddZdd	Zd
S )SubSetEvaluatorr   r   c                    || _         d S rD   )r   r   s     r0   rJ   zSubSetEvaluator.__init__8  s    r/   dnaga.DNAr\   r?   c                T    |                      |          }|                                S rD   )
run_packerr   rI   r=  r   s      r0   evaluatezSubSetEvaluator.evaluate;  s%    %%$$&&&r/   c                X    | j                                         }t          ||           |S rD   )r   r[   r   rA  s      r0   r@  zSubSetEvaluator.run_packer?  s*    !!##%%%r/   N)r   r   )r=  r>  r\   r?   )r=  r>  r\   r   )r$   r%   r&   rJ   rB  r@  r.   r/   r0   r;  r;  7  sP           ' ' ' '     r/   r;  c                  *    e Zd ZdZefddZ	 dddZdS )r   z13D Packer inherited from :class:`AbstractPacker`.r   rS   r>   r?   r@   rA   r   r\   r   c                V    t          |||||          }|                     |           |S )z Add a 3D :class:`Box` container.)r   r  )rI   r   r>   r@   rA   r   r   s          r0   add_binzPacker.add_binH  s0     $vuj99
r/   r=   rB   r   c                V    t          |||||          }|                     |           |S )zAdd a 3D :class:`Item` to pack.)r   r  )rI   rE   r>   r@   rA   rB   r   s          r0   add_itemzPacker.add_itemU  s2     GUFE6::r/   N)r   rS   r>   r?   r@   r?   rA   r?   r   r?   r\   r   r~   )
r>   r?   r@   r?   rA   r?   rB   r?   r\   r   )r$   r%   r&   r'   r   rF  rH  r.   r/   r0   r   r   E  sV        ;; -    &       r/   r   c                  B    e Zd ZdZefdd
Z	 dddZedd            ZdS )r   zz2D Packer inherited from :class:`AbstractPacker`. All containers and
    items used by this packer must have a depth of 1.r   rS   r>   r?   r@   r   r\   r   c                T    t          ||||          }|                     |           |S )z%Add a 2D :class:`Envelope` container.)r   r  )rI   r   r>   r@   r   envelopes         r0   rF  zFlatPacker.add_bing  s.     D%<<!!!r/   r=   rB   r   c                T    t          ||||          }|                     |           |S )z#Add a 2D :class:`FlatItem` to pack.)r   r  )rI   rE   r>   r@   rB   r   s         r0   rH  zFlatPacker.add_items  s0     77r/   r"  c                 2    t           j        t           j        fS rD   )r2   r3   r4   r.   r/   r0   r  zFlatPacker._axis  s    z4;&&r/   N)
r   rS   r>   r?   r@   r?   r   r?   r\   r   r~   )r>   r?   r@   r?   rB   r?   r\   r   r$  )	r$   r%   r&   r'   r   rF  rH  r%  r  r.   r/   r0   r   r   c  sz        9 9 -
 
 
 
 
" 
 
 
 
 
 ' ' ' \' ' 'r/   r   r   r   r   layout'GenericLayoutType'	list[Bin]offsetr   c           	        ddl m} t          |          }t                      }d}|j        |j        |j        |j        |j        f}|D ]{}t          j	        |j
        |j        |j                  }	t          | |d|	           |j        D ]5}
t          | |
d||         |	           |dz  }|t!          |          k    rd}6||z  }|d S )Nr   )colorsFRAMEITEMSr   )ezdxfrT  r   REDGREENBLUEMAGENTACYANr   rt   rM   r{   r|   
_add_framer   	_add_meshr   )rO  r   rR  rT  
offset_vecstartindexrgbr   mr   s              r0   r    r      s     fJFFEE:v|V[&.&+
NC  uw9963+++I 	 	DfdGSZ;;;QJEC   r/   r   layerrS   rc  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           0|d d         D ]\  }} ||||f|||
f                                |j        d          }|                    |dz   |	dz
  |
f           |                               d S )	Nc                b                         | |          }|                               d S )N)
dxfattribs)add_line	transform)rd   v2lineattribsrO  rc  s      r0   rh  z_add_frame.<locals>.add_line  s2    r2'::qr/   rd  )r=   r=   r=   r         ?r@   rg  g      ?)	r?   r>   r@   rA   r8  add_textr   set_placementri  )rO  r   rd  rc  rh  x0y0z0x1y1z1cornerssxsyexeyrM   r{   textrl  s   `  `               @r0   r]  r]    s          G JBB	sy		B	sz		B	sy		B	R	R	R	R	RG "'7122;77 - -R(2r"b"B|,,,"b"B|,,,, ) )1!QaBZ((((??38DW?EEDT	28R0111NN1r/   r   colorc                $   ddl m} ||d} |d          }|                                \  }}	}
|                    ||	|
           |j        \  }}}|                    |||           |                    | ||           |                     t          |j	                  ddd	i
          }|	|k    rd|j
        _        t          j        }nt          j        }|                    |dz   |dz   ||
z   f|           |                    |           d S )Nr   )cube)rd  r~  F)center)matrixrn  rd  TEXTro  Z   )align)ezdxf.render.formsr  rb   scalerT   rt   render_polyfacerp  rS   rE   dxfrotationr
   TOP_LEFTBOTTOM_LEFTrq  ri  )rO  r   rd  r~  rc  r  rl  meshry  rz  szrM   r{   r|   r}  r  s                   r0   r^  r^    sB    ('''''  G 4uD##%%JBBJJr2rmGAq!NN1a333??DL$GV3D   D 
Bww#,#/D!d(AF35AAANN1r/   )r   r   r   r   r\   r`   )r   r   r&  r'  r\   r   )r   r   r/  r   r\   r`   )r   r   r/  r   r\   r6  )rN  )rO  rP  r   rQ  rR  r   r\   r`   )rO  rP  r   r   rd  rS   rc  r   )
rO  rP  r   r   rd  rS   r~  r'  rc  r   )=
__future__r   typingr   r   r   r   enumr   r	   r[   mathr   ezdxf.enumsr
   
ezdxf.mathr   r   r   r   r   r   r   r   r   gaezdxf.eztypesr   __all__r   r!   pirv   r   r2   r   r;   __annotations__r   r   r   r   r   r   r   r   r7   r8   r9   r  r   r   r   r1  	Evaluatorr;  r   r   r    r]  r^  r.   r/   r0   <module>r     sv  0 # " " " " " "                       , + + + + +                  & % % % % % 0//////    GCLLw{    4   "    4       4    .7 6 6 6 6u u u u u u u up
 
 
 
 
t 
 
 
4\ \ \ \ \ \ \ \~	 	 	 	 	# 	 	 	2 2 2 2 2s 2 2 2.- - - -; ; ; ;    }(n n n n n n n nb   & 8D7P
! 
! 
! 
! 
!   *    bl       ^   <' ' ' ' ' ' ' 'D BK    (   8     r/   