Open Box :)
This commit is contained in:
parent
93c09e2d4a
commit
935c8cb526
BIN
cad/drawers/500/10/Sheet-8.SLDPRT
(Stored with Git LFS)
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
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
BIN
cad/drawers/500/10/~$Sheet-8.SLDPRT
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
cad/drawers/tools/__pycache__/converter.cpython-311.pyc
Normal file
BIN
cad/drawers/tools/__pycache__/converter.cpython-311.pyc
Normal file
Binary file not shown.
BIN
cad/drawers/tools/box_folding_tool.png
(Stored with Git LFS)
Normal file
BIN
cad/drawers/tools/box_folding_tool.png
(Stored with Git LFS)
Normal file
Binary file not shown.
268
cad/drawers/tools/box_folding_tool.scad
Normal file
268
cad/drawers/tools/box_folding_tool.scad
Normal 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
BIN
cad/drawers/tools/box_folding_tool.step
(Stored with Git LFS)
Normal file
Binary file not shown.
982
cad/drawers/tools/box_folding_tool_true.stl
Normal file
982
cad/drawers/tools/box_folding_tool_true.stl
Normal 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
|
||||
82
cad/drawers/tools/converter.py
Normal file
82
cad/drawers/tools/converter.py
Normal 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)
|
||||
66
cad/drawers/tools/export_step.sh
Normal file
66
cad/drawers/tools/export_step.sh
Normal 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."
|
||||
59
cad/drawers/tools/export_stl.sh
Normal file
59
cad/drawers/tools/export_stl.sh
Normal 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
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
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
BIN
cad/drawers/tools/reference/variables.png
(Stored with Git LFS)
Normal file
Binary file not shown.
64
cad/drawers/tools/render.sh
Normal file
64
cad/drawers/tools/render.sh
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user