class ScrewTidyRoundedInsert : Model { @Custom var thickness = 0.5 @Custom var radius = 3 @Custom var taper = 2 @Custom var chamferBase = 2 @Custom var chamferSlope = 2 @Custom var x = 1 @Custom var y = 1 // Experimental ! Keep at 0 var feetHeight = 0 fun insert( width : int, depth : int, height : int ) : Shape3d { val top = Square( width, depth ) .center().roundAllCorners( radius ) val mid = Square( width - taper, depth - taper ) .center().roundAllCorners( radius ) val bottom = Square( width - taper - chamferBase * 2 / chamferSlope, depth - taper - chamferBase * 2 / chamferSlope ).center().roundAllCorners( radius ) val insert = ExtrusionBuilder().apply { crossSection( bottom ) if (chamferBase > 0) { forward(chamferBase) crossSection( mid ) } forward( height - chamferBase ) crossSection( top ) // Now head down to make it hollow crossSection( top.offset(-thickness) ) forward( -height + thickness + chamferBase ) if (chamferBase > 0 ) { crossSection( mid.offset( -thickness ) ) forward( -chamferBase ) } crossSection( bottom.offset(-thickness) ) }.build() return if (feetHeight <= 0) { insert } else { // What I'm hoping for is to build 4 feet on the bed, and then // bidge between the shorter distance between the feet in 2 layers, // then bridge between the longer distances in 2 layers, and then // fingers crossed, the bottom of the box will bridge! val layerHeight = 0.2 val feetWidth = 2 val outline = bottom - bottom.offset(-feetWidth) val feetEndsProfile = outline - Square( bottom.size.x+feetWidth*2, bottom.size.y-10 ).center() val feetProfile = feetEndsProfile - Square( bottom.size.x-10, bottom.size.y+feetWidth*2 ).center() val feet = feetProfile.extrude( feetHeight ) + feetEndsProfile.extrude(layerHeight*4).translateZ( feetHeight - layerHeight*4 ) + outline.extrude(layerHeight*2).translateZ( feetHeight - layerHeight*2 ) feet + insert.translateZ(feetHeight) } } override fun build() : Shape3d { return insert( x * 39, y * 54, 44.5 ) // Cube( 100,1,100).center() } }