Open Box :)

This commit is contained in:
babayaga 2025-07-04 12:37:24 +02:00
parent 93c09e2d4a
commit 935c8cb526
15 changed files with 1544 additions and 2 deletions

BIN
cad/drawers/500/10/Sheet-8.SLDPRT (Stored with Git LFS)

Binary file not shown.

BIN
cad/drawers/500/10/~$500-10-Single.SLDASM (Stored with Git LFS) Normal file

Binary file not shown.

BIN
cad/drawers/500/10/~$Sheet-8.SLDPRT (Stored with Git LFS) Normal file

Binary file not shown.

BIN
cad/drawers/tools/box_folding_tool.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,268 @@
// Customizable parameters for the box folding tool
// These values are based on the provided screenshot.
// Overall dimensions
TotalWidth = 500; // [100:1000]
TotalLength = 500; // [100:1000]
Height = 80; // [20:200]
// Material and slot properties
TotalThickness = 5; // [1:20]
BaseThickness = 3; // [0.5:19]
Slot_Width_Walls = 8; // [1:20]
// Internal grid configuration
Nb_Boxes_U = 2; // [1:10]
Nb_Boxes_V = 2; // [1:10]
// View control
Folded_View = false; // [true, false]
// Use "export" to render all parts separately for STEP conversion
view_mode = "preview"; // ["preview", "export"]
// Note: InnerBox_Width from the screenshot (100) is not used directly.
// Instead, the compartment widths are calculated based on TotalWidth, Height, and Nb_Boxes_U/V.
// This ensures the design remains consistent with the overall dimensions.
// ---------------------------------------------------------------------
// Main module to generate the box folding pattern
// ---------------------------------------------------------------------
module unfolded_pattern() {
GrooveDepth = TotalThickness - BaseThickness;
difference() {
// 1. Create the base plate
cube([TotalWidth, TotalLength, TotalThickness], center = true);
// 2. Create the cutting grooves
translate([0, 0, TotalThickness/2 - GrooveDepth/2]) {
// Grooves for the main box walls
wall_grooves();
// Grooves for internal compartments
if (Nb_Boxes_U > 1 || Nb_Boxes_V > 1) {
internal_grooves();
}
}
}
}
// ---------------------------------------------------------------------
// Helper modules
// ---------------------------------------------------------------------
// Module for creating the grooves for the outer walls
module wall_grooves() {
InnerWidth = TotalWidth - 2 * Height;
InnerLength = TotalLength - 2 * Height;
GrooveDepth = TotalThickness - BaseThickness;
// Grooves parallel to Y-axis (vertical)
translate([-InnerWidth/2, 0, 0])
cube([Slot_Width_Walls, TotalLength, GrooveDepth], center=true);
translate([InnerWidth/2, 0, 0])
cube([Slot_Width_Walls, TotalLength, GrooveDepth], center=true);
// Grooves parallel to X-axis (horizontal)
translate([0, -InnerLength/2, 0])
cube([TotalWidth, Slot_Width_Walls, GrooveDepth], center=true);
translate([0, InnerLength/2, 0])
cube([TotalWidth, Slot_Width_Walls, GrooveDepth], center=true);
}
// Module for creating the grooves for the internal compartments
module internal_grooves() {
InnerWidth = TotalWidth - 2 * Height;
InnerLength = TotalLength - 2 * Height;
GrooveDepth = TotalThickness - BaseThickness;
CompartmentWidth = (InnerWidth - (Nb_Boxes_U - 1) * Slot_Width_Walls) / Nb_Boxes_U;
CompartmentLength = (InnerLength - (Nb_Boxes_V - 1) * Slot_Width_Walls) / Nb_Boxes_V;
// Internal vertical grooves
if (Nb_Boxes_U > 1) {
for (i = [1 : Nb_Boxes_U - 1]) {
x_pos = -InnerWidth/2 + i * CompartmentWidth + (i - 1/2) * Slot_Width_Walls;
translate([x_pos, 0, 0])
cube([Slot_Width_Walls, InnerLength, GrooveDepth], center = true);
}
}
// Internal horizontal grooves
if (Nb_Boxes_V > 1) {
for (i = [1 : Nb_Boxes_V - 1]) {
y_pos = -InnerLength/2 + i * CompartmentLength + (i - 1/2) * Slot_Width_Walls;
translate([0, y_pos, 0])
cube([InnerWidth, Slot_Width_Walls, GrooveDepth], center = true);
}
}
}
// ---------------------------------------------------------------------
// Modules for Folded View
// ---------------------------------------------------------------------
// Generates the fully assembled 3D box
module folded_box() {
// Inner dimensions of the box
InnerWidth = TotalWidth - 2 * Height;
InnerLength = TotalLength - 2 * Height;
// Material thickness for all parts
wall_thickness = TotalThickness;
// 1. Base Plate
translate([0, 0, wall_thickness / 2])
cube([InnerWidth, InnerLength, wall_thickness], center = true);
// 2. Outer Walls
// South Wall (bottom) - Full Width
translate([0, -InnerLength/2, Height/2 + wall_thickness])
rotate([90, 0, 0])
cube([InnerWidth, Height, wall_thickness], center=true);
// North Wall (top) - Full Width
translate([0, InnerLength/2, Height/2 + wall_thickness])
rotate([-90, 0, 0])
cube([InnerWidth, Height, wall_thickness], center=true);
// West Wall (left) - Shortened to fit between North/South walls
translate([-InnerWidth/2, 0, Height/2 + wall_thickness])
rotate([0, 90, 0])
cube([Height, InnerLength - 2 * wall_thickness, wall_thickness], center=true);
// East Wall (right) - Shortened to fit between North/South walls
translate([InnerWidth/2, 0, Height/2 + wall_thickness])
rotate([0, -90, 0])
cube([Height, InnerLength - 2 * wall_thickness, wall_thickness], center=true);
// 3. Internal Dividers
internal_dividers_folded();
}
// Generates the interlocking internal dividers for the folded view
module internal_dividers_folded() {
InnerWidth = TotalWidth - 2 * Height;
InnerLength = TotalLength - 2 * Height;
divider_thickness = Slot_Width_Walls; // Use slot width as the divider material thickness
// Calculate compartment sizes
Compartment_U = (InnerWidth + divider_thickness) / Nb_Boxes_U;
Compartment_V = (InnerLength + divider_thickness) / Nb_Boxes_V;
// Vertical dividers (U-direction)
for (i = [1 : Nb_Boxes_U - 1]) {
x_pos = -InnerWidth/2 + i * Compartment_U - divider_thickness/2;
difference() {
// Main divider piece
translate([x_pos, 0, Height/2 + TotalThickness])
cube([divider_thickness, InnerLength, Height], center=true);
// Slots for horizontal dividers (top-down)
for (j = [1 : Nb_Boxes_V - 1]) {
y_pos = -InnerLength/2 + j * Compartment_V - divider_thickness/2;
translate([x_pos, y_pos, Height * 0.75 + TotalThickness])
cube([divider_thickness + 0.1, divider_thickness, Height/2], center=true);
}
}
}
// Horizontal dividers (V-direction)
for (j = [1 : Nb_Boxes_V - 1]) {
y_pos = -InnerLength/2 + j * Compartment_V - divider_thickness/2;
difference() {
// Main divider piece
translate([0, y_pos, Height/2 + TotalThickness])
cube([InnerWidth, divider_thickness, Height], center=true);
// Slots for vertical dividers (bottom-up)
for (i = [1 : Nb_Boxes_U - 1]) {
x_pos = -InnerWidth/2 + i * Compartment_U - divider_thickness/2;
translate([x_pos, y_pos, Height * 0.25 + TotalThickness])
cube([divider_thickness, divider_thickness + 0.1, Height/2], center=true);
}
}
}
}
// ---------------------------------------------------------------------
// Module for exporting all parts separately
// ---------------------------------------------------------------------
module export_layout() {
wall_thickness = TotalThickness;
InnerWidth = TotalWidth - 2 * Height;
InnerLength = TotalLength - 2 * Height;
// 1. Base Plate
translate([0, 0, -TotalThickness/2])
cube([InnerWidth, InnerLength, wall_thickness], center = true);
// Spacing for laying out parts
spacing = TotalWidth;
// 2. Outer Walls
translate([spacing, 0, 0])
cube([InnerWidth, Height, wall_thickness], center=true); // South
translate([spacing, Height + 10, 0])
cube([InnerWidth, Height, wall_thickness], center=true); // North
translate([spacing + InnerWidth + 10, 0, 0])
cube([InnerLength - 2 * wall_thickness, Height, wall_thickness], center=true); // West
translate([spacing + InnerWidth + 10, Height + 10, 0])
cube([InnerLength - 2 * wall_thickness, Height, wall_thickness], center=true); // East
// 3. Internal Dividers
divider_thickness = Slot_Width_Walls;
Compartment_U = (InnerWidth + divider_thickness) / Nb_Boxes_U;
Compartment_V = (InnerLength + divider_thickness) / Nb_Boxes_V;
// Place all vertical dividers in a row
for (i = [1 : Nb_Boxes_U - 1]) {
translate([2 * spacing + (i-1)*(divider_thickness+10), 0, 0])
internal_divider_vertical_export(InnerLength, Compartment_V);
}
// Place all horizontal dividers in a row
for (j = [1 : Nb_Boxes_V - 1]) {
translate([2 * spacing, (j-1)*(Height+10) + Height + 10, 0])
internal_divider_horizontal_export(InnerWidth, Compartment_U);
}
}
// Helper modules for export layout (without difference operations)
module internal_divider_vertical_export(length, compartment_v_size) {
divider_thickness = Slot_Width_Walls;
difference() {
cube([divider_thickness, length, Height], center=true);
// Notches for horizontal dividers (bottom-up)
for (i = [1 : Nb_Boxes_V - 1]) {
y_pos = -length/2 + i * compartment_v_size - divider_thickness/2;
translate([0, y_pos, -Height/4])
cube([divider_thickness + 0.1, divider_thickness, Height/2], center=true);
}
}
}
module internal_divider_horizontal_export(length, compartment_u_size) {
divider_thickness = Slot_Width_Walls;
difference() {
cube([length, divider_thickness, Height], center=true);
// Notches for vertical dividers (top-down)
for (j = [1 : Nb_Boxes_U - 1]) {
x_pos = -length/2 + j * compartment_u_size - divider_thickness/2;
translate([x_pos, 0, Height/4])
cube([divider_thickness, divider_thickness + 0.1, Height/2], center=true);
}
}
}
// ---------------------------------------------------------------------
// Render the final object
// ---------------------------------------------------------------------
if (view_mode == "export") {
export_layout();
} else {
if (Folded_View) {
folded_box();
} else {
unfolded_pattern();
}
}

