Skip to content
Tutorial

Trace a scanned drawing into Rhino 8 curves: one spline per stroke with VectoSolveTrace

Rhino has no raster-to-curve command and the free Vectorize plug-in traces outlines. VectoSolveTrace does the centerline pass: one editable SPLINE per stroke, imported as a millimetre DXF into the open document.

Robin MonteiroSeptember 3, 2026Updated: September 3, 202613 min read
Use this article with an AI assistant:
.md
Trace a scanned drawing into Rhino 8 curves: one spline per stroke with VectoSolveTrace
R
Robin Monteiro

Founder of VectoSolve

Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.

How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author

Image vectorizationCutting machine filesEmbroidery filesSVG
Free previewNo signupFull-quality output

Try it on your own file

Free preview, no signup. Drop an image and see the vector before deciding anything.

The problem: outlines are the wrong geometry for a drawing

Rhino has no raster-to-curve command. The usual answer is the free Vectorize plug-in from McNeel, and for logos and filled shapes it is the right answer: it traces the outline of every dark region with Potrace, the same engine Inkscape uses. On a scanned drawing that geometry is wrong by construction. A pencil line 0.5 mm wide becomes two curves 0.5 mm apart plus two tiny caps. A lines plan, a floor plan, a hand sketch or a patent drawing comes back as a field of thin closed loops that nobody can fair, offset, extrude or dimension. You do not want the edge of the ink; you want the line the draughtsman drew.

Rhino users have been saying so for six years. Six threads on the McNeel forum ask for exactly this, and none of the answers points to a plug-in that does it. Their view counters, read on 2026-09-03: "How to trace a line drawing image to be a real line vector" (April 2020) 13,840 views and 16 replies, one of which concludes that the best tool for the job is not an automated one; "Raster to Vector Conversion Plug In" (October 2020) 4,746 views and 35 replies, the thread in which users asked for a replacement after the author of the old Trace plug-in passed away, and from which Vectorize was born; "Medial Axis from multiple closed curves, middle of double line" (June 2022) 2,975 views; "Extract Curves from Raster Image" (November 2022) 2,512 views; "Vectorize: centerline tracing" (December 2025) 420 views and one reply, "each converted line is doubled"; "I love Rhino, but hand-drawn blueprints are still my kryptonite" (February 2026) 431 views and 9 replies, "hours of manual tracing... old scanned archive plans". The forum counts 130,882 members and 3,998 active in the last 30 days.

Rhino forum threads asking for centerline tracing, views per thread

VectoSolveTrace is a Rhino 8 command that does the centerline pass: one editable curve down the middle of each stroke, delivered as SPLINE entities in an AutoCAD 2000 DXF and imported into the open document. This article is the engineering report: what it does, how it was measured, where it broke while we built it, and what it will not do.

What Vectorize does well, and where it stops

Vectorize (Dale Fugier, McNeel) is free, GPL v2, and popular: 68,729 downloads and 108 five-star votes on food4Rhino as of 2026-09-03, about 38 downloads a day since October 2020. Rhino 7 and 8 users install it through PackageManager. It is the tool to reach for when the image is a logo, a silhouette or a filled shape, because the outline is the geometry you want.

It stops where the input is a stroke. Potrace has no notion of a stroke's middle; it traces the boundary between dark and light. Every line becomes a ribbon, every crossing becomes a small polygon, and the cleanup is the manual tracing the forum threads describe.

How centerline tracing works, and two bugs we found on the way

The pipeline behind VectoSolveTrace runs on our servers and is the same one the website's centerline page uses:

  1. Threshold. The image is flattened on white, converted to grey, and split into ink and paper with Otsu's method, which picks the grey level that best separates the two populations of the histogram.
  2. Thin. The ink mask is eroded to a one-pixel skeleton (Zhang-Suen thinning) and traced into polylines with junction awareness, using the skeleton-tracing-js library.
  3. Smooth, then fit. The pixel staircase is smoothed with a short moving average, then each polyline is fitted with cubic Bézier curves. The order matters: fitting first and smoothing after rounds the corners; smoothing first and fitting after keeps a 90 degree corner sharp and turns a 400-point fair line into five cubics with 0.17 px of deviation.
  4. Write. Each Bézier chain becomes one SPLINE entity in the DXF (details below).

