Internal tool · Cutting automation

DXF Generator

Cut files without Adobe Illustrator · Type the name, check the preview, download · Up to 20 orders in one batch

A program I built for Mignon and Mignon, a personalized jewelry brand that engraves names, initials, birthstones and pet portraits onto necklaces, bracelets, rings and charms. Name pendants, pet collar plates and pet bookmarks are all cut from a DXF file, and every one used to be drawn by hand in Adobe Illustrator. This builds the same file from a typed name: letters shaped in the chosen script font, fused into one cuttable piece, holes or bend tabs added, written in millimetres.

Before Adobe Illustrator, by hand

Type the name, outline it, stroke and expand it so the script fuses, weld the loose pieces, draw the holes, check nothing falls out, export. One file per order.

After DXF Generator

Type the name, pick the font, adjust anything in the live preview if needed, and press Generate. Twenty orders go through as one batch.

Cut from a generated fileA metal pet collar plate cut from a generated DXF: a script name with a bend tab at each end, lying on its order paper
A collar plate cut from a file the program wrote: one script name welded into a single piece, with a bend tab at each end.

Security note: order numbers are blacked out, and API keys, Drive links and account details are removed. The names are examples typed in.

Why I Built This

Each cut file took about twenty minutes to draw

A script name is a row of separate letters that overlap, and a cutter needs one closed outline per piece of metal. Drawing that outline took about twenty minutes an order: outline the name, expand the stroke until the overlaps fuse, weld what stays loose, place the chain holes at matching heights, check that no counter has fallen out of an a.

The program now does that drawing. The operator enters the name and picks the font, and the program does the geometry. Each judgment call (how far to expand the stroke, where the rings sit so the pendant hangs level, what still needs joining) is now a rule applied the same way every time, and a live preview lets the operator adjust the result.

3
modes in one program: pet bookmark, name pendant and collar plate, each with its own two step flow
20
orders in a single batch, each with its own name, font and per letter adjustments

Type

Internal tool

Role

Developer, Experience Designer, Implementation

Built with

Python · OpenAI Image API · Claude Code

The problem, and what changed

The same twenty steps, every order, by hand

The shop had Illustrator, the licensed fonts and correct files. The problem was repeating the same careful sequence by hand for every order. Below is the same cut file, before and after.

1 · Making one name pendant

Before · Adobe Illustrator

Draw it again

About twenty minutes, per order

  1. Set the name in the licensed script font
  2. Convert the text to outlines
  3. Stroke and expand it so the overlapping letters fuse
  4. Weld by hand whatever is still separate
  5. Draw the two chain holes and line them up by eye
  6. Check no counter has fallen out of an a
  7. Export the DXF and type a file name
  8. Find the day's folder, then open Drive and upload it

About twenty minutes of careful work per order.

After · DXF Generator

Type it

The operator enters the name and font

  1. Type the order number and the name, and pick the font
  2. Check the live preview, and adjust a letter or a hole if needed
  3. Press Generate. The file is written, named and uploaded

The program applies the same rules every time, and up to twenty orders go through as one batch.

2 · Step by step

What
Before · by hand in Illustrator
After · DXF Generator
Making the letters one piece
BeforeStroke, expand, then weld the leftovers by hand, judged by eye
AfterEach letter is grown by the boldness setting and unioned on true curves, and whatever is still loose is joined with the smallest set of tapered arcs that makes it one piece
Seeing where it welded
BeforeYou know because you did it
AfterEvery added bar is circled in red, and the readout counts the pieces it found
Chain holes
BeforeDrawn and aligned by hand; a pendant that hangs crooked means doing it again
AfterBoth rings at one shared height, as near the ends as the shape allows, and never on a dot or a loose bit
Knowing it will cut
BeforeZoom in and look for slivers, hair thin bridges and loose counters
AfterRemoved before the file is written, and the preview states the verdict: one connected piece, or how many it found
Size
BeforeSet by hand, then measured
AfterComes out of the name, reported in millimetres before anything is written
Changing your mind
BeforeUndo back through the weld and start again
AfterDrag, rotate or resize any letter or hole, and the outline rebuilds as you go
How many at once
BeforeOne file, one order
AfterUp to twenty orders in one list, each with its own name, font and adjustments
The file name
BeforeTyped at export, so it could be wrong or inconsistent
AfterBuilt from the order number and the name. Never typed, so never wrong
Getting it to the cutter
BeforeFind the folder, open Drive in a browser, upload, check it landed in the right place
AfterThe Drive folder is pasted in once. After that one button, into a dated folder, reusing folders that exist so a second run merges instead of duplicating
What you need installed
BeforeIllustrator, the licensed fonts, and somebody who knows the twenty steps
AfterThe program. The licensed fonts stay activated on the work computer and are read through Windows
20 min → a name
what the person supplies per order: the name and the font, instead of twenty drawing operations
20
orders in a single batch, written, named and uploaded in one press

