/// <summary> /// Construct longitudinal bar reinforcement /// </summary> public BarReinforcement(Bars.Bar bar, Wire wire, LongitudinalBar longBar) { this.EntityCreated(); this.BaseBar = new GuidListType(bar.BarPart.Guid); this.Wire = wire; this.LongitudinalBar = longBar; }
/// <summary> /// Construct stirrup bar reinforcement /// </summary> public BarReinforcement(Bars.Bar bar, Wire wire, Stirrups stirrups) { this.EntityCreated(); this.BaseBar = new GuidListType(bar.BarPart.Guid); this.Wire = wire; this.Stirrups = stirrups; }
/// <summary> /// Construct stirrups by start and end parameter on the bar. /// </summary> public Stirrups(Bars.Bar bar, Geometry.Region region, double startParam, double endParam, double distance) { this.Regions.Add(region); double len = bar.BarPart.Edge.Length; this.Start = startParam * len; this.End = endParam * len; this.Distance = distance; }
/// <summary> /// Construct longitudinal bar using start and end param from bar start /// </summary> /// <param name="startAnchorage">Start anchorage in meters.</param> /// <param name="endAnchorage">End anchorage in meters.</param> public LongitudinalBar(Bars.Bar bar, Geometry.FdPoint2d position, double startAnchorage, double endAnchorage, double startParam, double endParam, bool auxiliary) { this.Position2d = position; this.Anchorage = new StartEndType(startAnchorage, endAnchorage); var len = bar.BarPart.Edge.Length; this.Start = startParam * len; this.End = endParam * len; this.Auxiliary = auxiliary; }
/// <summary> /// Add reinforcement to bar. /// Internal method use by GH components and Dynamo nodes. /// </summary> /// <param name="bar"></param> /// <param name="rebar"></param> /// <param name="overwrite">Overwrite rebar on bar if a rebar sharing guid already exists on the bar?</param> public static Bars.Bar AddReinforcementToBar(Bars.Bar bar, List <BarReinforcement> rebar, bool overwrite) { // check if bar is curved if (!bar.BarPart.Edge.IsLine()) { throw new System.ArgumentException($"Bar with guid: {bar.Guid} is not straight. Reinforcement can only be added to straight bars."); } // check if bar material is concrete if (bar.BarPart.ComplexMaterialObj.Concrete == null) { throw new System.ArgumentException("Material of bar must be concrete"); } foreach (BarReinforcement item in rebar) { // empty base bar - update with current barPart guid if (item.BaseBar.Guid == Guid.Empty) { item.BaseBar.Guid = bar.BarPart.Guid; } // base bar equals current barPart guid else if (item.BaseBar.Guid == bar.BarPart.Guid) { // pass } // base bar does not equal current barPart guid - reinforcement probably added to another bar already. else if (item.BaseBar.Guid != bar.BarPart.Guid) { throw new System.ArgumentException($"{item.GetType().FullName} with guid: {item.Guid} has a base bar guid: {item.BaseBar.Guid} that does not correnspond with the current bar"); } // add reinforcement to current bar bool exists = bar.Reinforcement.Any(x => x.Guid == item.Guid); if (exists) { if (overwrite) { bar.Reinforcement.RemoveAll(x => x.Guid == item.Guid); bar.Reinforcement.Add(item); } else { throw new System.ArgumentException($"{item.GetType().FullName} with guid: {item.Guid} has already been added to the bar. Are you adding the same element twice?"); } } else { bar.Reinforcement.Add(item); } } return(bar); }
public static Bars.Bar AddToBar(Bars.Bar bar, List <Reinforcement.BarReinforcement> barReinforcement, [DefaultArgument("true")] bool overwrite) { // clone bar var clone = bar.DeepClone(); // clone reinforcement var reinfClone = barReinforcement.Select(x => x.DeepClone()).ToList(); // add reinforcement Bars.Bar obj = Reinforcement.BarReinforcement.AddReinforcementToBar(clone, reinfClone, overwrite); return(obj); }
/// <summary> /// Construct post-tension cable /// </summary> /// <param name="bar">Reference bar element</param> /// <param name="shape"></param> /// <param name="losses"></param> /// <param name="manufacturing"></param> /// <param name="strand"></param> /// <param name="numberOfStrands"></param> /// <param name="identifier"></param> public Ptc(Bars.Bar bar, PtcShapeType shape, PtcLosses losses, PtcManufacturingType manufacturing, PtcStrandLibType strand, JackingSide jackingSide, double jackingStress, int numberOfStrands = 3, string identifier = "PTC") { if (bar.BarPart.Edge.Type == "line") { var start = bar.BarPart.Edge.Points[0]; var end = bar.BarPart.Edge.Points[1]; Initialize(start, end, bar.BarPart.Guid, shape, losses, manufacturing, strand, jackingSide, jackingStress, numberOfStrands, identifier); } else { throw new ArgumentException($"Bar must be of type line but got '{bar.BarPart.Edge.Type}'", "bar"); } }
static void Main() { // PRACTICAL EXAMPLE: CHANGE LENGTH OF BEAM // this simple example will show you how to edit the length of a beam from within a C# script. // This example was last updated 2022-05-03, using the ver. 21.1.0 FEM-Design API. // FILE PATH SETUP // Find the file you want to edit, and prepare a path for the edited file string struxmlPath = "example_beam.struxml"; string struxmlPathOut = "output/example_beam_new_length.struxml"; if (!Directory.Exists("output")) { Directory.CreateDirectory("output"); } // READ FILE Model model = Model.DeserializeFromFilePath(struxmlPath); // EDIT BEAM // Get the first beam (index 0) and update the coordinate of the beam endpoint Bars.Bar exbeam = model.Entities.Bars[0]; exbeam.BarPart.Edge.Points[1].X = 35; // EDIT SUPPORT // Update the position of the support to the same new coordinate Supports.PointSupport support = model.Entities.Supports.PointSupport[1]; support.Position.X = 35; // SAVE THE MODEL AS A NEW FILE model.SerializeModel(struxmlPathOut); // ENDING THE PROGRAM Console.WriteLine($"Saved an updated struxml file at path bin/debug/{struxmlPathOut}"); Console.WriteLine("\nPress any key to close console."); Console.ReadKey(); }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { Bars.Bar bar = null; PtcShapeType shape = null; PtcLosses losses = null; PtcManufacturingType manufacturing = null; PtcStrandLibType strandData = null; string jackingSide = "start"; double jackingStress = 200.0; int numberOfStrands = 3; string identifier = "PTC"; DA.GetData("Bar", ref bar); DA.GetData("Shape", ref shape); DA.GetData("Losses", ref losses); DA.GetData("Manufacturing", ref manufacturing); DA.GetData("StrandData", ref strandData); DA.GetData("JackingSide", ref jackingSide); DA.GetData("JackingStress", ref jackingStress); DA.GetData("NumberOfStrands", ref numberOfStrands); DA.GetData("Identifier", ref identifier); if (bar == null || shape == null || losses == null || manufacturing == null || strandData == null) { return; } JackingSide side = GenericClasses.EnumParser.Parse <JackingSide>(jackingSide); var ptc = new Ptc(bar, shape, losses, manufacturing, strandData, side, jackingStress, numberOfStrands, identifier); // add to bar var clone = bar.DeepClone(); clone.Ptc.Add(ptc); DA.SetData("Bar", clone); }
static void Main() { // EXAMPLE 4: EDITING AN EXISTING MODEL // In this example, we will edit an existing model by isolating a floor and replacing supporting // walls and pillars with appropriate supports. Using height as a point of comparison we can find // which elements to reuse from the old model, and create a new model with our selected elements. // This example was last updated 2022-04-13, using the ver. 21.1.0 FEM-Design API. // READ THE MODEL: // Deserialize the current model to access all the data in the .struxml file. FemDesign.Model model = FemDesign.Model.DeserializeFromFilePath("Example 4 - model.struxml"); // ISOLATE A FLOOR: // Choose which floor will be singled out. int floor = 3; FemDesign.StructureGrid.Storey storey = model.Entities.Storeys.Storey[floor]; List <GenericClasses.IStructureElement> storeyAsList = new List <GenericClasses.IStructureElement> { storey }; double zCoord = storey.Origo.Z; // POINT SUPPORTS: // Find all pillars supporting the chosen floor, and place point supports in their place. // We can use the fact that point [1] of any pillar is always the highest one. var supports = new List <GenericClasses.ISupportElement>(); for (int i = 0; i < model.Entities.Bars.Count; i++) { Bars.Bar tempBar = model.Entities.Bars[i]; if (tempBar.BarPart.Type != Bars.BarType.Column) { continue; } if (Math.Abs(tempBar.BarPart.Edge.Points[1].Z - zCoord) < Tolerance.LengthComparison) { var tempSupport = new Supports.PointSupport( point: new Geometry.FdPoint3d(tempBar.BarPart.Edge.Points[1].X, tempBar.BarPart.Edge.Points[1].Y, zCoord), motions: Releases.Motions.RigidPoint(), rotations: Releases.Rotations.Free() ); supports.Add(tempSupport); } } // ELEMENTS: // The model only contains plates and walls, so we will not be looking for beams etc. // We are looking for the floor plate at the right height, and the walls below it to // replace them with line supports. var elements = new List <GenericClasses.IStructureElement>(); // TESTING SLABS: // Slabs have a property which indicates if they are floors (plate) or walls (wall). // Based on this, we can sort out if we want to use them as an element or place a // line support in their stead. for (int i = 0; i < model.Entities.Slabs.Count; i++) { Shells.Slab tempSlab = model.Entities.Slabs[i]; if (tempSlab.Type == Shells.SlabType.Plate && Math.Abs(tempSlab.SlabPart.LocalPos.Z - zCoord) < Tolerance.LengthComparison) { elements.Add(tempSlab); } else if (tempSlab.Type == Shells.SlabType.Wall) { if (Math.Abs(tempSlab.SlabPart.Region.Contours[0].Edges[2].Points[0].Z - zCoord) < Tolerance.LengthComparison) { // Creating supports with translational stiffnes in the Z direction only. var tempSupport = new Supports.LineSupport( edge: tempSlab.SlabPart.Region.Contours[0].Edges[2], motions: new Releases.Motions(0, 0, 0, 0, 10E7, 10E7), rotations: new Releases.Rotations(0, 0, 0, 0, 0, 0), movingLocal: true ); supports.Add(tempSupport); } } } // TESTING PANELS: // Panels do not have the same property as slabs. Instead, we compare the height of all the // edge curves of the panel to discern if it is horizontal or not. for (int i = 0; i < model.Entities.Panels.Count; i++) { Shells.Panel tempPanel = model.Entities.Panels[i]; bool isSlab = true; for (int j = 0; j < tempPanel.Region.Contours[0].Edges.Count; j++) { if (tempPanel.Region.Contours[0].Edges[j].Points[0].Z != tempPanel.Region.Contours[0].Edges[j].Points[1].Z) { isSlab = false; break; } } if (isSlab && Math.Abs(tempPanel.Region.Contours[0].Edges[0].Points[0].Z - zCoord) < Tolerance.LengthComparison) { elements.Add(tempPanel); } else if (!isSlab && Math.Abs(tempPanel.Region.Contours[0].Edges[2].Points[0].Z - zCoord) < Tolerance.LengthComparison) { // Creating supports with translational stiffnes in the Z direction only. var tempSupport = new Supports.LineSupport( edge: tempPanel.Region.Contours[0].Edges[2], motions: new Releases.Motions(0, 0, 0, 0, 10E7, 10E7), rotations: new Releases.Rotations(0, 0, 0, 0, 0, 0), movingLocal: true ); supports.Add(tempSupport); } } // LOADS: // Similar to supports and elements, we will reuse loads from the model if they are on the correct height var loads = new List <GenericClasses.ILoadElement>(); for (int i = 0; i < model.Entities.Loads.LineLoads.Count; i++) { if (Math.Abs(model.Entities.Loads.LineLoads[i].Edge.XAxis.Z - zCoord) < Tolerance.LengthComparison) { loads.Add(model.Entities.Loads.LineLoads[i]); } } for (int i = 0; i < model.Entities.Loads.SurfaceLoads.Count; i++) { Loads.SurfaceLoad tempLoad = model.Entities.Loads.SurfaceLoads[i]; if (Math.Abs(tempLoad.Region.Contours[0].Edges[0].Points[0].Z - zCoord) < Tolerance.LengthComparison) { loads.Add(tempLoad); } } // CREATE NEW MODEL: // With a new model, we can add all our gathered elements to it. We can also take load cases, // load combinations, and the storey marker directly from the old model. FemDesign.Model newModel = new FemDesign.Model(Country.S); newModel.AddElements(elements); newModel.AddSupports(supports); newModel.AddLoads(loads); newModel.AddLoadCases(model.Entities.Loads.LoadCases); newModel.AddLoadCombinations(model.Entities.Loads.LoadCombinations); newModel.AddElements(storeyAsList); // SAVE AND RUN: // Create a file path for the new model, serialize it, and run the script! string path = Path.GetFullPath("output/edited_model.struxml"); if (!Directory.Exists("output")) { Directory.CreateDirectory("output"); } newModel.SerializeModel(path); Console.WriteLine($"Opening file at {path}"); var app = new Calculate.Application(); app.OpenStruxml(path, false); }
/// <summary> /// Create Rhino curve from underlying Edge (Line or Arc) of Bar. /// </summary> internal static Rhino.Geometry.Curve GetRhinoCurve(this Bars.Bar bar) { return(bar.BarPart._edge.ToRhino()); }
protected override void SolveInstance(IGH_DataAccess DA) { // get input Bars.Bar bar = null; if (DA.GetData(0, ref bar)) { if (bar.BarPart.HasComplexCompositeRef || bar.BarPart.HasDeltaBeamComplexSectionRef) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "The bar has a Composite Section. The object has not been implemented yet. Please, get in touch if needed."); return; } bar = bar.DeepClone(); } bool newGuid = false; if (DA.GetData(1, ref newGuid)) { if (newGuid) { bar.EntityCreated(); bar.BarPart.EntityCreated(); } } Curve curve = null; if (DA.GetData(2, ref curve)) { // convert geometry FemDesign.Geometry.Edge edge = Convert.FromRhinoLineOrArc2(curve); // update edge bar.BarPart.Edge = edge; } FemDesign.Materials.Material material = null; if (DA.GetData(3, ref material)) { bar.BarPart.ComplexMaterialObj = material; } List <FemDesign.Sections.Section> sections = new List <Sections.Section>(); if (DA.GetDataList(4, sections)) { bar.BarPart.ComplexSectionObj.Sections = sections.ToArray(); } List <FemDesign.Bars.Connectivity> connectivities = new List <Bars.Connectivity>(); if (DA.GetDataList(5, connectivities)) { bar.BarPart.Connectivity = connectivities.ToArray(); } List <FemDesign.Bars.Eccentricity> eccentricities = new List <Bars.Eccentricity>(); if (DA.GetDataList(6, eccentricities)) { if (bar.Type != Bars.BarType.Truss) { bar.BarPart.ComplexSectionObj.Eccentricities = eccentricities.ToArray(); } } Vector3d v = Vector3d.Zero; if (DA.GetData(7, ref v)) { bar.BarPart.LocalY = v.FromRhino(); } bool orientLCS = true; if (DA.GetData(8, ref orientLCS)) { bar.BarPart.OrientCoordinateSystemToGCS(); } string identifier = null; if (DA.GetData(9, ref identifier)) { bar.Identifier = identifier; bar.BarPart.Identifier = bar.Identifier; } // output DA.SetData(0, bar); }
static void Main() { // EXAMPLE 9: READ RESULTS // This example will show you how to model a simple supported beam, // and read some of the results. // This example was last updated 2022-07-01, using the ver. 21.2.0 FEM-Design API. #region DEFINE GEOMETRY // Define geometry var p1 = new Geometry.FdPoint3d(2.0, 2.0, 0); var p2 = new Geometry.FdPoint3d(10, 2.0, 0); var mid = p1 + (p2 - p1) * 0.5; // Create elements var edge = new Geometry.Edge(p1, p2, Geometry.FdVector3d.UnitZ()); Materials.MaterialDatabase materialsDB = Materials.MaterialDatabase.DeserializeStruxml("materials.struxml"); Sections.SectionDatabase sectionsDB = Sections.SectionDatabase.DeserializeStruxml("sections.struxml"); var material = materialsDB.MaterialByName("C35/45"); var section = sectionsDB.SectionByName("Concrete sections, Rectangle, 300x900"); var bar = new Bars.Bar( edge, Bars.BarType.Beam, material, sections: new Sections.Section[] { section }, connectivities: new Bars.Connectivity[] { Bars.Connectivity.GetRigid() }, eccentricities: new Bars.Eccentricity[] { Bars.Eccentricity.GetDefault() }, identifier: "B"); bar.BarPart.LocalY = Geometry.FdVector3d.UnitY(); var elements = new List <GenericClasses.IStructureElement>() { bar }; #endregion #region DEFINE SUPPORTS // Create supports var s1 = new Supports.PointSupport( point: p1, motions: Releases.Motions.RigidPoint(), rotations: Releases.Rotations.Free() ); var s2 = new Supports.PointSupport( point: p2, motions: new Releases.Motions(yNeg: 1e10, yPos: 1e10, zNeg: 1e10, zPos: 1e10), rotations: Releases.Rotations.Free() ); var supports = new List <GenericClasses.ISupportElement>() { s1, s2 }; #endregion #region DEFINE LOAD CASES/COMBINATIONS // Create load cases var deadload = new Loads.LoadCase("Deadload", Loads.LoadCaseType.DeadLoad, Loads.LoadCaseDuration.Permanent); var liveload = new Loads.LoadCase("Liveload", Loads.LoadCaseType.Static, Loads.LoadCaseDuration.Permanent); var loadcases = new List <Loads.LoadCase>() { deadload, liveload }; // Create load combinations var slsFactors = new List <double>() { 1.0, 1.0 }; var SLS = new Loads.LoadCombination("SLS", Loads.LoadCombType.ServiceabilityCharacteristic, loadcases, slsFactors); var ulsFactors = new List <double>() { 1.35, 1.5 }; var ULS = new Loads.LoadCombination("ULS", Loads.LoadCombType.UltimateOrdinary, loadcases, ulsFactors); var loadCombinations = new List <Loads.LoadCombination>() { SLS, ULS }; // Create loads var pointForce = new Loads.PointLoad(mid, new Geometry.FdVector3d(0.0, 0.0, -5.0), liveload, null, Loads.ForceLoadType.Force); var pointMoment = new Loads.PointLoad(p2, new Geometry.FdVector3d(0.0, 5.0, 0.0), liveload, null, Loads.ForceLoadType.Moment); var lineLoadStart = new Geometry.FdVector3d(0.0, 0.0, -2.0); var lineLoadEnd = new Geometry.FdVector3d(0.0, 0.0, -4.0); var lineLoad = new Loads.LineLoad(edge, lineLoadStart, lineLoadEnd, liveload, Loads.ForceLoadType.Force, "", constLoadDir: true, loadProjection: true); var loads = new List <GenericClasses.ILoadElement>() { pointForce, pointMoment, lineLoad }; #endregion #region ASSEMBLE // Add to model Model model = new Model(Country.S); model.AddElements(elements); model.AddSupports(supports); model.AddLoadCases(loadcases); model.AddLoadCombinations(loadCombinations); model.AddLoads(loads); #endregion #region SETTINGS // define the file name string fileName = "SimpleBeam.struxml"; fileName = Path.GetFullPath(fileName); // Define the Units // it is an optional operation and it can be omitted // Default Units can be seen looking at FemDesign.Results.UnitResults.Default() var units = new FemDesign.Results.UnitResults(Results.Length.m, Results.Angle.deg, Results.SectionalData.mm, Results.Force.daN, Results.Mass.kg, Results.Displacement.cm, Results.Stress.MPa); // Select the results to extract var resultTypes = new List <Results.ResultType> { Results.ResultType.PointSupportReaction, Results.ResultType.NodalDisplacement }; var bscPathsFromResultTypes = Calculate.Bsc.BscPathFromResultTypes(resultTypes, fileName, units); #endregion #region ANALYSIS // Running the analysis FemDesign.Calculate.Analysis analysisSettings = new FemDesign.Calculate.Analysis(null, null, null, null, calcCase: true, false, false, calcComb: true, false, false, false, false, false, false, false, false, false); var fdScript = FemDesign.Calculate.FdScript.Analysis(fileName, analysisSettings, bscPathsFromResultTypes, null, true); var app = new FemDesign.Calculate.Application(); app.RunFdScript(fdScript, false, true); model.SerializeModel(fileName); // Read model and results model = Model.DeserializeFromFilePath(fdScript.StruxmlPath); #endregion #region EXTRACT RESULTS IEnumerable <Results.IResult> results = Enumerable.Empty <Results.IResult>(); foreach (var cmd in fdScript.CmdListGen) { string path = cmd.OutFile; var _results = Results.ResultsReader.Parse(path); results = results.Concat(_results); } #endregion #region DO SOMETHING WITH RESULTS // Display Results on Screen // The results are grouped by their type var resultGroups = results.GroupBy(t => t.GetType()).ToList(); foreach (var resultGroup in resultGroups) { Console.WriteLine(resultGroup.Key.Name); Console.WriteLine(); foreach (var result in resultGroup) { Console.WriteLine(result); } Console.WriteLine(); Console.WriteLine(); } // Select a specific result Console.WriteLine("Vertical Reaction Forces"); var zReactions = results.Where(t => t.GetType() == typeof(Results.PointSupportReaction)).Cast <Results.PointSupportReaction>(); foreach (var zReaction in zReactions) { Console.WriteLine($"Node {zReaction.Id}: {zReaction.Fz} {units.Force}"); } #endregion // ENDING THE PROGRAM Console.WriteLine("\nPress any key to close console."); Console.ReadKey(); }
static void Main() { // PRACTICAL EXAMPLE: CREATE POST-TENSIONED CABLES // This example will show you how to add post-tensioned cables to your concrete beam. // This example was last updated 2022-05-03, using the ver. 21.1.0 FEM-Design API. // DEFINE GEOMETRY var p1 = new Geometry.FdPoint3d(0.0, 2.0, 0); var p2 = new Geometry.FdPoint3d(10, 2.0, 0); var edge = new Geometry.Edge(p1, p2, Geometry.FdVector3d.UnitY()); // CREATE BEAM Materials.MaterialDatabase materialsDB = Materials.MaterialDatabase.DeserializeStruxml("materials.struxml"); Sections.SectionDatabase sectionsDB = Sections.SectionDatabase.DeserializeStruxml("sections.struxml"); var material = materialsDB.MaterialByName("C35/45"); var section = sectionsDB.SectionByName("Concrete sections, Rectangle, 300x900"); var bar = new Bars.Bar( edge, Bars.BarType.Beam, material, sections: new Sections.Section[] { section }, connectivities: new Bars.Connectivity[] { Bars.Connectivity.GetRigid() }, eccentricities: new Bars.Eccentricity[] { Bars.Eccentricity.GetDefault() }, identifier: "B"); // CREATE POST-TENSIONED CABLE var shape = new Reinforcement.PtcShapeType( start: new Reinforcement.PtcShapeStart(0.0, 0.0), intermediates: new List <Reinforcement.PtcShapeInner>() { new Reinforcement.PtcShapeInner(0.4, -0.20, 0.0, 0.1), new Reinforcement.PtcShapeInner(0.6, -0.20, 0.0), }, end: new Reinforcement.PtcShapeEnd(0.0, 0.0, 0.9) ); var losses = new Reinforcement.PtcLosses( curvatureCoefficient: 0.05, wobbleCoefficient: 0.007, anchorageSetSlip: 0.0, elasticShortening: 0.0, creepStress: 0.0, shrinkageStress: 0.0, relaxationStress: 0.0); var manufacturing = new Reinforcement.PtcManufacturingType( positions: new List <double>() { 0.3, 0.7 }, shiftX: 0.0, shiftZ: 0.1); var strandData = new Reinforcement.PtcStrandLibType( name: "Custom ptc material", f_pk: 1860.0, a_p: 150.0, e_p: 195000.0, rho: 7.810, relaxationClass: 2, rho_1000: 0.1); var ptc = new Reinforcement.Ptc( bar, shape, losses, manufacturing, strandData, jackingSide: Reinforcement.JackingSide.Start, jackingStress: 1000.0, numberOfStrands: 3, identifier: "PTC"); var elements = new List <GenericClasses.IStructureElement>() { bar, ptc }; // CREATE AND OPEN MODEL Model model = new Model(Country.S, elements); string path = "output/post_tensioned_cable.struxml"; if (!Directory.Exists("output")) { Directory.CreateDirectory("output"); } model.SerializeModel(path); var app = new Calculate.Application(); app.OpenStruxml(Path.GetFullPath(path), false); }
static void Main() { // EXAMPLE 1: CREATING A SIMPLE BEAM // This example will show you how to model a simple supported beam, // and how to save it for export to FEM-Design.Before running, // make sure you have a window with FEM-Design open. // This example was last updated 2022-04-27, using the ver. 21.1.0 FEM-Design API. // Define geometry var p1 = new Geometry.FdPoint3d(2.0, 2.0, 0); var p2 = new Geometry.FdPoint3d(10, 2.0, 0); var mid = p1 + (p2 - p1) * 0.5; // Create elements var edge = new Geometry.Edge(p1, p2, Geometry.FdVector3d.UnitZ()); Materials.MaterialDatabase materialsDB = Materials.MaterialDatabase.DeserializeStruxml("materials.struxml"); Sections.SectionDatabase sectionsDB = Sections.SectionDatabase.DeserializeStruxml("sections.struxml"); var material = materialsDB.MaterialByName("C35/45"); var section = sectionsDB.SectionByName("Concrete sections, Rectangle, 300x900"); var bar = new Bars.Bar( edge, Bars.BarType.Beam, material, sections: new Sections.Section[] { section }, connectivities: new Bars.Connectivity[] { Bars.Connectivity.GetRigid() }, eccentricities: new Bars.Eccentricity[] { Bars.Eccentricity.GetDefault() }, identifier: "B"); bar.BarPart.LocalY = Geometry.FdVector3d.UnitY(); var elements = new List <GenericClasses.IStructureElement>() { bar }; // Create supports var s1 = new Supports.PointSupport( point: p1, motions: Releases.Motions.RigidPoint(), rotations: Releases.Rotations.Free() ); var s2 = new Supports.PointSupport( point: p2, motions: new Releases.Motions(yNeg: 1e10, yPos: 1e10, zNeg: 1e10, zPos: 1e10), rotations: Releases.Rotations.Free() ); var supports = new List <GenericClasses.ISupportElement>() { s1, s2 }; // Create load cases var deadload = new Loads.LoadCase("Deadload", Loads.LoadCaseType.DeadLoad, Loads.LoadCaseDuration.Permanent); var liveload = new Loads.LoadCase("Liveload", Loads.LoadCaseType.Static, Loads.LoadCaseDuration.Permanent); var loadcases = new List <Loads.LoadCase>() { deadload, liveload }; // Create load combinations var slsFactors = new List <double>() { 1.0, 1.0 }; var SLS = new Loads.LoadCombination("SLS", Loads.LoadCombType.ServiceabilityCharacteristic, loadcases, slsFactors); var ulsFactors = new List <double>() { 1.35, 1.5 }; var ULS = new Loads.LoadCombination("ULS", Loads.LoadCombType.UltimateOrdinary, loadcases, ulsFactors); var loadCombinations = new List <Loads.LoadCombination>() { SLS, ULS }; // Create loads var pointForce = new Loads.PointLoad(mid, new Geometry.FdVector3d(0.0, 0.0, -5.0), liveload, null, Loads.ForceLoadType.Force); var pointMoment = new Loads.PointLoad(p2, new Geometry.FdVector3d(0.0, 5.0, 0.0), liveload, null, Loads.ForceLoadType.Moment); var lineLoadStart = new Geometry.FdVector3d(0.0, 0.0, -2.0); var lineLoadEnd = new Geometry.FdVector3d(0.0, 0.0, -4.0); var lineLoad = new Loads.LineLoad(edge, lineLoadStart, lineLoadEnd, liveload, Loads.ForceLoadType.Force, "", constLoadDir: true, loadProjection: true); var loads = new List <GenericClasses.ILoadElement>() { pointForce, pointMoment, lineLoad }; // Add to model Model model = new Model(Country.S); model.AddElements(elements); model.AddSupports(supports); model.AddLoadCases(loadcases); model.AddLoadCombinations(loadCombinations); model.AddLoads(loads); // Save model then open in FEM-Design string path = System.IO.Path.GetFullPath("simple_model.struxml"); model.SerializeModel(path); var app = new Calculate.Application(); app.OpenStruxml(path, true); }