Two bugs are worth reporting because they explain results you may have seen elsewhere.

The fan. On 2026-09-02 a naval architect's scan, 2,712 by 4,200 px with the scanner border touching all four edges, traced to about 30 segments radiating from one point instead of the 2,000 lines on the sheet. The cause is a rule inside skeleton-tracing-js: it divides the image recursively along seams, and a seam is only valid if both of its ends are white. Ink on every border leaves no valid seam at the root, the library falls back to treating the whole image as one chunk, and joins every border crossing to the centre. A four-pixel white margin around the mask restores the first seam. Measured on that scan, downscaled to 3,000, 4,000 and 4,096 px, then at full size: 32, 30, 30 and 30 polylines without the margin; 1,920, 2,230, 2,260 and 2,251 with it. The regression test is a framed grid: 1 polyline without margin, 308 with.

Centerline tracing of the same scan with and without a white margin

The pure black-and-white refusal. On 2026-09-03 the plug-in's own test harness sent a PNG exported from a drawing program, pure black on pure white, and the server refused it as "empty". Otsu's method on a two-level histogram gives a plateau of equally good thresholds; the code kept the first one (zero), and a mask defined as "darker than zero" is empty. Keeping the last threshold of the plateau fixed it. Greyscale scans were never affected because their histograms have no plateau.

A Full Year of Conversions for $49

Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime

Get the Annual Deal

Installing and running the command

  1. In Rhino 8, run PackageManager, search vectosolve, install VectoSolveTrace, restart Rhino. The package is published on McNeel's package server (version 1.0.0, MIT licence); the food4Rhino listing was submitted on 2026-09-03 and follows once approved.
  2. Create a free VectoSolve account and an API key at vectosolve.com/dashboard/api-keys. Trial calls are included, no card needed.
  3. Open a document in millimetres and run VectoSolveTrace.
  4. First run only: a text box asks for the key and stores it in %APPDATA%\VectoSolve\api_key.txt (macOS: ~/Library/Application Support/VectoSolve). The key leaves your machine only in the request header to vectosolve.com over HTTPS.
  5. A file dialog: pick the scan (PNG, JPG, WebP or GIF, up to 4 MB, the server cap being 4.5 MB per request).
  6. A prompt: "Drawing width in millimetres (0 keeps one pixel per millimetre)". Type the real width of the drawing if you know it.
  7. The command line shows "Uploading (mode centerline)", then "DXF received" with the number of curves, and the curves appear in the document, selected and zoomed. The last line gives the conversions left on the account.

Under the hood the command sends one multipart request to the VectoSolve API with mode=centerline, output_format=dxf, dxf_version=AC1015, units=mm and your width, with an Idempotency-Key header so a retry after a network cut never charges twice. It writes the DXF to a temporary file and runs _-Import on it. When the server answers 422 (the image is not line art), the plug-in explains and offers the outline mode instead. When the key is rejected, it forgets it and asks again.

Preparing a scan: four numbers that decide the result

  • Resolution. The tracer downscales anything above 3,000 px on the long side before thinning. A 300 dpi A3 scan is 3,508 px wide and will be reduced by 15 percent; fine lines survive that. A 600 dpi scan gains nothing and uploads slower.
  • Threshold. A greyscale scan carries paper texture and pencil pressure. If the result has stray specks, export the scan as pure black on white first (threshold at about 50 percent in any image editor) and trace that.
  • Ink ratio. The server refuses images with more than 20 percent ink as "too filled", because a filled shape has no meaningful centerline. The ratio is measured on the source, not on the downscaled copy: reducing a 2,900 px plan once pushed its apparent ink from 14 to 17 percent and tripped the guard, so the check was moved to the original.
  • Margin and dashes. The margin is now added automatically, but a scan cropped inside its frame still traces cleaner. Dashed grid lines come out as short curves, which is correct and useless; redraw the grid in Rhino, it is a grid.

