English · 简体中文
The Missing Optical Lens & Filter Thread Standard for Autodesk Fusion 360
(Formerly fusion-lens-threads)
🎯 The end of hand-modeling lens threads at 2 a.m.
If you 3D-print vintage lens adapters, cine-mod vintage glass with 80mm/95mm front rings, or machine custom filter step-up rings, you already know the pain: Fusion 360 ships without camera optics thread tables.
OptiThread drops the complete photographic optics standard directly into Autodesk Fusion 360's native Thread dropdown. Pick your size, click OK, and print parts that actually screw together smoothly.⭐ Star this repository — even if you don't need an adapter tonight, you'll thank yourself the moment you pick up your next vintage lens.
🟠 Now listed on the Autodesk App Store! The easiest install: in Fusion 360 open Scripts and Add-Ins → App Store, search Camera Lens and Filter Threads, and click Install. (Store page is in review; the link goes live for everyone once Autodesk approves it.)
After installing, the Camera Lens and Filter Threads family shows up right in the native Thread command.
| The Problem in Lens Making | What happens natively in Fusion | How OptiThread solves it |
|---|---|---|
| The 0.75mm vs 1.0mm Trap | Filter rings are 0.75mm pitch; M42 mounts are 1.0mm. Modeling the wrong one strips threads. | Both pitches pre-configured for every single diameter from 24mm to 127mm. |
| The Leica L39/LTM Myth | People use M39×1.0. It binds after 1.5 turns and damages historic Leica threads. | True 26 TPI (0.9769mm) pitch with authentic Whitworth 55° profile included. |
| The 3D-Print "Fusing" Disaster | Nominal CAD threads stick together due to layer expansion and printer tolerances. | Tuned 0.10mm 6g/6H clearance built right in — parts screw together right off the build plate. |
| Cine-Mod & Step-Up Rings | Fusion lacks large front diameters (77mm, 82mm, 86mm, 95mm, 114mm cine fronts). | Complete standard cine and filter sizes included up to 127mm. |
- 🎞 Vintage Lens Adapters: M42, Leica L39/LTM, Soviet/Zenit, Enlarging lenses, Projector glass adapted to Sony E, Canon RF, Nikon Z, L-Mount, Fuji X.
- 🎬 Cine-Modding & Step-Up Rings: Custom 80mm / 95mm cine front rings, matte box adapters, seamless follow focus gear threads.
- 🔭 Astrophotography & Optomechanics: Custom T-mounts, filter drawers, Barlow couplers, telescope adapters.
- 📸 Camera Accessories: Custom metal/printed lens hoods, macro extension helicoids, anamorphic clamp brackets.
- Why this exists
- Why every lens-maker needs OptiThread
- Built for your next optical project
- Features
- Supported sizes & pitches
- Which pitch: 0.75 vs 1.0 mm
- Requirements
- Installation
- Using it in Fusion 360
- After a Fusion 360 update
- Troubleshooting
- How it works
- Customizing / development
- Contributing
- License
- Acknowledgements
Fusion 360 ships with standard ISO / UTS thread tables, but photographic lens and filter threads are not in there — things like the M42 lens mount, M39 (Leica screw mount), or the dozens of filter-ring diameters (49 mm, 52 mm, 77 mm …). If you 3D-print or machine lens adapters, filter rings, step-up rings, or custom mounts, you normally have to hand-model each thread.
This project drops a ready-made thread family into Fusion so you can just pick the size and pitch from the dropdown — like any built-in thread.
- 🔍 Auto-detects your Fusion 360
ThreadDatafolder (newest installed version) on macOS and Windows — no hunting through hidden app folders. - 📦 73 diameters covering the full common lens/filter range (24 – 127 mm).
- 🎯 Two pitches per size —
0.75 mmand1.0 mm(e.g.M42x1mount andM42x0.75filter thread). - 🎞 Leica Thread Mount (L39 / LTM) — the real mount is 26 TPI =
0.976923 mm, not 1.0 mm. Available as
L39x1/26-LTMin the main family (60° profile) and asL39x1/26in a second family with the historically correct Whitworth 55° flank angle. - 🔩 External (6g) + internal (6H) for every entry, with a 0.10 mm fit clearance so an external thread screws into an internal one of the same size.
- 🪶 Zero runtime dependencies — macOS uses the built-in
bash, Windows uses the built-inPowerShell. No Python required to install. - 🧪 Tested — a Python generator + test harness verify all three generators (Python / bash / PowerShell) produce identical, valid Fusion XML.
- 🛠️ Hackable — change one list to add your own sizes or pitches.
All diameters (mm), each available in 0.75 mm and 1.0 mm pitch:
24 25 25.5 27 28 30 30.5 34 35.5 36 36.5 37 37.5
38.5 39 40 40.5 41 42 43 43.5 44 46 46.5 48 49
50 50.5 52 54 55 56 58 60 62 64 67 70 72
74 75 76 77 78 80 82 84 85 86 87 90 92
94 95 96 98 100 102 104 105 107 108 110 112 114
116 118 120 122 124 125 126 127
That's 73 sizes × 2 pitches × (external + internal) = 292 thread definitions.
The commonly requested M39, M40, M42, M43 are all included.
Photographic filter threads are metric, but the Leica Thread Mount is not:
| Mount | Diameter | Pitch | TPI | Flange focus |
|---|---|---|---|---|
| L39 / LTM (Leica screw mount) | 39 mm | 0.976923 mm | 26 | 28.8 mm |
| M39 (Soviet/Zenit, enlarger) | 39 mm | 1.0 mm | 25.4 | 45.2 / 28.8 mm |
| Canon J-mount | 39 mm | 1.058 mm | 24 | 28.8 mm |
L39 = LTM = LSM — three names, one mount. They all mean exactly this:
39 mm × 26 TPI. "M39" is the popular nickname (it is the title of the Wikipedia
article), but it is ambiguous: a true metric M39×1 (Zenit SLR / enlarger
thread, 1.0 mm) is a different thread, and mixing them is the single most
common way to build a 39 mm adapter that will not focus. That is why the
designation here is prefixed L39, not M39 — while M39×1 remains
available in the standard family for the Soviet/enlarger mount.
0.976923 mm = 25.4 mm / 26. Both LTM families here use that exact pitch:
Camera Lens and Filter Threads→L39x1/26-LTM— 26 TPI pitch on a standard 60° profile. This is the pragmatic choice for 3D-printed adapters (most published LTM adapters are modelled at 60°, and the 0.10 mm clearance absorbs the profile difference).Leica Thread Mount (L39/LTM)→L39x1/26— the same pitch with the original Whitworth 55° flank angle and Whitworth depths (d₂ = d − 0.640327·P,d₁ = d − 1.280655·P). Use this when you want the historically correct form.
Flange focal distance (28.8 mm for LTM) is a body/lens dimension, not a thread dimension — set it in your model, the thread file only defines the thread.
Both pitches exist for a reason: the same diameter number can be a filter thread (0.75 mm) or a lens mount (1.0 mm) — the pitch is what tells them apart.
Quick rule
- 0.75 mm → the thread on the front of a lens (where you screw UV/ND/CPL filters, lens caps, hoods, step-up rings). This is the photographic standard for filter threads up to ~86 mm.
- 1.0 mm → (a) large filter diameters (95, 105, 112, 120, 127 mm),
and (b) screw lens mounts like
M42×1(Pentax/Praktica SLR) andM39×1(Leica Thread Mount rangefinder).
| You are modeling… | Use | Examples |
|---|---|---|
| A screw-in filter, cap, hood, or filter step-ring (≤ 86 mm) | 0.75 mm | 49, 52, 67, 77 mm filter threads |
| A large filter accessory (≥ 95 mm) | 1.0 mm | 95, 105, 112, 120, 127 mm |
| An adapter to a vintage M42 screw-mount lens | 1.0 mm | M42×1 (Pentax/Praktica) |
| An adapter to a Leica screw-mount lens (L39/LTM) | 26 TPI = 0.976923 mm | L39x1/26-LTM |
| Unsure / generic filter part | default to 0.75 mm | safe choice |
Concrete size notes (the ones people mix up)
- M39 (three different things share this number — check the pitch):
M39×0.75→ a 39 mm filter thread.M39×1.0→ Soviet Zenit M39 / enlarger M39 (a DIN 1 mm thread).L39x1/26-LTM→ the real Leica Thread Mount, 26 TPI = 0.976923 mm. Leitz used a Whitworth-form thread because the plant already made microscopes (RMS thread), which is why the pitch is not a round metric number. A 1.0 mm adapter will not correctly mate with a true LTM lens.
- M40 / 40.5: filter threads →
0.75 mm. - M42:
M42×0.75= 42 mm filter thread;M42×1.0= the famous SLR screw mount (use 1.0 for adapters). - M43: filter thread →
0.75 mm.
In Fusion 360, just pick the matching designation in the Designation dropdown — the screenshot below shows both pitches listed side by side.
The Designation dropdown lists both pitches for each size — e.g. M46x0.75 (filter) and M46x1.0 (mount).
- Autodesk Fusion 360 (any recent version) installed.
- macOS or Windows. No Python, no plugins, no admin rights needed for the default install.
TL;DR: run one script → restart Fusion 360 → pick
Camera Lens and Filter Threadsin the Thread dialog. Three steps, done.
- In Fusion 360, open Scripts and Add-Ins (under the Tools menu), then click the App Store tab (or the store icon).
- Search for Camera Lens and Filter Threads and click Install.
- The add-in copies the thread library into Fusion's configuration and prompts you to restart Fusion 360. After restart, the family appears in the Thread Type dropdown.
You can also open the store page directly: https://apps.autodesk.com/FUSION/en/Detail/Index?id=4331085586591467927
Prefer the manual route? The sections below show how to install from this repo with the included scripts.
First, get the files — either clone or download the ZIP from the green
Code button on GitHub and unzip it:
git clone https://github.com/HairuoLiu/fusion-lens-threads.git
cd fusion-lens-threadsStep 1 — Run the installer
chmod +x install_mac.sh
./install_mac.shThe script finds your Fusion ThreadData folder automatically and writes both
thread files into it: LensSizeThreads.xml (filters + L39x1/26-LTM) and
LensMountThreads.xml (L39/LTM, Whitworth 55°).
Step 2 — Restart Fusion 360 (fully quit and reopen).
Step 3 — Verify: open the Thread command and look for Camera Lens and Filter Threads
and Leica Thread Mount (L39/LTM) in the Thread Type dropdown. Done ✅
Handy flags:
./install_mac.sh --dry-run # just print where it WOULD install
./install_mac.sh --output /path/ThreadData # install to a specific folderStep 1 — Run the installer (PowerShell):
powershell -ExecutionPolicy Bypass -File install_windows.ps1If Windows blocks the script, the
-ExecutionPolicy Bypassflag above already handles it for this one run — you don't need to change any system settings.
Step 2 — Restart Fusion 360 (fully quit and reopen).
Step 3 — Verify: open the Thread command → the Thread Type dropdown now
lists Camera Lens and Filter Threads (with L39x1/26-LTM under Size 39) and
Leica Thread Mount (L39/LTM). Done ✅
The installer writes two files into every detected
ThreadDatafolder:LensSizeThreads.xmlandLensMountThreads.xml.
Handy flags:
powershell -ExecutionPolicy Bypass -File install_windows.ps1 -WhatIf
powershell -ExecutionPolicy Bypass -File install_windows.ps1 -OutputDir "C:\path\to\ThreadData"If auto-detection fails (unusual install location), copy the pre-built XML yourself:
- Grab both
LensSizeThreads.xmlandLensMountThreads.xmlfrom this repo. - Drop them into your Fusion
ThreadDatafolder:- macOS:
~/Library/Application Support/Autodesk/Webdeploy/production/<version-id>/Autodesk Fusion 360.app/Contents/Libraries/Applications/Fusion/Fusion/Server/Fusion/Configuration/ThreadData - Windows:
%LOCALAPPDATA%\Autodesk\webdeploy\Production\<version-id>\Fusion\Server\fusion\Configuration\ThreadData - Pick the newest
<version-id>folder if there are several.
- macOS:
- Restart Fusion 360.
1. Make a cylinder (or a hole) to thread.
2. Create → Thread.
3. Tick Modeled (so the thread is real geometry, not just cosmetic), then
set Thread Type → Camera Lens and Filter Threads.
4. Choose Size and Designation — e.g. M42x1 for an M42 mount, or
M42x0.75 for a 42 mm filter thread.
5. For an internal thread (a ring the lens screws into), also tick Internal. Click OK.
The Thread dialog with Camera Lens and Filter Threads selected — pick Size and Designation, then OK.
The result: a fully modeled camera-lens thread on your part, ready for 3D printing or machining.
To make two parts screw together, give the external part and the internal part the same size and pitch (e.g. both
M42x1). The 0.10 mm clearance is already built in, so they'll thread together without editing.
Every major Fusion update creates a new ThreadData version folder, and
custom XML is not migrated automatically. After an update, just re-run the
installer (it targets the newest version folder). You can also use the
community add-in ThreadKeeper to
re-apply custom threads automatically after each update.
| Symptom | Fix |
|---|---|
Camera Lens and Filter Threads doesn't appear |
Did you fully restart Fusion 360? Custom threads load at startup. |
| It appeared before but vanished | Fusion updated → new version folder. Re-run the installer. |
| Installer says "ThreadData not found" | Use --output / -OutputDir to point at the folder manually, or do the manual install. |
| Windows: "running scripts is disabled" | Use the exact command with -ExecutionPolicy Bypass shown above. |
| Parts don't screw together | Make sure both parts use the same size and pitch; only one is Internal, the other External. |
| I need a size/pitch that isn't listed | See Customizing — it's one line. |
The generated XML follows the basic ISO metric 60° profile:
H = (√3 / 2) × pitch- pitch diameter
d2 = d − 0.75·H - minor diameter
d1 = d − 1.25·H
External threads are shrunk by a 0.10 mm allowance and internal threads grown
by the same amount, so a same-size external/internal pair mates with a light,
printable clearance. See generate_lens_threads.py for the exact math and the
Fusion XML schema (<ThreadType> → <ThreadSize> → <Designation> → <Thread>).
The second family uses the Whitworth 55° form instead:
d₂ = d − 0.640327·Pd₁ = d − 1.280655·P
with P = 25.4 / 26 = 0.976923 mm for the L39 / LTM mount. Because Fusion
models threads from (major, pitch, minor) diameters plus the flank angle, a
55° family reproduces the historical LTM profile far better than a 60°
approximation — but for 3D printing the difference is ~0.02 mm on the pitch
diameter, so the 60° entry is usually good enough.
Camera Lens and Filter Threads |
Leica Thread Mount (L39/LTM) |
|
|---|---|---|
| File | LensSizeThreads.xml |
LensMountThreads.xml |
| Flank angle | 60° (ISO metric) | 55° (Whitworth) |
| Contents | 73 sizes × 0.75/1.0 mm + L39x1/26-LTM |
L39x1/26 (26 TPI) |
| Use for | filters, hoods, step rings, M42 adapters | true Leica screw-mount adapters |
Add or remove sizes/pitches by editing the lists at the top of
generate_lens_threads.py:
SIZES = [24, 25, 25.5, ...] # nominal diameters in mm
PITCHES = [0.75, 1.0] # pitches in mm
# Non-metric mounts: (size, designation label, pitch)
SPECIAL_DESIGNATIONS = [(39, "L39x1/26-LTM", 25.4 / 26.0)]
# Second family: Whitworth 55 deg mounts
LTM_SIZES = [(39, "L39x1/26", 25.4 / 26.0)]Pitch values are printed with 6 decimals (fmt_pitch) so imperial-derived
pitches such as 26 TPI keep their precision:
python generate_lens_threads.py # writes both XML files
python tests/test_threads.py # validates sizes/pitches/genders/diameters
python tests/compare_outputs.py \
LensSizeThreads.xml \
<mac_output>/LensSizeThreads.xml \
<win_output>/LensSizeThreads.xml # confirms all 3 generators matchThe bash and PowerShell installers embed the same generator inline, so the three
implementations are kept byte-for-byte identical by compare_outputs.py.
fusion-lens-threads/
├── install_mac.sh # macOS installer (auto-detect path + generate + write)
├── install_windows.ps1 # Windows installer (same, PowerShell, UTF-8 no BOM)
├── generate_lens_threads.py # Python generator (cross-platform, for tweaking)
├── LensSizeThreads.xml # pre-built: filters + 0.75/1.0 mm + L39x1/26-LTM
├── LensMountThreads.xml # pre-built: L39/LTM, Whitworth 55 deg, 26 TPI
├── tests/
│ ├── test_threads.py # schema/geometry validation
│ └── compare_outputs.py # cross-generator equality check
├── docs/images/ # README images (+ manifest of screenshots to add)
├── README.md # this file (English)
├── README.zh-CN.md # 中文说明
├── REDDIT.md # launch/share guide for Reddit
└── LICENSE # MIT
Issues and PRs are welcome — especially:
- extra lens/filter sizes or non-standard pitches,
- Linux path detection,
- real-world screenshots/prints for the gallery.
Please run the tests above before opening a PR so all three generators stay in sync.
Released under the MIT License (SPDX identifier: MIT).
See LICENSE for the full text.
The MIT License itself is unversioned — there is a single canonical text — so "MIT" fully identifies it. In short: free to use, copy, modify, merge, publish, distribute, sublicense, and sell, provided the copyright and permission notice are kept. Provided as is, without warranty.
SPDX-License-Identifier: MIT
Copyright (c) 2026 HairuoLiu
- The Fusion 360 custom-thread XML format, documented by the community (incl. Nightkurz/CustomThreads).
- ThreadKeeper for the survive-updates workflow.
Made for people who print lens adapters at 2 a.m. · Sharing this on Reddit? See REDDIT.md.
