Nike Ajax CAD Model Build

Discussion in 'Scale' started by vcp, Apr 28, 2019.

Help Support The Rocketry Forum by donating:

  1. May 14, 2019 #31

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Here's a quick little bit that illustrates an important aspect of OpenSCAD. I'm going to add a simple nozzle to the tail cone of the Ajax. In the file Nike-Ajax body.scad add the following dimension lines to the beginning of the file, with the other dimensions:
    Code:
    // Ajax nozzle dimensions - estimated
    nozzle_depth = 8;
    nozzle_diameter = 6;
    throat_diameter = 2;
    Then change the //tail cone lines to this:
    Code:
        // tail cone with nozzle
        difference() {
            cylinder (h = Tail_Cone_Length, d1 = Tail_Diameter, d2 = Body_Diameter, $fn = smooth);
            translate ([0, 0, -0.000]) cylinder (h = nozzle_depth, d1 = nozzle_diameter, d2 = throat_diameter, $fn = smooth);
        } // end difference
    This just takes the previous tail cone and uses the difference command to subtract a smaller cone to represent the nozzle.

    I'll explain the translate ([0, 0, -0.000]) in a moment. Take a look at the result:

    closed ajax nozzle.JPG

    The nozzle doesn't really look like the 'open' nozzle aperture that we expected. That's because the bottom of the tail cone and the bottom of the subtracted nozzle cone are laying in exactly the same plane. OpenScad doesn't quite know what to do - which cone takes precedence? That's where that extra translate command comes in. Change
    translate ([0, 0, -0.000]) to
    translate ([0, 0, -0.002])
    This drops the nozzle cone slightly below the bottom of the tail cone, and now there is no question that the nozzle is subtracted from the bottom of the tail cone. You'll often see a small factor like this, often predefined as 'epsilon' in OpenSCAD code to prevent coincident indeterminate surfaces. So now the nozzle looks like this:

    ajax nozzle.JPG
    Much better.
     
  2. May 14, 2019 #32

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    What the heck, I'm up, and it looks too incomplete right now without the nose cone. Easy to add, but I am not going into the nose cone code - it's a horrible, horrible left-over hack that I just had handy and was easy to fit in here. There are much better ways to do a nose cone. So I'm just going to include the file Nike-Ajax nose cone.scad file and urge you not to look in it. To use it we'll need to make the following changes to the file Nike-Ajax.scad.

    First, remove the comment to activate the line include <Nike-Ajax nose cone.scad>;
    Next, add the dimension line NC_Sta = 14; under // main component locations

    And finally, replace the line // TODO nose cone with the lines:
    // Nose Cone
    color ("White") translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - NC_Sta]) Ajax_NC ();

    Ajax with nc.JPG

    Pointy. Doesn't look much like an Ajax without the tunnels and forward fins but it'll get there.
     

    Attached Files:

    Last edited: May 14, 2019
  3. May 20, 2019 #33

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Just a quick little update that shows some more OpenSCAD fun.

    The last code line of the Nike-Ajax.scad file is currently:

    rotate (a = [0, 0, 60]) Nike_M5_motor ();

    This is the line that calls the Nike_M5_motor module contained in the Nike_M5_Motor.scad file, which then displays the Nike Booster as part of the full Nike-Ajax model.

    I've mentioned before that there are some options in that motor file that don't quite fit the Nike-Ajax. There are multiple options in that motor file but going into the file to make the changes just so it's specific to the Nike-Ajax is clumsy. I'd have to make a special motor file every time I used it for a different rocket. (And there are a lot of them that use the M5 motor!) So I've modified the motor file to make the options selectable as variables in the call to the module. The line above in the Nike-Ajax.scad file should be replaced with this:

    Code:
    rotate (a = [0, 0, 60])
        Nike_M5_motor (noz_shroud=false, connector=false, noz_closure=false, upper_curv_flange=true, lower_const_flange=true);
    I've modified the Nike_M5_Motor.scad file to accept these 'switches' as inputs to the module. The switches mean the following:
    1. noz_shroud - this determines if the module adds a shroud to the Nike nozzle. We don't want that here because the Nike-Ajax model will have its own shroud.
    2. connector - the Nike-Hercules has a large circular barrel connector at the ignitor, the Nike-Ajax doesn't, so we don't want to see that connector here.
    3. noz-closure - this determines if the nozzle shipping closure is included on the model. I could leave it in or take it out - but having taken it out I notice that I need to add some more interior detail to the nozzle.
    4. upper_curv_flange - the M5 documents describe two different shapes of upper flange on the motor. In all of the NA pictures, I've only ever seen the curved flange used.
    5. lower_const_flange - the M5 documents describe two different shapes of lower flange on the motor. The NA uses only the constant diameter flange.
    I can see that I'm eventually going to have to add a couple more switches to take care of the different hole patterns in the flange, and maybe some other things.

    no connector.JPG
    Connector is gone. Oh, in that view you can see the holes in the upper edge of the flange that the interstage assembly will bolt to. The holes in the outer rim are the ones that need another switch to make them go away (tho I think some stay for the launch lugs).

    So make the above one-line change to the Nike-Ajax.scad file, and download this new Nike_M5_Motor.scad file. (Rename the .txt file to .scad)


     

    Attached Files:

  4. May 21, 2019 #34

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Now I'm going to put some bolt detail on the Nike aft shroud. There's a ring of six bolts at the forward edge of the shroud, and a bolt next to each fin mounting post. Fortunately, I've got a very good picture of these bolts:
    fin shroud bolts real.JPG

    The first thing I'm going to do is take the booster shroud dimensions from the Nike-Ajax fin shroud.scad file and move them into the Nike-Ajax common.scad file. This will make these dimensions available globally, which I want because I believe they will be used later in some other modules. Note that I've also added the variable Shroud_Bolt_Sta to this list of variables.
    Code:
    // Booster_Fin_Shroud dimensions
        Root_Chord = 37.125;    //
        Boost_Shroud_Diameter = 16.67;  // Bennett
        Boost_Shroud_Length = 28.125;   // Bennett
        Boost_Shroud_Thickness = 0.085; // Alway
        Fin_Spacing = 0.05; // spacing between fin root and shroud
        Shroud_Bolt_Sta = 364.5; // TLAR from photo
    Next, I'll add a new module to the Nike-Ajax common.scad file. This module will be used to create bolt heads, and since I'll be placing different sized bolts in several different places, it will be handy to have it available as a common module. This will be much like the module rivet () that is also in the common file, but with one interesting difference.
    Code:
    module bolt_head (diameter, height, random = true) {  // single bolt head
    // diameter is flat-to-flat on bolt head; 1.155* converts this to a circle with same size inscribed hex
        if (random == true ) {
            rnd_rot = rands(-15, 15, 1);
            rotate (a = [0, 0, rnd_rot[0]]) cylinder (h = height, d = 1.155*diameter, $fn = 6);
        } else {
            cylinder (h = height, d = 1.155*diameter, $fn = 6);
        } // end if
    } //end module bolt_head
    Like the rivet module, this is also called with the variables diameter and height. But there is an additional variable random. The structure random = true gives it the default value of true, if the code that calls this module doesn't specify a value. So what does random do? I hate it when bolt heads are all lined up like soldiers on parade. It's just not that way in real life. The bolt heads should show some variation in their rotation. There's an if statement there, and if random == true, then it executes the next two lines, else if it's not true, it skips those lines and executes the line following the } else {.

    If random is true, the first line executed is the command rands (-15, 15, 1) , which is an OpenSCAD command to generate a single random number between -15 and 15. In the next line, that number is used to rotate the bolt head. So each call to module bolt_head () will give a bolt head with a slightly different rotation, and no unrealistic alignment of the heads. However, if I do want a specific non-rotated bolt head, I set random = false in the calling code, and it executes the line following the else, and no rotation is performed.

    The bolt head is just drawn as a 'cylinder' with $fn=6. The $fn, that I've mentioned before as defining the 'smoothness' of the cylinder, is actually just setting the number of sides. So $fn=6 draws a hexagon. You'll also note that the diameter is multiplied by the factor 1.155. This is because I want to define the bolt head 'diameter' as the flat-to-flat distance, which is what you use to measure a bolt head. But the cylinder command draws a hexagon inscribed within the given diameter, which is too small. Multiplying by 1.155 gives the flat-to-flat diameter that we want.

    So now, we have to go back to the file Nike-Ajax booster fin shroud.scad and look at the code that places the bolts using the bolt_head module. It turns out that most of the module has changed, so I've shown the whole thing.
    Code:
    include <Nike-Ajax common.scad>;
    
    module Booster_Fin_Shroud () {
        // Global Root_Chord = 37.125;    //
        // Global Boost_Shroud_Diameter = 16.67;  // Bennett
        // Global Boost_Shroud_Length = 28.125;   // Bennett
        // Global Boost_Shroud_Thickness = 0.085; // Alway
        // Global Fin_Spacing = 0.05; // spacing between fin root and shroud
    
        // This is just the simple sheet metal shroud covering the Nike M5 nozzle, but it's included
        // here because it will have some bolt detail added
        // bottom of shroud is at  [0, 0, 0]
     
        difference() {
            cylinder (h = Boost_Shroud_Length, d = Boost_Shroud_Diameter, $fn = smooth);
            cylinder (h = 3 * Boost_Shroud_Length, d = Boost_Shroud_Diameter - 2 * Boost_Shroud_Thickness,
                center = true, $fn = smooth);
            // hole in shroud for fin bolt
            for (bolt_pos = [120-bolt_offset, 240-bolt_offset, 360-bolt_offset]) {
                rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Root_Chord/2])
                    rotate (a = [0, 90, -20]) cylinder (h = 2, d = 1, center = true, $fn = 20);
            } // end for       
           
           
        } // end difference
    
        // shroud bolt detail
        for (bolt_pos = [30, 90, 150, 210, 270, 330]) {
            rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Bottom_Nike_Sta - Shroud_Bolt_Sta])
                rotate (a = [0, 90, 0]) bolt_head (0.625, 0.375);
        } // end for
     
        // fin secure bolt detail
        bolt_offset = 16;
        for (bolt_pos = [120-bolt_offset, 240-bolt_offset, 360-bolt_offset]) {
            rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Root_Chord/2])
                rotate (a = [0, 90, -20]) bolt_head (0.625, 0.6, random = false);
            rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Root_Chord/2])
                rotate (a = [0, 90, -20 - 180]) cylinder (h = 2, d = 0.5, $fn = 20);
        } // end for 
     
    } // end module Booster_Fin_Shroud
    The section // shroud bolt detail places the six bolts at the forward edge of the shroud, two between each fin. The for loop runs six times, and the code within it rotates and translates the bolts into position. Notice that the actual call to the bolt module, bolt_head (0.625, 0.375); does not specify a value for random, so the bolt_head module assumes the default random = true.

    The section // fin secure bolt detail places the bolt that is next to the mounting post of each fin. This bolt secures the fin in place. It's angled inwards so that it intersects the fin mounting post. Here I've used a for loop to place a bolt at each fin, and the code within the loop rotates and translates the bolt_head. For illustration here, I have specified random = false, which overrides the default true setting in the bolt_head module. All of these bolts are now at a fixed rotation. The additional code in this section, which is also within the for loop, adds a cylindrical section to represent the threaded part of the bolt, which is visible through the hole in the shroud that the bolt passes through.

    The last new bit of code is the for loop that follows // hole in shroud for fin bolt. It places three cylinders that are positioned the same way as the fin bolts, but since this is within the difference statement, these cylinders are subtracted from the shroud, creating the shroud holes for the bolts. Since the shroud is only a thin-walled tube, the fin bolts are just 'floating' at the moment. To make a printable model I'll have to go back later and put some structure in there.

    The final result looks pretty darn close to the original picture.
    fin shroud bolts real.JPG fin shroud bolts cad.JPG
     
    Last edited: May 21, 2019
    Bill Hanson and dhbarr like this.
  5. May 22, 2019 #35

    Bill Hanson

    Bill Hanson

    Bill Hanson

    Forum Supporter TRF Supporter

    Joined:
    Nov 22, 2018
    Messages:
    125
    Likes Received:
    85
    Gender:
    Male
    Location:
    New Mexico
    Subscribed!
     
  6. May 22, 2019 #36

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Radar Fins - there's only one new OpenSCAD command for these, and a lot of it is like the other fins, so I'll just post the code and go through most of it quickly.
    Radar Fins.JPG
    Bennett - Radar Fin.JPG
    This is the contents of the new file Nike-Ajax radar fin.scad that will be attached (as a .txt file).
    Code:
    // Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
    // http://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.
    
    include <Nike-Ajax common.scad>;
    
    
    module Radar_Fin () {
    
    //Global Radar_Fin_Sta = 74.675;    // Bennett/Alway
    edge_diameter = 0.2;                 // TLAR
    TE_root_height = 0.5;                 // Bennett
    root_length = 10;                     // Bennett
    TE_length = 2.188;                    // Bennett
    horn_root_position = 3.445;         // TLAR
    horn_diameter = 1.0;                // Bennett
    horn_angle = 45;                    // Bennett
    horn_ID = 0.7;                        // TLAR
    mount_plate_dia = 3.0;                // TLAR
    cone_angle = 3;                        // half-angle of forward body cone
    mount_plate_location = 10 - 6.75;     // Bennett
    
        rotate (a = [0, -90, 0]) {  // need to rotate 'cause I should have built it this way
            difference() { // for subtracting the interior of the radar horn and its root
                hull () { // hull together all the elements to form the fin
                    // aft root
                    translate ([edge_diameter/2, 0, TE_root_height]) sphere (d = edge_diameter, $fn = 20);
                    // fore root
                    translate ([root_length - edge_diameter/2, 0, 0]) sphere (d = edge_diameter, $fn = 20);
                    // aft tip
                    translate ([edge_diameter/2, 0, TE_length + TE_root_height]) sphere (d = edge_diameter, $fn = 20);
                    // radar horn
                    translate ([horn_root_position, 0, 0]) rotate (a = [0, -horn_angle, 0])
                        cylinder (h = 4.35, d = horn_diameter, $fn = 30);    
                } // end hull
                // cube to clip off root end of horn, positioned as required
                translate ([20, 0, -2.6]) rotate (a = [0, 3, 0]) cube (size = [60, 5, 4], center = true);
                // horn interior, positioned as required
                translate ([horn_root_position, 0, 0]) rotate (a = [0, -horn_angle, 0]) cylinder (h = 6, d = horn_ID, $fn = 30);
            } // end difference
             
            // mounting plate
            intersection () {
                //
                translate ([mount_plate_location, 0, 0.0]) rotate (a = [0, cone_angle, 0])
                    cylinder (h = .4, d = mount_plate_dia, $fn = 60);
                translate ([0, 0, -4.48]) rotate (a = [0, 90+cone_angle, 0]) cylinder (h = 8, d = 10, $fn = smooth);
            } // end intersection
         
            // TODO: mounting plate screws
        } // end rotate
    } // end module Radar_Fin
    
    // Radar_Fin ();
    In the above code, the line: Radar_Fin_Sta = 74.675; // Bennett/Alway is a global dimension that must be added into the Nike-Ajax common.scad file. I've left the rest of the dimensions local to this module.

    Within the hull command are the three spheres and the cylinder that form the general shape of the fin. The cylinder is the radar horn that the fin is there to support.
    radar fin 1.JPG
    When these are hulled, we get the general shape of the fin. The difference command that encloses the hull, subtracts two objects from the hulled shape. One is a cylinder that cores out the horn to make it a tube, and the other is a cube that is angled to flatten off the root edge of the fin. These two objects are shown highlighted (the '#' prefix on a line highlights a negative shape).
    radar fin 2.JPG
    The lines within the intersection () { block form the fin mounting plate. Below, the first cylinder is shown, before the intersection is performed.
    radar fin 3.JPG
    The beginning of the plate above is just a flat cylinder, but this plate should be curved to match the body of the missile at this point. The intersection command takes two (or more) objects, and leaves only the area where the objects intersect. So I'm going to take a cylinder that matches the diameter and angle of the body, and intersect it with that flat plate. I've highlighted that intersecting cylinder.
    radar fin 4.JPG
    The top of the mounting plate is now curved. The remaining cylindrical section of the plate will be embedded in the missile body.
    radar fin 5.JPG
    The fin shape is not perfect - it should be 'pinched-in' a bit below the radar horn, but it's pretty close. I'll come back and address that sometime later. It also needs some mounting screws in the plate that I'll do later too.

    The only thing left is to add the fin into the main Nike-Ajax.scad file. it's added within the same for loop that places the main fins (and will later also place the guide fins). The line
    include <Nike-Ajax radar fin.scad>; has to be uncommented as well.
    Code:
        // fins
        color ("White") for ( rot = [45, 135, 225, 315]) {
            rotate (a = [0, 0, rot])
                translate ([Body_Diameter/2, 0, Bottom_Ajax_Tail_Cone_Sta - Main_Fin_Sta]) Main_Fin ();
            //rotate (a = [0, 0, rot]) translate ([-3.8, 0, Bottom_Ajax_Tail_Cone_Sta - 48.826]) Guide_Fin ();
            // radar fin - 5.48 to position fin root flush with forward body cone
            rotate (a = [0, 0, rot]) translate ([-5.48, 0, Bottom_Ajax_Tail_Cone_Sta - Radar_Fin_Sta]) Radar_Fin ();      
        } // end for
    radar fin 6.JPG
     

    Attached Files:

    Last edited: May 22, 2019
  7. May 22, 2019 #37

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Oopsie, file limit. You also need the main Nike-Ajax file. And it looks like I didn't attach the new booster fin shroud file either, so I'll add that here too.
     

    Attached Files:

  8. May 22, 2019 #38

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    The shape of the Nike-Ajax guide fins are the most complex on the missile, but there are very few drawing dimensions for this fin.

    Bennett - Guide Fin.JPG
    Guide Fin.JPG

    So to get something that looks like that, we have to resort to a lot of That Looks About Right. So here I do a lot of placing spheres, hulling them, and walking them around until TLAR.
    This is the Nike-Ajax guide fin.scad file.
    Code:
    // Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
    // http://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.
    
    include <Nike-Ajax common.scad>;
    
    module Guide_Fin () {
        // Global Guide_Hub_Diameter = 2.25; // Bennett
        // Global Guide_Hub_Offset = 9;      // Bennett
        Guide_Edge_Diameter = 0.2;     // TLAR
        Guide_Fin_Span = 7.576;     // Bennett
        Guide_Fin_Root = 20.307;     // Bennett
        screw_hole_dia = 0.5;        // TLAR
        screw_hole_xspacing = 0.30; // TLAR
        screw_hole_yspacing = 0.55;    // TLAR
        screw_hole_depth = 0.5;     // TLAR
        root_center_thickness = 0.4;    // Bennett
        rise_fin_aft_root_tip = 1.044;     // Bennett
       
        rotate (a = [0, -90, 0]) { // rotate all because I should have built it this way
        difference() {
            union () { // join the root wedge, hub, and fin so the screw holes hit everything
                // root hub
                intersection () { // root hub intersected with cylinder for curved top
                    translate ([9, 0, .2]) rotate (a = [0, cone_angle, 0]) cylinder (h = 0.4, d = Guide_Hub_Diameter, $fn = 60);
                    translate ([8, 0, -2.31]) rotate (a = [0, 90+cone_angle, 0]) cylinder (h = 6, d = 6, center = true, $fn = smooth);
                } // end intersection
    
                difference() {
                    hull () { // root wedge
                        translate ([Guide_Hub_Offset - 0.5, 0, 1.15]) sphere (d = 0.6, $fn = 20); // aft max wedge upper hub
                        translate ([Guide_Hub_Offset + 0.5, 0, 1.1]) sphere (d = 0.6, $fn = 20); // fore max wedge upper hub
                       
                        translate ([Guide_Hub_Offset - 0.5, 0.8, 0.45]) sphere (d = 0.4, $fn = 20); // aft wedge base hub left
                        translate ([Guide_Hub_Offset + 0.5, 0.8, 0.45]) sphere (d = 0.4, $fn = 20); // fore wedge base hub left
                        translate ([Guide_Hub_Offset - 0.5, -0.8, 0.45]) sphere (d = 0.4, $fn = 20); // aft wedge base hub right
                        translate ([Guide_Hub_Offset + 0.5, -0.8, 0.45]) sphere (d = 0.4, $fn = 20); // fore wedge base hub right      
                       
                        translate ([1.0, 0, 1.1]) sphere (d = Guide_Edge_Diameter, $fn = 20); // aft wedge tip
                        translate ([Guide_Fin_Root - 1, 0, 0.15]) sphere (d = Guide_Edge_Diameter, $fn = 20); // fore wedge tip  
                    } // end hull
                // slice off the root edge of the wedge
                translate ([Guide_Hub_Offset, 0, 0.0]) rotate (a = [0, cone_angle, 0]) cube (size = [30, 5, 1], center = true);
                } // end difference
               
                // fin
                hull () {
                    // root
                    translate ([Guide_Edge_Diameter/2, 0, 1.044 + Guide_Edge_Diameter/2])
                        sphere (d = Guide_Edge_Diameter, $fn = 20); // aft root tip
                    translate ([Guide_Edge_Diameter/2, 0, Guide_Fin_Span + rise_fin_aft_root_tip - Guide_Edge_Diameter/2])
                        sphere (d = Guide_Edge_Diameter, $fn = 20); // aft tip
                    translate ([Guide_Fin_Root-Guide_Edge_Diameter/2, 0, Guide_Edge_Diameter/2])
                        sphere (d = Guide_Edge_Diameter, $fn = 20); // forward tip
                    translate ([Guide_Hub_Offset-1, 0, 1.2]) sphere (d = root_center_thickness, $fn = 20); // root center width
                } // end hull
    
            } // end union
    
            // mounting screw holes
            translate ([Guide_Hub_Offset + screw_hole_xspacing, screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
                cylinder (h = 2, d = screw_hole_dia, $fn = 20);
            translate ([Guide_Hub_Offset - screw_hole_xspacing, screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
                cylinder (h = 2, d = screw_hole_dia, $fn = 20);
            translate ([Guide_Hub_Offset + screw_hole_xspacing, -screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
                cylinder (h = 2, d = screw_hole_dia, $fn = 20);
            translate ([Guide_Hub_Offset - screw_hole_xspacing, -screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
                cylinder (h = 2, d = screw_hole_dia, $fn = 20);
       
        } // end difference
        } // end rotate
    } // end module Guide_Fin
    
    Guide_Fin ();
    First, note that two dimensions have been moved to the Nike-Ajax common.scad file, so that they will be global.

    Next, in the intersection block, we make a hub with a curved surface just like that in the radar fin.

    In the first hull block, I'll place a set of spheres that will form the root wedge structure when hulled. I'll also have a difference command around this hull so that I can use a cube placed to slice off the root edge flat.
    wedge spheres.JPG

    After hulling and slicing off the root, we have the root wedge. The block that slices the root flat is highlighted.
    wedge hull.JPG

    After placing a set of spheres for the fin, they are also hulled to form the fin. The hub is also shown here.
    wedge fin.JPG

    There's been nothing new up to this point, but here I have to introduce a new OpenSCAD command, the union () { I want to use a difference to make cutouts for the mounting screw holes with some cylinders, but the structure that these cylinders must be subtracted from is made up of the hub, root wedge, and fin. The difference command takes the first item following the command and subtracts every other item that follows. So to get a difference from multiple objects, we first have to merge them together with the union. Everything within the union () {...} curly brackets is treated as one object. Now the first item following the difference is the union, and the four cylinders for the mounting screw holes are subtracted from that. That leaves one last question - you may have noted that we've subtracted items from multiple objects that have been hulled; we did it just above with the root slice. Well, that's because a hull does an implied union on all of the hulled objects, so the hull is treated as a single object.
    wedge holes.JPG

    Like on the radar fin, I've also got to rotate the whole fin, and add it into the Nike-Ajax.scad file. The final result is excellent. Compare to the photo up top.
    finished guide fin.JPG


    The three changed .scad files are attached as .txt
     

    Attached Files:

  9. May 22, 2019 #39

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    The only major things left to do are the tunnels and the interstage. This whole exercise of explaining things has made my code dramatically more clear and modular. (To me, anyway, even if it's still mud to everyone else.)

    Nike Ajax2.JPG
     
  10. May 23, 2019 #40

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    You know, I was never satisfied with the trailing edge shape of the radar fin. Laying in bed the other night I finally figured out what to do about it.

    sculpt radar fin.JPG

    I just placed four spheres, sized and walked them around 'til they intersected the trailing edge the way I wanted, then hulled them and subtracted the hull. Mirrored same for the other side, shown above highlighted. The code below is added within the difference statement in the module Radar_Fin () {...}.
    Code:
                // sculpt the trailing edge
                hull () {   
                    translate ([-0.2, 0.5, 2.48]) sphere (d = 0.9, $fn =60); // top TE sphere
                    translate ([-0.2, 0.82, 2.95]) sphere (d = 0.9, $fn =60); // tpp trim sphere         
                    translate ([2.95, 2.3, -1]) sphere (d = 4, $fn =60); // bottom forward sphere
                    translate ([-0.2, .45, 0]) sphere (d = 0.8, $fn =60); // bottom TE sphere
                } // end hull
                mirror ([0, 1, 0]) hull () {   
                    translate ([-0.2, 0.5, 2.48]) sphere (d = 0.9, $fn =60); // top TE sphere
                    translate ([-0.2, 0.82, 2.95]) sphere (d = 0.9, $fn =60); // tpp trim sphere         
                    translate ([2.95, 2.3, -1]) sphere (d = 4, $fn =60); // bottom forward sphere
                    translate ([-0.2, .45, 0]) sphere (d = 0.8, $fn =60); // bottom TE sphere
                } // end hull
    I guess I should explain what I mean by 'walking', It's what I do when I don't have exact dimensions and going for a TLAR. I first place an object at a best guess near where I think it should be. Then I just incrementally change values, usually one at a time, to translate (or rotate, or resize) the object into place, hitting 'preview' between each change. With some practice, it doesn't take long to get something placed exactly how you want it.

    TODO: still need the mounting plate screws
     
  11. May 25, 2019 #41

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Fun with tunnels.

    tunnel dimensions.JPG

    The Bennett drawing has a nice detail on the tunnel profile at stations along the body. The interesting thing is that there are two different tunnel shapes. I like the way Bennett has organized the data, but I wish he would have stuck with decimal measurements and either full width or half width measures.

    The tunnels are probably the most involved part of the model, so this will have to be brief - it would take forever to go into detail. The tunnels will be added in the Nike-Ajax body.scad file. Add the following line at the beginning to include the tunnel file code: include <Nike-Ajax body tunnels.scad>;

    And at the bottom of that file, within the Main_Body module, add the following lines:
    Code:
        // body tunnels  
        // Tunnel #1  top side - side opposite launcher and in line with nike fin, and #3 launcher side
        for (rot = [0, 180]) {
            rotate (a = [0, 0, rot]) Tunnel_1_3 ();
        } // end for
       
        // Tunnel #2 & #4
        for (rot = [90, 270]) {
            rotate (a = [0, 0, rot]) Tunnel_2_4 ();
        } // end for
    This places a tunnel at each of the four rotations between the fins. It calls two modules in the new Nike-Ajax body tunnels.scad file. Each Tunnel module is for a different tunnel shape. This is the beginning of that file:
    Code:
    // Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
    // http://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.
    
    include <Nike-Ajax common.scad>;  
       
       
    module Tunnel_1_3 () {
        Tunnel_all_forward ();
        hull () {
            //Tunnels_all_sta26p000 ();
            Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.2);  // all tunnels sta 26.000
            //Tunnels_1_3_sta75p781 ();
            Tunnel_Profile (75.781, 0.40625, 1.375, 1.0625, 5.9, 0.2);  // tunnels 1&3 sta 75.781
        }
        hull () {
            //Tunnels_1_3_sta75p781 ();
            Tunnel_Profile (75.781, 0.40625, 1.375, 1.0625, 5.9, 0.2);  // tunnels 1&3 sta 75.781  
            //Tunnels_all_sta108p656 ();
            Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.2);  // all tunnels sta 108.656
        }
        hull () {
            //Tunnels_all_sta108p656 ();
            Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.2);  // all tunnels sta 108.656  
            //Tunnels_1_3_sta198p625 ();
            Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 sta 198.625
        } // end hull
        Tunnel_Rear_1_3 ();
    } // end module Tunnel_1_3
    
    module Tunnel_2_4 () {
        Tunnel_all_forward ();
        hull () {
            //Tunnels_all_sta26p000 ();
            Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.1);  // all tunnels sta 26.000
            //Tunnels_2_4_sta75p781 ();
            Tunnel_Profile (75.781, 0.46875, 1.375, 1.0625, 5.83, 0.1);  // tunnels 2&4 sta 75.781
            //Tunnels_all_sta108p656 ();
        }
        hull () {
            Tunnel_Profile (75.781, 0.46875, 1.375, 1.0625, 5.83, 0.1);  // tunnels 2&4 sta 75.781
            //Tunnels_all_sta108p656 ();  
            Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.1);  // all tunnels sta 108.656
            //Tunnels_2_4_sta198p625 ();
        }
        hull () {
            Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.1);  // all tunnels sta 108.656
            //Tunnels_2_4_sta198p625 ();  
            Tunnel_Profile (214, 0.59375, 1.8125, 1.25, 5.6, 0.1);  // tunnels 2&4 sta 198.625
        } // end hull
        Tunnel_Rear_2_4 ();
    } // end module Tunnel_2_4    
    These are the tunnel modules called from the Nike-Ajax body.scad file. Each of these modules calls three types of modules. The Tunnel_all_forward () module creates the shape of the forward ends of the tunnels. They are all the same so both top modules call this same module. Likewise they each call a Tunnel_Rear_n_n () module, but these are different because the tunnel aft ends are different.

    In between the front and rear, there are hulls of a bunch of Tunnel_Profile () modules. Here is the Tunnel_Profile () and a data set for it:
    Code:
    // all tunnels sta 26.000
        //    sta = 75.781  // Bennett
        //    half_top_width = 0.2969; // Bennett 19/32" /2      
        //    half_bottom_width = 0.9531; // Bennett 1"29/32 /2    
        //  exposed_height = 0.78125 // Bennett 25/32"
        //    depth = 3.35;    // TLAR
        //  spheredia = 0.1; // TLAR
        //  Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.1);  // all tunnels sta 26.000
       
    module Tunnel_Profile (sta, half_top_width, half_bottom_width, exposed_height, depth, spheredia) {  
    // general tunnel profile module
        translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - sta]) rotate (a = [0, -90, 0]) {
            translate ([0, half_top_width - spheredia/2, depth + exposed_height - spheredia/2])
                sphere (d = spheredia, $fn = 20);
            translate ([0, -half_top_width + spheredia/2, depth + exposed_height - spheredia/2])
                sphere (d = spheredia, $fn = 20);
            translate ([0, half_bottom_width - spheredia/2, depth]) sphere (d = spheredia, $fn = 20);
            translate ([0, -half_bottom_width + spheredia/2, depth]) sphere (d = spheredia, $fn = 20);          
        } // end translate-rotate
    } // end module Tunnel Profile
    If you look at the Bennet drawing above, you'll see that he presents the data as a series of trapezoids sitting on the surface of the body. The module above creates exactly the same thing. Using spheres (as I have done before) at the corners of the trapezoid. Since there are a half-dozen different sizes of trapezoids this module takes a data set for each, and rotates and positions it in place on the body. The modules calling this one, hull together pairs of trapezoids, forming the tunnel along the body. The full set of trapezoid data sets are here:
    Code:
    // Tunnel Data
    // tunnels 1&3 sta 198.625
        //    sta = 214?  // Bennett 186.25  why is this different?
        //    half_top_width = 0.53125; // Bennett 1"1/16 /2      
        //    half_bottom_width = 1.8125; // Bennett 1"13/16  
        //  exposed_height = 1.25 // Bennett
        //    depth = 5.6;    // TLAR
        //  spheredia = 0.1; // TLAR
        //  Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.1);  // tunnels 1&3 sta 198.625
    
    // tunnels 2&4 sta 198.625
        //    sta = 214?  // Bennett 186.25  why is this different?
        //    half_top_width = 0.59375; // Bennett 19/32"      
        //    half_bottom_width = 1.8125; // Bennett 1"13/16  
        //  exposed_height = 1.25 // Bennett
        //    depth = 5.6;    // TLAR
        //  spheredia = 0.1; // TLAR
        //  Tunnel_Profile (214, 0.59375, 1.8125, 1.25, 5.6, 0.1);  // tunnels 2&4 sta 198.625
       
    // all tunnels sta 108.656
        //    sta = 108.656  // Bennett
        //    half_top_width = 0.53125; // Bennett 1"1/16 /2      
        //    half_bottom_width = 1.8125; // Bennett 1"13/16  
        //  exposed_height = 1.25 // Bennett
        //    depth = 5.6;    // TLAR
        //  spheredia = 0.1; // TLAR
        //  Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.1);  // all tunnels sta 108.656  
       
    // tunnels 1&3 sta 75.781
        //    sta = 75.781  // Bennett
        //    half_top_width = 0.40625; // Bennett 13/16" /2      
        //    half_bottom_width = 1.375; // Bennett 1"3/8  
        //  exposed_height = 1.0625 // Bennett 1"1/16
        //    depth = 5.9;    // TLAR
        //  spheredia = 0.1; // TLAR
        //  Tunnel_Profile (75.781, 0.40625, 1.375, 1.0625, 5.9, 0.1);  // tunnels 1&3 sta 75.781      
       
    // tunnels 2&4 sta 75.781
        //    sta = 75.781  // Bennett
        //    half_top_width = 0.46875; // Bennett 15/32"        
        //    half_bottom_width = 1.375; // Bennett 1"3/8  
        //  exposed_height = 1.0625 // Bennett 1"1/16
        //    depth = 5.83;    // TLAR
        //  spheredia = 0.1; // TLAR
        //  Tunnel_Profile (75.781, 0.46875, 1.375, 1.0625, 5.83, 0.1);  // tunnels 2&4 sta 75.781
       
    // all tunnels sta 26.000
        //    sta = 75.781  // Bennett
        //    half_top_width = 0.2969; // Bennett 19/32" /2      
        //    half_bottom_width = 0.9531; // Bennett 1"29/32 /2    
        //  exposed_height = 0.78125 // Bennett 25/32"
        //    depth = 3.35;    // TLAR
        //  spheredia = 0.1; // TLAR
        //  Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.1);  // all tunnels sta 26.000
    .... continued

    Attached are all of the new and changed files:
     

    Attached Files:

    Last edited: May 25, 2019
    dhbarr likes this.
  12. May 25, 2019 #42

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    The forward shape of the tunnels is handled here:
    Code:
    module Tunnel_all_forward () {
        hull () {
            difference() { // top curve of forward tunnel
                translate ([19.82, 0, Bottom_Ajax_Tail_Cone_Sta - 27.5]) rotate (a = [90, 0, 0])
                    cylinder (h = 0.55, d = 48, center = true, $fn = 240);
                translate ([25, 0, Bottom_Ajax_Tail_Cone_Sta - 30.875]) cube (size = [50, 50, 70], center = true);
            } // end difference
            Side_Curve_Tunnel_All_Forward ();
            mirror ([0, 1, 0]) Side_Curve_Tunnel_All_Forward ();
        } // end hull
    } // end module Tunnel_all_forward
    
    module Side_Curve_Tunnel_All_Forward () {
        difference() { // side curve of forward tunnel
            translate ([-3.15, -23.03, Bottom_Ajax_Tail_Cone_Sta - 27.0]) rotate (a = [0, 91.5, 0])
                cylinder (h = 0.5, d = 48, center = true, $fn = 240);
            translate ([0, -25, Bottom_Ajax_Tail_Cone_Sta - 30.875]) cube (size = [50, 50, 70], center = true);
            translate ([0, 0, 265.2 ]) cube (size = [50, 50, 70], center = true);
        } // end difference
    } // end module Side_Curve_Tunnel_All_Forward

    This is going to be difficult to explain. The section labeled as // top curve of forward tunnel creates the top curve using the edge of a short cylinder that can be seen highlighted here. A difference statement cuts away the unwanted portions of the cylinder.

    fore tunnel1.JPG

    The module Side_Curve_Tunnel_All_Forward () does the same thing, placing the edge of a flat disk against the body where the tunnel contacts it, again with a difference statement to cut away the unwanted part. The module is mirrored for the other side. Then it's just a matter of hulling together the three curved sections:

    fore tunnel2.JPG

    The aft ends of the tunnels are done much the same way, except that there are two different shapes:
    Code:
    module Tunnel_Rear_1_3 () {
        intersection () {
            translate ([125.653, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [90, 0, 0])
                cylinder (h = 6, d = 265, center = true, $fn = 360);
    
            hull () {
                Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 sta 198.625
                Tunnel_Profile (232.625 - 1.875, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 
            } // end hull
        } // end intersection
    } // end module Tunnel_Rear_1_3
    
    
    module Tunnel_Rear_2_4 () {
        hull () {
            difference() { // top curve of rear tunnel
                // top ridge of tunnel
                translate ([198.15, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [90, 0, 0])
                    cylinder (h = 1.15, d = 410, center = true, $fn = 360);
                translate ([245, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) cube (size = [500, 500, 500], center = true);
                // slice off aft tip
                translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - Top_Ajax_Tail_Cone_Sta - 10])
                    cube (size = [20, 20, 20], center = true);
            } // end difference
            Side_Curve_Rear_Tunnel_2_4 ();
            mirror ([0, 1, 0]) Side_Curve_Rear_Tunnel_2_4 ();
        } // end hull
    } // end module Tunnel_Rear_2_4
    
    module Side_Curve_Rear_Tunnel_2_4 () {
        difference() { // side curve of rear tunnel
            translate ([-5.56, -158.34, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [0, 90, 0])
                cylinder (h = 0.5, d = 320, center = true, $fn = 360);   
            translate ([0, -250, Bottom_Ajax_Tail_Cone_Sta - 214]) cube (size = [500, 500, 700], center = true);
            translate ([0, 0, -329.5 ]) cube (size = [500, 500, 700], center = true);
        } // end difference
    } // end module Side_Curve_Rear_Tunnel_2_4

    The result is shown here with the two distinct tunnel shapes (shown with the as yet incomplete interstage). Note that this difference is not noted in either the Bennett or Alway drawings, but it is clear from photographs.

    aft tunnels.JPG
     
    Last edited: May 25, 2019
  13. May 25, 2019 #43

    dhbarr

    dhbarr

    dhbarr

    Amateur Professional

    Joined:
    Jan 30, 2016
    Messages:
    5,232
    Likes Received:
    404
    This is beautiful and elegant work.
     
  14. May 30, 2019 #44

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    The last major component is the interstage:

    interstage OD.JPG

    The interstage is a single cast unit. Although I have a picture of one that is welded, it's the only one I've seen like that, and I suspect it was uniquely constructed for that display because they didn't have a real one. I've very pleased with the way my OpenSCAD interstage came out.

    interstage2.JPG
    interstage3.JPG

    The code structure for this is just a flat rounded disk, on top of a pair of cones. The strut is a separate module that is called three times in a loop in the same way that fins are applied. Then a cone matching the Ajax tailcone is subtracted from the top center.

    I'll attach the code, but I'm not going to list it here. It's mostly more of the same stuff; lots of hulled spheres, assorted differences and intersections. However, there is one new command I've used that I will explain. That flat top ring would be pretty difficult to construct with only what I've used so far. The rotate_extrude command solves that, but it's a bit awkward to explain. This command takes a 2D object drawn in the xy plane, rotates it around the x-axis so that it lies in the yz plane, then rotates and extrudes it around the z-axis.

    So the code here first draws a circle that is the thickness of the ring. I guess circle is a new command too. OpenSCAD can draw 2D primitives like square, circle, and polygon. That circle is then translated on the x-axis by the radius of the ring. The rotate_extrude then creates a torus. The surrounding hull makes the torus into a flat disk.
    Code:
                // top ring
                hull () {
                    rotate_extrude (convexity = 10, $fn = smooth)
                        translate ([ring_diameter/2 - ring_thickness/2 , 0, 0])
                            circle (d = ring_thickness, $fn = 60);
                } // end hull
    The rotate_extrude is usually used for more complex objects created from polygons.

    Still need to do the launch lugs and a few details.
     

    Attached Files:

  15. Jun 8, 2019 #45

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Launch Lugs.

    Simple rotations and differences of common shapes, so I won't detail the code. The only different thing here is that I've allowed the color of each component to be specified separately. From photographs, it looks like the lugs are sometimes installed after the motor body is painted, so they can be different colors. So the bolts are sometimes unpainted as well. Same deal for the retention plate, that is installed after the missile is placed on the rail.

    Nike-Ajax Launch Lug.scad file:
    Code:
    // Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
    // http://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.
    
    include <Nike_M5_Motor.scad>
    include <Nike-Ajax common.scad>;
    
    //M5_MotorTubeDiameter = 16.466;  from Nike_M5_Motor.scad
    //M5_UpperFlangeDiameter = 17.572;
    
    // Launch Lug Dimensions
    
    InnerBoltRadialPosition = 24; // degrees
    OuterBoltRadialPosition = 38; // degrees
    LugInnerSurfaceFromBodyCenter = 8.8;
    LugCavityHeight = 9.37; // from body center
    LugCapPlateThickness = 9.75 - 9.37;
    LugLength = 1.25; // from MD drawings
    MainBoltHeadDiameter = 5/8; // estimated from drawings
    CapBoltHeadDiameter = 3/8; // estimated from photographs
    LugMainFlangeThickness = 0.65; // estimated from drawings
    SpanOfLugFull = 11.85;
    SpanOfLugCavity = 10.1;
    SpanOfCapPlateInnerEdge = 8.85;
    SpanOfCapPlateBolts = 11;
    
    // Lug Longitudinal Positions - From MD drawings
    UpperLugCenterDownFromTopOfFlange = 0.6;
    BottomLugCenterUpFromM5Nozzle = 27.59;
    UpperLugCenterUpFromM5Nozzle = 106.7;
    
    tablength = 0.8;
    tabdepth = 2;
    
    //Launch Lug
    module LaunchLug (BodyDiameter,
        // since the lugs may be attached after painting the Nike body, its color and the
        // color of its components can be assigned independently
        LugColor = "White",         // color of lug
        BoltColor = "White",         // color of lug attachment bolts // Steel
        PlateColor = "White",         // color of attachment plate - could be unpainted Iron
        PlateBoltColor = "White") {    // color of plate attachment bolts // Steel
           
        translate ([0, 0, -LugLength/2]) {
            // Main flange of Lug
            color (LugColor) difference() {
                cylinder (h = LugLength, d = BodyDiameter + LugMainFlangeThickness, $fn = 180);
                translate ([0, 0, -1]) cylinder (h = 4, d = BodyDiameter, $fn = 180);
                rotate (a = [0, 0, 318.5]) translate ([0, -15, -1]) cube (size = [30, 30, 4]);
                rotate (a = [0, 0, 69.5]) translate ([-15, 0, -1]) cube (size = [30, 30, 4]);    
            } // end difference
           
            // Main flange bolts
            color (BoltColor) {
                rotate (a = [0, 0, -24]) translate ([0, BodyDiameter/2 + LugMainFlangeThickness, LugLength/2])
                    rotate (a = [90, 0, 0]) bolt_head (MainBoltHeadDiameter, 0.375, random = true);
                rotate (a = [0, 0, -38]) translate ([0, BodyDiameter/2 + LugMainFlangeThickness, LugLength/2])
                    rotate (a = [90, 0, 0]) bolt_head (MainBoltHeadDiameter, 0.375, random = true);  
            }
           
            // Lug vertical angle
            color (LugColor) difference() {
                translate ([-SpanOfLugFull/2, 0, 0]) cube (size = [SpanOfLugFull, LugCavityHeight, LugLength]);
                translate ([0, 0, -1]) cylinder (h = 4, d = BodyDiameter, $fn = 180);  
                rotate (a = [0, 0, 323]) translate ([-0.3, -15, -1]) cube (size = [30, 30, 4]);
                rotate (a = [0, 0, 323]) translate ([-31.6, -15, -1]) cube (size = [30, 30, 4]);    
                translate ([-SpanOfLugCavity/2, LugInnerSurfaceFromBodyCenter, -1])
                    cube (size = [SpanOfLugCavity, LugCavityHeight - LugInnerSurfaceFromBodyCenter, 4]);
            } // end difference
               
            // Lug Plate
            color (PlateColor)
                translate ([SpanOfLugFull/2 - (SpanOfLugFull - SpanOfCapPlateInnerEdge)/2, LugCavityHeight , 0])
                cube (size = [(SpanOfLugFull - SpanOfCapPlateInnerEdge)/2, LugCapPlateThickness, LugLength]);
            //color (PlateBoltColor) {
                translate ([SpanOfCapPlateBolts/2, LugCavityHeight + LugCapPlateThickness, LugLength * 3/4])
                    rotate (a = [-90, 0, 0]) bolt_head (CapBoltHeadDiameter, 0.2, random = true);
                translate ([SpanOfCapPlateBolts/2, LugCavityHeight + LugCapPlateThickness, LugLength * 1/4])
                    rotate (a = [-90, 0, 0]) bolt_head (CapBoltHeadDiameter, 0.2, random = true);  
            //} // end color
        } // end translate
    } // module launch lug

    The above module is called four times, twice for the upper lugs, and twice for the lower lugs. In each pair, the second lug is a mirror of the first. The following code is added to the Nike_Ajax_Booster module in the Nike-Ajax.scad file.
    Code:
        // Upper Launch Lug
        rotate (a = [0, 0, 90]) {
            translate ([0, 0, 134.55]) {
                LaunchLug (M5_UpperFlangeDiameter,
                // since the lugs may be attached after painting the Nike body, its color and the
                // color of its components can be assigned independently
                    "White",     // color of lug
                    Steel,         // color of lug attachment bolts // Steel
                    Iron,         // color of attachment plate - could be unpainted Iron
                    Steel         // color of plate attachment bolts // Steel
                    );
                mirror ([1, 0, 0]) LaunchLug (M5_UpperFlangeDiameter,
                    "White",     // color of lug
                    Steel,         // color of lug attachment bolts // Steel
                    Iron,         // color of attachment plate - could be unpainted Iron
                    Steel         // color of plate attachment bolts // Steel
                    );
            } // end translate
        // Lower Launch Lug
            translate ([0, 0, BottomLugCenterUpFromM5Nozzle]) {
                LaunchLug (Boost_Shroud_Diameter,
                    "White",     // color of lug
                    Steel,         // color of lug attachment bolts // Steel
                    Iron,         // color of attachment plate - could be unpainted Iron
                    Steel         // color of plate attachment bolts // Steel
                    );
                mirror ([1, 0, 0]) LaunchLug (Boost_Shroud_Diameter,
                    "White",     // color of lug
                    Steel,         // color of lug attachment bolts // Steel
                    Iron,         // color of attachment plate - could be unpainted Iron
                    Steel         // color of plate attachment bolts // Steel
                    );
            } // end translate
        } // end rotate        
    launch lugs.JPG
     

    Attached Files:

  16. Jun 10, 2019 #46

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    I was never truly happy with the aft end of the shorter tunnels - the end is 'scalloped', which is not at all like the real tunnel. tunnel scallop.JPG

    It took a bit of thought, but adding the following code to the module Tunnel_Rear_1_3 in the file Nike-Ajax body tunnels.scad fixes it right up.
    Code:
    module Tunnel_Rear_1_3 () {
        hull () {
            difference() { // hulling the 'pie' shape to the tunnel flattend the end,
                           // removing the 'scallop'
                translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - 230.85 ])
                    cylinder (h = 0.01, d = 12, $fn = 120);
                rotate (a = [0, 0, 16]) translate ([0, -7.5, Bottom_Ajax_Tail_Cone_Sta - 230])
                    cube (size = [15, 15, 10], center = true);
                rotate (a = [0, 0, 164]) translate ([0, -7.5, Bottom_Ajax_Tail_Cone_Sta - 230])
                    cube (size = [15, 15, 10], center = true);
            }   
            intersection () {
                // the edge of this disk is the top ridge of the tunnel
                translate ([125.653, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [90, 0, 0])
                    cylinder (h = 6, d = 265, center = true, $fn = 360);           
                hull () {
                    Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 sta 198.625
                    Tunnel_Profile (232.625 - 1.875, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3
                } // end hull
            } // end intersection
        } // end hull 
    } // end module Tunnel_Rear_1_3
    tunnel flat.JPG

    Much better.
     
  17. Jun 10, 2019 #47

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    Did I mention that the interstage looks totally printable in Simplify3D?
    interstage in simplify.JPG
    I might see if my printer still works.

    Nutz, the latest upgrade to Simplify blew away all my settings.
     
    Last edited: Jun 10, 2019
  18. Jun 10, 2019 #48

    Leo

    Leo

    Leo

    Well-Known Member

    Joined:
    Aug 19, 2009
    Messages:
    1,744
    Likes Received:
    38
    Sorry, that was not my fault....
     
  19. Jun 11, 2019 #49

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    First thing I've printed in about nine months. Came out pretty nice with the default settings; the only ratty part was the support separation, easy enough to fix. 1/10 scale. The color match was pretty good, will only need slight adjustment*. I cannot break the legs by hand, so it should be strong enough for most stuff

    20190610_200453_HDR.jpg

    *Naw, it was pure coinkydink, just what was left over in the printer.
     
  20. Jun 11, 2019 #50

    Leo

    Leo

    Leo

    Well-Known Member

    Joined:
    Aug 19, 2009
    Messages:
    1,744
    Likes Received:
    38
    Guess my joke didn't catch on :)

    My last name is "Nutz" :D
     
  21. Jun 11, 2019 #51

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    But now I know who to blame from here on.
     
  22. Jun 11, 2019 #52

    Leo

    Leo

    Leo

    Well-Known Member

    Joined:
    Aug 19, 2009
    Messages:
    1,744
    Likes Received:
    38
    I'm ready to take all the punishment that is required to make you happy :D
     
  23. Jun 19, 2019 at 12:19 AM #53

    vcp

    vcp

    vcp

    Well-Known Member

    Joined:
    Jan 28, 2009
    Messages:
    868
    Likes Received:
    72
    Location:
    Boise, ID
    All that OpenSCAD code is useless unless you can print it...

    Nike Ajax interstage print.jpg
    Starting with the first print of the interstage only, printed inverted. It came out well with only a little clean-up needed where supports came off. But I wanted to print the interstage and forward Nike flange as a single print. The next attempt, with the flange, was stopped just above the Nike ignitor dome, to see how the interstage supports there would separate - it was ugly. The next one was stopped because I'd forgotten to put the supports under the launch lugs, but I got a look at how new supports were working on the ignitor dome - better but still needing tweaks. The fourth print was just up to a programmed stop, where I was again testing supports and different processes. The first full print was very good, but I wasn't happy with the supports needed for the top ring of the interstage. So, I sliced off the top ring and printed it separately. The final print, with a separately printed top ring... is fabulous. Practically zero cleanup required.

    This is how I've used Simplify3D processes to change the printing parameters at each level:
    interstage print processes.JPG

    The blue level is the shoulder, layer height 0.20 mm, infill 12%.
    Turquoise is the start of the upper Nike flange, starting just below the upper weld line; layer height 0.15, infill 12%, reduced speed outer layer (on all layers on up).
    The green layer contains the launch lug detail and the start of the ignitor dome surface, so layer height 0.10, infill 45%.
    Yellow still has detail, and the upper surface of the dome. Layer height still at 0.10, infill to 100% to ensure a good backing for the curved dome surface.
    Red is the remainder, layer height 0.15, infill 100%. The infill doesn't matter much here since it would be nearly solid anyway, with three wall layers. There's no fine detail here, so the change to 0.15 was to reduce print time.
    The upper ring of the interstage (not shown) was printed separately, at 0.10 layer height.
    Total print time for both parts, about six hours. I don't rush the print speed, and long prints don't bother me.

    Except for under the launch lugs, you'll notice that I haven't used S3D supports. The supports for the rim of the shoulder, and between the ignitor dome and base of the interstage, are programmed supports (i.e., in the OpenSCAD code). The shoulder rim support is a style I've used many times, and it gives a nice sharp edge to the shoulder and peels off cleanly. The cylinder between the dome and interstage is spaced perfectly so that I can just grab it with needle-nose pliers, crush it, and yank it out cleanly. I am utterly satisfied with the result.

    Note that this print is intended for a display model only, but changes for a flying model wouldn't be difficult. I was expecting to need to beef up the struts for a flying model, but they seem surprisingly strong.
     

Share This Page