Seasonal Snowflake Coasters

The rattlecan chipboard coasters having passed their Best Used By dates, I figured a more durable seasonal version was in order:

Snowflake Coasters - overview
Snowflake Coasters – overview

I laid out the design with the intent of cutting an acrylic snowflake with a bit of compensation to fit snugly into a plywood background:

Snowflake Coaster - LB layout
Snowflake Coaster – LB layout

At the last moment I realized I could just cut two of the patterns on the left, swap the snowflakes, and get two coasters with very little scrap:

Snowflake Coasters - detail
Snowflake Coasters – detail

Mary thinks the gap between the snowflake and the background looks OK. I’m not convinced, but studying the results suggests applying enough kerf compensation to close the largest gaps would results in the rest of the flake not fitting into its socket. Plus, of course, you’d have more scrap.

Embiggening the small dagger-shaped pieces around the center would be an improvement. Perhaps cutting those as a separate operation after arranging them in a corner would work.

Protip: Align the grain in those daggers with the rest of the plywood, because It Will Be Very Obvious if you don’t.

Applying a nice wood stain / finish to the plywood, perhaps before cutting it out, would certainly improve the result.

Invisible on the bottom: self-adhesive cork disks eliminating the need to glue the pieces to something else. I had thought of a blank plywood or MDF disk, but came to my senses just in time.

The original SVG fell with a blizzard from one of the many SVG snowflake generators out there. Because LightBurn uses only the stroke centerlines of SVG images and ignores the stroke width, it required some tweakage before becoming a coaster.

After saving an SVG flake from the blizzard, fire up Inkscape:

  • Import the SVG file
  • Center it in whatever page you’re using
  • Ungroup the flake from the frame (if it has one)
  • Delete the frame to leave only the flake
  • Select the flake
  • Invoke Path → Stroke to Path
  • Save as an SVG image under a new file name

Then fire up LightBurn:

  • Import the tweaked SVG file
  • Assign a layer with line (rather than fill) parameters
  • Ungroup to separate the flake’s strokes
  • Weld the strokes together to remove the overlaps
  • Wrap a coaster outline around it
  • Resize the flake as needed
  • Set layer parameters as needed
  • Duplicate the flake
  • Embiggen as needed
  • Unleash the laser!

The LightBurn SVG layout as a GitHub Gist:

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Seasonal Holly Coasters

Starting with a random SVG holly image from the InterTubes:

Holly Coaster - assortment
Holly Coaster – assortment

The rattlecan chipboard versions came out pretty well, because I’ve already explored much of the error space. The two-tone berries and leaves received Sharpie contrast touchup. They’re all in constant use on the kitchen table!

The wood veneer version over on the right looks surprisingly good (in person, anyway) for being a complete faceplant. The narrow sections suffered severe burning and fell apart where the grain runs perpendicular to the cut. The highlight spots for the berries fell through the honeycomb table and vanished in the chaff. Sanding the whole mess flat scuffed off most of the smudges, although I couldn’t bring myself to slather it with polyurethane.

The bright holly on the left is mirror-back acrylic pressed into a 3 mm deep (!) recess engraved in more scrap paneling:

Holly Coaster - mirror
Holly Coaster – mirror

I hand-painted the colors by scribbling Sharpie onto areas where the mirror backing was engraved away. A sheet of aluminized Mylar below the acrylic reflects some light back through the colors to make them slightly brighter.

As I recently learned, applying alcohol to laser-cut acrylic produces almost instantaneous stress-cracking, which accounts for the decorative crackle finish around the perimeter:

Holly Coaster - mirror flaws
Holly Coaster – mirror flaws

The surface flaw beyond the berry over on the right apparently came from an acrylic fume explosion in the honeycomb below it, strong enough to torch the protective plastic film. Given that I was starting with a scrap mirror fragment, I didn’t perch it up on spikes, which is pretty much required to prevent such events.

The wood coasters have mmmmm excellent upside potential, but it’s obvious I have not yet mastered my craft.

The LightBurn SVG layout as a GitHub Gist:

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Marquetry: Veneer Test Piece

