A working version
This commit is contained in:
commit
ff142a2d56
|
@ -0,0 +1,4 @@
|
|||
Metadata
|
||||
*.3mf
|
||||
*.log
|
||||
*.gcode
|
|
@ -0,0 +1,17 @@
|
|||
©2023 Neale Pickett <neale@woozle.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software. The software is provided "as
|
||||
is", without warranty of any kind, express or implied, including but not limited
|
||||
to the warranties of merchantability, fitness for a particular purpose and
|
||||
noninfringement. In no event shall the authors or copyright holders be liable
|
||||
for any claim, damages or other liability, whether in an action of contract,
|
||||
tort or otherwise, arising from, out of or in connection with the software or
|
||||
the use or other dealings in the software.
|
|
@ -0,0 +1,5 @@
|
|||
This is a tiny temperature tower.
|
||||
I made it because I suspected my printer's hotend thermistor was reporting too cold.
|
||||
|
||||
`build.sh` generates `.3mf` files
|
||||
with extra code to make PrusaSlicer change temperatures automatically.
|
|
@ -0,0 +1,63 @@
|
|||
#! /bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
builddefs=params.json
|
||||
|
||||
run () {
|
||||
echo "=== $*"
|
||||
"$@"
|
||||
}
|
||||
|
||||
render () {
|
||||
basename=$1; shift
|
||||
run openscad -o $basename "$@" temp-tower.scad 2>&1 | tee $basename.log
|
||||
|
||||
mkdir -p Metadata
|
||||
custom=Metadata/Prusa_Slicer_custom_gcode_per_print_z.xml
|
||||
(
|
||||
echo '<?xml version="1.0" encoding="utf-8"?>'
|
||||
echo '<custom_gcodes_per_print_z>'
|
||||
sed -n 's/ECHO: "CUSTOM##\(.*\)"/\1/p' $basename.log
|
||||
echo '<mode value="SingleExtruder"/>'
|
||||
echo '</custom_gcodes_per_print_z>'
|
||||
) > $custom
|
||||
run zip $basename $custom
|
||||
|
||||
rm $custom $basename.log
|
||||
rmdir Metadata
|
||||
}
|
||||
|
||||
paramsets () {
|
||||
cat $builddefs | jq -r '.parameterSets | keys[] | select(length > 0)'
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
-h|-help|--help)
|
||||
cat <<EOD
|
||||
Usage $0 [-paramsets] [PARAMSET ...]
|
||||
|
||||
Generates .3mf files with temperature changes
|
||||
for each given parameter set.
|
||||
|
||||
Parameter sets are specified in $builddefs.
|
||||
|
||||
-paramsets List all defined parameter sets, and exit.
|
||||
EOD
|
||||
exit 1
|
||||
;;
|
||||
-p*|--p*)
|
||||
paramsets
|
||||
exit
|
||||
;;
|
||||
"")
|
||||
paramsets | while read paramset; do
|
||||
render $paramset.3mf -P $paramset -p $builddefs
|
||||
done
|
||||
;;
|
||||
*)
|
||||
for paramset in "$@"; do
|
||||
render $paramset.3mf -P $paramset -p $builddefs
|
||||
done
|
||||
;;
|
||||
esac
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"parameterSets": {
|
||||
"tower-pla-standard": {
|
||||
"TempBase": 220,
|
||||
"TempIncrease": -5,
|
||||
"Tiers": 9,
|
||||
"SideText": "PLA"
|
||||
},
|
||||
"tower-pla-short": {
|
||||
"TempBase": 220,
|
||||
"TempIncrease": -10,
|
||||
"Tiers": 5,
|
||||
"SideText": "PLA"
|
||||
},
|
||||
"tower-pla-thermistor": {
|
||||
"TempBase": 220,
|
||||
"TempIncrease": -10,
|
||||
"Tiers": 7,
|
||||
"SideText": "PLA"
|
||||
},
|
||||
|
||||
"tower-petg-standard": {
|
||||
"TempBase": 250,
|
||||
"TempIncrease": -5,
|
||||
"Tiers": 9,
|
||||
"SideText": "PETG"
|
||||
},
|
||||
"tower-petg-short": {
|
||||
"TempBase": 250,
|
||||
"TempIncrease": -10,
|
||||
"Tiers": 5,
|
||||
"SideText": "PETG"
|
||||
},
|
||||
|
||||
"": {}
|
||||
},
|
||||
"fileFormatVersion": "1"
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
/** Small temperature tower.
|
||||
|
||||
©2023 Neale Pickett <neale@woozle.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software. The software is provided "as
|
||||
is", without warranty of any kind, express or implied, including but not limited
|
||||
to the warranties of merchantability, fitness for a particular purpose and
|
||||
noninfringement. In no event shall the authors or copyright holders be liable
|
||||
for any claim, damages or other liability, whether in an action of contract,
|
||||
tort or otherwise, arising from, out of or in connection with the software or
|
||||
the use or other dealings in the software.
|
||||
|
||||
*/
|
||||
|
||||
/* [Main Options] */
|
||||
|
||||
// Temperature at the bottom
|
||||
TempBase = 220; // [100:300]
|
||||
|
||||
// Temperature increase at each tier
|
||||
TempIncrease = -10; // [-20:20]
|
||||
|
||||
// How many tiers
|
||||
Tiers = 7;
|
||||
|
||||
// Print a full tower? If false, you just get two poles.
|
||||
FullTower = true;
|
||||
|
||||
// Text to engrave on the side
|
||||
SideText = "PLA";
|
||||
|
||||
/* [Hidden] */
|
||||
PlateHeight = 0.8;
|
||||
Font = "Liberation Sans:style=bold";
|
||||
EngraveDepth = 0.3;
|
||||
$fn = 90;
|
||||
|
||||
module FullTier(temperature) {
|
||||
difference() {
|
||||
cube([25, 5, 5]);
|
||||
translate([12, -1, 0]) cube([12, 10, 5 - PlateHeight]); // Inner cavity
|
||||
translate([0, 2.5, 0]) rotate([0, 45, 0]) rotate([0, 0, 90]) cube(5*sqrt(2), center=true); // Overhang
|
||||
translate([2.5, 2.5, 0.1]) cylinder(r=1, h=5); // Overhang hole
|
||||
translate([4.4, EngraveDepth, 0.8])
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(EngraveDepth + 0.1)
|
||||
text(str(temperature), size=3.2, font=Font);
|
||||
}
|
||||
translate([22, 2.5, 0]) cylinder(r=1, h=3); // Cylinder
|
||||
translate([14, 2.5, 0]) cylinder(r1=1, r2=0.2, h=3); // Cone
|
||||
translate([5, 0.5, 0.4]) cube([6, 5, 0.2]); // Rear protrusion: y translate = protrusion depth
|
||||
}
|
||||
|
||||
module Posts(temperature) {
|
||||
difference() {
|
||||
translate([4, 0, 0]) cube([8, 5, 5]);
|
||||
translate([4.4, EngraveDepth, 0.8])
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(EngraveDepth + 0.1)
|
||||
text(str(temperature), size=3.2, font=Font);
|
||||
}
|
||||
translate([22, 2.5, 0]) cylinder(r=2, h=5);
|
||||
|
||||
}
|
||||
|
||||
module Tier(temperature) {
|
||||
if (FullTower) {
|
||||
FullTier(temperature);
|
||||
} else {
|
||||
Posts(temperature);
|
||||
}
|
||||
}
|
||||
|
||||
module EngraveText(text) {
|
||||
linear_extrude(EngraveDepth + 0.1)
|
||||
text(text, size=3.2, valign="center", font=Font);
|
||||
}
|
||||
|
||||
module Custom(text) {
|
||||
echo(str("CUSTOM##", text));
|
||||
}
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
cube([25, 5, PlateHeight]); // Floor plate
|
||||
for (tier = [0 : 1 : Tiers-1]) {
|
||||
z = PlateHeight + (5 * tier);
|
||||
temp = TempBase + (TempIncrease * tier);
|
||||
Custom(str(
|
||||
"<code print_z=\"", z, "\"",
|
||||
" type=\"4\"",
|
||||
" extruder=\"1\"",
|
||||
" color=\"\"",
|
||||
" extra=\"M104 S", temp, "\"",
|
||||
" gcode=\"M104 S", temp, "\"/>",
|
||||
""
|
||||
));
|
||||
translate([0, 0, z]) Tier(temp);
|
||||
}
|
||||
}
|
||||
if (FullTower) {
|
||||
translate([25 - EngraveDepth, 2.5, 1+PlateHeight])
|
||||
rotate([90, -90, 90])
|
||||
EngraveText(SideText);
|
||||
} else {
|
||||
translate([4 + EngraveDepth, 2.5, 1+PlateHeight])
|
||||
rotate([90, -90, -90])
|
||||
EngraveText(SideText);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue