Ë
    Jÿi\  ã                  óv   — d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZmZmZ 	 	 	 	 	 	 	 	 d
d„Zddd„Zy	)z‰
build123d Pack

name: pack.py
by:   fischman
date: November 9th 2023

desc:
    Utility code for packing objects in a squarish 2D area.
é    )Úannotations)Ú	dataclass)ÚOptionalÚcast)ÚCallableÚ
Collection)ÚLocationÚShapeÚPosc                ó„  ‡‡
‡‡‡‡‡— t          G d„ d«      «       Š
ˆˆfd„Šˆ
fd„Šˆˆˆfd„}ˆ
ˆˆˆfd„Šˆ
ˆˆˆfd„Št        | «      dkD  sJ ‚t        t        | «      D ��cg c]  \  }}| ||«       ||«      f‘Œ c}}d	„ d
¬«      }t        |d„ d
¬«      } ‰
d|d   d   |d   d   ¬«      Šg }|D ]_  Š ‰‰‰d   ‰d   «      }|r ‰|‰d   ‰d   «      }n |‰d   ‰d   «      }|j	                  ‰d   |j
                  |j                  f«       Œa t        |d„ ¬«      D �	cg c]  }	|	d   |	d   f‘Œ c}	S c c}}w c c}	w )a_  Takes an iterable of objects to pack into a square(ish) 2D
    arrangement, and return a list of (x,y) locations to place each to
    achieve the packing.
    Based on https://codeincomplete.com/articles/bin-packing/ and
    implemented as a straight-forward port of
    https://github.com/jakesgordon/bin-packing/blob/master/js/packer.growing.js
    c                  óp   — e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded	<   d
Z	ded<   d
Z
ded<   y
)ú_pack2d.<locals>._NodeFÚboolÚusedr   ÚfloatÚxÚyÚwÚhNz_Node | NoneÚdownÚright)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r   r   r   r   © ó    ú_/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/build123d/pack.pyÚ_Noder   #   sD   … àˆˆdÓØˆˆ5‹Øˆˆ5‹Øˆˆ5‹Øˆˆ5‹Ø!ˆˆlÓ!Ø"ˆˆ|Ô"r   r   c                ó¾   •— | j                   r* ‰| j                  ||«      xs  ‰| j                  ||«      S ‰d   | j                  k  r‰d   | j                  k  r| S y ©Né   é   )r   r   r   r   r   )Ústartr   r   Ú	find_nodeÚos      €€r   r%   z_pack2d.<locals>.find_node-   sT   ø€ Ø�:Š:Ù˜UŸ[™[¨!¨QÓ/ÒN±9¸U¿Z¹ZÈÈAÓ3NÐNØˆQ‰4�5—7‘7Š?˜q ™t u§w¡wšØˆLØr   c                ó  •— | j                   rJ ‚d| _          ‰| j                  | j                  |z   | j                  | j                  |z
  ¬«      | _         ‰| j                  |z   | j                  | j                  |z
  |¬«      | _        | S )NT)r   r   r   r   ©r   r   r   r   r   r   r   )Únoder   r   r   s      €r   Ú
