From b5df3a8e978e743f41e3e5edcc78cc898ac07150 Mon Sep 17 00:00:00 2001 From: unfunny Date: Sat, 14 Feb 2026 19:53:13 -0500 Subject: [PATCH 1/8] add readme.md n stuff --- README.md | 22 ++++++++++++++++++++++ pwa-512x512.png | Bin 0 -> 27220 bytes 2 files changed, 22 insertions(+) create mode 100644 README.md create mode 100644 pwa-512x512.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..9ca1957 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# svg2nametag-Ren + +

+ Logo +

+ +## Overview +**svg2nametag-Ren** is a specialized toolset designed to convert 2D SVG designs into 3D printable nametag models (STL). It specifically handles multi-material or multi-color 3D prints by automatically separating SVG layers into distinct STL files optimized for Bambu Studio, OrcaSlicer, or PrusaSlicer. + +The project offers two primary ways to work: +- **Python CLI**: A robust command-line interface for bulk-processing entire directories of SVGs on your local machine. +- **Web App (WASM)**: A high-performance, client-side web application powered by Manifold 3D. It runs entirely in the browser, supports batch folder uploads, and works offline as a PWA. + +## Technical Specifications +Every model produced by the converter follows a precise set of dimensions to ensure consistency and professional-grade print results: + +- **Automatic Scaling**: All nametags are normalized to a standard width of **87.80mm**. +- **Background Layer**: The base layer is extruded to a thickness of **3.0mm**. +- **Text/Graphic Layers**: Primary and accent layers are extruded to a height of **2.0mm**. +- **Optimized Offsets**: Text layers are offset by **3.0mm** along the Z-axis, ensuring they sit perfectly on top of the background. +- **Hole Handling**: Implements a robust **Even-Odd** fill rule to correctly render internal contours in complex typography (e.g., the centers of 'B', 'O', or 'R'). +- **Layer Classification**: Recognizes SVG classes (`st1`, `st2`) to split designs into separate STL components for easy filament assignment. diff --git a/pwa-512x512.png b/pwa-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..2bab5bb138941470413a09be88bd124990854df6 GIT binary patch literal 27220 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 Date: Sat, 14 Feb 2026 19:56:51 -0500 Subject: [PATCH 2/8] Update README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9ca1957..d11c992 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,23 @@ # svg2nametag-Ren

- Logo + Logo

## Overview **svg2nametag-Ren** is a specialized toolset designed to convert 2D SVG designs into 3D printable nametag models (STL). It specifically handles multi-material or multi-color 3D prints by automatically separating SVG layers into distinct STL files optimized for Bambu Studio, OrcaSlicer, or PrusaSlicer. The project offers two primary ways to work: -- **Python CLI**: A robust command-line interface for bulk-processing entire directories of SVGs on your local machine. +- **Python CLI (You Are Here)**: A robust command-line interface for bulk-processing entire directories of SVGs on your local machine. Requires basic command line knowledge. - **Web App (WASM)**: A high-performance, client-side web application powered by Manifold 3D. It runs entirely in the browser, supports batch folder uploads, and works offline as a PWA. ## Technical Specifications Every model produced by the converter follows a precise set of dimensions to ensure consistency and professional-grade print results: -- **Automatic Scaling**: All nametags are normalized to a standard width of **87.80mm**. -- **Background Layer**: The base layer is extruded to a thickness of **3.0mm**. +- **Automatic Scaling**: All nametags are normalized to a standard width of **87.80mm**, or **150%** scale. +- **Background Layer**: The background is set to a thickness of **3.0mm**. - **Text/Graphic Layers**: Primary and accent layers are extruded to a height of **2.0mm**. -- **Optimized Offsets**: Text layers are offset by **3.0mm** along the Z-axis, ensuring they sit perfectly on top of the background. +- **Optimized Offsets**: Text layers are offset by **3.0mm** along the Z-axis, ensuring they sit perfectly on top of the background. (They end up at a coords 4mm.) - **Hole Handling**: Implements a robust **Even-Odd** fill rule to correctly render internal contours in complex typography (e.g., the centers of 'B', 'O', or 'R'). - **Layer Classification**: Recognizes SVG classes (`st1`, `st2`) to split designs into separate STL components for easy filament assignment. +- **Relatively Low Poly Count** Won't explode your slicer From e5ec87cf3d30877ff16554f3b3591072f61c1a43 Mon Sep 17 00:00:00 2001 From: unfunny Date: Sat, 14 Feb 2026 20:04:31 -0500 Subject: [PATCH 3/8] Upload files to "/" --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index d11c992..aa3859e 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,23 @@ # svg2nametag-Ren

