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/>.
//
//
//! Simple tube or ring
//
2020-02-29 12:52:36 -05:00
include < ../utils/core/core.scad >
2019-06-08 17:10:47 -04:00
module ring ( or , ir ) //! Create a ring with specified external and internal radii
difference ( ) {
circle4n ( or ) ;
circle4n ( ir ) ;
}
module tube ( or , ir , h , center = true ) //! Create a tube with specified external and internal radii and height ```h```
2020-03-29 15:18:57 -04:00
linear_extrude ( h , center = center , convexity = 5 )
2019-06-08 17:10:47 -04:00
ring ( or , ir ) ;
2020-11-13 04:35:56 -05:00
module woven_tube ( or , ir , h , center = true , colour = grey ( 30 ) , colour2 , warp = 2 , weft ) { //! Create a woven tube with specified external and internal radii, height ```h```, colours, warp and weft
colour2 = colour2 ? colour2 : colour * 0.8 ;
weft = weft ? weft : warp ;
warp_count = max ( floor ( PI * or / warp ) , 0.5 ) ;
angle = 360 / ( 2 * warp_count ) ;
module layer ( weft ) {
points = [ [ ir , weft / 2 ] , [ or , weft / 2 ] , [ or , - weft / 2 ] , [ ir , - weft / 2 ] ] ;
color ( colour )
for ( i = [ 0 : warp_count ] )
rotate ( 2 * i * angle )
rotate_extrude ( angle = angle )
polygon ( points ) ;
color ( colour2 )
for ( i = [ 0 : warp_count ] )
rotate ( ( 2 * i + 1 ) * angle )
rotate_extrude ( angle = angle )
polygon ( points ) ;
}
translate_z ( center ? - h / 2 : 0 ) {
weft_count = floor ( h / weft ) ;
if ( weft_count > 0 )
for ( i = [ 0 : weft_count - 1 ] ) {
translate_z ( i * weft + weft / 2 )
rotate ( i * angle )
layer ( weft ) ;
}
remainder = h - weft * weft_count ;
if ( remainder ) {
translate_z ( weft_count * weft + remainder / 2 )
rotate ( weft_count * angle )
layer ( remainder ) ;
}
}
}