A worked example: a 30-year-old lines plan

The scan that exposed the fan bug is a good test because it is ugly in the normal ways: greyscale, border on all sides, a dashed station grid, 30 years of paper. Thresholded to pure ink and thickened slightly, it traced to 2,251 single curves. Exported as SPLINE entities, the DXF was re-read by the reference parser with zero errors and imported into Rhino 8 as curves that snap, offset and fair. End to end, in production on 2026-09-02, the same scan (2,070 curves on that run) took 8.5 seconds. The dashed grid came out dashed and was redrawn in two minutes. The design work, fairing the hull lines and fitting them to stations, stayed with the designer, which is the honest shape of this job.

The test drawing shipped with the plug-in is smaller: 1,200 by 900 px, a rectangle, a circle, two diagonals and a short stroke. It traces in 3.4 seconds to 10 SPLINE entities with extents from 21 to 189 mm for a requested width of 210 mm, and a zero-error audit.

Before and after on a line drawing: scan on the left, one spline per stroke on the right

Free SVG Tools for Crafters

Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG

Check Your SVG Free

DXF internals: why the file opens, and what is inside

Rhino reads two DXF flavours from VectoSolve.

R12 (AC1009) is the 1992 format: POLYLINE and VERTEX records, no handles, no object dictionary. It reads in every CAM package of the last thirty years, and it flattens every curve to vertices. On the 2,251-curve plan above, the R12 export weighs 894 KB and carries 17,861 VERTEX records, five group-code pairs each.

AutoCAD 2000 (AC1015) is what the plug-in uses. It carries LWPOLYLINE entities (two group-code pairs per vertex) and SPLINE entities, on a complete R2000 skeleton: a HANDSEED, a handle on every entity, nine symbol tables, block records, a BLOCKS and an OBJECTS section. The same 2,251 curves weigh 585 KB as LWPOLYLINE and 684 KB as SPLINE; splines are larger than flattened polylines here because each cubic keeps its control points.

The same 2,251 traced curves written three ways

The skeleton is not a detail. On 2026-08-25 Rhino 8 refused a DXF from an earlier version of our AutoCAD 2000 writer with "Opendesign error: missing symbol table": the file had one table and no handles, and lenient readers had hidden that for months. The rewritten writer emits the full structure, and every AutoCAD 2000 export is now re-read by the ezdxf 1.4.4 reference parser, in strict mode with an audit, inside the test suite: zero errors on five option combinations and on 15 of 16 real customer files, the sixteenth being an empty-geometry edge case fixed the same day. The test is the guarantee; a sentence on a web page is not.

How a stroke becomes a SPLINE. Each traced stroke is a chain of N cubic Béziers. A chain of cubics is exactly a clamped B-spline of degree 3: the control points are the Bézier control points with shared endpoints written once (3N+1 points), and the knot vector repeats each interior value three times, [0,0,0,0, 1,1,1, 2,2,2, ..., N,N,N,N], so the knot count equals the control count plus four. In the DXF that is group code 70 = 8 (planar) or 9 (closed and planar), 71 = 3 (degree), 72 = knot count, 73 = control point count, 74 = 0 (no fit points), one 40 per knot and 10/20/30 per control point. Every span of the spline is the original cubic, an identity rather than an approximation, which is why the curve you edit in Rhino has a handful of control points instead of hundreds of vertices.

Vectorize versus VectoSolveTrace, side by side

Vectorize (McNeel, free)VectoSolveTrace
MethodOutline tracing (Potrace)Centerline tracing (skeleton of each stroke)
A pencil line becomesTwo curves plus capsOne curve
Best forLogos, filled shapes, silhouettesScanned plans, sketches, single-line lettering, technical drawings
Photos and fillsTraced as outlinesRefused with an explanation, not charged; outline mode offered instead
OutputRhino curves in the documentDXF AC1015 with SPLINE entities, imported into the document
UnitsDocument unitsMillimetres, the width you type
RunsLocallyOnline, through the VectoSolve API
PriceFreeFree plug-in; one conversion per run on a VectoSolve account