split_nodez_pack2d.<locals>.split_node4   sk   ø€ Ø—9’9Ðˆ}ØˆŒ	Ù˜DŸF™F d§f¡f¨q¡j°D·F±F¸d¿f¹fÀq¹jÔIˆŒ	Ù˜TŸV™V a™Z¨4¯6©6°T·V±V¸a±ZÀ1ÔEˆŒ
Øˆr   c                ó8  •— | ‰j                   k  }|‰j                  k  }|xr ‰j                  ‰j                   | z   k\  }|xr ‰j                   ‰j                  |z   k\  }|r	 ‰| |«      S |r	 ‰| |«      S |r	 ‰| |«      S |r	 ‰| |«      S J d‰› d| › d|› �«       ‚)NzFailed to grow! root: z, w: z, h: ©r   r   )	r   r   Úcan_grow_downÚcan_grow_rightÚshould_grow_rightÚshould_grow_downÚ	grow_downÚ
grow_rightÚroots	         €€€r   Ú	grow_nodez_pack2d.<locals>.grow_node;   s±   ø€ à˜TŸV™V™ˆØ˜dŸf™f™ˆØ*ÒG°·±¸4¿6¹6ÀA¹:Ñ0FÐØ(ÒE¨d¯f©f¸¿¹À!¹Ñ.DÐÙÙ˜a Ó#Ð#ÙÙ˜Q “?Ð"ÙÙ˜a Ó#Ð#ÙÙ˜Q “?Ð"ØEÐ.¨t¨f°E¸!¸¸EÀ!ÀÐEÓEˆur   c                óÄ   •—  ‰ddd‰j                   | z   ‰j                  ‰ ‰‰j                   | ‰j                  ¬«      ¬«      Š ‰‰| |«      }|sJ d«       ‚ ‰|| |«      S )NTr   )r   r   r   r(   z2Failed to grow right! root: {root}, w: {w}, h: {h}r,   ©r   r   r)   r   r%   r3   r*   s      €€€€r   r2   z_pack2d.<locals>.grow_rightK   sl   ø€ áØØØØ�f‰f�q‰jØ�f‰fØÙ˜$Ÿ&™& A¨¯©Ô0ô
ˆñ ˜˜q !Ó$ˆÙÐIÐIÓIˆtÙ˜$  1Ó%Ð%r   c                óÄ   •—  ‰ddd‰j                   ‰j                  |z    ‰‰j                  ‰j                   |¬«      ‰¬«      Š ‰‰| |«      }|sJ d«       ‚ ‰|| |«      S )NTr   )r   r   r   r(   z1Failed to grow down! root: {root}, w: {w}, h: {h}r,   r6   s      €€€€r   r1   z_pack2d.<locals>.grow_downZ   sl   ø€ áØØØØ�f‰fØ�f‰f�q‰jÙ˜Ÿ™ 4§6¡6¨QÔ/Øô
ˆñ ˜˜q !Ó$ˆÙÐHÐHÓHˆtÙ˜$  1Ó%Ð%r   r   c                ó&   — t        | d   | d   «      S r!   )Úmin©Úds    r   Ú<lambda>z_pack2d.<locals>.<lambda>l   s   € ”c˜!˜A™$  !¡”or   T)ÚkeyÚreversec                ó&   — t        | d   | d   «      S r!   )Úmaxr:   s    r   r<   z_pack2d.<locals>.<lambda>o   s   € ¼#¸aÀ¹dÀAÀaÁD¼/r   Fr"   r#   r,   c                ó   — | d   S )Nr   r   )Úts    r   r<   z_pack2d.<locals>.<lambda>y   s   € ÀQÀqÂTr   )r=   )r   ÚlenÚsortedÚ	enumerateÚappendr   r   )ÚobjectsÚwidth_fnÚ	length_fnr4   Úir&   Úsorted_objectsÚtranslationsr)   rB   r   r%   r1   r2   r3   r*   s        `    @@@@@@r   Ú_pack2drM      se  þ€ ô ÷#ð #ó ð#õôöF÷ &÷&ô ˆw‹<˜!ÒÐÐÜÜ6?ÀÔ6HÔIÑ6H©F¨Q°ˆ!‰X�a‹[™) A›,Ò	'Ð6HÒIÙ%Øô€Nô
 ˜NÑ0IÐSWÔX€NÙ�˜.¨Ñ+¨AÑ.°.ÀÑ2CÀAÑ2FÔG€DØ€LÛˆÙ˜˜q ™t Q q¡TÓ*ˆÙÙ˜d A a¡D¨!¨A©$Ó/‰Dá˜Q˜q™T 1 Q¡4Ó(ˆDØ×Ñ˜Q˜q™T 4§6¡6¨4¯6©6Ð2Õ3ð ô #)¨¹>Õ"JÓKÑ"J˜QˆQˆq‰T�1�Q‘4ŠLÐ"JÑKÐKùó 	Jùò Ls   Á D7
Ä#D=c                óØ  ‡— | D �ci c]"  }||j                  «       j                  ||fz   “Œ$ c}Št        | ˆfd„ˆfd„¬«      }t        | |«      D ��cg c]œ  \  }}t	        |d   |j                  «       j
                  j                  z
  |d   |j                  «       j
                  j                  z
  df«      t        dd|r%|j                  «       j
                  j                   ndf«      z  |z  ‘Œž }}}d„ }|D �cg c]  }|j                  «       ‘Œ }}t        |«      D ]5  \  }	}
