ConcreteExtents

ConcreteExtents

ConcreteExtents defines the concrete cross-section geometry. It’s a polymorphic base class with specific section types as derived classes.

Supported Section Types

TypeDescription
TBeamT-shaped beam
IBeamI-shaped beam
LBeamL-shaped ledger beam
RectangularSolid rectangular section
InvertedTBeamInverted T-beam
BulbTBeamBulb-T beam
HollowCoreHollow core plank
MetroDeckMetro deck section
TSlabT-slab section
RiserStair riser section
PolygonalCustom polygonal shape (NOT supported by API)

Note: Polygonal sections are not currently supported by the API.

Working with Section Types

Type Checking

Use pattern matching to handle different section types:

var design = await client.PullBeamDesignerAsync();

switch (design.ConcreteExtents)
{
    case TBeam tBeam:
        Console.WriteLine($"T-Beam: {tBeam.Length}\" long, {tBeam.Height}\" tall");
        break;

    case IBeam iBeam:
        Console.WriteLine($"I-Beam: {iBeam.Length}\" long");
        break;

    case LBeam lBeam:
        Console.WriteLine($"L-Beam (Ledger): {lBeam.Length}\" long");
        break;

    case Rectangular rect:
        Console.WriteLine($"Rectangular: {rect.Length}\" x {rect.Width}\" x {rect.Height}\"");
        break;

    case HollowCore hollowCore:
        Console.WriteLine($"Hollow Core: {hollowCore.Length}\" long");
        break;

    case null:
        Console.WriteLine("No section defined");
        break;

    default:
        Console.WriteLine($"Other section type: {design.ConcreteExtents.GetType().Name}");
        break;
}

Modifying Properties

Cast to the specific type before modifying:

var design = await client.PullBeamDesignerAsync();

if (design.ConcreteExtents is TBeam tBeam)
{
    tBeam.Length = 240;   // inches
    tBeam.Width = 48;     // inches
    tBeam.Height = 24;    // inches
}

await client.PushBeamDesignerAsync("", design);

Changing Section Type

Replace the entire ConcreteExtents object:

var design = await client.PullBeamDesignerAsync();

// Change from whatever it was to an I-Beam
design.ConcreteExtents = new IBeam
{
    Length = 360,
    Height = 36,
    // Set other required properties...
};

await client.PushBeamDesignerAsync("", design);

Common Properties

All section types inherit from ConcreteExtents and share these common properties:

PropertyTypeDescription
HolesAndSolidsHolesSolidsDefinitionVoids and solid regions
ToppingToppingDefinitionTopping configuration

TBeam Properties

PropertyTypeUnitDescription
LengthdoubleinchesMember length
WidthdoubleinchesTotal flange width
TopWidthdoubleinchesTop flange width
BottomWidthdoubleinchesBottom flange width
HeightdoubleinchesTotal section height
ThicknessdoubleinchesFlange thickness
JointGapdoubleinchesGap between members
StemSpacingdoubleinchesSpacing between stems
FirstStemLocationdoubleinchesFirst stem location
Quantityint-Number of stems (min: 1)
CenterLegsbool-Center leg positioning
StemEdgeCorner-Stem edge chamfer type
FlangeTopEdgeCorner-Top flange chamfer
FlangeBottomEdgeCorner-Bottom flange chamfer

TBeam Example

var design = await client.PullBeamDesignerAsync();

if (design.ConcreteExtents is TBeam tBeam)
{
    // Dimensional properties
    tBeam.Length = 240;
    tBeam.Width = 48;
    tBeam.Height = 24;
    tBeam.Thickness = 4;

    // Stem configuration
    tBeam.Quantity = 2;
    tBeam.StemSpacing = 24;
    tBeam.CenterLegs = true;
}

await client.PushBeamDesignerAsync("", design);

IBeam Properties

