A place to store your vials of blended inkjet juice, plus a workstation for the plotter pen you’re refilling and that ink vial up front:

The two pen holders accommodate ordinary fiber-tip pens and ceramic-tip pens. The slot along the front lets you keep track of the ink level, not that there’s much danger of running dry at 0.05 ml per refill from a vial holding 1 ml of blended ink. The big flange makes it harder for me to knock the damn thing over; avoiding an ink spill, even when you have a towel underneath, is a Good Thing.
The Slic3r tool path preview shows off the Hilbert Curve top & bottom infill:

The OpenSCAD source code:
// HP7475A Plotter Pen Refill Station // Ed Nisley KE4ZNU - August 2015 //- Extrusion parameters - must match reality! ThreadThick = 0.25; ThreadWidth = 0.40; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); Protrusion = 0.1; HoleWindage = 0.2; module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2); FixDia = Dia / cos(180/Sides); cylinder(r=(FixDia + HoleWindage)/2, h=Height, $fn=Sides); } //------ // Dimensions WallThick = 6*ThreadWidth; BaseThick = IntegerMultiple(1.0,ThreadThick); VialOD = 8.0; VialOC = VialOD + WallThick; VialArray = [4,4]; // number of vials in each direction PenOD = [14.7,11.7]; // regular fiber pen body, ceramic *cap* dia NumPens = len(PenOD); // really works for just two pens... PenLength = 38; FlangeOD = 18; echo(str("Max pen OD: ",max(PenOD))); echo(str("Number of pens: ",len(PenOD))); Holder = [(VialOC*VialArray[0] + WallThick),(VialOC*VialArray[1] + 2*FlangeOD + WallThick),(3*VialOD + BaseThick)]; HolderRound = 5.0; //- Build it difference() { union() { hull() { for (i=[-1,1], j=[-1,1]) { translate([i*(Holder[0]/2 - HolderRound),j*(Holder[1]/2 - HolderRound),0]) cylinder(r=HolderRound,h=Holder[2],$fn=8*4); } } hull() { for (i=[-1,1], j=[-1,1]) { translate([i*Holder[1]/2,j*(Holder[1]/2 - HolderRound),0]) cylinder(r=HolderRound,h=BaseThick,$fn=8*4); } } for (i=[0:len(PenOD) - 1]) translate([(i*Holder[0]/2 - Holder[0]/4),-Holder[1]/4,BaseThick]) { // spacing is a total hack rotate(180/12) cylinder(d=FlangeOD,h=PenLength,$fn=3*4); } } for (i=[0:VialArray[0] - 1] , j=[0:VialArray[1] - 1]) { vx = i*VialOC - (VialOC*(VialArray[0] - 1)/2); vy = j*VialOC - (VialOC*(VialArray[1] - 1)/2) + FlangeOD; translate([vx,vy,BaseThick]) rotate(180/8) PolyCyl(VialOD,Holder[2],8); } translate([0,(VialOD/2 - Holder[1]/2),BaseThick]) rotate(180/8) PolyCyl(VialOD,Holder[2],8); // edges along open side => snug fit for (i=[0:len(PenOD) - 1]) translate([(i*Holder[0]/2 - Holder[0]/4),-Holder[1]/4,BaseThick]) { // spacing is a total hack rotate(180/12) PolyCyl(PenOD[i],(PenLength + Protrusion),3*4); } }
Mostly because I can…
wait, why are the ceramic and fiber pen wells different? they fit the same plotter mechanism …?
Both uncapped pens fit the same carousel, but the ceramic pen cap extends along its body nearly to the flange. I decided to fill capped pens, rather than have them dribble excess ink into the block, so I needed two different sockets.
And then I dripped a drop of black ink atop the block. It instantly seeped along all the threads, covered the entire top of the block, and is now working its way throughout the structure. [sigh]