- Logo + Logo

## Overview -**svg2nametag-Ren** is a specialized toolset designed to convert 2D SVG designs into 3D printable nametag models (STL). It specifically handles multi-material or multi-color 3D prints by automatically separating SVG layers into distinct STL files optimized for Bambu Studio, OrcaSlicer, or PrusaSlicer. +**svg2nametag-Ren** converts 2D SVG designs into 3D printable nametags. It automatically splits your design into separate files for different colors, making it easy to print multi-color nametags on printers like the Bambu Lab series. -The project offers two primary ways to work: -- **Python CLI (You Are Here)**: A robust command-line interface for bulk-processing entire directories of SVGs on your local machine. Requires basic command line knowledge. -- **Web App (WASM)**: A high-performance, client-side web application powered by Manifold 3D. It runs entirely in the browser, supports batch folder uploads, and works offline as a PWA. +For detailed setup and usage guides, please check out the **[Wiki](wiki/Home.md)**. -## Technical Specifications -Every model produced by the converter follows a precise set of dimensions to ensure consistency and professional-grade print results: +## Physical Dimensions +The program automatically scales all designs to these specific measurements for a consistent, professional look: -- **Automatic Scaling**: All nametags are normalized to a standard width of **87.80mm**, or **150%** scale. -- **Background Layer**: The background is set to a thickness of **3.0mm**. -- **Text/Graphic Layers**: Primary and accent layers are extruded to a height of **2.0mm**. -- **Optimized Offsets**: Text layers are offset by **3.0mm** along the Z-axis, ensuring they sit perfectly on top of the background. (They end up at a coords 4mm.) -- **Hole Handling**: Implements a robust **Even-Odd** fill rule to correctly render internal contours in complex typography (e.g., the centers of 'B', 'O', or 'R'). -- **Layer Classification**: Recognizes SVG classes (`st1`, `st2`) to split designs into separate STL components for easy filament assignment. -- **Relatively Low Poly Count** Won't explode your slicer +- **Total Width**: 87.80 mm +- **Background Thickness**: 3.0 mm +- **Text/Detail Thickness**: 2.0 mm +- **Text/Detail Offset**: 3.0 mm (Text sits at 4mm from the bottom) +- **Total Height**: 5.0 mm (Text sits 3mm high and extends 2mm up) + +## Ways to Use +- **Web App**: The easiest way! Just open the web page, drag your files in, and download the results. No installation required. +- **Python Tool**: For advanced users who want to process hundreds of files at once using the command line. Requires Python 3.12 or higher and some basic knowledge of the command line. From 71c6cc62660faddef598bb2c86bcb0b6f3b9fc48 Mon Sep 17 00:00:00 2001 From: unfunny Date: Sat, 14 Feb 2026 20:04:53 -0500 Subject: [PATCH 4/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aa3859e..37c0eb7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # svg2nametag-Ren

- Logo + Logo