I haven’t given Mary a diamond in forever, so:

Marquetry test piece
Marquetry test piece

Straight up: this was mostly for fun, as can be determined by the hideous juxtaposition of the diamond amid a hexagon with the grain running the wrong way.

The diamond pattern was the least awful result of searching the Intertubes for diamond svg.

I didn’t expect it to work on the first try, but apart from having to calibrate the engraving depth in the scrap of plywood paneling, things went swimmingly:

Marquetry plywood engraving depth tests
Marquetry plywood engraving depth tests

I now have settings to excavate 0.2, 0.5, and 1.0 mm into that particular paneling. The veneer sheets were just over 0.5 mm thick and stuck out just enough to sand them flush.

The ideal kerf compensation turned out to be none at all, which I found after compensating the frame 0.1 mm outward on all sides, then having it not fit in the hole nor around the inner triangles.

A layer of yellow Elmer’s Wood Glue holds everything in place.

A few licks of 120 grit sandpaper, wipe it down with polyurethane finish, let it cure overnight, and it’s presentation-ready.

Got a chuckle, which is as much as I expected.

High Impact Art: Coaster 5

This came out all glittery:

Smashed Glass Coaster 5 - top view
Smashed Glass Coaster 5 – top view

Epoxy tinted with transparent black dye does a pretty good job of not obliterating the cracks between the cuboids. In person, the cracks seem less conspicuous around the borders of the glass pieces, but they’re visible enough for this ahem use case.

Under the proper lighting, a few bubbles appear along and above the black layer:

Smashed Glass Coaster 5 - oblique view
Smashed Glass Coaster 5 – oblique view

The new thing this time around were three pins holding the layers in alignment while the epoxy cured:

Smashed Glass Coaster 5 - alignment pin
Smashed Glass Coaster 5 – alignment pin

The conical end comes from grabbing an 8 mm snippet of 3/64 inch steel rod in a pin vise and twirling it against Mr Bench Grinder for a few seconds.

The pins pretty much dropped into 1.1 mm holes created while cutting the sheets. The tiny circles mark the laser path around the pin holes:

Coaster 5 - layers
Coaster 5 – layers

The “holes” in the top sheet (upper middle) are in the Tool 2 layer so they’re not cut, because it was easier to match-drill holes halfway into the top sheet with the drill press than to figure out how to convince the laser to not punch all the way through. Engraving (along the lines of the earring borders) might work, but I’m not sure how well a high-aspect-ratio hole will engrave.

The mirror sheet is reversed left-to-right in order to cut it from the back of the reflective layer. I’m not certain this is necessary, because acrylic is basically opaque to 10.6 µm IR light and any doubly attenuated reflected light will diverge strongly from the focus point at the top surface, but it’s the recommended procedure and easy enough to do.

The cork cuts with its adhesive layer up and blue tape on the bottom to prevent soot from accumulating in all the surface crevices.

The alignment pins worked surprisingly well:

Smashed Glass Coaster 5 - edge alignment A
Smashed Glass Coaster 5 – edge alignment A

The top sheet sticks out 0.3 mm on one side:

Smashed Glass Coaster 5 - edge alignment B
Smashed Glass Coaster 5 – edge alignment B

Oddly, there’s no place where the top sheet is indented by any noticeable amount, so there may be slight size differences depending on all the colors and ages in that stack of plastic sheets.

I’ll cure the next one top-side down, giving the bubbles an opportunity to rise toward the mirror layer and maybe become less conspicuous:

Smashed Glass Coaster 5 - curing
Smashed Glass Coaster 5 – curing

The tricky part: finding and arranging glass chunks within a 100 mm circle!

Avoiding narrow gaps and acute angles in the perimeter, as the notch on the left side, should simplify draining the epoxy.

Smashed Glass Coaster: Conformal Perimeter

Snugging the perimeter around the smashed glass fragments definitely improves the result:

Smashed glass coaster - top view A
Smashed glass coaster – top view A

It’s just under 100 mm = 4 inch across the longest dimension and surprisingly glittery:

Smashed glass coaster - top view B
Smashed glass coaster – top view B

