import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.* import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.* import uk.co.nickthecoder.foocad.extras.v1.* import static uk.co.nickthecoder.foocad.extras.v1.Extras.* class DragChain : Model { var segments = 3 var size = Vector3( 5,5,5 ) var gap = 1.0 var wallThickness = 0.8 var baseThickness = 0.8 var flexThickness = 0.4 var joinSize = Vector2( 0.6, 0.6 ) var delta = 1 meth segment() : Shape3d { val trap = Trapezium( size.y, size.z ) .deltaX( delta ) .rotate(90) val base = Square( size.x + wallThickness * 2, size.y + delta * 2 ) .center() .extrude( baseThickness ) val sides = trap.extrude( wallThickness ) .rotateY(-90) .leftTo( size.x/2 ) .mirrorX().also() .centerXY() .bottomTo(base.top) val top = Square( size.x + wallThickness *2, size.y ) .extrude( baseThickness ) .centerXY() .bottomTo( sides.top ) return base + sides + top } override meth build() : Shape3d { val one = segment() val many = one.tileY( segments, gap ) .centerXY() val floor = Square( many.size.x, many.size.y ) .center() .extrude( flexThickness ) return many + floor } } /* var segments = 3 var size = Vector3( 5,5,5 ) var thickness = 0.8 var baseThickness = 2.0 var joinSize = Vector2( 0.6, 0.6 ) var angle = 30.0 var round = 0.5 meth internalShape() : Shape2d { val x = size.x/2 val y = size.y/2 val x2 = x * Math.sin( angle * Math.PI / 180 ) return PolygonBuilder().apply { moveTo( x, 0 ) lineTo( x2, y ) lineTo( -x2, y ) lineTo( -x, 0 ) lineTo( -x2, -y ) lineTo( x2, -y ) }.build() //.roundCorners( listOf( 5, 4, 2, 1 ), round ) } meth segment() : Shape3d { val internal = internalShape() val external = internal.offset( thickness ) val removeBase = external.offset( -thickness ) val base = external.extrude(0.4) val solid = (external - removeBase) .extrude( baseThickness*2 + size.z ) val hole = Square( solid.size.x * 2, size.y ) .center() .smartExtrude( size.z ) .top( Chamfer( size.z/2 - 0.1, size.z/3 ) ) .bottomTo( baseThickness ) val join = Cube( joinSize.x, joinSize.y, baseThickness ) .topTo( solid.top ).also() .centerY() .centerXTo( solid.right ) return solid + base - hole + join } meth chain( segments : int ) : Shape3d { return segment().tileX( segments ) .centerX() } @Piece meth chain() = chain( segments ) override fun build() : Shape3d { return chain( segments ) } */