## Overview From ba7c039d260295fc9482117ce5e65775bd707c5e Mon Sep 17 00:00:00 2001 From: unfunny Date: Sat, 14 Feb 2026 20:09:37 -0500 Subject: [PATCH 5/8] Fix Link (From WebApp branch) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 37c0eb7..9d9549e 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Overview **svg2nametag-Ren** converts 2D SVG designs into 3D printable nametags. It automatically splits your design into separate files for different colors, making it easy to print multi-color nametags on printers like the Bambu Lab series. -For detailed setup and usage guides, please check out the **[Wiki](wiki/Home.md)**. +For detailed setup and usage guides, please check out the **[Wiki](https://git.randomhack.com/Retro/svg2NameTag-Ren.git)**. ## Physical Dimensions The program automatically scales all designs to these specific measurements for a consistent, professional look: From 444dd80a737c80f689eb07eb500276ed5a7b5baa Mon Sep 17 00:00:00 2001 From: Unfunny Date: Sat, 11 Apr 2026 12:38:19 -0400 Subject: [PATCH 6/8] Add text inset logic for better 3D print adhesion - Increase text thickness to 2.3mm (base 2.0mm + 0.3mm inset compensation) - Adjust text Z offset to 2.7mm to inset text into background - Total height remains at 5mm - Update README to reflect new text thickness --- README.md | 2 +- convert_nametags.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9d9549e..088e15b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The program automatically scales all designs to these specific measurements for - **Total Width**: 87.80 mm - **Background Thickness**: 3.0 mm -- **Text/Detail Thickness**: 2.0 mm +- **Text/Detail Thickness**: 2.3 mm (includes 0.3mm inset compensation) - **Text/Detail Offset**: 3.0 mm (Text sits at 4mm from the bottom) - **Total Height**: 5.0 mm (Text sits 3mm high and extends 2mm up) diff --git a/convert_nametags.py b/convert_nametags.py index e93fd3f..7e52ed5 100644 --- a/convert_nametags.py +++ b/convert_nametags.py @@ -15,8 +15,8 @@ logger = logging.getLogger(__name__) # Constants based on specs BACKGROUND_THICKNESS = 3.0 -TEXT_THICKNESS = 2.0 -TEXT_Z_OFFSET = 3.0 # Starts on top of background +TEXT_THICKNESS = 2.0 + 0.3 # 2.3mm (base 2.0 + 0.3mm for inset compensation) +TEXT_Z_OFFSET = 3.0 - 0.3 # 2.7mm - starts inset into background CURVE_RESOLUTION = 64 # number of segments per circle # SVG Class mappings From e62fa8869fc634fc977f593c9a573e82180f8a1a Mon Sep 17 00:00:00 2001 From: Unfunny Date: Sat, 11 Apr 2026 13:01:05 -0400 Subject: [PATCH 7/8] Add text inset for better adhesion - Increase text thickness to 2.3mm (base 2.0mm + 0.3mm inset compensation) - Adjust text Z offset to 2.7mm to inset text into background - Total height remains at 5mm - Update README to reflect new text thickness --- .gitignore | 3 ++- convert_nametags.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index def4cc9..d864857 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .venv/ - +nametags/ +stls/ \ No newline at end of file diff --git a/convert_nametags.py b/convert_nametags.py index 7e52ed5..d2f181a 100644 --- a/convert_nametags.py +++ b/convert_nametags.py @@ -205,6 +205,8 @@ def create_extrusion(paths, height, z_offset=0.0, scale=1.0): else: mesh = trimesh.util.concatenate(meshes) + + mesh.apply_translation([0, 0, z_offset]) return mesh except Exception as e: From 301421e29fb35d1a9da678886e4493618a81ad13 Mon Sep 17 00:00:00 2001 From: Unfunny Date: Sat, 11 Apr 2026 13:01:46 -0400 Subject: [PATCH 8/8] Fix README to reflect correct text offset --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 088e15b..5c139a3 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,10 @@ The program automatically scales all designs to these specific measurements for - **Total Width**: 87.80 mm - **Background Thickness**: 3.0 mm +- **Background Thickness**: 3.0 mm - **Text/Detail Thickness**: 2.3 mm (includes 0.3mm inset compensation) -- **Text/Detail Offset**: 3.0 mm (Text sits at 4mm from the bottom) -- **Total Height**: 5.0 mm (Text sits 3mm high and extends 2mm up) +- **Text/Detail Offset**: 2.7 mm (Text is inset into background for better adhesion) +- **Total Height**: 5.0 mm ## Ways to Use - **Web App**: The easiest way! Just open the web page, drag your files in, and download the results. No installation required.