The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Tag: Laser Cutter

  • 3D Printed Smashed Glass Coasters: Cork Alignment Fixture

    3D Printed Smashed Glass Coasters: Cork Alignment Fixture

    The printed coaster frame sits on a cork base:

    Printed Coaster - inset cork
    Printed Coaster – inset cork

    A sheet of craft adhesive holds them together; stick a generous rectangle of adhesive on the cork, then cut them at the same time. However, given the irregular perimeter, it’s basically impossible (for me, anyway) to align the cork + adhesive with the printed frame.

    A single-use fixture made from corrugated cardboard make that task trivially easy:

    Printed Coaster - cork alignment fixture - detail
    Printed Coaster – cork alignment fixture – detail

    The LightBurn layout shows the cork layer and the two fixture pieces:

    The cork shape is offset 0.5 mm inward from the Perimeter shape, but I found offsetting the cardboard cut by only 0.3 mm inward produced a snug fit around the cork. The other piece of cardboard gets cut with the exact Perimeter shape and no offset, with the laser kerf providing just enough clearance for a very snug fit on the printed shape.

    Align the two pieces of cardboard by eye to match their inner shapes as shown in the picture, tape them together, and the fixture is ready. In principle, the outer edges should exactly coincide: Trust, but verify.

    Peel off the craft adhesive paper and put the cork in the bottom of the fixture. The cork comes off a roll and really wants to roll up again, making the masking tape holding it flat mandatory:

    Printed Coasters - cork alignment template
    Printed Coasters – cork alignment template

    Yes, that’s a different coaster.

    Flip the fixture over, drop the coaster in place, press firmly together, peel the tape, and pull out the finished coaster:

    Printed Coasters - white PETG finished
    Printed Coasters – white PETG finished

    The fixture goes in the recycling bin, as those fragments will never pass this way again.

  • 3D Printed Smashed Glass Coasters: Fragment Path Offsets, Simplified Version

    3D Printed Smashed Glass Coasters: Fragment Path Offsets, Simplified Version

    Rather than use Inkscape or LightBurn to generate all the offsets required to make a solid model, it’s easier to let OpenSCAD handle it:

    Printed Coaster Layout - 100 mm Set G - solid model
    Printed Coaster Layout – 100 mm Set G – solid model

    The overall process:

    • Pick some interesting fragments
    • Scan to get an image
    • Mark the fragments in GIMP
    • Create a suitable circumcircle in LightBurn
    • Use a nesting program like Deepnest to create a nice layout of the fragments within the circle
    • Create the perimeter path as an offset around all the fragments in LightBurn

    Because the fragments have irregular shapes and spacing, creating the perimeter path may also produce small snippets of orphaned geometry which must be manually selected and deleted. I also edit the path to remove very narrow channels between adjacent fragments.

    Which is why you can’t generate that path automatically:

    Printed Coaster Layout - 100 mm Set G - LightBurn perimeter geometry
    Printed Coaster Layout – 100 mm Set G – LightBurn perimeter geometry

    Because LightBurn doesn’t have the ability to name the various paths, the next step requires Inkscape. After importing the LightBurn paths saved as an SVG, group all the fragments and name the group Fragments, then name the perimeter path Perimeter:

    Printed Coaster Layout - 100 mm Set G - Inkscape layer and IDs
    Printed Coaster Layout – 100 mm Set G – Inkscape layer and IDs

    Inkscape still crashes unpredictably while doing what seems to be a simple process, which may be due to the tremendous number of points in the hand-traced fragment outlines. Unfortunately, simplifying the curves in either LightBurn or Inkscape tends to round off the extreme points and increases the likelihood of the fragment not fitting into its recess.

    OpenSCAD generates all the other features in the solid model with paths plucked from that file:

    include <BOSL2/std.scad>
    
    fn = "Printed Fragment Coaster - 100 mm Set G - Inkscape paths.svg";
    
    FragmentThick = 3.8;
    
    BaseThick = 1.0;
    RimHeight = 1.0;
    
    union() {
    
      linear_extrude(h=BaseThick)
        import(fn,id="Perimeter");
    
       color("Green")
      up(BaseThick)
        linear_extrude(h=FragmentThick)
          difference() {
            import(fn,id="Perimeter");
            offset(delta=0.2)
              import(fn,id="Fragments");
          }
    
      color("Red")
      up(BaseThick)
        linear_extrude(h=FragmentThick + RimHeight)
          difference() {
            offset(delta=2.5)
              import(fn,id="Fragments");
            offset(delta=1.2)
              import(fn,id="Fragments");
          }
    
    
    }
    

    The Perimeter path defines the overall shape of the coaster as a 1.0 mm thick slab, visible as the white-ish line around the edge and at the bottom of all the fragment recesses.

    Atop that, the green shape is the same Perimeter shape, with the Fragment shapes removed after the offset() operation enlarges them by 0.2 mm to ensure enough clearance.

    Finally, the red walls containing the epoxy above each fragment are 1.3 mm wide, the difference of the two offset() operations applied to the Fragments.

    Because the outer edge of the wall is 2.5 mm away from the edge of its fragment:

    • The Perimeter path must be offset at least 2.5 mm from the Fragments in LightBurn. I used 4.0 mm to produce a small lip around the outside edge of the coaster.
    • The fragment shapes must be placed at least 5.0 mm apart to prevent the walls from overlapping. I set Deepnest to exactly 5.0 mm spacing, but you can see a few places where the fragments come too close together. I think this happens due to an approximation deepnest uses while rotating the paths, but it may be better to manually adjust the errant fragments than increase the average space.

    While this still requires manually tracing the glass fragments and fiddling a bit with Inkscape, the overall process isn’t nearly as burdensome as getting all the offsets correct every time.

    However, some oddities remain. OpenSCAD produced this result during the first pass through the process for this coaster:

    Printed Coaster Layout - 100 mm Set G - spurious point
    Printed Coaster Layout – 100 mm Set G – spurious point

    As far as I can tell, the spurious point came from a numeric effect, because telling Inkscape to store only five decimal places in the SVG file reduced the spike to the small bump seen in the first picture. I cannot replicate that effect using the same files and have no explanation.

  • 3D Printed Smashed Glass Coasters: Fragment Path Offsets, Complicated Version

    3D Printed Smashed Glass Coasters: Fragment Path Offsets, Complicated Version

    This should have been trivially easy and turned into a nightmare.

    The problem to be solved is generating paths around fragments for the various recesses / reflectors / lips / rims / whatever. This clutter collector was a test piece:

    Smashed Glass Clutter Collector - overview
    Smashed Glass Clutter Collector – overview

    The corresponding paths:

    Printed Clutter Collector - Inkscape layers
    Printed Clutter Collector – Inkscape layers

    Which was how I convinced myself I didn’t need all those paths to make the thing, but that’s why it’s a test piece.

    Anyhow, Inkscape has a remarkably complex and fiddly way of generating precise offsets:

    • Select a path
    • Hit Ctrl-J to create a Dynamic Offset path
    • Drag the offset path away from the original in any direction for any distance
    • Hit Ctrl-Shift-x to fire up the XML editor (!)
    • Change the offset path’s inkscape:radius property to the desired offset

    During the course of working that out, I discovered Inkscape 1.4.2 is incredibly crashy when creating and dealing with offsets, to the point that I simply gave up trying to do that.

    LightBurn has no trouble creating a path at a specific offset from another path and can export the result as an SVG file. You then use Inkscape to set the path IDs so that OpenSCAD can import them by name for a specific use. Although Inkscape isn’t entirely stable doing even that seemingly trivial task, it’s usable.

    For reasons I do not profess to understand, setting the name of a path sometimes does not set its ID property, which is required by OpenSCAD to extract it from the SVG file. Instead, you must verify / set the ID using the path’s Object Properties window:

    Printed Clutter Collector - Inkscape path properties
    Printed Clutter Collector – Inkscape path properties

    I also set the Label property, because … why not?

    A top view shows how the various paths look in real life:

    Smashed Glass Clutter Collector - top view
    Smashed Glass Clutter Collector – top view

    The OpenSCAD program generating the solid model from those paths:

    include <BOSL2/std.scad>
    
    fn = "Printed Clutter Collector - Inkscape layers.svg";
    
    FragmentThick = 5.0;
    
    BaseThick = 1.0;
    RimHeight = 7.0;
    
    union() {
      linear_extrude(h=BaseThick)
        import(fn,id="Perimeter");
        
      linear_extrude(h=BaseThick + FragmentThick + RimHeight)
        difference() {
          import(fn,id="Perimeter");
          import(fn,id="Rim");
        }
    
      up(BaseThick - 0.05)
        linear_extrude(h=FragmentThick)
          difference() {
            import(fn,id="Perimeter");
            import(fn,id="Recess");
          }
    
    }
    

    Which becomes this:

    Printed Clutter Collector - solid model
    Printed Clutter Collector – solid model

    Save that, import it into PrusaSlicer, pick the filament, and print it out.

    While the printer buzzes away, use LightBurn to cut a shiny blue metallized paper reflector and a cork base using the appropriate paths; presumably you set those paths to LightBurn layers corresponding to the various materials. The Inkscape file has those paths with their names, because … why not?

    To assemble:

    • Cover the bottom of the recess with epoxy
    • Squish the reflector in place with epoxy oozing around it on all sides
    • Cover the reflector with epoxy
    • Squish the fragment atop the reflector with epoxy oozing around it on all sides
    • Fill the recess level with the lip inside the perimeter wall
    • Pop bubbles as needed
    • When it’s cured, stick the cork sheet on the bottom

    Note that the OpenSCAD program uses the path geometry without question, so it’s your responsibility to create them with the proper offsets and names.

    While all of that to-ing and fro-ing works, in the sense that I did make a rather nice clutter collector, it’s entirely too complicated and fiddly to be useful. Instead, I can now generate a coaster from just the fragment outlines and the coaster’s outer perimeter, a straightforward process which requires a bit more explanation.

  • 3D Printed Smashed Glass Coasters: Optimization

    3D Printed Smashed Glass Coasters: Optimization

    A pair of 3D printed smashed glass coasters for a friend:

    Printed Coasters - in use
    Printed Coasters – in use

    The black PETG coaster under the French Press:

    Printed Coasters - black PETG finished
    Printed Coasters – black PETG finished

    The white PETG coaster under the mug:

    Printed Coasters - white PETG finished
    Printed Coasters – white PETG finished

    They’re considerably improved from the first attempt:

    Smashed glass printed coaster - front view
    Smashed glass printed coaster – front view

    More details to follow …

  • Baseboard Radiator Sleds

    Baseboard Radiator Sleds

    Cleaning the baseboard radiator fins before moving the houseplants back to their winter abode by the living room window made sense, so I took the trim covers off and vacuumed a remarkable accumulation of fuzz off the top and out from between the fins. The covers had an equally remarkable accumulation of sawdust along their bottom edge, apparently deposited when the previous owners had the floor sanded before they moved in a decade ago.

    If you happen to live in a house with baseboard radiators, I’m guessing you never looked inside, because nobody (else) does.

    Anyhow, the radiator fins should rest on plastic carriers atop the bent-metal struts also supporting the trim covers, so that they slide noiselessly when the copper pipe expands & contracts during the heating cycle. Over the last six decades, however, the plastic deteriorated and most of the carriers were either missing or broken to the point of uselessness:

    Baseboard Radiator Sled - old vs new
    Baseboard Radiator Sled – old vs new

    The shapes on the bottom are replacements made with a 3D printed base (“sled”) and a chipboard wrap around the radiator preventing the fins from contacting the strut:

    Baseboard Radiator Sled - OpenSCAD show
    Baseboard Radiator Sled – OpenSCAD show

    Although it was tempting to 3D print the whole thing, because plastic, I figured there was little point in finesse: chipboard would work just as well, was much faster to produce, and I need not orient the shapes to keep the printed threads in the right direction.

    The Prusa MK4 platform was just big enough for the number of sleds I needed:

    Baseboard Radiator Sled - printed
    Baseboard Radiator Sled – printed

    The sleds along the left and right edges lost traction as the printing progressed, but everything came out all right.

    The OpenSCAD program also produces 2D SVG shapes for the chipboard wraps and adhesive rectangles sticking them to the sleds:

    Baseboard Radiator Sled - OpenSCAD SVGs
    Baseboard Radiator Sled – OpenSCAD SVGs

    Import those into LightBurn, duplicate using the Grid Array, Fire The Laser, then assemble:

    Baseboard Radiator Sled - assembly
    Baseboard Radiator Sled – assembly

    The slits encourage the chipboard to bend in the right direction at the right place, so I didn’t need any fancy tooling to get a decent result.

    A few rather unpleasant hours crawling around on the floor got the struts bent back into shape and the sleds installed under the fins:

    Baseboard Radiator Sled - installed
    Baseboard Radiator Sled – installed

    Protip: Gloves aren’t just a good idea, they’re essential.

    The trim cover presses the angled chipboard where it should go against the fins. The covers carry shadows of the plastic carriers, suggesting the clearance was tighter than it should have been and thermal cycling put more stress on the plastic than expected. We’ll never know.

    Although I’ll make more for the other baseboards as the occasion arises, I hope to never see these again …

    The OpenSCAD source code as a GitHub Gist:

    // Baseboard radiator sled
    // Ed Nisley – KE4ZNU
    // 2025-10-11
    include <BOSL2/std.scad>
    Layout = "Sled"; // [Show,Build3D,Build2D,Sled,Wrap,Glue]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.1;
    Gap = 5.0;
    Radiator = [25.0,62.0,50.0]; // X = support base, YZ = radiator element
    SledBase = [Radiator.x + 10.0,Radiator.y,1.0]; // support under wrap
    Runner = [SledBase.x – 2.0,3.0,1.6]; // bars contacting radiator support
    GlueOA = [SledBase.x,SledBase.y] – [2.0,2.0]; // glue sheet
    Wrap = [SledBase.x,Radiator.y + 1.0,Radiator.z + 1.0]; // chipboard wrap around radiator
    WrapFlat = [Wrap.x,Wrap.y + 2*Wrap.z];
    WrapThick = 1.2;
    WrapSlit = 0.4;
    //—–
    // Sled base
    module Sled() {
    cuboid(SledBase,rounding=2.0,edges="Z",anchor=BOTTOM)
    position(TOP)
    for (j=[-1,1])
    fwd(j*SledBase.y/3)
    cuboid(Runner,rounding=Runner.z/2,edges="Z",anchor=BOTTOM);
    }
    //—–
    // Glue sheet
    // Export as SVG for laser cutting
    module Glue() {
    rect(GlueOA,rounding=2.0);
    }
    //—–
    // Radiator wrap
    // Export as SVG for laser cutting
    module Wrap() {
    difference() {
    rect(WrapFlat,rounding=2.0);
    for (j=[-1,1])
    fwd(j*Wrap.y/2)
    rect([Wrap.x/2,WrapSlit]);
    }
    }
    //—–
    // Build things
    if (Layout == "Sled")
    Sled();
    if (Layout == "Glue")
    Glue();
    if (Layout == "Wrap")
    Wrap();
    if (Layout == "Show") {
    xrot(180)
    Sled();
    color("Yellow",0.6)
    Glue();
    up(1)
    color("Brown") {
    cuboid([Wrap.x,Wrap.y,WrapThick],anchor=BOTTOM);
    for (j=[-1,1])
    fwd(j*Wrap.y/2)
    cuboid([Wrap.x,WrapThick,Wrap.z],anchor=BOTTOM);
    }
    }
    if (Layout == "Build3D") {
    Sled();
    }
    if (Layout == "Build2D") {
    left(GlueOA.x/2 + Gap/2)
    Glue();
    right(Wrap.x/2 + Gap/2)
    Wrap();
    }
  • Mostly Removing Acrylic Scratches

    Mostly Removing Acrylic Scratches

    Some time ago I made a simple guide / carrier to help select & arrange smashed glass fragments to fit within a given diameter:

    Coaster Layout - selected fragments
    Coaster Layout – selected fragments

    The laser-engraved guide lines confused GIMP’s edge detection to no end.

    It came from a large sheet of 1 mm acrylic, formerly a poster cover, bearing scars of its long history in the “might be useful someday” stash. I wondered if I could remove enough scratches and scuffs to ease GIMP’s workload.

    Stipulated: I am a cheapskate.

    Laser-cut a suitable sheet and sand both sides with 220 grit paper to what looked like a uniform surface:

    Acrylic polishing - 220
    Acrylic polishing – 220

    Continue scrubbing with 400, 800, 1000, 1500, and 3000 grit papers:

    Acrylic polishing - 3000
    Acrylic polishing – 3000

    Massage it with Novus Polish 3, 2, and 1:

    Acrylic polishing - Novus 1
    Acrylic polishing – Novus 1

    At best, it’s more translucent than transparent and definitely not an optical-quality polishing job:

    Acrylic polishing - translucency
    Acrylic polishing – translucency

    Fortunately, I need not care about the edges, because it goes in a square frame with a circular cutout.

    Tape it into that cardboard frame, scan it against a black background, and blow out the contrast to show I should have started with 100 grit paper and paid more attention to that “uniform surface” thing:

    Acrylic polishing - scratches
    Acrylic polishing – scratches

    In use, though, it doesn’t look all that bad:

    Fragment layout - 5in Set B - scan tweaked
    Fragment layout – 5in Set B – scan tweaked

    Come to find out those glittery cracks between all the cuboids still confuse GIMP’s edge detection, but at least hand-tracing the outline is easier without all the lines.

    The entire “polishing” series as a slideshow for your amusement:

    • Acrylic polishing - 220
    • Acrylic polishing - 400
    • Acrylic polishing - 800
    • Acrylic polishing - 1000
    • Acrylic polishing - 1500
    • Acrylic polishing - 3000
    • Acrylic polishing - Novus 3
    • Acrylic polishing - Novus 2
    • Acrylic polishing - Novus 1

    FWIW, those fragments turned out nicely:

    Smashed Glass 3D Printed Coaster - Set B
    Smashed Glass 3D Printed Coaster – Set B

    More on that later …

  • Glow In The Dark Pool Sandals

    Glow In The Dark Pool Sandals

    For reasons not relevant here, after Having Been Advised to not walk barefoot on our wood floors, I picked up a pair of beach / pool sandals with comfy soles. Although they have a white logo, they’re black and essentially invisible in the dark when I need them most.

    Start by taking a photo of the logo on the clamped-flat upper strap:

    UnderArmour logo - flattened
    UnderArmour logo – flattened

    Use GIMP to select the white area, clean it up a little, convert the selection into a path, export it as an SVG file, import into LightBurn, scale to match reality, and Fire The Laser:

    UnderArmour logo - GITD tape cutting
    UnderArmour logo – GITD tape cutting

    That’s a roll of glow-in-the-dark tape which is almost certainly a lethal combination of PVC and phosphorescent stuff, so hold your breath while it cuts.

    It’s “actually a “kiss cut” through the tape, but not through the backing paper, letting the whole thing hang together after the operation.

    Peel-n-stick on the (still flattened) sandals, expose them to light, and It Just Works:

    UnderArmour logo - glowing
    UnderArmour logo – glowing

    The fit isn’t perfect, perhaps due to insufficient flattening, but it’s close enough for my simple needs.