3D Bin Packing
py3dbp is a Python library for solving the 3D Bin Packing problem, an optimization challenge focused on fitting items of various sizes into a finite number of bins. The current stable version is 1.1.2, released in July 2020. The library appears to be in maintenance mode with infrequent updates.
Warnings
- breaking The `distribute_items` parameter behavior changed significantly between version 0.x and 1.x. In 0.x, it tried to put all items in the first bin that could fit at least one. In 1.x, when `distribute_items=True`, it distributes all items across all bins; when `distribute_items=False`, each bin attempts to pack all items independently.
- gotcha The `pack()` method's default parameters (`bigger_first=False`, `distribute_items=False`, `number_of_decimals=3`) may not always be optimal or align with intuitive expectations. Different forks or examples of the library might implicitly suggest different defaults for these parameters.
- gotcha The library's last release was in July 2020. While functional, it indicates that active development might be minimal, and community support or bug fixes may be limited.
Install
-
pip install py3dbp
Imports
- Packer
from py3dbp import Packer
- Bin
from py3dbp import Bin
- Item
from py3dbp import Item
- Painter
from py3dbp import Packer, Bin, Item, Painter
Quickstart
from py3dbp import Packer, Bin, Item
# Initialize packer
packer = Packer()
# Add bins
packer.add_bin(Bin('large-box', 12.0, 12.0, 5.5, 70.0))
packer.add_bin(Bin('medium-box', 11.0, 8.5, 5.5, 70.0))
# Add items
packer.add_item(Item('item-1', 5.0, 3.0, 2.0, 5.0))
packer.add_item(Item('item-2', 4.0, 4.0, 3.0, 3.0))
packer.add_item(Item('item-3', 6.0, 2.0, 1.0, 2.0))
# Pack items into bins
# Default parameters: bigger_first=False, distribute_items=False, number_of_decimals=3
packer.pack(bigger_first=True, distribute_items=True)
# Print results
for bin_obj in packer.bins:
print(f"\nBin: {bin_obj.name}, Volume: {bin_obj.get_total_volume()} cubic units, Weight: {bin_obj.get_total_weight()} kg")
print(" Fitted items:")
for item in bin_obj.items:
print(f" - {item.name} (WHL: {item.width}x{item.height}x{item.depth}, Weight: {item.weight}kg)")
print(f" Unfitted items: {len(bin_obj.unfitted_items)}")
for item in bin_obj.unfitted_items:
print(f" - {item.name} (WHL: {item.width}x{item.height}x{item.depth}, Weight: {item.weight}kg)")