The coaster is a five-layer sandwich half an inch thick:

Smashed glass coaster - edge view
Smashed glass coaster – edge view

From the top:

  • Clear acrylic: 1.5 mm = 1/16 inch
  • Black acrylic: 1.5 mm = 1/16 inch
  • Clear acrylic: 3.2 mm = 1/8 inch
  • Mirror acrylic: 2.7 mm
  • Cork: 2.7 mm cut from a standard round coaster base

The smashed glass pieces sit atop the mirror, so the trick is making the layers around it add up to the same thickness. This is not possible by adding the nominal dimensions, because cast acrylic sheet thickness isn’t well controlled; I’ve finally written the actual (metric!) thickness on the sheets so I can select which 1/8 Inch sheet has the proper thickness.

A chipboard template (seen atop the finished coaster) verified the glass pieces fit easily within their openings:

Smashed glass coaster - top view - fit template
Smashed glass coaster – top view – fit template

I laid the clear frame on the mirror, poured generous epoxy puddles along the middle of the fragment openings, eased the glass in place, and gently pressed the slabs down to get a uniform epoxy layer, with the excess oozing under the frame all around. Then lay the black frame around the glass atop the clear, squirt more epoxy along the gaps around the glass, pour more epoxy atop the fragments, ease the top sheet in place paying considerable attention to coaxing the bubbles along to the edge, align the sides, and wait.

The epoxy cured while stuck atop a styrofoam pillar to let it drain smoothly off the edges:

Smashed glass coaster - epoxy curing
Smashed glass coaster – epoxy curing

I encouraged the epoxy out of the acute corners, as shown by the larger puddles, over the next few hours until the epoxy stiffened up. Those puddles also show the transparent black tint, to the tune of four drops in 8 ml of epoxy, which turned out to just barely suffice for the job. The whole assembly sat level while curing, but the layers didn’t remain aligned even after gently shoving them around while the stack cured.

The black epoxy joins nicely with the black frame layer to conceal most of the remaining bubbles. A different color frame with matching epoxy might looks less ominous, but colors more transparent than dark gray would likely reveal the bubbles.

It Would Be Nice™ if the acrylic sheet on the top had a transparent plastic film cover, but it arrived with brown paper on both sides. Despite that, I spattered only a few tiny drops on the bare surface and managed to scrape most of them off without further damage.

Overall, I think the conformal perimeter looks much better than the polygonal outline smashed glass coasters.

Smashed Glass Earrings: Sample Set

The POC earrings had a pair of 1.5 mm acrylic disks epoxied around the glass fragment, with the “gold” ring captured in a rebate around the rims. That process was both tedious and messy, so I tried laser-engraving a deeper rebate into a 3 mm sheet, then epoxying the fragment and the ring in place:

Earrings - epoxy curing
Earrings – epoxy curing

They’re stuck to a strip of Kapton tape to keep the epoxy off the bottom surface of the glass, while aligning it with the surrounding disk.

Peeling the protective film / plastic off reveals the acrylic disk:

Earrings - 25 20 16 12 mm first look
Earrings – 25 20 16 12 mm first look

They all required more effort to remove the epoxy remaining around the ring, but it worked out better than I expected.

A lighter background shows off their internal structure:

Earrings - 25 20 16 12 mm set
Earrings – 25 20 16 12 mm set

A closer look at the pairs:

  • Earrings - 25 mm pair
  • Earrings - 20 mm pair
  • Earrings - 16 mm pair
  • Earrings - 12 mm pair

As always, glooping clear epoxy around the edges fills many of the internal cracks and reduces the glittery aspect of all those glass-to-air-to-glass interfaces, but I don’t see another good way to keep the fragments under control.

The results may not be up to a “fine jewelry” standard, whatever that may be, but a slipcase box definitely improves the presentation:

Earrings - presentation case
Earrings – presentation case

If I had the courage of my convictions, I’d go for the Mr Clean look myself, but …

Layered Paper Coaster: GCMC Test

A few more attempts at layered paper construction, done with plain white Art Paper of various vintages:

Layered paper coasters
Layered paper coasters

