* 3d models * Update kcl-samples simulation test output * typos * Update kcl-samples simulation test output --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
241 lines
7.2 KiB
Plaintext
241 lines
7.2 KiB
Plaintext
// Power Distribution Unit (PDU) faceplate with European plug sockets and switch
|
|
// Designed for standard 19-inch rack systems with 1U height and 8 sockets
|
|
|
|
// Set units in millimeters (mm)
|
|
@settings(defaultLengthUnit = mm, kclVersion = 1.0)
|
|
|
|
// Define the dimensions
|
|
// Width fits standard 19” rack, height is 1U, depth is variable
|
|
faceplateWidth = 482.6 // this is standardized to fit 19-inch racks)
|
|
faceplateHeight = 44.45 // usually 1U (44.45 mm), but can be 2U (88.9 mm) or more
|
|
faceplateDepth = 100 // varies by manufacturer, but commonly between 100 mm and 300 mm
|
|
|
|
|
|
// Define dimensions of side supports (width and thickness)
|
|
supportWidth = 50
|
|
supportThickness = 3
|
|
|
|
// Main body of the PDU faceplate with integrated rack mounting flanges
|
|
faceplateShape = startSketchOn(offsetPlane(XY, offset = -faceplateHeight / 2))
|
|
|> startProfile(%, at = [-faceplateWidth / 2 - supportWidth, 0])
|
|
|> yLine(length = supportThickness)
|
|
|> xLine(length = supportWidth)
|
|
|> yLine(length = faceplateDepth - supportThickness)
|
|
|> xLine(length = faceplateWidth)
|
|
|> yLine(length = supportThickness - faceplateDepth)
|
|
|> xLine(length = supportWidth)
|
|
|> yLine(length = -supportThickness)
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg01)
|
|
|> close()
|
|
faceplateBody = extrude(faceplateShape, length = faceplateHeight)
|
|
faceplateFrontFace = startSketchOn(faceplateBody, face = seg01)
|
|
|
|
// Creates recessed volume within the faceplate for inserting modules
|
|
nestWall = 2
|
|
nestWidth = faceplateWidth - (nestWall * 2)
|
|
nestHeight = faceplateHeight - (nestWall * 2)
|
|
nestDepth = faceplateDepth - nestWall
|
|
nestShape = startProfile(faceplateFrontFace, at = [-nestWidth / 2, nestHeight / 2])
|
|
|> xLine(length = nestWidth)
|
|
|> yLine(length = -nestHeight)
|
|
|> xLine(length = -nestWidth)
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close()
|
|
nestVoid = extrude(nestShape, length = -nestDepth)
|
|
|
|
// Spacer block on the left side, used to position components correctly
|
|
moduleHeight = nestHeight
|
|
moduleWidth = nestHeight
|
|
moduleDepth = nestHeight
|
|
|
|
leftSpacerWidth = moduleWidth * 1.5
|
|
leftSpacerPosition = leftSpacerWidth / 2 - (nestWidth / 2)
|
|
|
|
fn boxModuleFn(width) {
|
|
shape = startSketchOn(XZ)
|
|
|> startProfile(%, at = [-width / 2, moduleHeight / 2])
|
|
|> xLine(length = width)
|
|
|> yLine(length = -moduleHeight)
|
|
|> xLine(length = -width)
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close()
|
|
body = extrude(shape, length = -moduleDepth)
|
|
return body
|
|
}
|
|
leftSpacerShape = boxModuleFn(width = leftSpacerWidth)
|
|
|> translate(
|
|
%,
|
|
x = leftSpacerPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
|
|
// Module for power switch including front plate and red rocker button
|
|
switchPosition = leftSpacerPosition + leftSpacerWidth / 2 + moduleWidth / 2
|
|
swtichWidth = moduleWidth
|
|
|
|
// Switch Body
|
|
switchBody = boxModuleFn(width = moduleWidth)
|
|
|
|
// Switch Plate
|
|
swtichPlateWidth = 20
|
|
switchPlateHeight = 30
|
|
switchPlateThickness = 3
|
|
switchPlateShape = startSketchOn(switchBody, face = END)
|
|
|> startProfile(
|
|
%,
|
|
at = [
|
|
-swtichPlateWidth / 2,
|
|
-switchPlateHeight / 2
|
|
],
|
|
)
|
|
|> yLine(length = switchPlateHeight)
|
|
|> xLine(length = swtichPlateWidth)
|
|
|> yLine(length = -switchPlateHeight)
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close()
|
|
switchPlateBody = extrude(switchPlateShape, length = switchPlateThickness)
|
|
|> translate(
|
|
%,
|
|
x = switchPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
|
|
// Switch Button
|
|
switchButtonHeight = 26
|
|
swtichButtonWidth = 15
|
|
switchButtonShape = startSketchOn(offsetPlane(-YZ, offset = -swtichButtonWidth / 2))
|
|
|> startProfile(
|
|
%,
|
|
at = [
|
|
switchPlateThickness,
|
|
switchButtonHeight / 2
|
|
],
|
|
)
|
|
|> line(end = [3, -1])
|
|
|> arc(interiorAbsolute = [6, 0], endAbsolute = [12, -9])
|
|
|> line(endAbsolute = [
|
|
switchPlateThickness,
|
|
-switchButtonHeight / 2
|
|
])
|
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close()
|
|
switchButtonBody = extrude(switchButtonShape, length = swtichButtonWidth)
|
|
|> translate(
|
|
%,
|
|
x = switchPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
|> appearance(%, color = "#ff0000")
|
|
|
|
// Spacer between switch and plug modules for layout alignment
|
|
secondSpacerWidth = moduleWidth / 2
|
|
secondSpacerPosition = switchPosition + swtichWidth / 2 + secondSpacerWidth / 2
|
|
secondSpacerBody = boxModuleFn(width = secondSpacerWidth)
|
|
|> translate(
|
|
%,
|
|
x = secondSpacerPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
|
|
// European power plug modules with circular sockets and two-pin holes
|
|
// 8 identical sockets, each with grounding notch and dual-pin recesses
|
|
powerPlugWidth = moduleWidth
|
|
powerPlugCount = 8
|
|
powerPlugOveralWidth = powerPlugWidth * powerPlugCount
|
|
firstPowerPlugPosition = secondSpacerPosition + secondSpacerWidth / 2 + powerPlugWidth / 2
|
|
lastPowerPlugPosition = firstPowerPlugPosition + powerPlugWidth * (powerPlugCount - 1)
|
|
powerPlugBody = boxModuleFn(width = powerPlugWidth)
|
|
|> translate(
|
|
%,
|
|
x = firstPowerPlugPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
plugShape = startSketchOn(powerPlugBody, face = END)
|
|
|> circle(%, center = [0, 0], radius = 17)
|
|
|> translate(
|
|
%,
|
|
x = firstPowerPlugPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
plugBody = extrude(plugShape, length = -20)
|
|
plugHoleDistance = 20
|
|
plugHoleShape = startSketchOn(plugBody, face = START)
|
|
|> circle(%, center = [-plugHoleDistance / 2, 0], radius = 3)
|
|
|> translate(
|
|
%,
|
|
x = firstPowerPlugPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
|> patternLinear2d(
|
|
%,
|
|
instances = 2,
|
|
distance = plugHoleDistance,
|
|
axis = [1, 0],
|
|
)
|
|
plugHoleBody = extrude(plugHoleShape, length = -5)
|
|
|> patternLinear3d(
|
|
%,
|
|
instances = powerPlugCount,
|
|
distance = powerPlugWidth,
|
|
axis = [1, 0, 0],
|
|
)
|
|
|
|
// Rightmost spacer to fill in remaining horizontal space
|
|
rightSpacerWidth = nestWidth / 2 - lastPowerPlugPosition - (powerPlugWidth / 2)
|
|
rightSpacerPosition = lastPowerPlugPosition + powerPlugWidth / 2 + rightSpacerWidth / 2
|
|
rightSpacerBody = boxModuleFn(width = rightSpacerWidth)
|
|
|> translate(
|
|
%,
|
|
x = rightSpacerPosition,
|
|
y = 0,
|
|
z = 0,
|
|
)
|
|
|
|
// Rack mounting holes on flanges, elongated for alignment flexibility
|
|
holeWidth = 25
|
|
holeDiameter = 5
|
|
holeStraightSegment = holeWidth - holeDiameter
|
|
holeVerticalDistance = faceplateHeight * 0.3
|
|
|
|
holeShapes = startProfile(
|
|
faceplateFrontFace,
|
|
at = [
|
|
-holeStraightSegment / 2,
|
|
holeDiameter / 2
|
|
],
|
|
)
|
|
|> xLine(length = holeStraightSegment)
|
|
|> tangentialArc(endAbsolute = [
|
|
holeStraightSegment / 2,
|
|
-holeDiameter / 2
|
|
])
|
|
|> xLine(length = -holeStraightSegment)
|
|
|> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|> close()
|
|
|> translate(
|
|
%,
|
|
x = -faceplateWidth / 2 - (supportWidth / 2),
|
|
y = 0,
|
|
z = -holeVerticalDistance,
|
|
)
|
|
|> patternLinear2d(
|
|
%,
|
|
instances = 3,
|
|
distance = holeVerticalDistance,
|
|
axis = [0, 1],
|
|
)
|
|
|> patternLinear2d(
|
|
%,
|
|
instances = 2,
|
|
distance = faceplateWidth + supportWidth,
|
|
axis = [1, 0],
|
|
)
|
|
holeVoid = extrude(holeShapes, length = -supportThickness)
|