Designing 3D Printed Cross Stitch Canvases
by watchmeflyy in Craft > Embroidery
80 Views, 1 Favorites, 0 Comments
Designing 3D Printed Cross Stitch Canvases







This project originated from me going down the rabbit hole of watching cross stitch charm videos. It seemed like a relaxing activity to do while watching shows, but I didn't want to buy a whole pack of plastic canvas for the few small ideas I wanted to try out.
Cue my 7 year old 3D printer ready to pay itself off for the millionth time.
How is 3D printing cross stitch canvas advantageous over just purchasing plastic canvas? (note that you can actually use the methods shown in this tutorial to generate DXFs to laser cut your canvas)
- Hole space customization: with plastic canvas, you are limited to what you can buy and have to cut the canvas to the right size. With 3D printing, you can change the spacing of the holes to whatever thickness of floss or yarn that you're using.
- Color customization: instead of only translucent white for the canvas, you can print the canvas in whatever color(s) you want.
- Scalability: if you're making multiples of the same design, you don't need to cut out the shape painstakingly each time - you can just print the same shape repeatably.
- Easy back covers: to cover the messy backside of a stitched canvas, you can just print a perfectly sized back piece to stitch on.
- Designing for end intent: if you want to make a charm, you can intentionally add a loop to the top for a keychain. If you want to just display it, you can print a small frame leg so it stands up on its own. If you want to turn it into a magnet, you can add a boss to press the magnet into.
- 3D canvas: you can print three dimensional canvases instead of just flat canvas. You can put holes in curved surfaces, make boxes without needing to stitch the faces together, etc.
- Not-cross stitching: I didn't do it in this tutorial but you could do a circular array of holes instead of grid, or any other variation of hole patterning as you'd like. I didn't have a use case in mind but you could do cool mandalas with circular symmetries for example.
This tutorial walks through a few different ways to generate the 3D canvases:
- Starting with a pattern and making a shape: how to generate the hole pattern without painstakingly drawing each individual circle and dimensioning the spacing. This is the main method I used so the first 80% of the tutorial focuses on this
- Starting with a shape and filling a pattern: for when you have a shape or surface in mind and want to add holes
- Curved/3D surfaces: I had a tough time warping the hole pattern onto nonflat surfaces but I'll show some workarounds. I didn't spend too much time on this since I didn't have specific use cases in mind...
- Custom backings: I made two main deviations, one for magnets and another for a display/stand style
All print files and solid models are in a zip folder attached in the next "Supplies" step, plus posted on printables.com for easy individual access. Solidworks native files are attached for reference but of all of them, the pokeball one is the best one to copy the CAD.
PS: I do my CAD in Solidworks since I have a license and it's what I'm most familiar with. When I have time I might go back and add steps on how to do this in other CAD packages.. but until then if you don't have CAD software access, feel free to go through just step 1 to make your design and I'd be happy to make the 3D models for you. Just comment below or message me.
Supplies
- 3D printer and filament. I used just PLA but TPU might be interesting for a flexible feel actually
- Thread
- One point of 3D printing canvas is that you can make whatever hole spacing you want to fit whatever thread you want. I gave suggestions based on classic 14ct cross stitch, but you can easily scale up the holes to fit yarn of different weights for example. Scale the sizes to stitch with whatever you have.
- Needle (to match whatever thread you're using)
- If you're planning to stitch with yarn, you'll want darning needles. Tatting needles would be a good option as well.
- Scissors
- Google sheets access - this is how I generated my cross stitch patterns and then used a script to get XY coordinates for holes
- my Google sheet for reference
- CAD software
- I'll show everything done in SolidWorks for the designs, but everything can be replicated fairly easily in the CAD software of your choice.
Spreadsheet Pattern Design
Let's say you have a pattern in mind that you want to make a canvas for. First you'll need to generate a pattern in Google Sheets, which we'll use a script to output XY coordinates of hole locations. I made my patterns in this Google sheet, for reference. Make the rows and columns the same size (select a bunch of rows, right click > resize row height > set to something like 20px). Then change the background color of the cells to make the pattern.
To find inspiration for designs, you can search up "pixel art", "perler bead designs", "cross stitch charms", etc. If you have an image in mind, you can use a cross stitch converter like flosscross.com to generate the pattern that you can transfer to the Google sheet.
Important note: change the cell color of any "white" parts to cream, tan, or anything else as long as you don't just leave it blank. In the next step you'll see that I used a script to output the pattern's XY coordinates and it detects cells that are not white and not blank, hence why you need to make sure you intentionally keep white cells.
Once you're finished with your base design, we will need to edit it to make it stitchable. This spreadsheet will be used in order to output a table of XY coordinates for where holes need to be made in the canvas in order to be able to stitch the design. Notice the discrepancy though: each cell in the design represents a stitch, but what we need are XY coordinates for holes. We can't just put a hole where the cell is shaded (like picture below) and be able to stitch it.
Needle goes in and then... no color?
Instead, we need at least four holes to make a single stitch. You make the cross in cross stitch and that cross becomes your dot of color.
If you follow that logic, it means that to make a single dot of color, you will need four holes total. You can think of it as making sure you have 3 extra holes (north, west, and north west light grey holes next to the dark grey original hole). Here's an example: let's say you want to make a cross shape like shown below.
Starting with the top dot of color, we need to make sure we have 3 extra holes to make it. Shown below, to make the dark red cell, we need to add holes in the light red spots. The black outline box shows which four holes would make that dark red cell.
For the next dot of color, again we need to make sure we have 3 extra holes to make it. Shown below, to make the dark orange cell, we need to add holes in the light orange spots. Notice that there is overlap of one light red cell previously and one of the light orange spots.
To make the dark yellow cell, we need to add a new hole in the light yellow cell. Notice that there is overlap of the "four holes rule" with a dark orange and a dark gray cell - those are already accounted for - but there is a new light yellow cell added.
To make the dark green cell, we need holes in the spots enclosed by the black outlined box again. All of those cells already are shaded though so the holes are accounted for.
For the final dark blue cell, we need to add a hole in the spot shown in light blue. Two holes, the dark red and dark green, have already been accounted for.
To recap, in order to stitch the dark grey cross pattern, we need to add holes shown in the light grey cells below.
To spell this out, this is what the stitching would look like. Holes in the light grey and dark grey cells would be stitched together as shown with the dotted blue lines, to make dots of colors corresponding to the desired cross shape. Generally, the rule of thumb is to add a cell above every top-most cell in your pattern and add a cell to the left of every left-most cell. Make sure that each cell in your pattern has a total of 4 holes to make the corresponding cross stitch.
Here are examples of my patterns now. The desired pokeball pattern as grey extra cells I added in order to be able to stitch it. I added a cell above every top-most cell and another cell to the left of every left-most cell. I don't know how to describe it well but also add a cell at the "top left corners" - in the example below, cells in corners E1, C2, B3, and A5 are added. Again, just imagine making sure that each cell in your pattern has a total of 4 holes to make the corresponding cross stitch. It'll look like your pattern has a shadow casted north west of it.
Similarly, see the sakura pattern below. Cells are added above every top-most cell and to the left of every left-most cell, plus the corner cases (J1, H3, G5, etc).
Script for Outputting XY Coordinates of Pattern
ChatGPT was extremely helpful for generating a script to output XY coordinates based on the Google Sheet patterns, and the final script is pasted below. What it does is:
- Scans the last active Google sheet your account accessed
- Collects row # and column # for cells that are shaded. Only looks at background color and ignores whether a cell has content
- Outputs scaled row # *2 and column # *2 in a text file
- The 2 is the spacing between holes for a roughly 14ct canvas (2mm). I say roughly because this is a little bigger than 14ct canvas; I couldn't go smaller or else my canvases were too delicate and broke easily.
Here are notes on parts to edit in the script:
- There are constants "rowScaled" and "colScaled" where the row # and column # are multiplied by 2, meaning 2mm. You can change that constant based on what spacing you'd like for the holes though, so if you want to use more thicker thread you'd want to increase the spacing.
- The line that starts with DriveApp.createFile has a location for the name of the txt file. Update this based on what the design and spacing are, so you don't get multiple text files with the same name.
Final script:
Using Apps Script


To use the script, go to your pattern spreadsheet and go to Extensions > Apps Script. You'll open the project editor page where you can click the + sign to make a Script and then you can paste the script from the previous step. Some security access popups will come up which you can breeze through before you press Run. The .txt file will then output to your Google Drive! Don't forget to change the file name line so that you don't end up with same named txt files.
I ran into this error message "Exception: Cannot call SpreadsheetApp.getUi() from this context." occasionally so if you do to, just reload the google sheet and go to Extension > Apps Script to reopen your code from that sheet. See details here.
Designing the Canvas: Table Driven Pattern






The steps in the pictures above walk you through how I did the table driven pattern in SolidWorks. There should be similar functions in pretty much any other CAD program you use. The notes in each picture are copied below for reference.
- I started by making a large 70x70mm square and adding a Ø1.5mm circle. The 1.5mm hole is driven by global variables "holeSize" and distance - see left.
- I made two variables: distance and holeSize. This way I could scale my hole sizes and outline accordingly if I were to change my thread thickness. HoleSize is exacty that; the diameter of the holes. Distance is 1.1*holeSize (hence 1.65) and is the distance from the outer edge of the canvas to the closest hole (will make sense later). I dimensioned the hole 1.65mm from the top and left edges.
- The pattern in question is just a circular hole. I made the holes circular instead of square thinking that it would help the printer do smoother motions instead of choppy lines, plus I figured the squares might break more easily due to stress concentration at the corners.
- Using that sketch, I extruded the square (1mm thickness) and cut out the circle. Note that I did the circle cut as a dedicated cut feature; that way I could select cutting out the circle as a patterned feature.
- Go to Reference Geometry > Coordinate System and create a coordinate system. I made it from the center of the circle but it doesn't really matter; that's a legacy decision from something I was trying. Using the top left corner of the square is fine too.
- Now to generate a table driven pattern. Use the coordinate system from the previous step and the circle extruded cut as the feature to pattern. Browse to the .txt file generated from the Google Sheet and import that as your XY coordinates. Now you have the pattern of holes to stitch through!
- Now that you've cut out all the holes, you need to cut the outline. I made the outer edges 1.65mm from the closest hole (global variable "distance" shown in step 1). To do this quickly, I drew the outline and then drew perpendicular construction lines from each line segment to the closest hole. Then I selected all the construction lines, made them equal length to each other, and dimensioned one of them (and thus all) "distance" in length. See next step for the 2.43mm offset inner lines and orange circled parts - that's for the backing so you don't need to do that now.
- Fillet all corners and now you're done with the cross stitch canvas model!
- Note that you can actually use this method to generate DXFs to laser cut your canvas
Table driven pattern is just what it's called in Solidworks, but you should be able to find equivalents for other CAD softwares as well. For Fusion 360 users, here are a few resources I found:
- Import points from excel file
- You could first create a sketch of points from an excel file and then use that sketch to drive the pattern
- Sketch driven patterns
Alternative: Filling a Canvas


Let's say that you don't necessarily have a pattern but instead you have a shape you want to fill. For example, you have a specifically sized spot that you want to stitch. This method works only for flat shapes; see next step for curved options.
There is a Fill Pattern tool that allows you to propagate features within a shape/outline. What you'll need first is the shape that you want to fill. Cut out your designed hole size anywhere in the shape. Make sure you have a straight line somewhere (construction line in a sketch, or outer edge, etc) so that you can reference it for your fill direction. For the Fill Pattern tool, select the straight line as the guide for your grid array, edit the grid array spacing, and select the outer edge of the shape to fill. This works for outlines that are straight or curved. (Notice in the screenshots above that the grid spacing I chose was 1.8mm; this was before I realized 1.8mm is too close for the holes I chose and thus the canvas was too delicate.)
Alternative: Filling Curved Surfaces




The Fill Pattern tool doesn't work on nonflat surfaces so I wondered how to do curved surfaces. You can actually start with a flat design and then bend/warp/flex it to a different curvature. In this example though, I wanted to make a circular box: so holes in a cylinder. If I were to warp an array of holes and then cut it on the exterior, that was computationally too intense. Instead, I extruded (using extrude thin, so that it was a wedge shape cross section instead of rectangular) just a sliver of the cylinder and cut holes into it. Then I made a circular array of that sliver to fuse and make a complete cylinder.
I actually started with a pattern (the night whale pattern in my Google sheet) so I calculated out what the circumference and hole spacing would be to get the right number of columns. In the first screenshot, the 4.29° arc angle is to get 84 columns, which is 360° (circle) / 84 (columns) = 4.29°. Then the 24.21mm radius is from having 84 columns that are spaced 1.8mm apart (again, before I realized 2mm spacing was better). The circle's circumference would be 84 (columns) * 1.8mm = 151.2mm, so to get radius you do 151.2mm / 2 / pi = 24.1mm (round up for this so that your slivers overlap when you combine).
To do the lid, I made a gently curved dome and then used the Wrap tool in order to wrap a sketch of holes onto the surface. This was annoying since I had to manually delete holes that didn't fit within the boundary, or else the cuts would get too close to the edges.
I mention these alternate methods without having a use case in mind, since I was just curious to try patterning. This step is more to show you ideas in case you want to do something with it, hence why the steps aren't as exhaustive.
Backing Design




To design the backing that you'll stitch on the back of your cross stitch, you'll need to fill in all holes except the outermost ones (that is, if you don't want to just stitch a mirror copy of your design and stitch that as your back).
To do this, I selected the outline I made (right click any segment and click "select chain" and used offset entities to make a copy of that outline 2.43mm inward. 2.43mm was the distance so that the line isolated the outermost holes; if you changed the hole spacing in the App Script from 2mm, you'll have to adjust accordingly. The orange circled parts: on diagonals, you'll notice that the 2.43mm offset lines intersect holes. You'll actually want to add that intersected hole as a hole in the backing so you can stitch through it: this is because you'll want more stitches on diagonals since they're "longer" than just your usual vertical or horizontal borders. To exclude the intersected hole from being filled, select the hole and click "convert entities" so that you have that circle copied to your sketch. Then use the trim tool to cut the intersecting lines as shown in the second image above. This final outline is what you'll use an extrude command in order to fill the center, thereby only leaving the outermost holes and the intersected holes.
Reference the third picture above to see what holes you'll want to keep for your backing, at corners and on diagonals. The sakura cross stitch I did was my first before I knew to include the extra holes in the diagonals so it looks a little different, if you look closely. I've corrected it in the final models I've shared here though - just not the pictures since I didn't redo it.
If you want just a plain backing, you can stop here and this is your final model to print.
Magnet Backing

To turn this into a magnet quickly, you can extrude a boss to house the magnet directly in the backing piece. I used Ø6mm x 2mm circular magnets so made a boss to those dimensions, added some fillets to clean it up, and called it a day.
Frame Backing


You can also extrude a leg on the back so that the cross stitch canvas will stand up for display on its own. See the second image above as a reference for the dimensions on the chicken, but you'll have to make it longer and bigger depending on how large your pattern ends up being. The leg is angled 60° upward so that it can print without supports.
Printing Tips

At this point I had the files and finally sent them to my printer thinking that was the end of it. Of course I jinxed myself and all I got was an mess of extrusions dragging with my nozzle. Printing the tiny holes was unsurprisingly difficult for the printer to do since they were so small and thus printed so fast.
Main tips to get the best fidelity of the printed canvases:
- Slow down your speeds
- 100% infill
- Enable ironing for the canvas that you'll stitch on (not necessary for backing)
- Dry your filament
- Tune retraction settings
I had to turn down my printing speeds in order to print the holes properly, dropping them down from standard 60-80mm/s to 15mm/s. This is only for extrusion/print moves - I didn't change travel speeds. See below for what it looked like in PrusaSlicer.
Because the canvas is riddle with holes, there's no point in decreasing infill so keep it at 100% to make it as solid and strong as possible. To better fuse the extrusions together, turn on ironing too.
Stringing comes up inevitably due to the tiny holes. Drying filament helps with minimizing stringing so highly recommend that. Tuning retraction settings also helps, but what I'll say is that I still had slight stringing despite having recently re-tuned retraction. As long as you can push a needle through your holes, a little bit of stringing isn't a concern.
Cross Stitching


There are good online tutorials for how to cross stitch in the first place: this is a good one, for example. A tip to keep in mind is not to tie a knot to secure your thread, which would result in awkward bulges in the back; instead, just leave a long tail and rely on the tension in the strand to keep the stitches in place. For my Ø1.5mm holes and 2mm spacing, I found that 2 strands of embroidery floss folded in half (so 4 total strands) worked well.
There isn't anything too specific for stitching into plastic compared to fabric, except your print quality will affect how easy it is to stitch through the holes. If your holes are ending up too small to stitch into, you may have stringing issues or elephant foot - in that case, either pre-poke your holes with an awl to widen them or use elephant foot compensation. Alternatively, make the size of your holes a little bigger and print again.
Stitching the Backing



To stitch the backing to the stitched canvas, it's as simple as whip stitching the two sides together. The pictures in this step show a few tips on how to start and end the whip stitches.
Again, don't tie any knots to secure the thread. Just rely on the tension in the thread. Poke through a hole and when you're pulling the thread through, before the end goes through both layers, use your needle to pull up on the thread so that the end of the thread is caught between the two halves, instead of coming from outside. See the images below for what it should look like.
Then tuck the end between the two layers (trim it shorter if needed) and whip stitch all around.
If you run out of thread, use the needle to sew back through a few stitches (third image above) and cut the end off, before securing another thread like you did previously.
Anyway, now you're done with your cross stitched whatever! Have fun, get creative, and think outside of the standard cross stitch box because with 3D design, now you can.