t        ||	dz   d «      D ]  \  }} ||
|«      sŒJ d|	› d	|› d
�«       ‚ Œ7 |S c c}w c c}}w c c}w )a5  Pack objects in a squarish area in Plane.XY.

    Args:
        objects (Collection[Shape]): objects to arrange
        padding (float): space between objects
        align_z (bool, optional): align shape bottoms to Plane.XY. Defaults to False.

    Returns:
        Collection[Shape]: rearranged objects
    c                ó>   •— ‰t        t        | «         j                  S ©N)r   r
   ÚX©r&   Úbounding_boxess    €r   r<   zpack.<locals>.<lambda>‹   s   ø€ ˜>¬$¬u°a«.Ñ9×;Ò;r   c                ó>   •— ‰t        t        | «         j                  S rP   )r   r
   ÚYrR   s    €r   r<   zpack.<locals>.<lambda>Œ   s   ø€ ˜N¬4´°q«>Ñ:×<Ò<r   )rH   rI   r   r"   c                óº  — t        | j                  j                  |j                  j                  «      }t        | j                  j                  |j                  j                  «      }t        | j                   j                  |j                   j                  «      }t        | j                   j                  |j                   j                  «      }||kD  xr ||kD  S rP   )r@   r9   rQ   rU   )Úbb1Úbb2Úmin_xÚmin_yÚmax_xÚmax_ys         r   Ú_overlappingzpack.<locals>._overlapping”   s…   € ä�C—G‘G—I‘I˜sŸw™wŸy™yÓ)ˆÜ�C—G‘G—I‘I˜sŸw™wŸy™yÓ)ˆÜ�C—G‘G—I‘I˜sŸw™wŸy™yÓ)ˆÜ�C—G‘G—I‘I˜sŸw™wŸy™yÓ)ˆØ�u‰}Ò. ¨¡Ð.r   NzObjects at indexes z and z	 overlap!)Úbounding_boxÚsizerM   Úzipr	   r9   rQ   rU   r   ÚZrE   )rG   ÚpaddingÚalign_zr&   rL   rB   Ú
translatedr]   ÚbbrJ   Úbb_iÚjÚbb_jrS   s                @r   Úpackri   |   s¦  ø€ ñ NUÓUÉWÈ�a˜Ÿ™Ó)×.Ñ.°'¸7Ð1CÑCÑCÈWÑU€NÜØÛ;Û<ô€Lô ˜' <Ô0ôá0‰FˆQ�ô 	�!�A‘$˜Ÿ™Ó)×-Ñ-×/Ñ/Ñ/°°1±¸¿¹Ó8H×8LÑ8L×8NÑ8NÑ1NÐPQÐRÓSÔVYÐ[\Ð^_ñ  }DÐbc×bpÑbpÓbr×bvÑbv×bxÑbxÑaxð  JKð  [Ló  WMñ  	Mð  PQó  	QØ0ð ñ ò/ñ %/Ó	/¡J˜qˆ!�.‰.Õ
 J€BÐ	/Ü˜R–=‰ˆˆ4Ü   A¨¡E G Ö-‰GˆAˆtÙ#Ø�dõð :à$ Q C u¨Q¨C¨yÐ9ó:ð ñ .ð !ð
 Ðùò5 Vùóùò 
0s   †'EÁB!E!Ã>E'N)rG   zCollection[object]rH   úCallable[[object], float]rI   rj   ÚreturnzCollection[tuple[float, float]])F)rG   úCollection[Shape]rb   r   rc   r   rk   rl   )Ú__doc__Ú
__future__r   Údataclassesr   Útypingr   r   Úcollections.abcr   r   Ú	build123dr	   r
   r   rM   ri   r   r   r   Ú<module>rs      sW   ðñ	õ #å !ß !ç 0ç *Ñ *ðcLØðcLà'ðcLð )ðcLð %ó	cLõL&r   