BIM Link Example Define Cross Section Factory - idea-statica/ideastatica-public GitHub Wiki

The Cross-Section Factory is responsible for Creating the correct associated Cross-sections based on the base application section input.

Below is the code for the CrossSectionFactory.cs

using Dlubal.RSTAB6;
using Dlubal.RSTAB8;
using IdeaRS.OpenModel.CrossSection;
using IdeaRstabPlugin.BimApi;
using IdeaRstabPlugin.Factories.RstabPluginUtils;
using IdeaStatiCa.BimApi;
using System;
using System.Collections.Generic;
using System.Globalization;

using IOM = IdeaRS.OpenModel.CrossSection;

using PM = IdeaRstabPlugin.Factories.RstabParamName;

namespace IdeaRstabPlugin.Factories
{
    /// <summary>
    /// Factory class for <see cref="IIdeaCrossSection"/>.
    /// </summary>
    internal class CrossSectionFactory : IFactory<Dlubal.RSTAB8.ICrossSection, IIdeaCrossSection>
    {
        private const DB_CRSC_PROPERTY_ID CssDbPropertyType = (DB_CRSC_PROPERTY_ID)189;

        /// <summary>
        /// Creates <see cref="IIdeaCrossSection"/> instance from a given <see cref="ICrossSection"/>
        /// </summary>
        /// <param name="objectFactory">IObjectFactory instance</param>
        /// <param name="importSession"></param>
        /// <returns>IIdeaCrossSection instance</returns>
        /// <exception cref="ArgumentOutOfRangeException">Thrown in case of incomplete data in RSTAB TextId property</exception>
        /// <param name="css">RSTAB cross-section</param>

