I-Beam
Classic I-section with fillet radii and live dimension annotations.
Parameters
200
300
40
20
12
Display
Camera
const geometryGroup = scene.geometry.group();
const dimensionsGroup = scene.dimensions.group();
const AMBER = "#d97706";
const amberFillId = scene.addHatchFill(AMBER);
const amberStroke = AMBER;
const dimensionOverflow = 15;
const dimensionOffset = 30;
scene.draw((p) => {
const { width, height, flangeThickness, webThickness, filletRadius } = p;
// i-beam
const path = geometryGroup.path({
stroke: amberStroke,
fill: amberFillId,
});
path
.moveToAbs(0, 0)
.lineTo(width / 2, 0)
.lineTo(0, flangeThickness)
.lineTo(-width / 2 + webThickness / 2 + filletRadius, 0)
.arcTo(-filletRadius, filletRadius, filletRadius, true)
.lineTo(0, height - 2 * flangeThickness - 2 * filletRadius)
.arcTo(filletRadius, filletRadius, filletRadius, true)
.lineTo(width / 2 - webThickness / 2 - filletRadius, 0)
.lineTo(0, flangeThickness)
.lineTo(-width, 0)
.lineTo(0, -flangeThickness)
.lineTo(width / 2 - webThickness / 2 - filletRadius, 0)
.arcTo(filletRadius, -filletRadius, filletRadius, true)
.lineTo(0, -height + 2 * flangeThickness + 2 * filletRadius)
.arcTo(-filletRadius, -filletRadius, filletRadius, true)
.lineTo(-width / 2 + webThickness / 2 + filletRadius, 0)
.lineTo(0, -flangeThickness)
.lineTo(width / 2, 0)
.close();
geometryGroup.translate(0, -height / 2);
const dimensions = dimensionsGroup.dimension();
const webThicknessDimensionPositionY = (height / 2 - flangeThickness) / 2;
// web thickness dimension
dimensions
.moveToAbs(-webThickness / 2, webThicknessDimensionPositionY)
.tick(0)
.lineTo(-dimensionOverflow, 0)
.moveToAbs(webThickness / 2, webThicknessDimensionPositionY)
.tick(Math.PI)
.lineTo(dimensionOverflow * 2, 0)
.textAt(5, 0, `${webThickness}mm`, "start");
// flange width dimension
dimensions
.moveToAbs(-width / 2, -height / 2 - dimensionOffset)
.tick(0)
.lineTo(width, 0)
.tick(0)
.textAt(-width / 2, -15, `${width}mm`);
// height dimension
dimensions
.moveToAbs(width / 2 + dimensionOffset, -height / 2)
.tick(-Math.PI / 2)
.lineTo(0, height)
.tick(Math.PI / 2)
.textAt(15, -height / 2, `${height}mm`, "start");
// fillet radius dimension
const filletRadiusDimensionDirX = Math.cos(Math.PI / 4);
const filletRadiusDimensionDirY = Math.sin(Math.PI / 4);
dimensions
.moveToAbs(-webThickness / 2, height / 2 - flangeThickness)
.moveTo(-filletRadius, -filletRadius)
.moveTo(
filletRadius * filletRadiusDimensionDirX,
filletRadius * filletRadiusDimensionDirY,
)
.arrowFilled(Math.PI / 4)
.lineTo(-30, -30)
.lineTo(-15, 0)
.textAt(-5, 0, `R ${filletRadius}mm`, "end");
});