CHS

Circular hollow section with center mark, radius dimension, and wall-thickness callout.

Parameters
110
24
Display
Camera
  const geometryGroup = scene.geometry.group();
  const dimensionsGroup = scene.dimensions.group();
  const TEAL = "#0f766e";
  const tealFillId = scene.addHatchFill(TEAL);
  const tealStroke = TEAL;

  const radiusDimensionAngle = Math.PI / 4; // 45deg
  const centerMarkSize = 15;
  const dimensionOverflow = 15;
  const thicknessDimensionAngle = -Math.PI / 4; // -45deg

  scene.draw((p) => {
    const { radius: outerRadius, thickness } = p;
    const innerRadius = outerRadius - thickness;

    const path = geometryGroup.path({ stroke: tealStroke, fill: tealFillId });

    // a single arcTo can create a circle with the help of a very small displacement (epsilon) and lareArc = true
    // it looks and behaves like a circle but a perfect one can only be produced by 2 or more arcs
    path
      // outer circle
      .moveToAbs(-outerRadius, 0)
      .arcTo(0, -Number.EPSILON, outerRadius, true, true)
      // inner circle
      .moveToAbs(-innerRadius, 0)
      .arcTo(0, -Number.EPSILON, innerRadius, true, true)
      .close();

    const dimensions = dimensionsGroup.dimension();
    const radiusDirX = Math.cos(radiusDimensionAngle);
    const radiusDirY = Math.sin(radiusDimensionAngle);

    // radius dimension
    dimensions
      .centerMark(centerMarkSize)
      .lineTo(outerRadius * radiusDirX, outerRadius * radiusDirY)
      .arrowFilled(radiusDimensionAngle)
      .moveToAbs(
        (innerRadius / 2) * radiusDirX,
        (innerRadius / 2) * radiusDirY,
      )
      .textAt(-5, 5, `${outerRadius}mm`, "end");

    // wall thickness dimension
    const thicknessDirX = Math.cos(thicknessDimensionAngle);
    const thicknessDirY = Math.sin(thicknessDimensionAngle);
    dimensions
      .moveToAbs(
        (innerRadius - dimensionOverflow) * thicknessDirX,
        (innerRadius - dimensionOverflow) * thicknessDirY,
      )
      .lineTo(
        dimensionOverflow * thicknessDirX,
        dimensionOverflow * thicknessDirY,
      )
      .tick(thicknessDimensionAngle)
      .moveTo(thickness * thicknessDirX, thickness * thicknessDirY)
      .tick(thicknessDimensionAngle)
      .lineTo(
        dimensionOverflow * thicknessDirX,
        dimensionOverflow * thicknessDirY,
      )
      .lineTo(dimensionOverflow * 2, 0)
      .textAt(5, 0, `${thickness}mm`, "start");
  });