The middle one comes from a version of the original GCMC marquetry shape generator, tweaked to produce just the frame SVG, called by a Bash script to change the sash width, and imported into LightBurn for laser control:

LightBurn - Marq-6-0.6-0.0mm
LightBurn – Marq-6-0.6-0.0mm

I generated the plain disk for the bottom by deleting all the inner shapes.

The left and right coasters use LightBurn’s Offset tool to reduce the size of the interior holes on successive layers:

LightBurn - Marq-8-0.40-20.0mm-Layers
LightBurn – Marq-8-0.40-20.0mm-Layers

Although the GCMC version turned out OK, you’ll note it lacks the central disk, as I was unwilling to tweak the code enough to make the disk diameter vary with the kerf width.

Applying the LB Offset tool requires selecting only the inner shapes (it has an option to ignore the inner shapes) and applying the appropriate offset. Because the tool remembers its previous settings, it’s straightforward to step the offset from 1.0 mm to 7.0 mm on successive patterns.

Applying glue (from a glue stick!) to the bottom of each disk, aligning them atop each other, and pressing them together becomes tedious in short order. If I had to do a lot of these, I’d be tempted to add three wings (not at 120° angles!) around the perimeter with holes for pegs, then stacking the layers in a fixture to ensure good alignment. A polygonal perimeter would simplify trimming the tabs.

Spray adhesive might be faster, but each layer would have sticky edges and the finished coaster would become a dust collector par excellence.

I like the overall effect, but …

The OpenSCAD source code as a GitHub Gist:

#!/bin/bash
# Layering paper cutouts
# Ed Nisley KE4ZNU - 2022-08-21
Flags='-P 4 --pedantic' # quote to avoid leading hyphen gotcha
SVGFlags='--svg --svg-no-movelayer --svg-opacity=1.0 --svg-toolwidth=0.2'
# Set these to match your file layout
ProjPath='/mnt/bulkdata/Project Files/Laser Cutter/Coasters/Source Code'
LibPath='/opt/gcmc/library'
ScriptPath=$ProjPath
Script='Marquetry Layers.gcmc'
[ -z "$1" ] && leaves="6" || leaves="$1"
[ -z "$2" ] && aspect="0.50" || aspect="$2"
[ -z "$3" ] && center="0.0mm" || center="$3"
numlayers=8
sashmin=2.0
sashstep=2.0
sashmax=$(echo "$sashmin+$sashstep*($numlayers-1)" | bc)
echo min: $sashmin step: $sashstep max: $sashmax
for sash in $(seq $sashmin $sashstep $sashmax) ; do
fn=Marq-$leaves-$aspect-$center-S$sash.svg
echo Output: $fn
gcmc $Flags $SVGFlags --include "$LibPath" \
-D "NumLeaves=$leaves" -D "LeafAspect=$aspect" -D "CenterDia=$center" \
-D "Sash=${sash}mm" \
"$ScriptPath"/"$Script" > "$fn"
done
view raw layers.sh hosted with ❤ by GitHub
// Marquetry Layers
// Ed Nisley KE4ZNU
// 2022-08-21 layered paper test piece
layerstack("Frame","Leaves","Rim","Base","Center","Tool1"); // SVG layers map to LightBurn colors
//-----
// Library routines
include("tracepath.inc.gcmc");
include("varcs.inc.gcmc");
FALSE = 0;
TRUE = !FALSE;
//-----
// Command line parameters
// -D various useful tidbits
// add unit to speeds and depths: 2000mm / -3.00mm / etc
if (!isdefined("OuterDia")) {
OuterDia = 120.0mm;
}
if (!isdefined("CenterDia")) {
CenterDia = 20.0mm;
}
if (!isdefined("NumLeaves")) {
NumLeaves = 8;
}
if (!isdefined("Sash")) {
Sash = 4.0mm;
}
if (!isdefined("LeafAspect")) {
LeafAspect = 0.50;
}
// Leaf values
LeafStemAngle = 360.0deg/NumLeaves; // subtended by inner sides
LeafStemHA = LeafStemAngle/2;
LeafOAL = OuterDia/2 - Sash - (Sash/2)/sin(LeafStemHA);
LeafWidth = LeafAspect*LeafOAL;
L1 = (LeafWidth/2)/tan(LeafStemHA);
L2 = LeafOAL - L1;
// message("Len: ",LeafOAL," L1: ",L1," L2: ",L2);
LeafTipHA = to_deg(atan(LeafWidth/2,L2)); // subtended by outer sides
LeafTipAngle = 2*LeafTipHA;
// message("Width: ",LeafWidth);
// message("Tip HA: ",LeafTipHA);
LeafID = CenterDia + 2*Sash;
LeafOD = LeafID + LeafOAL;
// message("ID: ",LeafID," OD: ",LeafOD);
// Find leaf and rim vertices
P0 = [(Sash/2) / sin(LeafStemHA),0.0mm];
m = tan(LeafStemHA);
y0 = -(Sash/2) / cos(LeafStemHA);
if (CenterDia) { // one sash width around center spot
a = 1 + pow(m,2);
b = 2 * m * y0;
c = pow(y0,2) - pow(LeafID/2,2);
xp = (-b + sqrt(pow(b,2) - 4*a*c))/(2*a);
xn = (-b - sqrt(pow(b,2) - 4*a*c))/(2*a);
y = xp*tan(LeafStemHA) - (Sash/2) / cos(LeafStemHA);
P1 = [xp,y];
if (FALSE) {
message("a: ",a);
message("b: ",b);
message("c: ",c);
message("p: ",xp," n: ",xn," y: ",y);
}
}
else { // force sharp point without center spot
P1 = P0;
}
P2 = P0 + [L1,LeafWidth/2];
P3 = P0 + [LeafOAL,0mm];
P4 = P3 + [Sash/sin(LeafTipHA),0.0mm];
P5r = P4.x * sin(LeafTipHA) / sin(180deg - LeafStemHA - LeafTipHA);
P5 = rotate_xy([P5r,0.0mm],LeafStemHA);
P6 = rotate_xy(P4,LeafStemAngle);
t2 = pow(tan(-LeafTipHA),2);
a = 1 + t2;
b = -2 * t2 * P4.x;
c = t2 * pow(P4.x,2) - pow(P3.x,2);
xp = (-b + sqrt(pow(b,2) - 4*a*c))/(2*a);
xn = (-b - sqrt(pow(b,2) - 4*a*c))/(2*a);
y = (xp - P4.x)*tan(-LeafTipHA);
// message("p: ",xp," n: ",xn," y: ",y);
P4a = [xp,y];
P6a = rotate_xy(P4a,LeafStemAngle - 2*atan(P4a.y,P4a.x));
if (FALSE) {
message("P0: ",P0);
message("P1: ",P1);
message("P2: ",P2);
message("P3: ",P3);
message("P4: ",P4);
message("P4a: ",P4a);
message("P5: ",P5);
message("P6: ",P6);
message("P6a: ",P6a);
}
// Construct paths
LeafPoints = {P1,P2,P3,[P2.x,-P2.y],[P1.x,-P1.y]};
if (P0 != P1) {
StemArc = varc_ccw(P1 - [P1.x,-P1.y],LeafID/2);
StemArc += [P1.x,-P1.y];
LeafPoints += StemArc;
}
RimChord = length(P4a - P6a);
RimThick = OuterDia/2 - Sash - length(P5);
RimPoints = {P4a,P5,P6a};
RimArc = varc_cw(P4a - P6a,P4a.x);
RimArc += P6a;
RimPoints += RimArc;
//--- Lay out the frame
linecolor(0xff0000);
layer("Frame");
if (CenterDia) {
goto([CenterDia/2,0mm]);
circle_cw([0mm,0mm]);
}
repeat(NumLeaves;i) {
a = (i-1)*LeafStemAngle;
tracepath(rotate_xy(LeafPoints,a));
}
repeat(NumLeaves;i) {
a = (i-1)*LeafStemAngle;
tracepath(rotate_xy(RimPoints,a));
}
linecolor(0xff0000);
goto([OuterDia/2,0]);
circle_cw([0mm,0mm]);