How It Works

From a typed name to a closed cut path

A local web app: a small server on the work computer, with its own window. One geometry engine behind all three modes, in millimetres throughout.

Track A · Name pendants and collar platesText in, one closed cut path out
Input
A name and a font
Four licensed script fonts, read through Windows so no font file is copied
Shape
Letters as curves
The text is laid out with its real kerning at millimetres per em, each letter as a curve
Fuse
One piece, not many
Grown by the chosen boldness and unioned, the same move as stroke and expand, on true curves rather than a flattened polygon
Join and clean
Bars and slivers
Anything still separate, a space, an i dot, letters that never touch, gets a curved connector. Slivers are dropped
Output
AutoCAD 2004 DXF
1 unit = 1 mm, one closed spline per contour plus a hatch, the structure the old hand exports had
Track B · Pet bookmarksA photo becomes a head that sits on the bookmark
Input
The customer's pet photo
The same photo the order already carries
Service
OpenAI Image API
Line art under a locked prompt: face and ears only, cut at the jaw
Trace
Line art to outline
Filled into a silhouette, whiskers too thin to cut removed, then traced into a smooth outline
Fit
Head on the stick
The head sits where it is solid across the stick's full width, and the name is cut through the slot below
Output
One cuttable bookmark
Capitals a little taller than the slot, so every letter joins the frame on both sides
Program I builtOutside serviceWhat comes out

Three item types

Pet bookmarks, name pendants and collar plates

Each product has its own tab, and all three share one geometry engine. The flow is the same each time: enter the order, check the outline, press Generate. Only the shape built around the name changes.

Real output, straight from the programThree cut outlines side by side: a pet bookmark 40 by 100 mm, a Betsy name pendant 50 by 20.7 mm with a ring at each end, and a Brucie collar plate 53.8 by 17.1 mm with a bend frame at each end and a bone
The three item types, as the outlines the program wrote. Each is a single closed path, and the size in millimetres is calculated from the name.

