{"id":8719,"date":"2026-03-29T15:35:38","date_gmt":"2026-03-29T13:35:38","guid":{"rendered":"https:\/\/willem.aandewiel.nl\/?p=8719"},"modified":"2026-03-31T15:25:03","modified_gmt":"2026-03-31T13:25:03","slug":"vakverdeling-genereren-voor-laden-en-dozen","status":"publish","type":"post","link":"https:\/\/willem.aandewiel.nl\/index.php\/2026\/03\/29\/vakverdeling-genereren-voor-laden-en-dozen\/","title":{"rendered":"Vakverdeling genereren voor laden en dozen"},"content":{"rendered":"\n<p>240 keer bekeken \/ views<\/p>\n\n\n\n<p>Een lade indelen lijkt simpel\u2026 tot je meerdere vakgroottes wilt combineren.<\/p>\n\n\n\n<p>In deze post beschrijf ik twee <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">python<\/a> programma&#8217;s die ik geschreven heb om mooie vakverdelingen voor mijn onderdelen dozen te maken.<\/p>\n\n\n\n<p class=\"has-light-gray-background-color has-background\">You can find an English translation of this post <a href=\"https:\/\/willem.aandewiel.nl\/index.php\/2026\/03\/30\/generating-compartment-layouts-for-drawers-and-boxes\/\">here<\/a>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>boxGenerator.py <\/li>\n\n\n\n<li>gridLayoutGenerator.py <\/li>\n<\/ul>\n\n\n\n<p>Beide genereren openSCAD programma&#8217;s maar ook direct bruikbare <code>.stl <\/code>bestanden voor 3D-printen.<\/p>\n\n\n\n<p>In <a href=\"https:\/\/github.com\/mrWheel\/boxGenerator\" target=\"_blank\" rel=\"noreferrer noopener\">deze repository <\/a>staan twee scripts die puzzel werk voor je uit handen nemen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>boxGenerator.py<\/li>\n\n\n\n<li>gridLayoutGenerator.py<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">boxGenerator.py<\/h1>\n\n\n\n<p>boxGenerator.py maakt een vrije indeling van rechthoekige vakken binnen een box.<\/p>\n\n\n\n<p>Je geeft op:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>afmetingen van de box<\/li>\n\n\n\n<li>afmetingen van vakken<\/li>\n\n\n\n<li>aantal vakken per type<\/li>\n<\/ul>\n\n\n\n<p>Het script probeert die vakken te plaatsen binnen het beschikbare oppervlak.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Interactieve Prompt<\/h2>\n\n\n\n<p>Het programma werkt via een interactieve prompt.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Eerst geef je de buitenmaten van de te printen box op.<\/li>\n\n\n\n<li>Daarna geef je per gewenst vak de grootte van dat vak op (lengte en breedte).<\/li>\n\n\n\n<li>Vervolgens geef je op hoeveel vakken met deze maat je wilt hebben en hoveel van deze vakken steeds direct tegen elkaar geprint moeten worden.<\/li>\n\n\n\n<li>Tenslotte geef je op of je een voorkeur voor de plaats van deze vakken wilt hebben <br>bijvoorbeeld: &#8216;random&#8217;, &#8216;boven&#8217; of &#8216;onder&#8217; aan de box.<\/li>\n<\/ol>\n\n\n\n<p>Het script probeert alle vakken te plaatsen. Lukt dat niet, dan geeft het aan:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>welk vak niet past<\/li>\n\n\n\n<li>of van welk type er minder kunnen worden geplaatst<\/li>\n<\/ul>\n\n\n\n<p>Hier zie je hoe dit in de praktijk werkt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">.\/boxGenerator.py \nOpenSCAD box generator\n----------------------\nSelect a project:\n  [1] evenSpacers\n  [2] ladeBox2\n  [3] newProject\nChoice [1-3]: 2\nProject: ladeBox2\n\nEnter outer box size (length x width x height, example: 300x200x80): 190x172x70 &lt;Enter> \nEnter inner wall height in mm: 68.8 &lt;Enter>\nEnter outer wall thickness in mm: 1 &lt;Enter>\nEnter inner divider thickness in mm: 1 &lt;Enter> \nEnter bottom thickness in mm: 1.2 &lt;Enter> \nEnter leftover compartment size (length x width, '-' = skip): &lt;Enter> \nEnter random seed [12345]: &lt;Enter>\nEnter number of layout attempts [120]: &lt;Enter>\nEnter number of attempts per cluster group [50]: &lt;Enter>\n\nEnter compartment definitions.\nExample size: 25x30\nCluster size means how many equal compartments must touch each other.\nExample: size 25x30, count 8, cluster 3 => groups of 3, 3, and 2\nEmpty size reuses the default size and still shows the remaining questions.\nIf no default exists yet, empty size finishes input.\nUse 'keep' to reuse a default compartment without editing.\nUse '0x0' to remove\/skip a compartment and skip follow-up questions.\n\nCompartment 1 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): 190x55 &lt;Enter>\nCompartment 1 count: 2 &lt;Enter>\nCompartment 1 cluster size: 1 &lt;Enter>\nCompartment 1 preferred placement (random\/front\/back) [random]: &lt;Enter>\n\nCompartment 2 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): 100x55 &lt;Enter>\nCompartment 2 count: 1 &lt;Enter>\nCompartment 2 cluster size: 1 &lt;Enter>\nCompartment 2 preferred placement (random\/front\/back) [random]: &lt;Enter>\n\nCompartment 3 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): 80x50 &lt;Enter>\nCompartment 3 count: 1 &lt;Enter>\nCompartment 3 cluster size: 1 &lt;Enter>\nCompartment 3 preferred placement (random\/front\/back) [random]: &lt;Enter>\n\nCompartment 4 size (length x width) (empty = default-size, 'keep' = default-all, '0x0' = skip): &lt;Enter>\n\nPacking progress: attempt 1\/120, best placed compartments 3\/4, current missing compartments 3\nPacking progress: attempt 10\/120, best placed compartments 3\/4, current missing compartments 3\nPacking progress: attempt 20\/120, best placed compartments 3\/4, current missing compartments none\nPacking progress: attempt 30\/120, best placed compartments 4\/4, current missing compartments none\nPacking progress: attempt 40\/120, best placed compartments 4\/4, current missing compartments 3\nPacking progress: attempt 50\/120, best placed compartments 4\/4, current missing compartments none\nPacking progress: attempt 60\/120, best placed compartments 4\/4, current missing compartments 3\nPacking progress: attempt 70\/120, best placed compartments 4\/4, current missing compartments 3\nPacking progress: attempt 80\/120, best placed compartments 4\/4, current missing compartments none\nPacking progress: attempt 90\/120, best placed compartments 4\/4, current missing compartments none\nPacking progress: attempt 100\/120, best placed compartments 4\/4, current missing compartments none\nPacking progress: attempt 110\/120, best placed compartments 4\/4, current missing compartments none\nPacking progress: attempt 120\/120, best placed compartments 4\/4, current missing compartments none\n\nPlaced cluster groups:\n  group_1_1      position=(7.5, 0.0) footprint=180.5x55.0 cells=1 orientation=single pref=random\/random\n  group_1_2      position=(7.5, 115.0) footprint=180.5x55.0 cells=1 orientation=single pref=random\/random\n  group_2_1      position=(88.0, 60.0) footprint=100.0x55.0 cells=1 orientation=single pref=random\/random\n  group_3_1      position=(8.0, 55.0) footprint=80.0x50.0 cells=1 orientation=single pref=random\/random\n\nRequested cavities:\n  requested_01 position=(0.0, 0.0) size=188.0x55.0\n  requested_02 position=(0.0, 115.0) size=188.0x55.0\n  requested_03 position=(88.0, 55.0) size=100.0x60.0\n  requested_04 position=(0.0, 55.0) size=88.0x60.0\n\nRemaining free cavities:\n  None\n\nAbsorbed tiny gaps between requested cavities:\n  adjustment_01 axis=y between=requested_01\/requested_03 gap=5.000 growth=+0.000\/+5.000\n  adjustment_02 axis=y between=requested_04\/requested_02 gap=10.000 growth=+10.000\/+0.000\n\nOpenSCAD file written: ladeBox2.scad\nSTL file written: ladeBox2.stl\n<\/pre>\n\n\n\n<p>En hieronder staat het resultaat:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_3D.png\"><img loading=\"lazy\" decoding=\"async\" width=\"952\" height=\"859\" data-id=\"8727\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_3D.png\" alt=\"\" class=\"wp-image-8727\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_3D.png 952w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_3D-300x271.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_3D-768x693.png 768w\" sizes=\"auto, (max-width: 952px) 100vw, 952px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_top-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"616\" height=\"556\" data-id=\"8729\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_top-1.png\" alt=\"\" class=\"wp-image-8729\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_top-1.png 616w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/ladenBox2_top-1-300x271.png 300w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">gridLayoutGenerator.py<\/h1>\n\n\n\n<p>gridLayoutGenerator.py werkt met een vast raster.<\/p>\n\n\n\n<p>Ge\u00efnspireerd door <a href=\"https:\/\/gridfinitygenerator.com\/en\">Gridfinity<\/a>, maar zonder de overhead en daardoor met minder filamentgebruik.<\/p>\n\n\n\n<p>Alles gebeurt op basis van een gridsize. Alle vakken zijn veelvouden daarvan.<\/p>\n\n\n\n<p>Dat zorgt voor:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>strakke uitlijning<\/li>\n\n\n\n<li>eenvoudige indelingen<\/li>\n\n\n\n<li>voorspelbare resultaten<\/li>\n<\/ul>\n\n\n\n<p>Drie werkmodi<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>boxlengte vast Lengte opgegeven<br>gridsize en breedte berekend en via lijst te selecteren<\/li>\n\n\n\n<li>boxbreedte vast Breedte opgegeven<br>gridsize en lengte berekend en via lijst te selecteren<\/li>\n\n\n\n<li>gridsize<br>vast Boxafmetingen zijn veelvouden van gridsize en via lijst te selecteren<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Uitvoer<\/h2>\n\n\n\n<p>Het programma levert twee uitvoerformaten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OpenSCAD bestand. <br>Te bekijken en aan te passen in <a href=\"https:\/\/openscad.org\/downloads.html\" target=\"_blank\" rel=\"noreferrer noopener\">OpenSCAD<\/a> <br>Daarna te exporteren naar STL<\/li>\n\n\n\n<li>STL bestand <br>Dit bestand kan direct naar een 3D-printer worden gestuurd.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Interactieve Prompt<\/h2>\n\n\n\n<p>Het programma werkt via een interactieve prompt.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Eerst geef je op met welke van de drie modi&#8217;s je wilt werken.<\/li>\n\n\n\n<li>Daarna geef je de gewenst grid size op (de grid is altijd vierkant, dus \u00e9\u00e9n maat is genoeg).<\/li>\n\n\n\n<li>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).<\/li>\n\n\n\n<li>Nu geef je per vak op uit hoeveel &#8220;grids&#8221; zo&#8217;n vak moet bestaan.<\/li>\n\n\n\n<li>Vervolgens geef je op hoeveel vakken met deze maat je wilt hebben.<\/li>\n<\/ol>\n\n\n\n<p>Het verloop van de prompt ziet er zo uit:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python gritLayoutGenerator.py &lt;Enter>\n\ngridLayoutGenerator\n-------------------\nSelect a project:\n  [1] myLadeInlay\n  [2] newProject\nChoice [1-2]: 1 &lt;Enter>\nProject: myLadeInlay\n\nLayout mode:\n  [1] Fixed grid        (enter gridSize, then box dimensions)\n  [2] Fixed box Length  (suggest gridSize and box Width)\n  [3] Fixed box Width   (suggest gridSize and box Length)\nChoice [1-3]: 1 &lt;Enter> \nEnter random seed (rngSeed) [12345]: &lt;Enter>\nEnter number of layout attempts [100]: &lt;Enter>\nEnter number of attempts per cluster group [50]: &lt;Enter>\nEnter gridSize in mm: 19 &lt;Enter>\nAxis values (gridSize multiples, 100..300): 114, 133, 152, 171, 190, 209, 228, 247, 266, 285\nEnter complete outer box size in mm (LxWxH): 190x228x70 &lt;Enter> \nEnter outer wall thickness (outerWall) in mm: 1 &lt;Enter>\nEnter inner wall thickness (innerWall) in mm: 1 &lt;Enter>\nEnter bottom thickness in mm: 1.4 &lt;Enter>\nEnter inner wall height in mm: 70 &lt;Enter>\n\nEnter compartment requirements.\nUse format NxM (examples: 1x1, 1x2, 2x6, 3x4)\nEmpty size reuses the default size and still asks for count.\nIf no default exists yet, empty size finishes input.\n\nCompartment 1 size in grid units: 2x4 &lt;Enter>\nHow many of 2x4: 3 &lt;Enter>\n\nCompartment 2 size in grid units: 4x4 &lt;Enter>\nHow many of 4x4: 1 &lt;Enter>\n\nCompartment 3 size in grid units: 4x6 &lt;Enter>\nHow many of 4x6: 1 &lt;Enter>\n\nCompartment 4 size in grid units: 4x8 &lt;Enter>\nHow many of 4x8: 1 &lt;Enter> \n\nCompartment 5 size in grid units: 2x3 &lt;Enter>\nHow many of 2x3: 3 &lt;Enter>\n\nCompartment 6 size in grid units: &lt;Enter>\n\nPacking progress: attempt 1\/100, best placed compartments 9\/9, current missing compartments -\n\nGrid: 10 x 12 cells (120 total)\nPlaced compartments: 9\nAll requested compartments fit. Leftover 1x1 compartments added: 6\nOpenSCAD file written: myLadeInlay.scad\nSTL file written: myLadeInlay.stl\n<\/pre>\n\n\n\n<p>.. en dit is het resultaat:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_top.png\"><img loading=\"lazy\" decoding=\"async\" width=\"596\" height=\"683\" data-id=\"8737\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_top.png\" alt=\"\" class=\"wp-image-8737\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_top.png 596w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_top-262x300.png 262w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_3D.png\"><img loading=\"lazy\" decoding=\"async\" width=\"910\" height=\"692\" data-id=\"8738\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_3D.png\" alt=\"\" class=\"wp-image-8738\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_3D.png 910w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_3D-300x228.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2026\/03\/myLadeInlay_3D-768x584.png 768w\" sizes=\"auto, (max-width: 910px) 100vw, 910px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>240 keer bekeken \/ views Een lade indelen lijkt simpel\u2026 tot je meerdere vakgroottes wilt combineren. In deze post beschrijf ik twee python programma&#8217;s die ik geschreven heb om mooie vakverdelingen voor mijn onderdelen dozen te maken. You can find &hellip; <a href=\"https:\/\/willem.aandewiel.nl\/index.php\/2026\/03\/29\/vakverdeling-genereren-voor-laden-en-dozen\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":8758,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[149,196,197,175],"class_list":["post-8719","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-3d","tag-3d-printen","tag-openscad","tag-python3"],"views":240,"_links":{"self":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/8719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/comments?post=8719"}],"version-history":[{"count":22,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/8719\/revisions"}],"predecessor-version":[{"id":8766,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/8719\/revisions\/8766"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/media\/8758"}],"wp:attachment":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/media?parent=8719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/categories?post=8719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/tags?post=8719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}