Both have a place. Trace a logo with Vectorize. Trace a lines plan with VectoSolveTrace, then fair the curves in Rhino.

What it will not do

Centerline tracing is for line drawings. On a photo, a filled logo or a shaded rendering the server refuses the job and does not charge; the plug-in then offers the outline mode, which gives the same closed polylines Vectorize would. It does not fit curves to a station grid, fair a hull, or decide which of two crossing lines continues where; that is design work on top of the traced curves. And it does not read TIFF: export the scan as PNG first. For reference, the commercial raster-to-vector tools aimed at CAD start at $89 a month (Scan2CAD, vendor pricing read 2026-09-02); the plug-in is free and each run costs one conversion.

A Full Year of Conversions for $49

Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime

Get the Annual Deal

Pricing

The plug-in is free and open source (MIT). Each run uses one conversion on your VectoSolve account, like a conversion on the website: $7.99 a month for 25 conversions, or the annual plan at $49 for 300 conversions a year. A refused image costs nothing.

Where VectoSolve runs

Frequently asked questions

Does it work in Rhino 7?
No. The command is a Python 3 script packaged for Rhino 8. On Rhino 7, use the web page and import the DXF.

Does it need Grasshopper?
No. It is a plain Rhino command.

Can I get polylines instead of splines?
Yes. Run the same image on the website in Laser or Standard mode with DXF R12 output, or use Rhino's Convert on the splines.

How accurate is the centerline?
On a clean 300 dpi scan the curve sits within a pixel of the drawn line; the Bézier fit adds at most 0.8 px of deviation by design. On a blurred scan the skeleton follows the blur, so threshold first.

Will the file open in AutoCAD, Fusion or SolidWorks?
It carries the full AutoCAD 2000 structure and is re-read by a reference parser before release. Rhino is the host we test in; other CAD programs read the same standard, and we would rather you test than take our word.

What about ink on the border?
Handled since 2026-09-02 by an automatic margin; a scan cropped inside its frame still gives the cleanest curves.

Why one conversion per run?
The centerline pass runs on our servers, like the website. A refusal is free; a successful trace is one conversion.

Free SVG Tools for Crafters

Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG

Check Your SVG Free

Sources

  • McNeel forum, discourse.mcneel.com, topics 99934 (April 2020), 110206 (October 2020), 143510 (June 2022), 150737 (November 2022), 214082 (December 2025), 215406 (February 2026); view and reply counters read 2026-09-03; forum size from about.json, read 2026-09-02.
  • Vectorize plug-in page on food4Rhino: food4rhino.com/en/app/vectorize, downloads and votes read 2026-09-03.
  • Rhino package manager documentation: developer.rhino3d.com/guides/yak.
  • skeleton-tracing-js: github.com/LingDong-/skeleton-tracing.
  • Potrace: potrace.sourceforge.net.
  • ezdxf, the DXF reference library used in VectoSolve's test suite: ezdxf.mozman.at.
  • VectoSolve measurements: fan test and margin fix, DXF sizes, production timings, 2026-09-02 and 2026-09-03.
  • Scan2CAD pricing, vendor site, read 2026-09-02.
Tags:
rhino 8
rhino trace image
raster to vector rhino
centerline
dxf spline
scan to cad
food4rhino
Share:

Try Vectosolve Now

Convert your images to high-quality SVG vectors with AI

AI-Powered Vectorization

Ready to vectorize your images?

Convert your PNG, JPG, and other images to high-quality, scalable SVG vectors in seconds.

Doing this for customers?

If cut-file prep is your business, you are probably paying per file.

An outside art service charges 6 to 26 dollars a logo and comes back the next day. Redrawing it yourself costs half an hour you could bill. A year here is $49 for 25 conversions every month, every machine format included, which works out cheaper than two outsourced logos.

Everything on this page stays free. This is only worth it if you do volume.