-
Polymaker PolyDryer Box: PC4 Fitting Adapter
Having recently replaced the MMU3’s filament buffer with Polymaker PolyDryer boxes and auto-rewind spindles:

PolyDryer PC4 Fitting – Prusa MMU3 setup Their rubbery port covers work best with 6 mm OD PTFE tubes, but let the MMU3’s 4 mm tubes slide into / out of the boxes under normal filament extrusion / retraction forces, so I conjured an adapter for PC4-M10 pneumatic fittings:

PolyDryer PC4 Fitting – installed A pair of M3 screws hold the adapter plate in place, with an EVA foam gasket sealing against the cover:

PolyDryer PC4 Fitting – interior view The PC4-M10 fittings let the 4 mm tubing slide right through, so the adapter has a 0.5 mm bottom sheet to block the tube, with a small hole for the filament:

PC4 Fitting Plates – bottom – solid model You could use PC4-M6 fittings to block the tubing, but the 2 mm lumen on the fittings I have barely pass 1.75 mm nominal filament. Comments found elsewhere suggest identical PC4-M6 fittings have smaller lumens that snag the filament as it moves in one direction or the other.
The two blind holes get heat-staked 4×4mm M3 brass inserts.
The top has a threaded hole for the fitting:

PC4 Fitting Plates – top – solid model Despite what the description says, the thread is not an M10 metric straight thread: it is a tapered pipe thread used for gas- and liquid-tight fittings. Considerable measurement & searching suggested a ⅛BSP-28 thread, because:
- British Standard Pipe threads are used everywhere in the world except the USA
- Both my metric tap sets have a ⅛BSP-28 tap along with all their hard-metric straight taps
The thread is painfully close to ⅛NPT-27, which would probably work in a pinch if it was the only tap you had.
Those PC4-M6 fittings might sport 1/16BSP-28 threads, but you’re on your own.
Further searching suggests nobody uses the corresponding tapered female pipe threads and everybody goes with a straight internal thread, so I conjured a stumpy threaded rod using the BOSL2 library and removed it from the adapter plate:
threaded_rod(d=9.7,l=ThreadLength + Protrusion,pitch=INCH/28,internal=true,bevel2=true,anchor=BOTTOM);The 9.7 mm diameter is the ⅛BSP-28 “major diameter”, rather than its “gauge diameter”, simply because it produced a good fit. The beveled top guides the fitting into the hole, but I still managed to cross-thread one.
The OpenSCAD code also produces SVG files to laser-cut the foam gasket and a drill template:

PolyDryer PC4 Fitting – drill template The holes were step-drilled to ⅛ inch (which has a historic relation to the ⅛BSP-28 size, because iron pipe) for a generous fit around the M3 screws.
That was way more complicated than I expected and I’m really glad to live in the future where this is a 3D printer project, not a metalworking project involving an actual tap in, say, steel.
The OpenSCAD source code as a GitHub Gist:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// PC4 Fitting Plates for PolyDryer // Ed Nisley – KE4ZNU // 2025-05-02 include <BOSL2/std.scad> include <BOSL2/threading.scad> Layout = "Plate"; // [Plate,Gasket,DrillGuide] /* [Hidden] */ HoleWindage = 0.2; Protrusion = 0.1; NumSides = 3*3*4; Gap = 5.0; TubeStop = 0.5; // prevent PTFE tube from sliding through ThreadLength = 6.0; PlateOA = [28.0,22.0,ThreadLength + TubeStop]; ScrewOC = 20.0; $fn=4*3*4; //———- // Define it module Plate() { difference() { cuboid(PlateOA,anchor=BOTTOM,rounding=4.0,edges="Z"); // plate to fit PolyDryer up(TubeStop) // thread for fitting threaded_rod(d=9.7,l=ThreadLength + Protrusion,pitch=INCH/28,internal=true,bevel2=true,anchor=BOTTOM); down(Protrusion) for (i = [-1,1]) right(i*ScrewOC/2) cylinder(4.5 + TubeStop + Protrusion,d=3.7,anchor=BOTTOM); // M3 4×4 inserts down(Protrusion) cylinder(2*TubeStop,d=2.5,anchor=BOTTOM); // filament clearance } } //———- // Build things if (Layout == "Plate") Plate(); if (Layout == "Gasket") projection(cut=true) Plate(); if (Layout == "DrillGuide") difference() { projection(cut=true) Plate(); circle(d=10); }