PropertyTypeUnitDescription
LengthdoubleinchesMember length
HeightdoubleinchesTotal section height
TopFlangeWidthdoubleinchesTop flange width
BottomFlangeWidthdoubleinchesBottom flange width
TopFlangeThicknessdoubleinchesTop flange thickness
BottomFlangeThicknessdoubleinchesBottom flange thickness
WebWidthdoubleinchesWeb width

Rectangular Properties

PropertyTypeUnitDescription
LengthdoubleinchesMember length
WidthdoubleinchesSection width
HeightdoubleinchesSection height

Rectangular Example

var design = await client.PullBeamDesignerAsync();

design.ConcreteExtents = new Rectangular
{
    Length = 180,
    Width = 12,
    Height = 18
};

await client.PushBeamDesignerAsync("", design);

HollowCore Properties

PropertyTypeUnitDescription
LengthdoubleinchesMember length
WidthdoubleinchesSection width
HeightdoubleinchesSection height
CoreDiameterdoubleinchesCore void diameter
CoreCountint-Number of cores

Topping Configuration

Most section types support a topping:

if (design.ConcreteExtents is TBeam tBeam)
{
    tBeam.Topping.Type = ToppingType.Profile;
    tBeam.Topping.Thickness = 2.0;  // inches
}

ToppingType Values

ValueDescription
NoneNo topping
ProfileFollows section profile
UniformUniform thickness

Complete Example

using System;
using System.Threading.Tasks;
using ErikssonBeam.API.BeamClient;
using ErikssonBeam.API.BeamDesigner;

class SectionExample
{
    static async Task DescribeSection(ErikssonBeamClient client)
    {
        var design = await client.PullBeamDesignerAsync();

        Console.WriteLine("=== Section Analysis ===\n");

        switch (design.ConcreteExtents)
        {
            case TBeam t:
                Console.WriteLine("Section Type: T-Beam");
                Console.WriteLine($"  Length: {t.Length}\"");
                Console.WriteLine($"  Width: {t.Width}\"");
                Console.WriteLine($"  Height: {t.Height}\"");
                Console.WriteLine($"  Flange Thickness: {t.Thickness}\"");
                Console.WriteLine($"  Stems: {t.Quantity}");
                Console.WriteLine($"  Stem Spacing: {t.StemSpacing}\"");

                if (t.Topping?.Type != ToppingType.None)
                {
                    Console.WriteLine($"  Topping: {t.Topping.Type}, {t.Topping.Thickness}\" thick");
                }
                break;

            case IBeam i:
                Console.WriteLine("Section Type: I-Beam");
                Console.WriteLine($"  Length: {i.Length}\"");
                Console.WriteLine($"  Height: {i.Height}\"");
                Console.WriteLine($"  Top Flange: {i.TopFlangeWidth}\" x {i.TopFlangeThickness}\"");
                Console.WriteLine($"  Bottom Flange: {i.BottomFlangeWidth}\" x {i.BottomFlangeThickness}\"");
                Console.WriteLine($"  Web Width: {i.WebWidth}\"");
                break;

            case Rectangular r:
                Console.WriteLine("Section Type: Rectangular");
                Console.WriteLine($"  Length: {r.Length}\"");
                Console.WriteLine($"  Width: {r.Width}\"");
                Console.WriteLine($"  Height: {r.Height}\"");
                break;

            case HollowCore h:
                Console.WriteLine("Section Type: Hollow Core");
                Console.WriteLine($"  Length: {h.Length}\"");
                Console.WriteLine($"  Width: {h.Width}\"");
                Console.WriteLine($"  Height: {h.Height}\"");
                Console.WriteLine($"  Cores: {h.CoreCount} x {h.CoreDiameter}\" diameter");
                break;

            case null:
                Console.WriteLine("No section defined");
                break;

            default:
                Console.WriteLine($"Section Type: {design.ConcreteExtents.GetType().Name}");
                break;
        }
    }
}

See Also