        public IIdeaCrossSection Create(IObjectFactory objectFactory, IImportSession importSession, Dlubal.RSTAB8.ICrossSection css)
        {
            Dlubal.RSTAB8.CrossSection cssData = css.GetData();

            string[] cssDataTextIdSeparated = cssData.TextID.Split(' ');

            // Cross section type name
            string cssType = cssDataTextIdSeparated[0];

            // Argument out of range guard
            if (cssDataTextIdSeparated.Length == 1)
            {
                throw new ArgumentOutOfRangeException();
            }

            IList<double> parameters = GetArrayParams(cssDataTextIdSeparated[1]);

            // Mapping RSTAB parameters
            RstabParamsMap pm = MapRstabParams(parameters);

            var crossSectionParameter = new CrossSectionParameter();

            switch (cssType)
            {
                case "Rechteck":
                    IOM.CrossSectionFactory.FillRectangle(crossSectionParameter, pm.Get(PM.B), pm.Get(PM.H));
                    break;

                case "Kreis":
                case "RD":
                    IOM.CrossSectionFactory.FillCircle(crossSectionParameter, pm.Get(PM.D));
                    break;

                case "Rundstahl":
                    IOM.CrossSectionFactory.FillCircle(crossSectionParameter, pm.Get(PM.D) * 1000.0);
                    break;

                case "PB":
                    IOM.CrossSectionFactory.FillShapeTrev(crossSectionParameter, pm.Get(PM.B), pm.Get(PM.H), pm.Get(PM.Hf), pm.Get(PM.Bw));
                    break;

                case "UZ":
                    IOM.CrossSectionFactory.FillShapeT(crossSectionParameter, pm.Get(PM.B), pm.Get(PM.H), pm.Get(PM.Hf), pm.Get(PM.Bw));
                    break;

                case "ITU":
                    IOM.CrossSectionFactory.FillShapeI(crossSectionParameter, pm.Get(PM.H), pm.Get(PM.Btf), pm.Get(PM.Bbf), pm.Get(PM.Htf), pm.Get(PM.Hbf), pm.Get(PM.Tw));
                    break;

                case "ITS":
                    IOM.CrossSectionFactory.FillShapeI(crossSectionParameter, pm.Get(PM.H), pm.Get(PM.Btf), pm.Get(PM.Bbf), pm.Get(PM.Htf), pm.Get(PM.Hbf), pm.Get(PM.Tw));
                    break;

                case "SBD":
                    IOM.CrossSectionFactory.FillShapeIBase(crossSectionParameter, pm.Get(PM.H), pm.Get(PM.Btf), pm.Get(PM.Bbf), pm.Get(PM.Htf), pm.Get(PM.Hbf), pm.Get(PM.Tw), pm.Get(7) - pm.Get(6), pm.Get(3) - pm.Get(2));
                    break;

                case "SBE":
                    IOM.CrossSectionFactory.FillShapeTrev1(crossSectionParameter, pm.Get(PM.B), pm.Get(PM.H), pm.Get(PM.Hf), pm.Get(PM.Bw), pm.Get(3) - pm.Get(2));
                    break;

                case "SB":
                    IOM.CrossSectionFactory.FillShapeTrapezoid1(crossSectionParameter, pm.Get(PM.H), pm.Get(PM.Bt), pm.Get(PM.Bb));
                    break;

                case "UM":
                    IOM.CrossSectionFactory.FillShapeTT(crossSectionParameter, pm.Get(PM.B), pm.Get(PM.H), pm.Get(PM.Hf), pm.Get(PM.Bw), pm.Get(PM.B) - pm.Get(PM.Bw) - pm.Get(PM.Bw));
                    break;

                case "Ring":
                    IOM.CrossSectionFactory.FillOHollow(crossSectionParameter, pm.Get(PM.R) * 0.5, pm.Get(PM.T));
                    break;

                case "HK":
                    IOM.CrossSectionFactory.FillCssRectangleHollow(crossSectionParameter, pm.Get(PM.B), pm.Get(PM.H), pm.Get(PM.Tb), pm.Get(PM.Tt), pm.Get(PM.Tl), pm.Get(PM.Tr));
                    break;

                case "FBU":
                case "PBU":
                case "UZU":
                    if ((Math.Abs(pm.Get(1)) < 1e-6) || (Math.Abs(pm.Get(2)) < 1e-6))
                    {
                        IOM.CrossSectionFactory.FillShapeL(crossSectionParameter, pm.Get(PM.H), pm.Get(1) + pm.Get(2) + pm.Get(5), pm.Get(PM.Th), pm.Get(PM.Sh));
                    }
                    else
                    {
                        IOM.CrossSectionFactory.FillGeneralShape(crossSectionParameter, pm.Get(0), pm.Get(1), pm.Get(2), pm.Get(3), pm.Get(4), pm.Get(5));
                    }
                    break;

                case "IS":
                    CssHelperFactory.FillCssIw(crossSectionParameter, css);
                    break;

                case "IU":
                    CssHelperFactory.FillCssIwn(crossSectionParameter, css);
                    break;

                case "Kasten(A)":
                case "Kasten(B)":
                    CssHelperFactory.FillCssBoxFl(crossSectionParameter, css);
                    break;

                case "TS":
                    CssHelperFactory.CreateWeldedT(crossSectionParameter, css);
                    break;

                case "I":
                    CssHelperFactory.FillCssI(crossSectionParameter, css);
                    break;

                case "U":
                    CssHelperFactory.FillCssU(crossSectionParameter, css);
                    break;

                case "L":
                    CssHelperFactory.FillCssL(crossSectionParameter, css);
                    break;

                case "RHS":
                    CssHelperFactory.FillCssRHS(crossSectionParameter, css);
                    break;

                case "CHS":
                    CssHelperFactory.FillCssCHS(crossSectionParameter, css);
                    break;

                case "2I":
                case "2UR":
                case "2UV":
                case "2UK":
                case "2L(A)":
                case "2LA":
                case "2LB":
                case "2L(B)":
                case "2L(BA)":
                case "2L(BB)":
                case "TO":
                case "DICKQ":
                default:
                    //if (!ResolveThinwalledCssShapeV3(crossSectionParameter, css))
                    if (cssType.StartsWith("2") || !TryImportCssThinWalled(crossSectionParameter, css))
                    {
                        return CssHelperFactory.CreateCrossSectionByComponents(css, objectFactory);
                    }
                    break;
            }

            var cssParametric = new RstabCrossSectionParametric()
            {
                Id = $"css-{cssData.No}",
                Name = cssData.Description,
                Material = objectFactory.GetMaterial(cssData.MaterialNo),
                Rotation = 0,
                Type = crossSectionParameter.CrossSectionType,
                Parameters = new HashSet<Parameter>(crossSectionParameter.Parameters)
            };

            return cssParametric;
        }

