Tesla.Angela 发表于 2024-1-16 06:09:51

OpenSCAD基本组件:门闩

效果图:
把原作者的代码整理成了模块。//code from Internet (unknown URL), modified by Tesla.Angela (www.m5home.com/bbs)

$fn=100;

//The printing accuracy of your 3D printer.
gap=0.4;
//The status of the gate bolt.
LOCK=01;

module MakeGateBoltEnd
(
        thickness,base_length,base_width,tube_diameter,holes=true
)
{
        difference()
        {
                union()
                {
                        cube();
                        translate()
                        {
                                cube();
                        }
                }
                if(holes)
                {
                        translate([base_length/2,
                                                (base_width-tube_diameter)/4,0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                        translate([base_length/2,
                                                base_width-(base_width-tube_diameter)/4,0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                }
        }
}

module MakeGateBoltTopOpen
(
        thickness,base_length,base_width,tube_diameter,holes=true,
        front_extension_length=0,back_extension_length=0
)
{
        difference()
        {
                union()
                {
                        cube();
                        translate([0,base_width/2-(tube_diameter+thickness*2)/2,
                                                thickness])
                        {
                                cube();
                        }
                        translate([0,
                                                base_width/2+(tube_diameter+thickness*2)/2-thickness,
                                                thickness])
                        {
                                cube();
                        }
                        if(front_extension_length)
                        {
                                translate()
                                {
                                        cube();
                                }
                        }
                        if(back_extension_length)
                        {
                                translate([-back_extension_length,0,0])
                                {
                                        cube();
                                }
                        }
                }
                if(holes)
                {
                        //first hole
                        translate([base_length/2,
                                                (base_width-tube_diameter-thickness*2)/4,0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                        //second hole
                        translate([base_length/2,
                                                base_width-(base_width-tube_diameter-thickness*2)/4,
                                                0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                }
        }
}

module MakeGateBoltBody
(
        thickness,base_length,base_width,tube_diameter,holes
)
{
        difference()
        {
                union()
                {
                        cube();
                        translate([0,base_width/2-(tube_diameter+thickness*2)/2,
                                                thickness])
                        {
                                cube([base_length,tube_diameter+thickness*2,
                                                tube_diameter+thickness]);
                        }
                }
                translate()
                {
                        rotate()
                        {
                                cylinder(base_length+gap,tube_diameter/2,tube_diameter/2);
                        }
                }
                if(holes==2)
                {
                        //first hole
                        translate([base_length/2,
                                                (base_width-tube_diameter-thickness*2)/4,
                                                0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                        //second hole
                        translate([base_length/2,
                                                base_width-(base_width-tube_diameter-thickness*2)/4,
                                                0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                }
                else if(holes==4)
                {
                        //first hole
                        translate([4,(base_width-tube_diameter-thickness*2)/4,
                                                0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                        //second hole
                        translate([base_length-4,
                                                (base_width-tube_diameter-thickness*2)/4,
                                                0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                        //third hole
                        translate([4,base_width-(base_width-tube_diameter-thickness*2)/4,
                                                0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                        //fourth hole
                        translate([base_length-4,
                                                base_width-(base_width-tube_diameter-thickness*2)/4,
                                                0-gap/2])
                        {
                                cylinder(thickness+gap,1,1);
                        }
                }
        }
}

module MakeGateBoltStick(tube_diameter,stick_length, handle_length)
{
        intersection()
        {
                rotate()
                {
                        cylinder(stick_length,tube_diameter/2,tube_diameter/2);
                }
                translate()
                {
                        rotate()
                        {
                                cylinder(handle_length,tube_diameter/2,tube_diameter/2);
                        }
                }
        }
        translate()
        {
                rotate()
                {
                        cylinder(stick_length-tube_diameter/2,
                                        tube_diameter/2,tube_diameter/2);
                }
        }
        translate()
        {
                rotate()
                {
                        cylinder(handle_length-tube_diameter/2,
                                        tube_diameter/2,tube_diameter/2);
                }
        }
}

//test
translate([-40,0,0])
{
        MakeGateBoltEnd(1,10,20,10,true);
}
translate([-20,0,0])
{
        MakeGateBoltTopOpen(1,10,20,8+gap,true,10,10);
}
translate()
{
        MakeGateBoltBody(1,30,20,8+gap,4);
}
translate()
{
        MakeGateBoltBody(1,10,20,8+gap,2);
}
translate()
{
        MakeGateBoltStick(8,60,30);
}
页: [1]
查看完整版本: OpenSCAD基本组件:门闩