* Shuffle around function call code Signed-off-by: Nick Cameron <nrc@ncameron.org> * Refactor function calls to share more code Signed-off-by: Nick Cameron <nrc@ncameron.org> * Hack to leave the result of revolve as a singleton rather than array Signed-off-by: Nick Cameron <nrc@ncameron.org> --------- Signed-off-by: Nick Cameron <nrc@ncameron.org>
94 lines
3.3 KiB
Plaintext
94 lines
3.3 KiB
Plaintext
// Spinning Highrise Tower
|
|
// A conceptual high-rise tower with a central core and rotating floor slabs, demonstrating dynamic form through vertical repetition and transformation
|
|
|
|
|
|
|
|
|
|
@settings(defaultLengthUnit = m, kclVersion = 1.0)
|
|
|
|
// Define global parameters for floor geometry and building layout
|
|
floorCount = 17
|
|
floorHeight = 5
|
|
slabWidth = 30
|
|
slabThickness = 0.5
|
|
rotationAngleStep = 5
|
|
handrailHeight = 1.2
|
|
handrailThickness = 0.3
|
|
balconyDepth = 3
|
|
|
|
// Calculate facade and core geometry from parameters
|
|
facadeWidth = slabWidth - (balconyDepth * 2)
|
|
facadeHeight = floorHeight - slabThickness
|
|
coreHeight = floorCount * floorHeight - slabThickness
|
|
frameSide = 0.1
|
|
windowTargetWidth = 6
|
|
windowTargetCount = facadeWidth / windowTargetWidth
|
|
windowCount = round(windowTargetCount)
|
|
windowWidth = facadeWidth / windowCount
|
|
|
|
// Helper function: Creates a box from a center plane with given width and height
|
|
fn boxFn(plane, width, height) {
|
|
shape = startSketchOn(plane)
|
|
|> startProfile(%, at = [-width / 2, -width / 2])
|
|
|> line(%, end = [0, width])
|
|
|> line(%, end = [width, 0])
|
|
|> line(%, end = [0, -width])
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close(%)
|
|
body = extrude(shape, length = height)
|
|
return body
|
|
}
|
|
|
|
// Helper function: Defines transformation (translation and rotation) for each floor
|
|
fn transformFn(@i) {
|
|
return {
|
|
translate = [0, 0, i * floorHeight],
|
|
rotation = { angle = rotationAngleStep * i }
|
|
}
|
|
}
|
|
|
|
// Create building base
|
|
baseThickness = 0.2
|
|
baseSlab = boxFn(plane = XY, width = slabWidth, height = -baseThickness)
|
|
|> appearance(%, color = "#dbd7d2")
|
|
|
|
// Create ground platform beneath the base
|
|
goundSize = 50
|
|
groundBody = boxFn(plane = offsetPlane(XY, offset = -baseThickness), width = goundSize, height = -5)
|
|
|> appearance(%, color = "#3a3631")
|
|
|
|
// Create a single slab with handrail height to be reused with pattern
|
|
slabAndHandrailGeometry = boxFn(plane = offsetPlane(XY, offset = floorHeight - slabThickness), width = slabWidth, height = slabThickness + handrailHeight)
|
|
slabVoidStart = -slabWidth / 2 + handrailThickness
|
|
slabVoidWidth = slabWidth - (handrailThickness * 2)
|
|
slabVoidShape = startSketchOn(slabAndHandrailGeometry, face = END)
|
|
|> startProfile(%, at = [slabVoidStart, slabVoidStart])
|
|
|> line(%, end = [0, slabVoidWidth])
|
|
|> line(%, end = [slabVoidWidth, 0])
|
|
|> line(%, end = [0, -slabVoidWidth])
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close(%)
|
|
|
|
// Generate and pattern slabs with voids across all floors
|
|
slabBody = extrude(slabVoidShape, length = -handrailHeight)
|
|
|> patternTransform(instances = floorCount, transform = transformFn)
|
|
|> appearance(%, color = "#dbd7d2")
|
|
|
|
// Create structural core of the tower
|
|
coreLength = 10
|
|
coreWidth = 8
|
|
core = startSketchOn(XY)
|
|
|> startProfile(%, at = [-coreLength / 2, -coreWidth / 2])
|
|
|> line(%, end = [0, coreWidth])
|
|
|> line(%, end = [coreLength, 0])
|
|
|> line(%, end = [-0.22, -coreWidth])
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close(%)
|
|
|> extrude(%, length = coreHeight)
|
|
|
|
// Create facade panels for each floor
|
|
facadeStart = facadeWidth / 2
|
|
facadeGeometry = boxFn(plane = XY, width = facadeWidth, height = facadeHeight)
|
|
|> patternTransform(instances = floorCount, transform = transformFn)
|
|
|> appearance(%, color = "#151819")
|