2019-06-08 17:10:47 -04:00
//
// NopSCADlib Copyright Chris Palmer 2018
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//
//! Global constants, functions and modules. This file is used directly or indirectly in every scad file.
//
include < ../../global_defs.scad >
2019-06-27 06:10:37 -04:00
function inch ( x ) = x * 25.4 ; //! Inch to mm conversion (For fractional inches, 'inch(1 + 7/8)' will work as expected.)
function foot ( x ) = x * 25.4 * 12 ; //! Foot to mm conversion
function yard ( x ) = x * 25.4 * 12 * 3 ; //! Yard to mm conversion
function mm ( x ) = x ; //! Explicit mm specified
function cm ( x ) = x * 10.0 ; //! cm to mm conversion
function m ( x ) = x * 1000.0 ; //! m to mm conversion
2019-06-08 17:10:47 -04:00
function sqr ( x ) = x * x ; //! Returns the square of ```x```
function echoit ( x ) = echo ( x ) x ; //! Echo expression and return it, useful for debugging
function in ( list , x ) = ! ! len ( [ for ( v = list ) if ( v = = x ) true ] ) ; //! Returns true if ```x``` is an element in the ```list```
function Len ( x ) = is_list ( x ) ? len ( x ) : 0 ; //! Returns the length of a list or 0 if ```x``` is not a list
function r2sides ( r ) = $fn ? $fn : ceil ( max ( min ( 360 / $fa , r * 2 * PI / $fs ) , 5 ) ) ; //! Replicates the OpenSCAD logic to calculate the number of sides from the radius
function r2sides4n ( r ) = floor ( ( r2sides ( r ) + 3 ) / 4 ) * 4 ; //! Round up the number of sides to a multiple of 4 to ensure points land on all axes
module translate_z ( z ) translate ( [ 0 , 0 , z ] ) children ( ) ; //! Shortcut for Z only translations
2019-06-15 03:43:42 -04:00
module vflip ( ) rotate ( [ 180 , 0 , 0 ] ) children ( ) ; //! Invert children by doing a 180° flip around the X axis
module hflip ( ) rotate ( [ 0 , 180 , 0 ] ) children ( ) ; //! Invert children by doing a 180° flip around the Y axis
2019-06-08 17:10:47 -04:00
module ellipse ( xr , yr ) scale ( [ 1 , yr / xr ] ) circle4n ( xr ) ; //! Draw an ellipse
module extrude_if ( h , center = true ) //! Extrudes 2D object to 3D when ```h``` is nonzero, otherwise leaves it 2D
if ( h )
2020-01-10 05:26:12 -05:00
linear_extrude ( height = h , center = center , convexity = 2 ) // 3D
2019-06-08 17:10:47 -04:00
children ( ) ;
else
children ( ) ; // 2D
module circle4n ( r , d = undef ) { //! Circle with multiple of 4 vertices
R = is_undef ( d ) ? r : d / 2 ;
circle ( R , $fn = r2sides4n ( R ) ) ;
}
module semi_circle ( r , d = undef ) //! A semi circle in the positive Y domain
intersection ( ) {
R = is_undef ( d ) ? r : d / 2 ;
circle4n ( R ) ;
sq = R + 1 ;
translate ( [ - sq , 0 ] )
square ( [ 2 * sq , sq ] ) ;
}
2019-07-29 15:43:03 -04:00
module right_triangle ( width , height , h , center = true ) //! A right angled triangle with the 90° corner at the origin. 3D when ```h``` is nonzero, otherwise 2D
extrude_if ( h , center = center )
polygon ( points = [ [ 0 , 0 ] , [ width , 0 ] , [ 0 , height ] ] ) ;
2019-06-08 17:10:47 -04:00
include < sphere.scad >
include < bom.scad >
include < polyholes.scad >
include < teardrops.scad >
include < rounded_rectangle.scad >
include < clip.scad >