        private bool TryImportCssThinWalled(CrossSectionParameter crossSectionParameter, Dlubal.RSTAB8.ICrossSection css)
        {
            IrsCrossSectionDB2 cssDB = (IrsCrossSectionDB2)css.GetDatabaseCrossSection();
            double type = cssDB.rsGetProperty((DB_CRSC_PROPERTY_ID)CssDbPropertyType);

            // basic cross-section type
            /*
             *  0.0 = Unknown type
             *  1.0 = I-Sections
             *  2.0 = Channels
             *  3.0 = T-Sections
             *  4.0 = Angles
             *  5.0 = Square and Rectangular Hollow Sections
             *  6.0 = Pipes
             *  7.0 = Z-Sections
             *  8.0 = Solid Sections
             *  9.0 = Rail Sections
             * 10.0 = Corrugated Sheets
             * 11.0 = Elliptical Hollow Sections
             * 12.0 = 60 Degree Angles
             *
             */

            switch (type)
            {
                case 1.0:
                    CssHelperFactory.FillCssI(crossSectionParameter, css);
                    break;

                case 2.0:
                    CssHelperFactory.FillCssU(crossSectionParameter, css);
                    break;

                case 4.0:
                    CssHelperFactory.FillCssL(crossSectionParameter, css);
                    break;

                case 5.0:
                    CssHelperFactory.FillCssRHS(crossSectionParameter, css);
                    break;

                case 6.0:
                    CssHelperFactory.FillCssCHS(crossSectionParameter, css);
                    break;

                default:
                    return false;
            }

            return true;
        }

        /// <summary>
        /// Method transpiled from: ^RSTABSupport.StructuralModelFromRstab.GetArrayParams(String ^strList, char separator)
        /// </summary>
        /// <param name="rstabParamData">Specific part of RSTAB TextID string</param>
        /// <returns>RSTAB cross-sections geom parameters</returns>
        private IList<double> GetArrayParams(string rstabParamData)
        {
            string[] dataSeparated = rstabParamData.Split('/');

            CultureInfo ci = new CultureInfo("en-US", false);
            NumberFormatInfo numberFormatInfo = ci.NumberFormat;
            numberFormatInfo.NumberDecimalSeparator = ".";
            numberFormatInfo.NumberGroupSeparator = "";

            IList<double> parameters = new List<double>();

            for (int i = 0; i < dataSeparated.Length; i++)
            {
                if (double.TryParse(dataSeparated[i], NumberStyles.Any, numberFormatInfo, out double param))
                {
                    param *= 0.001;
                    parameters.Add(param);
                }
            }

            return parameters;
        }

        /// <summary>
        /// Parameters mapping function
        /// </summary>
        /// <param name="parameters">List of parameters taken from RSTAB</param>
        /// <returns>RstabParamsMap instance</returns>
        private RstabParamsMap MapRstabParams(IList<double> parameters)
        {
            var rstabParamsMap = new RstabParamsMap(parameters);
            rstabParamsMap.RegisterParam(1, PM.B);
            rstabParamsMap.RegisterParam(0, PM.H);
            rstabParamsMap.RegisterParam(0, PM.D);
            rstabParamsMap.RegisterParam(2, PM.Hf);
            rstabParamsMap.RegisterParam(3, PM.Bw);
            rstabParamsMap.RegisterParam(4, PM.Btf);
            rstabParamsMap.RegisterParam(1, PM.Bbf);
            rstabParamsMap.RegisterParam(2, PM.Htf);
            rstabParamsMap.RegisterParam(5, PM.Hbf);
            rstabParamsMap.RegisterParam(3, PM.Tw);
            rstabParamsMap.RegisterParam(1, PM.Bt);
            rstabParamsMap.RegisterParam(0, PM.Bb);
            rstabParamsMap.RegisterParam(0, PM.R);
            rstabParamsMap.RegisterParam(1, PM.T);
            rstabParamsMap.RegisterParam(4, PM.Tb);
            rstabParamsMap.RegisterParam(5, PM.Tt);
            rstabParamsMap.RegisterParam(2, PM.Tl);
            rstabParamsMap.RegisterParam(3, PM.Tr);
            rstabParamsMap.RegisterParam(4, PM.Th);
            rstabParamsMap.RegisterParam(5, PM.Sh);
            rstabParamsMap.RegisterParam(6, PM.Htfh1);   //Paramter for calculating hautop = params[7] - params[6];
            rstabParamsMap.RegisterParam(7, PM.Htfh2);   //Paramter for calculating hautop = params[7] - params[6];

            return rstabParamsMap;
        }
    }
}
⚠️ **GitHub.com Fallback** ⚠️