RHS

Rectangular hollow section with independent outer and inner corner radii.

Parameters
200
250
15
10
10
Display
Camera
  const geometryGroup = scene.geometry.group();
  const dimensionsGroup = scene.dimensions.group();

  const BLUE = "#2563eb";
  const blueFillId = scene.addHatchFill(BLUE);
  const blueStroke = BLUE;

  const dimensionOverflow = 15;
  const dimensionOffset = 30;

  scene.draw((p) => {
    const {
      width: outerWidth,
      height: outerHeight,
      thickness,
      innerRadius,
      outerRadius,
    } = p;

    const innerWidth = outerWidth - 2 * thickness;
    const innerHeight = outerHeight - 2 * thickness;

    const path = geometryGroup.path({ stroke: blueStroke, fill: blueFillId });

    path
      // outer rectangle
      .moveToAbs(-outerWidth / 2, 0)
      .lineTo(0, outerHeight / 2 - outerRadius)
      .arcTo(outerRadius, outerRadius, outerRadius, true)
      .lineTo(outerWidth - outerRadius * 2, 0)
      .arcTo(outerRadius, -outerRadius, outerRadius, true)
      .lineTo(0, -(outerHeight - outerRadius * 2))
      .arcTo(-outerRadius, -outerRadius, outerRadius, true)
      .lineTo(-(outerWidth - outerRadius * 2), 0)
      .arcTo(-outerRadius, outerRadius, outerRadius, true)
      .lineTo(0, outerHeight / 2 - outerRadius)
      // inner rectangle
      .moveToAbs(-innerWidth / 2, 0)
      .lineTo(0, innerHeight / 2 - innerRadius)
      .arcTo(innerRadius, innerRadius, innerRadius, true)
      .lineTo(innerWidth - innerRadius * 2, 0)
      .arcTo(innerRadius, -innerRadius, innerRadius, true)
      .lineTo(0, -(innerHeight - innerRadius * 2))
      .arcTo(-innerRadius, -innerRadius, innerRadius, true)
      .lineTo(-(innerWidth - innerRadius * 2), 0)
      .arcTo(-innerRadius, innerRadius, innerRadius, true)
      .lineTo(0, innerHeight / 2 - innerRadius)
      .close();

    const dimensions = dimensionsGroup.dimension();

    // width
    dimensions
      .moveToAbs(-outerWidth / 2, -outerHeight / 2 - dimensionOffset)
      .tick(0)
      .lineTo(outerWidth, 0)
      .tick(0)
      .textAt(-outerWidth / 2, -15, `${outerWidth}mm`, "middle");

    // height
    dimensions
      .moveToAbs(outerWidth / 2 + dimensionOffset, -outerHeight / 2)
      .tick(-Math.PI / 2)
      .lineTo(0, outerHeight)
      .tick(Math.PI / 2)
      .textAt(10, -outerHeight / 2, `${outerHeight}mm`, "start");

    // thickness
    dimensions
      .moveToAbs(-outerWidth / 2 - dimensionOverflow, 15)
      .lineTo(dimensionOverflow, 0)
      .tick(0)
      .moveTo(thickness, 0)
      .tick(0)
      .lineTo(dimensionOverflow * 2, 0)
      .textAt(5, 0, `${thickness}mm`, "start");
  });