The screens below are the real program with its live cut preview filled in, and each outline beside one is the DXF that run wrote. Two notes about this machine: the shop's four licensed fonts are activated on the work computer and not installed here, so the lettering is a stand-in face and the list reports 2 of 4 fonts ready; and the bookmark's line art normally comes back from the image model, so its Photo and Sketch panels hold the program's own bundled reference drawing. Everything after that is the real code.

  1. 01

    Item type 01 · Pet bookmark

    The first tab turns the customer's pet photo into a bookmark.

    • Up to 20 photos in one batch, one per order
    • Each photo becomes a card, with that order's name typed on it
    • The whole batch is generated at once
    How I built it: Pet bookmark
    • One reference file the shop had already cut sets every number: a 12 mm stick, a 6.3 mm slot, capitals 6.45 mm tall.
    • The capitals are deliberately taller than the slot, so no letter can fall out of the cut.
    • Long names go by rule: lengthen the bar, reduce the spacing, narrow the letters. The window says which one it had to do.
    DXF Generator bookmark tab after generating: the Griffin order selected, with Photo, Sketch and Silhouette panels across the top, Redo sketch and Redo silhouette buttons, sliders for head size, head position, name boldness and letter spacing, a green One piece ready to cut message, a Create DXF button, and the finished bookmark outline in the cut preview at 40.0 by 100.0 mm
    The bookmark tab after the artwork has been generated. The three panels are that order's stages: the photo in, the line drawing made from it, and the silhouette the cut is traced from, with Redo sketch and Redo silhouette for the one that comes back wrong. The green line reads "One piece - ready to cut".
    The generated bookmark outline: the traced pet head on top of a stick, with the name GRIFFIN cut through the slot below it
    What it wrote for that order: 40.0 × 100.0 mm, one closed path.
  2. 02

    Item type 02 · Name pendant

    The script name pendant, with a chain hole at each end.

    • Four script fonts, each checked as ready before it can be used
    • Letter spacing, letter boldness, which is how far the letters are grown so they fuse, and the width of the connector bars
    • Hole diameter from 1.0 to 2.2 mm, set separately for each ring
    • In the preview any letter can be dragged, rotated or resized, and so can the holes
    How I built it: Name pendant
    • Letters are grown by the boldness setting and unioned, so overlapping script becomes one shape.
    • What is still separate, a space, the dot of an i, a font whose letters never quite touch, is joined with a shallow tapered arc.
    • It uses the smallest set of those bars that makes the name one piece, and circles each one in red so the operator can see what was added.
    • Both rings sit at one height and never on a dot, because rings at different heights hang crooked.
    DXF Generator name tab: two orders both marked Ready, a Name design panel with order number, name and font, and a live cut preview showing the name Betsy welded into one script piece with a chain hole at each end, per letter drag, rotate and resize handles below it, and sliders for letter spacing, letter boldness, curved connector width and the two hole diameters
    Two orders, both generated. The live cut preview shows the real outline: the handles under it move, rotate and resize each letter, and the line beneath reads "2 separate pieces found - added 1 curved connector (red circles)". Every slider here used to be a manual Illustrator step.
    The generated name pendant outline: Betsy in script, welded into one piece, with a small ring at each end at the same height
    The same order as a cut path: 50.0 × 20.7 mm. One connector was added where the script did not touch, and both rings sit at one height.
  3. 03

    Item type 03 · Collar plate

    The metal name plate that bends around a pet collar strap.

    • Pet name in the collar script, with the plate sized from the name rather than the other way round
    • End symbol: none, a bone or a chicken leg, resizable and rotatable
    • Boldness for the letters, the connectors and the bend frames
    • The frames can be moved and resized in the preview, and a frame that would overlap the lettering is refused
    How I built it: Collar plate
    • Reuses the name builder and adds an open rectangular frame on each side for the strap.
    • The limits are built into the geometry: a frame moves within 20 mm across and 10 mm up, a letter within 8 mm, walls stay between 0.4 and 1.8 mm.
    • Anything outside those limits comes back as a plain sentence, for example "Keep each collar box outside the lettering".
    DXF Generator collar tab: order number and pet name fields, a No symbol, Bone and Chicken leg choice, sliders for symbol size, symbol rotation, letter spacing, letter boldness, connector boldness and rectangle boldness, and a filled cut preview showing the name Brucie in script with an open bend frame at each end and a bone, reading 53.8 by 17.1 mm, one connected piece
    The collar tab with the preview filled. The frames and the bone can be dragged and resized in place, and the readout confirms 53.8 × 17.1 mm, one connected piece. A plate cut in two pieces would be scrap.
    The generated collar plate outline: Brucie in script with an open bend frame at each end and a bone above the last letters
    The collar version of the same name: 53.8 × 17.1 mm. The open frames are what the strap threads through, and by the time the file is written frames, symbol and lettering are one path.
  4. 04

    And then · Generate, download, hand off

    One press writes the files, names them and puts them where the cutter can find them. This is the half of the job that used to happen in Finder and a browser tab.

    • Generate and download writes the files to the computer; Generate and upload sends the same batch straight into the shop's Google Drive, into a folder named for the day
    • The Drive link is pasted once. After that an upload is one button, with no exporting, signing in or choosing a folder per order
    • A second upload the same day reuses the folders already there, so the afternoon's batch joins the morning's
    • The file name is built automatically from the order number and the name, the same way every time
    How I built it: Generate and hand off
    • The DXF is AutoCAD 2004 at 1 unit per millimetre, one closed spline per contour plus a hatch, the same structure the shop's earlier exports had, so nothing downstream changed.
    • The preview is that written file rendered back to SVG, so the operator approves the exact file that gets cut.
    • Naming format: the date plus _cutting, then order number - name, then the same again plus the product.
    • The upload reuses any folder whose name already matches, so a second run merges into the first.
    What one batch writes
    The real tree from the run that produced the screenshots above, with the order numbers zeroed. The same structure is created in Drive, so each file is easy to match to its order at the cutter.
    Close up of the cut collar plate: the open bend frame on the left, the script letters welded into one continuous piece, and the counters inside the letters still intact
    A cut piece: frame, connector and welded script are one closed path, and the counters inside the letters survived.

How I built it

How each part works

A Python program packaged as a single Windows app, built with Claude Code. It runs a small server on the work computer and opens its own window onto it, falling back to the browser.

How each part works4 parts
01

Geometry in millimetres

One shared engine behind all three modes, working in real units from the first step.

How I built it

  • Every shape is a path in millimetres with y pointing up, so sizes on screen match the metal exactly
  • Boolean operations run on true Bézier curves, like Illustrator's Pathfinder, which keeps the script curves smooth
  • Paths are flattened to polygons only for measuring, never for the output
02

Licensed fonts without the font files

The shop's four script fonts are activated through Creative Cloud on the work computer, not shipped with the program.

How I built it

  • A small bridge asks Windows itself for the shaped outlines of a text, so the program never copies the font data
  • A font appears in the list only once Windows can see it, and a newly activated font shows up on a reload
  • The screen says how many fonts are ready, instead of failing later with an empty shape
03

Rings that hang level

Both chain holes sit at one height, as close to the ends of the name as the shape allows.

How I built it

  • It searches for the height where both ends are solid enough to carry a ring, preferring a higher line, around three quarters up, where the reference pieces had them
  • Small parts such as dots are never used for a ring
  • If there is nowhere safe it says "Could not find where to attach the rings" and does not write a pendant that would tear
04

Removing details too small to cut

Slivers, hair thin bridges and stray islands are removed before the file is written.

How I built it

  • Tiny islands and holes below a minimum area are dropped, and the program reports how many
  • If it still comes out as several pieces, the message names the number and suggests a thicker outline instead of exporting it
  • On bookmarks, whiskers too thin to survive the cut are taken out of the traced head