Replacing broken Ford F350 sun visor clips

My 2005 diesel F350 is a wonderful vehicle, but the interior plastic bits are around 20 years old, and decades of sun embrittlement have been taking their toll. Worse, Ford changes around their interior pieces periodically, so parts from new trucks aren’t necessarily going to fit into my older truck.

Obligatory pic of my truck

One of the cab parts which was broken when I got my truck, was one of the sun visor clips. Since I had one working visor clip (middle pic), I decided to try to code a compatible part in OpenSCAD before the other clip finally broke and left me with nothing to copy from. I was surprised that my first test run of a replacement part actually worked!

Should you decide to print one of these parts, please keep in mind that the type of material you print it out of matters here. The melting point of PLA plastic, for instance, is low enough that it’s likely to melt in the summer. I tend to do my rough draft of everything in PLA though, because I got a super cheap batch of Sunlu PLA+ a while back. So, right now I have a PLA+ visor clip which will likely fail from the heat next summer if I don’t get around to replacing it first. I intend to print my next one in ABS, which has a melting point high enough that I probably won’t have to worry about it. The source code and STL file for my visor clip is down below, and it’s free for personal use. It’s also amateurish enough that I don’t think anyone is going to make commercial copies, but please don’t go making and selling these. If you want a copy and can’t print it yourself, feel free to use a commercial online printing service or send me an email and I’ll work out a price that covers my costs. I’m not out to get rich over it, but I don’t wanna see this not-so-nice first-draft design spammed out by Chinese companies on Amazon for some goofy reason either.

I’ve included the STL file below, but I recommend downloading OpenSCAD to do some surface rounding and such on it if you decide to do your own.

This is a rough draft and it does hold the sun visor in place successfully, but there are several enhancements I plan to make before I print a “keeper” version in ABS. The current version’s printed in PLA+, which is likely to fail in summer heat.

It also uses the original screw, so if you don’t still have the original screw, unfortunately, I don’t know what its thread pitch and length are. I would suggest looking it up on some Ford website.

Intended future enhancements

  • The bottom is a giant square block. On the one hand I could round it off like the original part, or I could actually cut some round slots into it to have a pen holder, or to slip the arm of sunglasses through, etc. Or maybe a clip to hold proof of registration in the event of getting pulled over.
  • Rounding the edges off would make it more aesthetically appealing. Most of the edges are right angles, making it look like a spare part I stole from a Cybertruck.
  • The smaller part of the screw hole is a little oversized, and makes no contact with the screw edges, unlike the original part where the screw was threaded in and made solid contact. This could turn into wriggle over time.

Anyway, here’s the file and the OpenSCAD source.

Stuff Used In This

  • OpenSCAD (free 3d modelling software)
  • Sunlu PLA+ filament (used in prototyping)
  • Sunlu ABS filament (what I intend to use for the final model)
  • Mitutoyo calipers – used to take measurements of the original part so that I could replicate the critical dimensions on the first try.
  • Bambu Labs X1C 3d printer

Visor Clip Files

The files are available for download here, or over on Printables.

$fs=.1;
// Diameter of hole for screw
screwdia=5;
screwhead_dia=9;
// Depth of material for the screw hole
screwhead_depth=12.9;

screwhole_y_offset=30;


// Base of visor clip
overmold_size_x=38.5;
overmold_size_y=51.9;
overmold_size_z=18;

// Antirotate stick dimensions
antirotate_dim_x=2.8;
antirotate_dim_y=5.4;
antirotate_dim_z=18.8;

antirotate_offset=[0, overmold_size_y-9.4-antirotate_dim_y/2, 10];


platform_z_depth=6;

total_z=55.5;

// Diameter of visor clip's notch
visornotch_dia=9;

// First block coming up off the base
tower_base_x=34;
tower_base_y=21;
tower_base_z=10;

// Second block coming up off the base, to the notch
tower_notch_z=25;

// How high the tower goes over the notch
abovenotch_z=10;

// Derivative values
center_x=overmold_size_x/2;

// Dimensions of the X thing
x_diag_length=20.7/2;
x_diag_width=1;
x_vert_length=18.4/2;
x_vert_width=1;
x_diag_angle=30;
x_diag_height=5;

module draw_leg(angle) {
    translate([center_x, screwhole_y_offset, -x_diag_height/2])
        rotate([0, 0, angle])
            union() {
                cube([x_diag_length*2, x_diag_width, x_diag_height], center=true);
            }
}

module draw_x() {
    difference() {       
        union() {
            draw_leg(x_diag_angle);
            translate([center_x, screwhole_y_offset, -x_diag_height/2])
                translate([x_diag_length-1, 0, 0])
                    cube([ x_vert_width, x_vert_length*2,x_diag_height], center=true);

            translate([center_x, screwhole_y_offset, -x_diag_height/2])
                translate([-x_diag_length+1, 0, 0])
                    cube([ x_vert_width, x_vert_length*2,x_diag_height], center=true);
            draw_leg(-x_diag_angle);
        }
        union() {
            centerbar_clear_dia=13.8;
            centerbar_clear_depth=1.5;
            translate([center_x, screwhole_y_offset, -x_diag_height+(centerbar_clear_depth/2)])
                translate([0, 0, 0])
                    cube([centerbar_clear_dia, 20, centerbar_clear_depth], center = true);
        }
    }    
}

module draw_tower() {
    intersection() {
        translate([0, 0, overmold_size_z])
                        cube([overmold_size_x, tower_base_y, tower_base_z+tower_notch_z+abovenotch_z]);
        translate([center_x, 0, 0])
            cylinder(total_z+x_diag_height, d1=tower_base_x, d2=19.5);
    }
}

difference() {
    // Defining the positive shape of everything, more or less
    difference() {
        union() {        
            cube([overmold_size_x, overmold_size_y, overmold_size_z]);

            draw_tower();

            translate([antirotate_offset[0]+center_x-(antirotate_dim_x/2), antirotate_offset[1], -antirotate_dim_z])
                cube([antirotate_dim_x, antirotate_dim_y, antirotate_dim_z]);
            translate([center_x, screwhole_y_offset, -x_diag_height])
                cylinder(screwhead_depth+x_diag_height, d=screwhead_dia);
            draw_x();
        }
        union() {
            translate([0, visornotch_dia/4, overmold_size_z+tower_base_z+tower_notch_z])
                rotate([0, 90, 0])
                    cylinder(overmold_size_x, d=visornotch_dia);
                    
            #translate([center_x, screwhole_y_offset, overmold_size_z-screwhead_depth])
                cylinder(screwhead_depth, d=screwhead_dia);

            translate([center_x, screwhole_y_offset, -x_diag_height])
                cylinder(screwhead_depth+x_diag_height, d=screwdia);

            centerbar_clear_dia=13.8;
            centerbar_clear_depth=1.5;
            translate([center_x, screwhole_y_offset, -x_diag_height+(centerbar_clear_depth/2)])
                translate([0, 0, 0])
                    cube([centerbar_clear_dia, 16, centerbar_clear_depth], center = true);
        }
    }
}

Comments

Leave a Reply