128 keer bekeken / views
Een lade indelen lijkt simpel… tot je meerdere vakgroottes wilt combineren.
In deze post beschrijf ik twee python programma’s die ik geschreven heb om mooie vakverdelingen voor mijn onderdelen dozen te maken.
- boxGenerator.py
- gridLayoutGenerator.py
Beide genereren openSCAD programma’s maar ook direct bruikbare .stl bestanden voor 3D-printen.
In deze repository staan twee scripts die puzzel werk voor je uit handen nemen:
- boxGenerator.py
- gridLayoutGenerator.py
boxGenerator.py
boxGenerator.py maakt een vrije indeling van rechthoekige vakken binnen een box.
Je geeft op:
- afmetingen van de box
- afmetingen van vakken
- aantal vakken per type
Het script probeert die vakken te plaatsen binnen het beschikbare oppervlak.
Interactieve Prompt
Het programma werkt via een interactieve prompt.
- Eerst geef je de buitenmaten van de te printen box op.
- Daarna geef je per gewenst vak de grootte van dat vak op (lengte en breedte).
- Vervolgens geef je op hoeveel vakken met deze maat je wilt hebben en hoveel van deze vakken steeds direct tegen elkaar geprint moeten worden.
- Tenslotte geef je op of je een voorkeur voor de plaats van deze vakken wilt hebben
bijvoorbeeld: ‘random’, ‘boven’ of ‘onder’ aan de box.
Het script probeert alle vakken te plaatsen. Lukt dat niet, dan geeft het aan:
- welk vak niet past
- of van welk type er minder kunnen worden geplaatst
Hier zie je hoe dit in de praktijk werkt:
./boxGenerator.py OpenSCAD box generator ---------------------- Select a project: [1] evenSpacers [2] ladeBox2 [3] newProject Choice [1-3]: 2 Project: ladeBox2 Enter outer box size (length x width x height, example: 300x200x80): 190x172x70 <Enter> Enter inner wall height in mm: 68.8 <Enter> Enter outer wall thickness in mm: 1 <Enter> Enter inner divider thickness in mm: 1 <Enter> Enter bottom thickness in mm: 1.2 <Enter> Enter leftover compartment size (length x width, '-' = skip): <Enter> Enter random seed [12345]: <Enter> Enter number of layout attempts [120]: <Enter> Enter number of attempts per cluster group [50]: <Enter> Enter compartment definitions. Example size: 25x30 Cluster size means how many equal compartments must touch each other. Example: size 25x30, count 8, cluster 3 => groups of 3, 3, and 2 Empty size reuses the default size and still shows the remaining questions. If no default exists yet, empty size finishes input. Use 'keep' to reuse a default compartment without editing. Use '0x0' to remove/skip a compartment and skip follow-up questions. Compartment 1 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): 190x55 <Enter> Compartment 1 count: 2 <Enter> Compartment 1 cluster size: 1 <Enter> Compartment 1 preferred placement (random/front/back) [random]: <Enter> Compartment 2 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): 100x55 <Enter> Compartment 2 count: 1 <Enter> Compartment 2 cluster size: 1 <Enter> Compartment 2 preferred placement (random/front/back) [random]: <Enter> Compartment 3 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): 80x50 <Enter> Compartment 3 count: 1 <Enter> Compartment 3 cluster size: 1 <Enter> Compartment 3 preferred placement (random/front/back) [random]: <Enter> Compartment 4 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): <Enter> Packing progress: attempt 1/120, best placed compartments 3/4, current missing compartments 3 Packing progress: attempt 10/120, best placed compartments 3/4, current missing compartments 3 Packing progress: attempt 20/120, best placed compartments 3/4, current missing compartments none Packing progress: attempt 30/120, best placed compartments 4/4, current missing compartments none Packing progress: attempt 40/120, best placed compartments 4/4, current missing compartments 3 Packing progress: attempt 50/120, best placed compartments 4/4, current missing compartments none Packing progress: attempt 60/120, best placed compartments 4/4, current missing compartments 3 Packing progress: attempt 70/120, best placed compartments 4/4, current missing compartments 3 Packing progress: attempt 80/120, best placed compartments 4/4, current missing compartments none Packing progress: attempt 90/120, best placed compartments 4/4, current missing compartments none Packing progress: attempt 100/120, best placed compartments 4/4, current missing compartments none Packing progress: attempt 110/120, best placed compartments 4/4, current missing compartments none Packing progress: attempt 120/120, best placed compartments 4/4, current missing compartments none Placed cluster groups: group_1_1 position=(7.5, 0.0) footprint=180.5x55.0 cells=1 orientation=single pref=random/random group_1_2 position=(7.5, 115.0) footprint=180.5x55.0 cells=1 orientation=single pref=random/random group_2_1 position=(88.0, 60.0) footprint=100.0x55.0 cells=1 orientation=single pref=random/random group_3_1 position=(8.0, 55.0) footprint=80.0x50.0 cells=1 orientation=single pref=random/random Requested cavities: requested_01 position=(0.0, 0.0) size=188.0x55.0 requested_02 position=(0.0, 115.0) size=188.0x55.0 requested_03 position=(88.0, 55.0) size=100.0x60.0 requested_04 position=(0.0, 55.0) size=88.0x60.0 Remaining free cavities: None Absorbed tiny gaps between requested cavities: adjustment_01 axis=y between=requested_01/requested_03 gap=5.000 growth=+0.000/+5.000 adjustment_02 axis=y between=requested_04/requested_02 gap=10.000 growth=+10.000/+0.000 OpenSCAD file written: ladeBox2.scad STL file written: ladeBox2.stl
En hieronder staat het resultaat:


gridLayoutGenerator.py
gridLayoutGenerator.py werkt met een vast raster.
Geïnspireerd door Gridfinity, maar zonder de overhead en daardoor met minder filamentgebruik.
Alles gebeurt op basis van een gridsize. Alle vakken zijn veelvouden daarvan.
Dat zorgt voor:
- strakke uitlijning
- eenvoudige indelingen
- voorspelbare resultaten
Drie werkmodi
- boxlengte vast Lengte opgegeven
gridsize en breedte berekend en via lijst te selecteren - boxbreedte vast Breedte opgegeven
gridsize en lengte berekend en via lijst te selecteren - gridsize
vast Boxafmetingen zijn veelvouden van gridsize en via lijst te selecteren
Uitvoer
Het programma levert twee uitvoerformaten:
- OpenSCAD bestand.
Te bekijken en aan te passen in OpenSCAD
Daarna te exporteren naar STL - STL bestand
Dit bestand kan direct naar een 3D-printer worden gestuurd.
Interactieve Prompt
Het programma werkt via een interactieve prompt.
- Eerst geef je op met welke van de drie modi’s je wilt werken.
- Daarna geef je de gewenst grid size op (de grid is altijd vierkant, dus één maat is genoeg).
- Daarna geef je op welke (buitenmaat) je box moet krijgen. Je krijgt een lijst met mogelijke lengtes en breedtes te zien waar je uit moet kiezen).
- Nu geef je per vak op uit hoeveel “grids” zo’n vak moet bestaan.
- Vervolgens geef je op hoeveel vakken met deze maat je wilt hebben.
Het verloop van de prompt ziet er zo uit:
python gritLayoutGenerator.py <Enter> gridLayoutGenerator ------------------- Select a project: [1] myLadeInlay [2] newProject Choice [1-2]: 1 <Enter> Project: myLadeInlay Layout mode: [1] Fixed grid (enter gridSize, then box dimensions) [2] Fixed box Length (suggest gridSize and box Width) [3] Fixed box Width (suggest gridSize and box Length) Choice [1-3]: 1 <Enter> Enter random seed (rngSeed) [12345]: <Enter> Enter number of layout attempts [100]: <Enter> Enter number of attempts per cluster group [50]: <Enter> Enter gridSize in mm: 19 <Enter> Axis values (gridSize multiples, 100..300): 114, 133, 152, 171, 190, 209, 228, 247, 266, 285 Enter complete outer box size in mm (LxWxH): 190x228x70 <Enter> Enter outer wall thickness (outerWall) in mm: 1 <Enter> Enter inner wall thickness (innerWall) in mm: 1 <Enter> Enter bottom thickness in mm: 1.4 <Enter> Enter inner wall height in mm: 70 <Enter> Enter compartment requirements. Use format NxM (examples: 1x1, 1x2, 2x6, 3x4) Empty size reuses the default size and still asks for count. If no default exists yet, empty size finishes input. Compartment 1 size in grid units: 2x4 <Enter> How many of 2x4: 3 <Enter> Compartment 2 size in grid units: 4x4 <Enter> How many of 4x4: 1 <Enter> Compartment 3 size in grid units: 4x6 <Enter> How many of 4x6: 1 <Enter> Compartment 4 size in grid units: 4x8 <Enter> How many of 4x8: 1 <Enter> Compartment 5 size in grid units: 2x3 <Enter> How many of 2x3: 3 <Enter> Compartment 6 size in grid units: <Enter> Packing progress: attempt 1/100, best placed compartments 9/9, current missing compartments - Grid: 10 x 12 cells (120 total) Placed compartments: 9 All requested compartments fit. Leftover 1x1 compartments added: 6 OpenSCAD file written: myLadeInlay.scad STL file written: myLadeInlay.stl
.. en dit is het resultaat:


Follow