BIN
cad/drawers/tools/box_folding_tool.step (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,982 @@
solid OpenSCAD_Model
facet normal -1 0 0
outer loop
vertex -4 -167.5 5
vertex -4 -4 45
vertex -4 -4 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -4 -167.5 85
vertex -4 -4 45
vertex -4 -167.5 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -4 -4 45
vertex -4 -167.5 85
vertex -4 -4 85
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -4 4 45
vertex -4 167.5 5
vertex -4 4 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -4 167.5 5
vertex -4 4 45
vertex -4 167.5 85
endloop
endfacet
facet normal -1 -0 0
outer loop
vertex -4 167.5 85
vertex -4 4 45
vertex -4 4 85
endloop
endfacet
facet normal -0 0 1
outer loop
vertex -172.5 165 85
vertex -167.5 4 85
vertex -167.5 165 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -167.5 4 85
vertex -172.5 165 85
vertex -167.5 -4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -172.5 -165 85
vertex -167.5 -4 85
vertex -172.5 165 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -167.5 -4 85
vertex -172.5 -165 85
vertex -167.5 -165 85
endloop
endfacet
facet normal -0 0 1
outer loop
vertex -167.5 4 85
vertex -4 -4 85
vertex -4 4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 -4 85
vertex -167.5 4 85
vertex -167.5 -4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 170 172.5 85
vertex 4 167.5 85
vertex 170 167.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 4 85
vertex 4 4 85
vertex 4 167.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 4 4 85
vertex -4 4 85
vertex 4 -4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 4 85
vertex 4 167.5 85
vertex -4 167.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 170 172.5 85
vertex -4 167.5 85
vertex 4 167.5 85
endloop
endfacet
facet normal -0 0 1
outer loop
vertex -170 172.5 85
vertex -4 167.5 85
vertex 170 172.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 167.5 85
vertex -170 172.5 85
vertex -170 167.5 85
endloop
endfacet
facet normal -0 0 1
outer loop
vertex 4 4 85
vertex 167.5 -4 85
vertex 167.5 4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 167.5 -4 85
vertex 4 4 85
vertex 4 -4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 167.5 4 85
vertex 172.5 165 85
vertex 167.5 165 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 172.5 165 85
vertex 167.5 4 85
vertex 172.5 -165 85
endloop
endfacet
facet normal -0 0 1
outer loop
vertex 167.5 -4 85
vertex 172.5 -165 85
vertex 167.5 4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 172.5 -165 85
vertex 167.5 -4 85
vertex 167.5 -165 85
endloop
endfacet
facet normal -0 0 1
outer loop
vertex 4 -167.5 85
vertex 170 -172.5 85
vertex 170 -167.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 -4 85
vertex 4 -4 85
vertex -4 4 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 4 -4 85
vertex -4 -4 85
vertex 4 -167.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 -167.5 85
vertex 4 -167.5 85
vertex -4 -4 85
endloop
endfacet
facet normal -0 0 1
outer loop
vertex -4 -167.5 85
vertex 170 -172.5 85
vertex 4 -167.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -170 -172.5 85
vertex -4 -167.5 85
vertex -170 -167.5 85
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 -167.5 85
vertex -170 -172.5 85
vertex 170 -172.5 85
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex 4 -167.5 85
vertex 4 -4 45
vertex 4 -4 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 4 -167.5 5
vertex 4 -4 45
vertex 4 -167.5 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 4 -4 45
vertex 4 -167.5 5
vertex 4 -4 5
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 4 4 45
vertex 4 167.5 85
vertex 4 4 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 4 167.5 85
vertex 4 4 45
vertex 4 167.5 5
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 4 167.5 5
vertex 4 4 45
vertex 4 4 5
endloop
endfacet
facet normal 0 0 -1
outer loop
vertex 170 -165 5
vertex 172.5 165 5
vertex 172.5 -165 5
endloop
endfacet
facet normal -0 0 -1
outer loop
vertex 172.5 165 5
vertex 170 -165 5
vertex 170 165 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 167.5 -4 5
vertex 4 -4 5
vertex 167.5 -165 5
endloop
endfacet
facet normal -0 0 1
outer loop
vertex 167.5 -165 5
vertex 170 -167.5 5
vertex 170 -165 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 4 -167.5 5
vertex 167.5 -165 5
vertex 4 -4 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 167.5 -165 5
vertex 4 -167.5 5
vertex 170 -167.5 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 170 167.5 5
vertex 167.5 165 5
vertex 170 165 5
endloop
endfacet
facet normal -0 0 1
outer loop
vertex 4 167.5 5
vertex 167.5 165 5
vertex 170 167.5 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 4 4 5
vertex 167.5 165 5
vertex 4 167.5 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 167.5 165 5
vertex 4 4 5
vertex 167.5 4 5
endloop
endfacet
facet normal 0 0 -1
outer loop
vertex -170 -172.5 5
vertex 170 -170 5
vertex 170 -172.5 5
endloop
endfacet
facet normal -0 0 -1
outer loop
vertex 170 -170 5
vertex -170 -172.5 5
vertex -170 -170 5
endloop
endfacet
facet normal 0 0 -1
outer loop
vertex -170 170 5
vertex 170 172.5 5
vertex 170 170 5
endloop
endfacet
facet normal -0 0 -1
outer loop
vertex 170 172.5 5
vertex -170 170 5
vertex -170 172.5 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 167.5 5
vertex -167.5 165 5
vertex -4 4 5
endloop
endfacet
facet normal -0 0 1
outer loop
vertex -170 167.5 5
vertex -167.5 165 5
vertex -4 167.5 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -167.5 165 5
vertex -170 167.5 5
vertex -170 165 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 4 5
vertex -167.5 165 5
vertex -167.5 4 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -167.5 -165 5
vertex -4 -4 5
vertex -167.5 -4 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -4 -4 5
vertex -167.5 -165 5
vertex -4 -167.5 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -170 -167.5 5
vertex -167.5 -165 5
vertex -170 -165 5
endloop
endfacet
facet normal 0 0 1
outer loop
vertex -167.5 -165 5
vertex -170 -167.5 5
vertex -4 -167.5 5
endloop
endfacet
facet normal 0 0 -1
outer loop
vertex -172.5 -165 5
vertex -170 165 5
vertex -170 -165 5
endloop
endfacet
facet normal -0 0 -1
outer loop
vertex -170 165 5
vertex -172.5 -165 5
vertex -172.5 165 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -167.5 -4 85
vertex -4 -4 45
vertex -4 -4 85
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -167.5 -4 5
vertex -4 -4 45
vertex -167.5 -4 85
endloop
endfacet
facet normal 0 -1 -0
outer loop
vertex -4 -4 45
vertex -167.5 -4 5
vertex -4 -4 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex 4 -4 45
vertex 167.5 -4 85
vertex 4 -4 85
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex 167.5 -4 5
vertex 4 -4 45
vertex 4 -4 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex 4 -4 45
vertex 167.5 -4 5
vertex 167.5 -4 85
endloop
endfacet
facet normal 0 1 -0
outer loop
vertex -4 4 45
vertex -167.5 4 85
vertex -4 4 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -167.5 4 5
vertex -4 4 45
vertex -4 4 5
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -4 4 45
vertex -167.5 4 5
vertex -167.5 4 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex 167.5 4 85
vertex 4 4 45
vertex 4 4 85
endloop
endfacet
facet normal 0 1 -0
outer loop
vertex 167.5 4 5
vertex 4 4 45
vertex 167.5 4 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex 4 4 45
vertex 167.5 4 5
vertex 4 4 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 170 0
vertex -170 167.5 5
vertex -170 170 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 170 0
vertex -170 165 5
vertex -170 167.5 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 170 0
vertex -170 -165 5
vertex -170 165 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 -170 0
vertex -170 -165 5
vertex -170 170 0
endloop
endfacet
facet normal -1 -0 0
outer loop
vertex -170 -165 5
vertex -170 -170 0
vertex -170 -167.5 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 -170 5
vertex -170 -167.5 5
vertex -170 -170 0
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 -167.5 5
vertex -170 -170 5
vertex -170 -167.5 85
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 -172.5 85
vertex -170 -170 5
vertex -170 -172.5 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 -170 5
vertex -170 -172.5 85
vertex -170 -167.5 85
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 170 5
vertex -170 172.5 85
vertex -170 172.5 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 167.5 85
vertex -170 170 5
vertex -170 167.5 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -170 170 5
vertex -170 167.5 85
vertex -170 172.5 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 -167.5 85
vertex 170 -170 5
vertex 170 -167.5 5
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex 170 -172.5 85
vertex 170 -170 5
vertex 170 -167.5 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 -170 5
vertex 170 -172.5 85
vertex 170 -172.5 5
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 172.5 85
vertex 170 170 5
vertex 170 172.5 5
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex 170 167.5 85
vertex 170 170 5
vertex 170 172.5 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 167.5 5
vertex 170 170 5
vertex 170 167.5 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 170 5
vertex 170 167.5 5
vertex 170 170 0
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex 170 165 5
vertex 170 170 0
vertex 170 167.5 5
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex 170 -165 5
vertex 170 170 0
vertex 170 165 5
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 -170 0
vertex 170 -165 5
vertex 170 -167.5 5
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 -170 0
vertex 170 -167.5 5
vertex 170 -170 5
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 170 -165 5
vertex 170 -170 0
vertex 170 170 0
endloop
endfacet
facet normal 0 1 -0
outer loop
vertex 170 170 0
vertex -170 170 5
vertex 170 170 5
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -170 170 5
vertex 170 170 0
vertex -170 170 0
endloop
endfacet
facet normal 0 0 -1
outer loop
vertex -170 -170 0
vertex 170 170 0
vertex 170 -170 0
endloop
endfacet
facet normal -0 0 -1
outer loop
vertex 170 170 0
vertex -170 -170 0
vertex -170 170 0
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -170 -170 0
vertex 170 -170 5
vertex -170 -170 5
endloop
endfacet
facet normal 0 -1 -0
outer loop
vertex 170 -170 5
vertex -170 -170 0
vertex 170 -170 0
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -170 -172.5 5
vertex 170 -172.5 85
vertex -170 -172.5 85
endloop
endfacet
facet normal 0 -1 -0
outer loop
vertex 170 -172.5 85
vertex -170 -172.5 5
vertex 170 -172.5 5
endloop
endfacet
facet normal 0 1 -0
outer loop
vertex -4 -167.5 5
vertex -170 -167.5 85
vertex -4 -167.5 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -170 -167.5 85
vertex -4 -167.5 5
vertex -170 -167.5 5
endloop
endfacet
facet normal 0 1 -0
outer loop
vertex 170 -167.5 5
vertex 4 -167.5 85
vertex 170 -167.5 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex 4 -167.5 85
vertex 170 -167.5 5
vertex 4 -167.5 5
endloop
endfacet
facet normal 0 1 -0
outer loop
vertex 170 172.5 5
vertex -170 172.5 85
vertex 170 172.5 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -170 172.5 85
vertex 170 172.5 5
vertex -170 172.5 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -170 167.5 5
vertex -4 167.5 85
vertex -170 167.5 85
endloop
endfacet
facet normal 0 -1 -0
outer loop
vertex -4 167.5 85
vertex -170 167.5 5
vertex -4 167.5 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex 4 167.5 5
vertex 170 167.5 85
vertex 4 167.5 85
endloop
endfacet
facet normal 0 -1 -0
outer loop
vertex 170 167.5 85
vertex 4 167.5 5
vertex 170 167.5 5
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex -167.5 -165 85
vertex -167.5 -4 5
vertex -167.5 -4 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex -167.5 -4 5
vertex -167.5 -165 85
vertex -167.5 -165 5
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex -167.5 4 85
vertex -167.5 165 5
vertex -167.5 165 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex -167.5 165 5
vertex -167.5 4 85
vertex -167.5 4 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -170 -165 5
vertex -172.5 -165 85
vertex -172.5 -165 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -172.5 -165 85
vertex -170 -165 5
vertex -167.5 -165 85
endloop
endfacet
facet normal 0 -1 -0
outer loop
vertex -167.5 -165 85
vertex -170 -165 5
vertex -167.5 -165 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex -172.5 -165 5
vertex -172.5 165 85
vertex -172.5 165 5
endloop
endfacet
facet normal -1 -0 0
outer loop
vertex -172.5 165 85
vertex -172.5 -165 5
vertex -172.5 -165 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -170 165 5
vertex -167.5 165 85
vertex -167.5 165 5
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -167.5 165 85
vertex -170 165 5
vertex -172.5 165 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex -172.5 165 85
vertex -170 165 5
vertex -172.5 165 5
endloop
endfacet
facet normal -1 0 0
outer loop
vertex 167.5 -165 5
vertex 167.5 -4 85
vertex 167.5 -4 5
endloop
endfacet
facet normal -1 -0 0
outer loop
vertex 167.5 -4 85
vertex 167.5 -165 5
vertex 167.5 -165 85
endloop
endfacet
facet normal -1 0 0
outer loop
vertex 167.5 4 5
vertex 167.5 165 85
vertex 167.5 165 5
endloop
endfacet
facet normal -1 -0 0
outer loop
vertex 167.5 165 85
vertex 167.5 4 5
vertex 167.5 4 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex 170 165 5
vertex 172.5 165 85
vertex 172.5 165 5
endloop
endfacet
facet normal 0 1 0
outer loop
vertex 172.5 165 85
vertex 170 165 5
vertex 167.5 165 85
endloop
endfacet
facet normal 0 1 0
outer loop
vertex 167.5 165 85
vertex 170 165 5
vertex 167.5 165 5
endloop
endfacet
facet normal 1 -0 0
outer loop
vertex 172.5 -165 85
vertex 172.5 165 5
vertex 172.5 165 85
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 172.5 165 5
vertex 172.5 -165 85
vertex 172.5 -165 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex 170 -165 5
vertex 167.5 -165 85
vertex 167.5 -165 5
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex 167.5 -165 85
vertex 170 -165 5
vertex 172.5 -165 85
endloop
endfacet
facet normal 0 -1 -0
outer loop
vertex 172.5 -165 85
vertex 170 -165 5
vertex 172.5 -165 5
endloop
endfacet
endsolid OpenSCAD_Model

View File

@ -0,0 +1,82 @@
# converter.py
# A Python script for use with FreeCAD's command-line interface.
# Converts a mesh file (like STL) into a solid model and exports it to STEP.
import sys
import FreeCAD
import Part
import Mesh
# --- Argument Validation ---
# The script name is sys.argv[0], followed by FreeCAD's internal args.
# The actual script arguments start after that. We expect two: input and output files.
# FreeCAD adds its own arguments, so we find our files at the end of the list.
if len(sys.argv) < 3:
print("Converter script usage: <input_file> <output_file>")
sys.exit(1)
input_file_path = sys.argv[-2]
output_file_path = sys.argv[-1]
print(f"Input file: {input_file_path}")
print(f"Output file: {output_file_path}")
# --- Conversion Logic ---
try:
# 1. Load the mesh from the input STL file
mesh = Mesh.read(input_file_path)
# 2. Split the mesh into its separate, unconnected components (shells)
components = mesh.getSeparateComponents()
print(f"Found {len(components)} separate components in the mesh.")
# 3. Convert each component mesh into a solid shape
solids = []
for i, component_mesh in enumerate(components):
try:
# Create a shape from the mesh component
shape = Part.Shape()
shape.makeShapeFromMesh(component_mesh.Topology, 0.1)
# Use a more robust method to ensure the shape is a solid
# This can fix minor issues and is more reliable than direct conversion.
if not shape.isNull() and shape.Faces:
solid = Part.Solid(Part.Shell(shape.Faces))
if solid.Volume > 0:
solids.append(solid)
else:
# If creating a solid fails, try refining it first.
refined_shape = shape.removeSplitter()
if not refined_shape.isNull() and refined_shape.Faces:
solid = Part.Solid(Part.Shell(refined_shape.Faces))
if solid.Volume > 0:
solids.append(solid)
else:
print(f"Warning: Component {i+1} could not be converted to a solid after refining.")
else:
print(f"Warning: Component {i+1} became null after refining.")
else:
print(f"Warning: Component {i+1} could not be converted to a shape.")
except Exception as ex:
print(f"Warning: An exception occurred while processing component {i+1}: {ex}")
if not solids:
print("Error: No valid solids could be created from the mesh.")
sys.exit(1)
# 4. Combine all solids into a single compound part for export
if len(solids) > 1:
result_shape = Part.Compound(solids)
else:
result_shape = solids[0]
# 5. Export the final shape to a STEP file
result_shape.exportStep(output_file_path)
print("STEP export completed successfully.")
sys.exit(0)
except Exception as e:
print(f"An error occurred during FreeCAD conversion: {e}")
sys.exit(1)

View File

@ -0,0 +1,66 @@
#!/bin/bash
# --- export_step.sh ---
# Converts an OpenSCAD file to a STEP file using FreeCAD.
#
# !! REQUIRES FREECAD !!
# This script depends on FreeCAD being installed and 'FreeCADCmd.exe'
# being available in your system's PATH.
#
# Usage: ./export_step.sh <source.scad> [output.step]
#
# Arguments:
# $1: source_file - Input .scad file (Required)
# $2: output_file - Output .step file (Optional)
# --- Input Validation ---
if [ -z "$1" ]; then
echo "Usage: $0 <source.scad> [output.step]"
echo "Error: Source file not specified."
exit 1
fi
# --- Argument Parsing ---
SOURCE_FILE="$1"
OUTPUT_FILE="$2"
# --- Set Default Output Filename ---
if [ -z "$OUTPUT_FILE" ]; then
OUTPUT_FILE="${SOURCE_FILE%.scad}.step"
fi
# --- Define Temporary STL file ---
TEMP_STL_FILE="temp_conversion.stl"
# --- Step 1: Export from OpenSCAD to STL ---
echo "Step 1/3: Exporting '$SOURCE_FILE' to STL using dedicated export layout..."
openscad \
-o "$TEMP_STL_FILE" \
-D "view_mode=\"export\"" \
"$SOURCE_FILE"
if [ $? -ne 0 ]; then
echo "Error: OpenSCAD export failed."
exit 1
fi
echo "STL export successful."
# --- Step 2: Convert STL to STEP using FreeCAD ---
echo "Step 2/3: Converting '$TEMP_STL_FILE' to '$OUTPUT_FILE' using FreeCAD..."
# Note: Assuming FreeCADCmd.exe for Windows. Use 'freecadcmd' on Linux.
FreeCADCmd.exe -c converter.py "$TEMP_STL_FILE" "$OUTPUT_FILE"
if [ $? -ne 0 ]; then
echo "Error: FreeCAD conversion failed. Is FreeCAD installed and in your PATH?"
rm -f "$TEMP_STL_FILE" # Clean up temp file
exit 1
fi
echo "STEP conversion successful."
# --- Step 3: Clean up temporary files ---
echo "Step 3/3: Cleaning up temporary files..."
rm -f "$TEMP_STL_FILE"
echo "Done."
# --- Completion Message ---
echo "Export complete: '$OUTPUT_FILE' created successfully."

View File

@ -0,0 +1,59 @@
#!/bin/bash
# --- export_stl.sh ---
# Exports an OpenSCAD file to an STL file.
#
# Usage: ./export_stl.sh <source.scad> [output.stl] [folded_state]
#
# Arguments:
# $1: source_file - Input .scad file (Required)
# $2: output_file - Output .stl file (Optional)
# $3: folded_state - 'true' or 'false'. (Optional, defaults to 'true' for a solid model)
# --- Input Validation ---
if [ -z "$1" ]; then
echo "Usage: $0 <source.scad> [output.stl] [folded_state]"
echo "Error: Source file not specified."
exit 1
fi
# --- Argument Parsing ---
SOURCE_FILE="$1"
OUTPUT_FILE=""
# Default to 'true' as we usually want to export the assembled solid model
FOLDED_STATE="true"
# Case 1: All three arguments are provided
if [ -n "$3" ]; then
OUTPUT_FILE="$2"
FOLDED_STATE="$3"
# Case 2: Only two arguments are provided
elif [ -n "$2" ]; then
# Check if the second argument is the folded state or a filename
if [[ "$2" == "true" || "$2" == "false" ]]; then
FOLDED_STATE="$2"
else
OUTPUT_FILE="$2"
fi
fi
# --- Set Default Output Filename ---
if [ -z "$OUTPUT_FILE" ]; then
OUTPUT_FILE="${SOURCE_FILE%.scad}_${FOLDED_STATE}.stl"
fi
# --- OpenSCAD Export Command ---
# -D: Overrides a variable in the OpenSCAD script.
echo "Exporting '$SOURCE_FILE' to '$OUTPUT_FILE' with Folded_View=$FOLDED_STATE..."
openscad \
-o "$OUTPUT_FILE" \
-D "Folded_View=$FOLDED_STATE" \
"$SOURCE_FILE"
# --- Completion Message ---
if [ $? -eq 0 ]; then
echo "Export complete: '$OUTPUT_FILE' created successfully."
else
echo "Error: OpenSCAD export failed."
exit 1
fi

BIN
cad/drawers/tools/folded_view.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
cad/drawers/tools/reference/500-10.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
cad/drawers/tools/reference/variables.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,64 @@
#!/bin/bash
# --- render.sh ---
# Renders an OpenSCAD file to a PNG image.
#
# Usage: ./render.sh <source_file.scad> [output_file.png] [folded_state]
#
# Arguments:
# $1: source_file - The path to the input OpenSCAD file. (Required)
# $2: output_file - The path for the output PNG image. (Optional)
# $3: folded_state - 'true' or 'false' to control the Folded_View parameter.
# (Optional, defaults to false)
# --- Input Validation ---
if [ -z "$1" ]; then
echo "Usage: $0 <source_file.scad> [output_file.png] [folded_state]"
echo "Error: Source file not specified."
exit 1
fi
# --- Argument Parsing ---
SOURCE_FILE="$1"
OUTPUT_FILE=""
FOLDED_STATE="false" # Default value
# Case 1: All three arguments are provided
if [ -n "$3" ]; then
OUTPUT_FILE="$2"
FOLDED_STATE="$3"
# Case 2: Only two arguments are provided
elif [ -n "$2" ]; then
# Check if the second argument is the folded state or a filename
if [[ "$2" == "true" || "$2" == "false" ]]; then
FOLDED_STATE="$2"
else
OUTPUT_FILE="$2"
fi
fi
# --- Set Default Output Filename ---
if [ -z "$OUTPUT_FILE" ]; then
# Removes the .scad extension and appends .png
OUTPUT_FILE="${SOURCE_FILE%.scad}_${FOLDED_STATE}.png"
fi
# --- OpenSCAD Render Command ---
# --view=iso: Sets the camera to a standard isometric view.
# --imgsize: Sets the output image resolution.
# -D: Overrides a variable in the OpenSCAD script.
echo "Rendering '$SOURCE_FILE' to '$OUTPUT_FILE' with Folded_View=$FOLDED_STATE..."
openscad \
-o "$OUTPUT_FILE" \
--view=iso \
--imgsize=1024,768 \
-D "Folded_View=$FOLDED_STATE" \
"$SOURCE_FILE"
# --- Completion Message ---
if [ $? -eq 0 ]; then
echo "Render complete: '$OUTPUT_FILE' created successfully."
else
echo "Error: OpenSCAD rendering failed."
exit 1
fi