private static void SetFlatBarSection(StbSections sections, FemMaterial material, CroSecFamilyName familyName, ICollection <CroSec> k3dCroSecList) { if (sections.StbSecSteel.StbSecFlatBar != null) { foreach (StbSecFlatBar flatBar in sections.StbSecSteel.StbSecFlatBar) { var k3dCroSec = new CroSec_Trapezoid(familyName.FB, flatBar.name, null, null, material, flatBar.B, flatBar.t, flatBar.t); SetK3dCroSecElemId(sections, k3dCroSec, flatBar.name); k3dCroSecList.Add(k3dCroSec); } } }
private static void SetRoundBarSection(StbSections sections, FemMaterial material, CroSecFamilyName familyName, ICollection <CroSec> k3dCroSecList) { if (sections.StbSecSteel.StbSecRoundBar != null) { foreach (StbSecRoundBar roundBar in sections.StbSecSteel.StbSecRoundBar) { // TODO: Karambaは中実円断面ないため、矩形の等価断面。 double eqLength = Math.Sqrt(roundBar.R * roundBar.R * Math.PI) / 10d; var k3dCroSec = new CroSec_Trapezoid(familyName.Circle, roundBar.name, null, null, material, eqLength, eqLength, eqLength); SetK3dCroSecElemId(sections, k3dCroSec, roundBar.name); k3dCroSecList.Add(k3dCroSec); } } }
private static void SetLipCSection(StbSections sections, FemMaterial material, CroSecFamilyName familyName, ICollection <CroSec> k3dCroSecList) { if (sections.StbSecSteel.StbSecLipC != null) { foreach (StbSecLipC lipC in sections.StbSecSteel.StbSecLipC) { // TODO: 正確な形状に合わせて等価断面計算する。フィレットは非考慮 int typeFactor = lipC.type == StbSecLipCType.SINGLE ? 1 : 2; var eqLength = Math.Sqrt((2 * lipC.A * lipC.t + lipC.H * lipC.t + 2 * lipC.C * lipC.t - 4 * lipC.t * lipC.t) * typeFactor) / 10d; var k3dCroSec = new CroSec_Trapezoid(familyName.Circle, lipC.name, null, null, material, eqLength, eqLength, eqLength); SetK3dCroSecElemId(sections, k3dCroSec, lipC.name); k3dCroSecList.Add(k3dCroSec); } } }
private static void SetRollLSection(StbSections sections, FemMaterial material, CroSecFamilyName familyName, ICollection <CroSec> k3dCroSecList) { if (sections.StbSecSteel.StbSecRollL != null) { foreach (StbSecRollL rollL in sections.StbSecSteel.StbSecRollL) { // TODO: 正確な形状に合わせて等価断面計算する。フィレットは非考慮 int typeFactor = rollL.type == StbSecRollLType.SINGLE ? 1 : 2; var eqLength = Math.Sqrt((rollL.A * rollL.t1 + rollL.B * rollL.t2 - rollL.t1 * rollL.t2) * typeFactor) / 10d; var k3dCroSec = new CroSec_Trapezoid(familyName.Circle, rollL.name, null, null, material, eqLength, eqLength, eqLength); SetK3dCroSecElemId(sections, k3dCroSec, rollL.name); k3dCroSecList.Add(k3dCroSec); } } }
private static StbSecColumn_RC CreateTrapezoidColumn(int croSecId, int cNum, CroSec_Trapezoid trapezoid) { return(new StbSecColumn_RC { id = (croSecId + 1).ToString(), name = "C" + cNum, kind_column = StbSecColumn_RCKind_column.COLUMN, StbSecFigureColumn_RC = new StbSecFigureColumn_RC { Item = new StbSecColumn_RC_Rect { width_X = trapezoid.maxWidth() * 1000, width_Y = trapezoid._height * 1000 } }, }); }
private static List <CroSec> StbSecBeamRcToK3dCroSec(IEnumerable <StbSecBeam_RC> girders) { var k3dCroSecList = new List <CroSec>(); if (girders == null) { return(k3dCroSecList); } foreach (StbSecBeam_RC girder in girders) { double width, depth; FemMaterial_Isotrop material = Material.StbToRcFemMaterial(girder.strength_concrete); object[] figures = girder.StbSecFigureBeam_RC.Items; switch (figures[0]) { case StbSecBeam_RC_Straight straight: width = straight.width / 10d; depth = straight.depth / 10d; break; case StbSecBeam_RC_Taper _: StbSecBeam_RC_Taper[] tapers = { figures[0] as StbSecBeam_RC_Taper, figures[1] as StbSecBeam_RC_Taper }; width = tapers.First(figure => figure.pos == StbSecBeam_RC_TaperPos.START).width / 10d; depth = tapers.First(figure => figure.pos == StbSecBeam_RC_TaperPos.START).depth / 10d; break; case StbSecBeam_RC_Haunch _: StbSecBeam_RC_Haunch[] haunches; haunches = figures.Length == 2 ? new[] { figures[0] as StbSecBeam_RC_Haunch, figures[1] as StbSecBeam_RC_Haunch } : new[] { figures[0] as StbSecBeam_RC_Haunch, figures[1] as StbSecBeam_RC_Haunch, figures[2] as StbSecBeam_RC_Haunch }; width = haunches.First(figure => figure.pos == StbSecBeam_RC_HaunchPos.CENTER).width / 10d; depth = haunches.First(figure => figure.pos == StbSecBeam_RC_HaunchPos.CENTER).depth / 10d; break; default: throw new ArgumentException("Convert StbSecBeam_RC to karamba3d error"); } var name = $"BD-{width * 10}x{depth * 10}"; var k3dCroSec = new CroSec_Trapezoid("RcBeam", name, null, null, material, depth, width, width); k3dCroSec.AddElemId("Id" + girder.id); k3dCroSecList.Add(k3dCroSec); } return(k3dCroSecList); }
private static StbSecBeam_RC CreateTrapezoidBeam(int croSecId, int gNum, CroSec_Trapezoid trapezoid) { return(new StbSecBeam_RC { id = (croSecId + 1).ToString(), name = "G" + gNum, kind_beam = StbSecBeam_RCKind_beam.GIRDER, StbSecFigureBeam_RC = new StbSecFigureBeam_RC { Items = new object[] { new StbSecBeam_RC_Straight { depth = trapezoid._height * 1000, width = trapezoid.maxWidth() * 1000 } } }, }); }
private static List <CroSec> StbSecColumnRcToK3dCroSec(IEnumerable <StbSecColumn_RC> columns) { var k3dCroSecList = new List <CroSec>(); if (columns == null) { return(k3dCroSecList); } foreach (StbSecColumn_RC column in columns) { string name; CroSec_Beam k3dCroSec; object figure = column.StbSecFigureColumn_RC.Item; FemMaterial_Isotrop material = Material.StbToRcFemMaterial(column.strength_concrete); switch (figure) { case StbSecColumn_RC_Rect rect: double widthX = rect.width_X / 10d; double widthY = rect.width_Y / 10d; name = $"CD-{widthX * 10}x{widthY * 10}"; k3dCroSec = new CroSec_Trapezoid("RcColRect", name, null, null, material, widthX, widthY, widthY); break; case StbSecColumn_RC_Circle circle: double d = circle.D / 10d; name = $"P-{d * 10}"; k3dCroSec = new CroSec_Circle("RcColCircle", name, null, null, material, d, d / 2); break; default: throw new ArgumentException("Convert StbSecColumn_RC to karamba3d error"); } k3dCroSec.AddElemId("Id" + column.id); k3dCroSecList.Add(k3dCroSec); } return(k3dCroSecList); }