Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Boxes.py

Create boxes and more with a laser cutter!

Boxes.py is python library for generating drawings to be used with a laser cutter. It comes with a growing set of ready-to-use, fully parametrized generators:

  • Boxes in various shapes and with various lids
  • Boxes using flex cuts with rounded corners and living hinges
  • Type trays with and without outer walls and floors
  • Shelves
  • Book covers with flex spine
  • Magazine files
  • Timing belt pulleys and gears
  • and more

And a few one trick ponies:

  • A desktop arcade cabinet
  • A drill stand
  • A castle tower
  • A cutlery stand

Have a look into the examples/ directory <https://github.com/florianfesti/boxes/tree/master/examples/>or the online generator <https://www.festi.info/boxes.py/index.html> to see how the results look like.

Features

It generates SVG images that can be viewed directly in a web brower but also postscript and - with pstoedit as external helper - other vector formats including dxf, plt (aka hpgl) and gcode.

Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements.

The "burn" parameter compensates for the material removed by the laser. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue.

Finger Joints are the work horse of the library. They allow 90° edges and T connections. Their size is scaled up with the material "thickness" to maintain the same appearance. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators.

Dovetail joints can be used to join pieces in the same plane.

Flex cuts allows bending and stretching the material in one direction. This is used for rounded edges and living hinges.

Usage

There are multiple ways to use the available generators:

  • Try them out at <https://www.festi.info/boxes.py/index.html>
  • Use them as Inkscape extensions under Extensions->Boxes.py
  • Execute the scripts/boxes tool and pass the name of the generator together with the measurements on the command line.
  • Run scripts/boxesserver which provides an web interface on port 8000.
  • Add a WSGIScriptAlias to scripts/boxesserver in your httpd config.

You can also create your own generators using boxes/generators/_template.py or any of the generators in boxes/generators as a starting point.

Documentation

The module comes with Sphinx based documentation. The rendered version can be viewed at <https://florianfesti.github.io/boxes/html/index.html>.

About

Python module for generationg SVG plots for laser cutting boxes

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages