
    h	T                       % S SK Jr  S SKJrJrJrJr  S SKJrJ	r	  S SK
r
S SKrS SKrS SKJr  S SKJrJrJrJrJrJrJr  SSKJr  \(       a  S S	KJr  / S
QrSr\" S5      r\R>                  S-  r  " S S\5      r! " S S\5      r" " S S\5      r#Sr$S\%S'    " S S5      r& " S S\&5      r' " S S5      r( " S S\(5      r) " S S \(5      r*S2S! jr+S2S" jr,S2S# jr-\#R\                  \+\#R^                  \,\#R`                  \-0r1 " S$ S%5      r2S3S& jr3\#R^                  4     S4S' jjr4      S5S( jr5 " S) S*\Rl                  5      r7 " S+ S,\25      r8 " S- S.\25      r9 S6       S7S/ jjr:S8S0 jr;          S9S1 jr<g):    )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                  l    \ rS rSrSr\" 5       r\" 5       r\" 5       r\" 5       r	\" 5       r
\" 5       rSrg)r   H   zARotation type of an item:

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

 N)__name__
__module____qualname____firstlineno____doc__r	   WHDHWDHDWDHWDWHWDH__static_attributes__r%       I/var/www/html/env/lib/python3.13/site-packages/ezdxf/addons/binpacking.pyr   r   H   s3     &C
&C
&C
&C
&C
&Cr2   r   c                  >    \ rS rSr\" 5       r\" 5       r\" 5       rSrg)AxisY   r%   N)	r&   r'   r(   r)   r	   WIDTHHEIGHTDEPTHr1   r%   r2   r3   r5   r5   Y   s    FEVFFEr2   r5   c                  B    \ rS rSrSr\" 5       r\" 5       r\" 5       rSr	g)r   _   z)Order of how to pick items for placement.r%   N)
r&   r'   r(   r)   r*   r	   SMALLER_FIRSTBIGGER_FIRSTSHUFFLEr1   r%   r2   r3   r   r   _   s    3FM6LfGr2   r   )r   r   r   tuple[float, float, float]START_POSITIONc                      \ rS rSrSr S       SS jjrS rS r\SS j5       r	SS jr
S r\SS	 j5       r\R                  SS
 j5       r\SS j5       r\R                  SS j5       rSS jrSS jrSS jrSrg)r   j   z3D container item.c                    Xl         [        U5      U l        [        U5      U l        [        U5      U l        [        U5      U l        [        R                  U l        [        U l
        S U l        g N)payloadfloatwidthheightdepthweightr   r+   _rotation_typer@   	_position_bbox)selfrE   rG   rH   rI   rJ   s         r3   __init__Item.__init__m   sQ     5\
Fm5\
Fm*..'48
r2   c                   [        U R                  5       SU R                   SU R                   SU R                   SU R
                   S[        U R                  5       SU R                   SU R                  5        S3$ )N(x
, weight: ) pos() rt() vol())	strrE   rG   rH   rI   rJ   positionrotation_type
get_volumerN   s    r3   __str__Item.__str__~   sz    4<< !4::,a}Adjj\ J{{m6#dmm*<)= >$$%VDOO,=+>aA	
r2   c                .    [         R                   " U 5      $ )zHReturns a copy, all copies have a reference to the same payload
object.
)copyr]   s    r3   ra   	Item.copy   s     yyr2   c                T    U R                   c  U R                  5         U R                   $ rD   )rM   _update_bboxr]   s    r3   bbox	Item.bbox   s"    ::zzr2   c                    [        U R                  5      n[        X[        U R                  5       5      -   /5      U l        g rD   )r   rL   r   get_dimensionrM   rN   v1s     r3   rd   Item._update_bbox   s2    $..! "40B0B0D+E&E!FG
r2   c                    S U l         g rD   rM   r]   s    r3   _taintItem._taint   s	    
r2   c                    U R                   $ rD   )rK   r]   s    r3   r[   Item.rotation_type   s    """r2   c                0    Xl         U R                  5         g rD   )rK   rn   rN   values     r3   r[   rq      s    #r2   c                    U R                   $ )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).
)rL   r]   s    r3   rZ   Item.position   s    
 ~~r2   c                0    Xl         U R                  5         g rD   )rL   rn   rs   s     r3   rZ   rv      s    r2   c                N    U R                   U R                  -  U R                  -  $ )zReturns the volume of the item.rG   rH   rI   r]   s    r3   r\   Item.get_volume       zzDKK'$**44r2   c                   U R                   nU[        R                  :X  a#  U R                  U R                  U R
                  4$ U[        R                  :X  a#  U R                  U R                  U R
                  4$ U[        R                  :X  a#  U R                  U R
                  U R                  4$ U[        R                  :X  a#  U R
                  U R                  U R                  4$ U[        R                  :X  a#  U R
                  U R                  U R                  4$ U[        R                  :X  a#  U R                  U R
                  U R                  4$ [        U5      e)z?Returns the item dimension according the :attr:`rotation_type`.)r[   r   r+   rG   rH   rI   r,   r-   r.   r/   r0   
ValueError)rN   rts     r3   rh   Item.get_dimension   s   !!!::t{{DJJ66<###;;

DJJ66<###;;

DJJ66<###::t{{DJJ66<###::tzz4;;66<###::tzz4;;66nr2   c                   U R                   u  pnU R                  nU[        R                  :X  a  [        R
                  " XU5      $ U[        R                  :X  a>  [        R                  " [        5      [        R
                  " XR                  -   X#5      -  $ U[        R                  :X  aQ  [        R                  " [        S[        5      [        R
                  " XR                  -   X R                  -   U5      -  $ U[        R                  :X  a?  [        R                  " [        * 5      [        R
                  " XR                  -   X#5      -  $ U[        R                  :X  a8  [        R                  " S[        [        5      [        R
                  " XU5      -  $ U[        R                   :X  a?  [        R"                  " [        5      [        R
                  " XU R                  -   U5      -  $ [%        U5      e)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   )rZ   r[   r   r+   r   	translater,   z_rotatePI_2rH   r-   
xyz_rotaterI   r.   y_rotater/   r0   x_rotate	TypeError)rN   rS   yzr~   s        r3   get_transformationItem.get_transformation   s   
 --a!!!%%aA..!!!$$T*X-?-?KK.   !!!&&tQ58J8JKKZZ9   !!!$$dU+h.@.@JJ/   !!!&&q$58J8Ja9   !!!$$T*X-?-?tzz>1.   mr2   )rM   rL   rK   rI   rH   rE   rJ   rG   N        )rG   rF   rH   rF   rI   rF   rJ   rF   )returnr   r   None)r   r   )rt   r   r   r   )r   r?   )rt   r?   r   r   r   rF   )r   r   )r&   r'   r(   r)   r*   rO   r^   ra   propertyre   rd   rn   r[   setterrZ   r\   rh   r   r1   r%   r2   r3   r   r   j   s     9 9 	9
 9 9"
  
H # #     __ 5"r2   r   c                  P   ^  \ rS rSrSr S     SU 4S jjjrS	S jrS rSrU =r	$ )
r      zM2D container item, inherited from :class:`Item`. Has a default depth of
1.0.
c                *   > [         TU ]  XUSU5        g Ng      ?superrO   )rN   rE   rG   rH   rJ   	__class__s        r3   rO   FlatItem.__init__   s     	f=r2   c                    [        U R                  5      n[        X[        U R                  5       5      -   /5      U l        g rD   )r   rL   r   rh   rM   ri   s     r3   rd   FlatItem._update_bbox   s2    $..!"BT$2D2D2F-G(G#HI
r2   c                    [        U R                  5       SU R                   SU R                   SU R                   S[        U R
                  5       SU R                   SU R                  5        S3$ )NrR   rS   rT   rU   rV   ) area(rX   )rY   rE   rG   rH   rJ   rZ   r[   r\   r]   s    r3   r^   FlatItem.__str__   so    4<< !4::,a} ={{m6#dmm*<)= >$$%WT__->,?qB	
r2   rm   r   )rG   rF   rH   rF   rJ   rF   r   )
r&   r'   r(   r)   r*   rO   rd   r^   r1   __classcell__r   s   @r3   r   r      sE     > > 	>
 > >J
 
r2   r   c                      \ rS rSr\4       SS jjrS rS rS rS r	\
SS j5       rSS jrSS	 jrSS
 jrSS jrSS jrSS jrSS jrSrg)Bin   c                @   Xl         [        U5      U l        U R                  S::  a  [        S5      e[        U5      U l        U R                  S::  a  [        S5      e[        U5      U l        U R
                  S::  a  [        S5      e[        U5      U l        / U l        g )Nr   zinvalid widthzinvalid heightzinvalid depth)namerF   rG   r}   rH   rI   
max_weightitems)rN   r   rG   rH   rI   r   s         r3   rO   Bin.__init__   s     	5\
::_--Fm;;#-..5\
::_--
+!#
r2   c                ,    [        U R                  5      $ rD   lenr   r]   s    r3   __len__Bin.__len__  s    4::r2   c                ,    [        U R                  5      $ rD   )iterr   r]   s    r3   __iter__Bin.__iter__  s    DJJr2   c                f    [         R                   " U 5      n[        U R                  5      Ul        U$ )zReturns a copy.)ra   listr   rN   boxs     r3   ra   Bin.copy  s$    iio$	
r2   c                8    U R                   R                  5         g)z#Reset the container to empty state.N)r   clearr]   s    r3   reset	Bin.reset  s    

r2   c                6    [        U R                  5      (       + $ rD   r   r]   s    r3   is_emptyBin.is_empty"  s    tzz?""r2   c                    [        U R                  5       SU R                  S SU R                  S SU R                  S SU R
                   SU R                  5       S S3$ )NrR   .3frS   , max_weight:rW   rX   )rY   r   rG   rH   rI   r   get_capacityr]   s    r3   r^   Bin.__str__&  si    499~a

3/qS0A4::cBR S//* +$$&s+1.	
r2   c                  ^ UR                   nX!l         Uu  pEnU R                  5        H  nXql        UR                  5       u  pn
U R                  XH-   :  d$  U R
                  XY-   :  d  U R                  Xj-   :  a  MT  UR                  m[        U4S jU R                   5       5      (       a  M  U R                  5       UR                  -   U R                  ::  d  M  U R                  R                  U5          g   X1l         g)Nc              3  Z   >#    U  H   nTR                  UR                  5      v   M"     g 7frD   )has_intersectionre   ).0i	item_bboxs     r3   	<genexpr>Bin.put_item.<locals>.<genexpr>;  s#     OJq	22166::Js   (+TF)rZ   	rotationsr[   rh   rG   rH   rI   re   anyr   get_total_weightrJ   r   append)rN   itempivotvalid_item_positionrS   r   r   r[   whdr   s              @r3   put_itemBin.put_item-  s    "mma "^^-M!.((*GA!zzAE!T[[15%8DJJ<N		IODJJOOO))+dkk9T__L

!!$' . ,r2   c                N    U R                   U R                  -  U R                  -  $ )z+Returns the maximum fill volume of the bin.ry   r]   s    r3   r   Bin.get_capacityD  r{   r2   c                :    [        S U R                   5       5      $ )z-Returns the total weight of all fitted items.c              3  8   #    U  H  oR                   v   M     g 7frD   )rJ   r   r   s     r3   r   'Bin.get_total_weight.<locals>.<genexpr>J  s     6:4;;:   sumr   r]   s    r3   r   Bin.get_total_weightH  s    64::666r2   c                :    [        S U R                   5       5      $ )z-Returns the total volume of all fitted items.c              3  @   #    U  H  oR                  5       v   M     g 7frD   r\   r   s     r3   r   'Bin.get_total_volume.<locals>.<genexpr>N       <??$$   r   r]   s    r3   get_total_volumeBin.get_total_volumeL      <<<<r2   c                f     U R                  5       U R                  5       -  $ ! [         a     gf = f)zReturn the fill ratio.r   )r   r   ZeroDivisionErrorr]   s    r3   get_fill_ratioBin.get_fill_ratioP  s6    	((*T->->-@@@  		s    # 
00c                    [         $ rD   )r   r]   s    r3   r   Bin.rotationsW  s    r2   )rI   rH   r   r   r   rG   N)rG   rF   rH   rF   rI   rF   r   rF   r   boolr   rY   )r   r   r   r?   r   r   r   r   zIterable[RotationType])r&   r'   r(   r)   UNLIMITED_WEIGHTrO   r   r   ra   r   r   r   r^   r   r   r   r   r   r   r1   r%   r2   r3   r   r      s     -$ $ 	$
 $ $*  # #
.57=r2   r   c                      \ rS rSrSrSrg)r   i[  z)3D container inherited from :class:`Bin`.r%   N)r&   r'   r(   r)   r*   r1   r%   r2   r3   r   r   [  s    3r2   r   c                  T   ^  \ rS rSrSr\4     SU 4S jjjrSS jrS	S jrSr	U =r
$ )
r   ia  z)2D container inherited from :class:`Bin`.c                *   > [         TU ]  XUSU5        g r   r   )rN   r   rG   rH   r   r   s        r3   rO   Envelope.__init__d  s     	fc:>r2   c           
         [        U R                  5       SU R                  S SU R                  S SU R                   SU R                  5       S S3
$ )NrR   r   rS   r   r   rX   )rY   r   rG   rH   r   r   r]   s    r3   r^   Envelope.__str__m  s\    499~a

3/qS0A B//* +%%',A/	
r2   c                B    [         R                  [         R                  4$ rD   )r   r+   r,   r]   s    r3   r   Envelope.rotationst  s    !1!111r2   r%   )rG   rF   rH   rF   r   rF   r   r   )r&   r'   r(   r)   r*   r   rO   r^   r   r1   r   r   s   @r3   r   r   a  sB    3 -? ? 	?
 ? ?
2 2r2   r   c                D    U R                  S S9  UR                  S S9  g )Nc                "    U R                  5       $ rD   r   bs    r3   <lambda> _smaller_first.<locals>.<lambda>{      ANN,r2   )keyc                "    U R                  5       $ rD   r   r   s    r3   r  r  |  
    Q\\^r2   sortbinsr   s     r3   _smaller_firstr  x  s"     	II,I-	JJ+J,r2   c                H    U R                  S SS9  UR                  S SS9  g )Nc                "    U R                  5       $ rD   r  r  s    r3   r  _bigger_first.<locals>.<lambda>  r  r2   T)r  reversec                "    U R                  5       $ rD   r   r	  s    r3   r  r    r
  r2   r  r  s     r3   _bigger_firstr    s$    II,dI;	JJ+TJ:r2   c                \    [         R                  " U 5        [         R                  " U5        g rD   )randomshuffler  s     r3   _shuffler    s    
NN4
NN5r2   c                      \ rS rSrSS jrS r\SS j5       r\SS j5       rSS jr	SS jr
SS jrSS	 jrSS
 jrSS jrSS jrSS jr\R$                  4SS jjrSS jrSS jr\SS j5       rSrg)r   i  c                .    / U l         / U l        SU l        g )NT)r  r   _init_stater]   s    r3   rO   AbstractPacker.__init__  s    !	!#
r2   c                   U R                   (       a  [        S5      e[        S U R                   5       5      (       d  [        S5      eU R	                  5       nU R                   Vs/ s H  o"R                  5       PM     snUl        U R                   Vs/ s H  o3R                  5       PM     snUl        U$ s  snf s  snf )z=Copy packer in init state to apply different pack strategies.zcannot copy packed statec              3  8   #    U  H  oR                   v   M     g 7frD   )r   r   r   s     r3   r   &AbstractPacker.copy.<locals>.<genexpr>  s     59C<<9r   z#bins contain data in unpacked state)	is_packedr   allr  r   ra   r   )rN   packerr   r   s       r3   ra   AbstractPacker.copy  s    >>6775499555ABB!-1YY7YcxxzY704

;
		
; 8;s   'B9B>c                $    U R                   (       + $ )zIReturns ``True`` if packer is packed, each packer can only be used
once.
)r  r]   s    r3   r"  AbstractPacker.is_packed  s    
 ####r2   c                    U R                   $ )zReturns the unfitted items.)r   r]   s    r3   unfitted_itemsAbstractPacker.unfitted_items  s     zzr2   c                    SnU R                   (       a  SU R                  5        3nU R                  R                   S[	        U R
                  5       SU 3$ )N z, fill ratio: z, z bins)r"  r   r   r&   r   r  )rN   fills     r3   r^   AbstractPacker.__str__  sO    >>#D$7$7$9#:;D..))*"S^,<E$HHr2   c                    U R                   (       a  [        S5      eUR                  (       d  [        S5      eU R                  R	                  U5        g)zAppend a container.z"cannot append bins to packed statezcannot append bins with contentN)r"  r   r   r  r   r   s     r3   
append_binAbstractPacker.append_bin  s:    >>@AA||=>>		r2   c                r    U R                   (       a  [        S5      eU R                  R                  U5        g)zAppend a item.z#cannot append items to packed stateN)r"  r   r   r   )rN   r   s     r3   append_itemAbstractPacker.append_item  s'    >>ABB

$r2   c                V    U R                  5       nUS:X  a  gU R                  5       U-  $ )z"Return the fill ratio of all bins.r   )r   r   )rN   total_capacitys     r3   r   AbstractPacker.get_fill_ratio  s/    **,S $$&77r2   c                :    [        S U R                   5       5      $ )z,Returns the maximum fill volume of all bins.c              3  @   #    U  H  oR                  5       v   M     g 7frD   r  r   s     r3   r   .AbstractPacker.get_capacity.<locals>.<genexpr>  s     ;###%%r   r   r  r]   s    r3   r   AbstractPacker.get_capacity  s    ;;;;r2   c                :    [        S U R                   5       5      $ )z9Returns the total weight of all fitted items in all bins.c              3  @   #    U  H  oR                  5       v   M     g 7frD   )r   r   s     r3   r   2AbstractPacker.get_total_weight.<locals>.<genexpr>       ?Yc''))Yr   r;  r]   s    r3   r   AbstractPacker.get_total_weight      ?TYY???r2   c                :    [        S U R                   5       5      $ )z9Returns the total volume of all fitted items in all bins.c              3  @   #    U  H  oR                  5       v   M     g 7frD   )r   r   s     r3   r   2AbstractPacker.get_total_volume.<locals>.<genexpr>  r@  r   r;  r]   s    r3   r   AbstractPacker.get_total_volume  rB  r2   c                :    [        S U R                   5       5      $ )z/Returns the total volume of all unfitted items.c              3  @   #    U  H  oR                  5       v   M     g 7frD   r   r   s     r3   r   5AbstractPacker.get_unfitted_volume.<locals>.<genexpr>  r   r   r   r]   s    r3   get_unfitted_volume"AbstractPacker.get_unfitted_volume  r   r2   c                    [         U   " U R                  U R                  5        U R                  U R                  [	        U R                  5      5        g)z<Pack items into bins. Distributes all items across all bins.N)PICK_STRATEGYr  r   _packr   )rN   picks     r3   packAbstractPacker.pack  s4    dDIItzz2

499d4::./r2   c                    SU l         U H?  nU H6  nU R                  X45      (       d  M  U R                  R                  U5        M8     MA     g)z;Pack items into bins, removes packed items from self.items!FN)r  pack_to_binr   remove)rN   r  r   r   r   s        r3   rN  AbstractPacker._pack  sA     C##C..JJ%%d+  r2   c                   UR                   (       d  UR                  U[        5      $ U R                  5        H  nUR                    H  nUR	                  5       u  pVnUR
                  u  pn
U[        R                  :X  a  X-   X4nOBU[        R                  :X  a  XU-   U
4nO&U[        R                  :X  a  XX-   4nO[        U5      eUR                  X+5      (       d  M      g   M     g)NTF)r   r   r@   _axisrh   rZ   r5   r7   r8   r9   r   )rN   r   r   axisplaced_itemr   r   r   rS   r   r   r   s               r3   rS  AbstractPacker.pack_to_bin  s    yy<<n55JJLD"yy%335a%..a4::%UAMET[[(AqMETZZ'15ME#D/)<<,,  ) ! r2   c                     [         $ rD   )r5   r%   r2   r3   rW  AbstractPacker._axis  s    r2   )r  r  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(   r)   rO   ra   r   r"  r)  r^   r0  r3  r   r   r   r   rJ  r   r=   rP  rN  rS  staticmethodrW  r1   r%   r2   r3   r   r     s     
	 $ $  I 8<@@= %11 0,(  r2   r   c                    US:  a  [        S5      eSnU n[        U5       HM  nU R                  5       nUR                  [        R
                  5        UR                  5       nXb:  d  MI  UnUnMO     U$ )zjRandom shuffle packing. Returns a new packer with the best packing result,
the input packer is unchanged.
r   zexpected attempts >= 1r   )r}   rangera   rP  r   r>   r   )r$  attempts
best_ratiobest_packer_
new_packer	new_ratios          r3   r   r     sr     !|122JK8_[[]
,,---/	!"J$K  r2   c                    U R                   SL d   e[        U R                  U5      u  p4X0l        U R                  U5        U R                  R	                  U5        g)zoPack 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   rP  extend)r$  pickerstrategychosenrejectss        r3   r   r     sM     u$$$%fllF;OFL
KK
LL r2   c                    / n/ nSn[        X5       H5  u  pVUS-  nU(       a  UR                  U5        M$  UR                  U5        M7     U[        U 5      :  a  UR                  XS 5        X#4$ )zqReturns 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   rj  )r   rk  rm  rn  countr   rO  s          r3   ri  ri  "  sn     FGE%(

MM$NN4  ) s5zuV}%?r2   c                  2    \ rS rSrSS jrSS jrS	S jrSrg)
SubSetEvaluatori7  c                    Xl         g rD   r$  )rN   r$  s     r3   rO   SubSetEvaluator.__init__8  s    r2   c                D    U R                  U5      nUR                  5       $ rD   )
run_packerr   rN   dnar$  s      r3   evaluateSubSetEvaluator.evaluate;  s    %$$&&r2   c                P    U R                   R                  5       n[        X!5        U$ rD   )r$  ra   r   ry  s      r3   rx  SubSetEvaluator.run_packer?  s!    !!#%r2   ru  N)r$  r   )rz  ga.DNAr   rF   )rz  r  r   r   )r&   r'   r(   r)   rO   r{  rx  r1   r%   r2   r3   rs  rs  7  s    'r2   rs  c                  `    \ rS rSrSr\4           SS jjr S         S	S jjrSrg)
r   iE  z13D Packer inherited from :class:`AbstractPacker`.c                B    [        XX4U5      nU R                  U5        U$ )z Add a 3D :class:`Box` container.)r   r0  )rN   r   rG   rH   rI   r   r   s          r3   add_binPacker.add_binH  s#     $vj9
r2   c                B    [        XX4U5      nU R                  U5        U$ )zAdd a 3D :class:`Item` to pack.)r   r3  )rN   rE   rG   rH   rI   rJ   r   s          r3   add_itemPacker.add_itemU  s%     GF6:r2   r%   N)r   rY   rG   rF   rH   rF   rI   rF   r   rF   r   r   r   )
rG   rF   rH   rF   rI   rF   rJ   rF   r   r   )	r&   r'   r(   r)   r*   r   r  r  r1   r%   r2   r3   r   r   E  s    ; -  	
   
&   	
   
 r2   r   c                  l    \ rS rSrSr\4         SS jjr S	       S
S jjr\SS j5       r	Sr
g)r   ic  zv2D Packer inherited from :class:`AbstractPacker`. All containers and
items used by this packer must have a depth of 1.c                @    [        XX45      nU R                  U5        U$ )z%Add a 2D :class:`Envelope` container.)r   r0  )rN   r   rG   rH   r   envelopes         r3   r  FlatPacker.add_bing  s!     D<!r2   c                @    [        XX45      nU R                  U5        U$ )z#Add a 2D :class:`FlatItem` to pack.)r   r3  )rN   rE   rG   rH   rJ   r   s         r3   r  FlatPacker.add_items  s#     7r2   c                 B    [         R                  [         R                  4$ rD   )r5   r7   r8   r%   r2   r3   rW  FlatPacker._axis  s    zz4;;&&r2   r%   N)
r   rY   rG   rF   rH   rF   r   rF   r   r   r   )rG   rF   rH   rF   rJ   rF   r   r   r^  )r&   r'   r(   r)   r*   r   r  r  r_  rW  r1   r%   r2   r3   r   r   c  s    9 -

 
 	

 
 

" 
 
 	

 
 

 ' 'r2   r   c           	        SSK Jn  [        U5      n[        5       nSnUR                  UR                  UR
                  UR                  UR                  4nU H  n[        R                  " UR                  UR                  UR                  5      n	[        XSU	5        UR                   H+  n
[        X
SXv   U	5        US-  nU[!        U5      :  d  M)  SnM-     XT-  nM     g )Nr   )colorsFRAMEITEMSr   )ezdxfr  r   REDGREENBLUEMAGENTACYANr   r   rS   r   r   
_add_framer   	_add_meshr   )layoutr  offsetr  
offset_vecstartindexrgbr   mr   s              r3   r    r      s     fJFEE::v||V[[&..&++
NCuww96+IIDfGSZ;QJEC 	 
 	 r2   c                  ^ ^^ UU U4S jnSU0mSu  pVn[        UR                  5      n[        UR                  5      n	[        UR                  5      n
XV4X4X4XY4XV4/n[	        XSS  5       H$  u  u  pu  pU" XU4XU45        U" XU
4XU
45        M&     US S  H  u  nnU" UUU4UUU
45        M     T R                  UR                  STS9nUR                  US-   U	S-
  U
45        UR                  T5        g )	Nc                H   > TR                  XTS9nUR                  T5        g )N)
dxfattribs)add_line	transform)rj   v2lineattribsr  r  s      r3   r  _add_frame.<locals>.add_line  s!    r':qr2   layer)r   r   r   r         ?rH   r  g      ?)	rF   rG   rH   rI   rp  add_textr   set_placementr  )r  r   r  r  r  x0y0z0x1y1z1cornerssxsyexeyrS   r   textr  s   `  `               @r3   r  r    s    G JBB	syy	B	szz	B	syy	B					G "'12;7(2""|,""|, 8 1!QaBZ(  ??388DW?EDT	28R01NN1r2   c                   SSK Jn  UUS.nU" SS9nUR                  5       u  pn
UR                  XU
5        UR                  u  pnUR                  XU5        UR                  XUS9  U R                  [        UR                  5      SSS	0S
9nX:  a"  SUR                  l        [        R                  nO[        R                  nUR                  US-   US-   X-   4US9  UR!                  U5        g )Nr   )cube)r  colorF)center)matrixr  r  TEXTr  Z   )align)ezdxf.render.formsr  rh   scalerZ   r   render_polyfacer  rY   rE   dxfrotationr
   TOP_LEFTBOTTOM_LEFTr  r  )r  r   r  r  r  r  r  meshr  r  szrS   r   r   r  r  s                   r3   r  r    s     ( G uD##%JBBJJrrmmGA!NN13??DLL$GV3D  D 
w#,,#//D!d(AF35ANN1r2   )r  r   r   r   r   r   )r$  r   rb  intr   r   )r$  r   rk  r   r   r   )r   r]  rk  r   r   ztuple[list[Item], list[Item]]))r   r   r   )r  'GenericLayoutType'r  z	list[Bin]r  r   r   r   )r  r  r   r   r  rY   r  r   )
r  r  r   r   r  rY   r  r  r  r   )=
__future__r   typingr   r   r   r   enumr   r	   ra   mathr  ezdxf.enumsr
   
ezdxf.mathr   r   r   r   r   r   r   r,  r   gaezdxf.eztypesr   __all__r   r!   pir   r   r5   r   r@   __annotations__r   r   r   r   r   r  r  r  r<   r=   r>   rM  r   r   r   ri  	Evaluatorrs  r   r   r    r  r  r%   r2   r3   <module>r     s  0 #      ,   &/  CLww{4 "4 4  .7* 6u up
t 
4\ \~	# 	2s 2.-; }(n nb& 8D7P7P
!
!$,
!	
!'"*bll ^ <' 'D BK'0:>	(8'+47@CHPr2   