Interpolation of results was added
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
using StructureHelperLogics.NdmCalculations.Analyses;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections
|
||||
{
|
||||
internal class CalculatorLogic : ICalculatorLogic
|
||||
{
|
||||
public IEnumerable<INdmCalculator> GetNdmCalculators()
|
||||
{
|
||||
var calculators = new List<INdmCalculator>();
|
||||
calculators.Add(new ForceCalculator() { Name = "New Force Calculator"});
|
||||
return calculators;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections
|
||||
{
|
||||
internal class ForceLogic : IForceLogic
|
||||
{
|
||||
public IEnumerable<IForceCombinationList> GetCombinationList()
|
||||
{
|
||||
var combinations = new List<IForceCombinationList>();
|
||||
var combination = new ForceCombinationList() { Name = "New Force Action"};
|
||||
combination.DesignForces.Clear();
|
||||
combination.DesignForces.AddRange(ForceCombinationListFactory.GetDesignForces(DesignForceType.Suit_1));
|
||||
combinations.Add(combination);
|
||||
return combinations;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections
|
||||
{
|
||||
internal interface ISectionGeometryLogic
|
||||
public interface ISectionGeometryLogic
|
||||
{
|
||||
IEnumerable<INdmPrimitive> GetNdmPrimitives();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using StructureHelper.Models.Materials;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
|
||||
{
|
||||
public interface IRCGeometryLogic : ISectionGeometryLogic
|
||||
{
|
||||
IEnumerable<IHeadMaterial> HeadMaterials { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using StructureHelper.Models.Materials;
|
||||
using StructureHelperCommon.Infrastructures.Settings;
|
||||
using StructureHelperLogics.Models.Materials;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
|
||||
{
|
||||
internal class MaterialLogic : IMaterialLogic
|
||||
{
|
||||
public IEnumerable<IHeadMaterial> GetHeadMaterials()
|
||||
{
|
||||
var result = new List<IHeadMaterial>();
|
||||
var concrete = HeadMaterialFactory.GetHeadMaterial(HeadmaterialType.Concrete40, ProgramSetting.CodeType);
|
||||
concrete.Name = "Concrete";
|
||||
result.Add(concrete);
|
||||
var reinforcement = HeadMaterialFactory.GetHeadMaterial(HeadmaterialType.Reinforecement400, ProgramSetting.CodeType);
|
||||
reinforcement.Name = "Reinforcement";
|
||||
result.Add(reinforcement);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
using StructureHelper.Models.Materials;
|
||||
using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperLogics.Models.Primitives;
|
||||
using StructureHelperLogics.Models.Templates.RCs;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
|
||||
{
|
||||
public class RectGeometryLogic : IRCGeometryLogic
|
||||
{
|
||||
RectangleBeamTemplate template;
|
||||
IHeadMaterial concrete => HeadMaterials.ToList()[0];
|
||||
IHeadMaterial reinforcement => HeadMaterials.ToList()[1];
|
||||
|
||||
RectangleShape rect => template.Shape as RectangleShape;
|
||||
double width => rect.Width;
|
||||
double height => rect.Height;
|
||||
double area1 => Math.PI * template.BottomDiameter * template.BottomDiameter / 4d;
|
||||
double area2 => Math.PI * template.TopDiameter * template.TopDiameter / 4d;
|
||||
double gap => template.CoverGap;
|
||||
|
||||
public IEnumerable<IHeadMaterial> HeadMaterials { get; set; }
|
||||
|
||||
public RectGeometryLogic(RectangleBeamTemplate template)
|
||||
{
|
||||
this.template = template;
|
||||
}
|
||||
|
||||
public IEnumerable<INdmPrimitive> GetNdmPrimitives()
|
||||
{
|
||||
List<INdmPrimitive> primitives = new List<INdmPrimitive>();
|
||||
primitives.AddRange(GetConcretePrimitives());
|
||||
primitives.AddRange(GetCornerReinfrocementPrimitives());
|
||||
if (template.WidthCount > 2 || template.HeightCount > 2)
|
||||
{
|
||||
primitives.AddRange(GetMiddleReinfrocementPrimitives());
|
||||
}
|
||||
return primitives;
|
||||
}
|
||||
|
||||
private IEnumerable<INdmPrimitive> GetConcretePrimitives()
|
||||
{
|
||||
List<INdmPrimitive> primitives = new List<INdmPrimitive>();
|
||||
var rectangle = new RectanglePrimitive(concrete) { Width = width, Height = height, Name = "Concrete block" };
|
||||
primitives.Add(rectangle);
|
||||
return primitives;
|
||||
}
|
||||
|
||||
private IEnumerable<INdmPrimitive> GetCornerReinfrocementPrimitives()
|
||||
{
|
||||
double[] xs = new double[] { -width / 2 + gap, width / 2 - gap };
|
||||
double[] ys = new double[] { -height / 2 + gap, height / 2 - gap };
|
||||
|
||||
List<INdmPrimitive> primitives = new List<INdmPrimitive>();
|
||||
var point = new PointPrimitive(reinforcement) { CenterX = xs[0], CenterY = ys[0], Area = area1, Name = "Left bottom point" };
|
||||
primitives.Add(point);
|
||||
point = new PointPrimitive(reinforcement) { CenterX = xs[1], CenterY = ys[0], Area = area1, Name = "Right bottom point" };
|
||||
primitives.Add(point);
|
||||
point = new PointPrimitive(reinforcement) { CenterX = xs[0], CenterY = ys[1], Area = area2, Name = "Left top point" };
|
||||
primitives.Add(point);
|
||||
point = new PointPrimitive(reinforcement) { CenterX = xs[1], CenterY = ys[1], Area = area2, Name = "Right top point" };
|
||||
primitives.Add(point);
|
||||
return primitives;
|
||||
}
|
||||
|
||||
private IEnumerable<INdmPrimitive> GetMiddleReinfrocementPrimitives()
|
||||
{
|
||||
double[] xs = new double[] { -width / 2 + gap, width / 2 - gap };
|
||||
double[] ys = new double[] { -height / 2 + gap, height / 2 - gap };
|
||||
|
||||
List<INdmPrimitive> primitives = new List<INdmPrimitive>();
|
||||
IPointPrimitive point;
|
||||
if (template.WidthCount > 2)
|
||||
{
|
||||
int count = template.WidthCount - 1;
|
||||
double dist = (xs[1] - xs[0]) / count;
|
||||
for (int i = 1; i < count; i++)
|
||||
{
|
||||
point = new PointPrimitive(reinforcement) { CenterX = xs[0] + dist * i, CenterY = ys[0], Area = area1, Name = $"Bottom point {i}" };
|
||||
primitives.Add(point);
|
||||
point = new PointPrimitive(reinforcement) { CenterX = xs[0] + dist * i, CenterY = ys[1], Area = area2, Name = $"Top point {i}" };
|
||||
primitives.Add(point);
|
||||
}
|
||||
}
|
||||
if (template.HeightCount > 2)
|
||||
{
|
||||
int count = template.HeightCount - 1;
|
||||
double dist = (ys[1] - ys[0]) / count;
|
||||
for (int i = 1; i < count; i++)
|
||||
{
|
||||
point = new PointPrimitive(reinforcement) { CenterX = xs[0], CenterY = ys[0] + dist * i, Area = area1, Name = $"Left point {i}" };
|
||||
primitives.Add(point);
|
||||
point = new PointPrimitive(reinforcement) { CenterX = xs[1], CenterY = ys[0] + dist * i, Area = area1, Name = $"Right point {i}" };
|
||||
primitives.Add(point);
|
||||
}
|
||||
}
|
||||
return primitives;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using StructureHelperCommon.Infrastructures.Interfaces;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperLogics.Models.CrossSections;
|
||||
using StructureHelperLogics.Models.Templates.RCs;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
using System;
|
||||
@@ -9,36 +10,45 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections
|
||||
namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
|
||||
{
|
||||
public class RCSectionTemplate : ICrossSectionTemplate
|
||||
public class SectionTemplate : ICrossSectionTemplate
|
||||
{
|
||||
IForceLogic forceLogic;
|
||||
IMaterialLogic materialLogic;
|
||||
ISectionGeometryLogic geometryLogic;
|
||||
IRCGeometryLogic geometryLogic;
|
||||
ICalculatorLogic calculatorLogic;
|
||||
IEnumerable<INdmPrimitive> primitives;
|
||||
IEnumerable<IForceCombinationList> combinations;
|
||||
IEnumerable<INdmCalculator> calculators;
|
||||
|
||||
public SectionTemplate(IRCGeometryLogic geometryLogic)
|
||||
{
|
||||
this.geometryLogic = geometryLogic;
|
||||
materialLogic = new MaterialLogic();
|
||||
forceLogic = new ForceLogic();
|
||||
calculatorLogic = new CalculatorLogic();
|
||||
}
|
||||
|
||||
public ICrossSection GetCrossSection()
|
||||
{
|
||||
ICrossSection section = new CrossSection();
|
||||
var repository = section.SectionRepository;
|
||||
var materials = materialLogic.GetHeadMaterials();
|
||||
geometryLogic.HeadMaterials = materials;
|
||||
primitives = geometryLogic.GetNdmPrimitives();
|
||||
repository.HeadMaterials.AddRange(materials);
|
||||
repository.Primitives.AddRange(primitives);
|
||||
combinations = forceLogic.GetCombinationList();
|
||||
repository.ForceCombinationLists.AddRange(combinations);
|
||||
calculators = calculatorLogic.GetNdmCalculators();
|
||||
ProcessCalculatorsSetForce();
|
||||
ProcessCalculatorsSetPrimitives();
|
||||
AddAllForcesToCalculators();
|
||||
AddAllPrimitivesToCalculator();
|
||||
repository.CalculatorsList.AddRange(calculators);
|
||||
return section;
|
||||
}
|
||||
|
||||
private void ProcessCalculatorsSetForce()
|
||||
private void AddAllForcesToCalculators()
|
||||
{
|
||||
foreach (var calculator in calculators)
|
||||
{
|
||||
@@ -49,7 +59,7 @@ namespace StructureHelperLogics.Models.Templates.CrossSections
|
||||
}
|
||||
}
|
||||
}
|
||||
private void ProcessCalculatorsSetPrimitives()
|
||||
private void AddAllPrimitivesToCalculator()
|
||||
{
|
||||
foreach (var calculator in calculators)
|
||||
{
|
||||
@@ -1,20 +1,16 @@
|
||||
using LoaderCalculator.Data.Matrix;
|
||||
using LoaderCalculator;
|
||||
using LoaderCalculator.Data.Matrix;
|
||||
using LoaderCalculator.Data.Ndms;
|
||||
using LoaderCalculator.Data.SourceData;
|
||||
using LoaderCalculator;
|
||||
using StructureHelperCommon.Infrastructures.Enums;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperLogics.Models.Calculations.CalculationProperties;
|
||||
using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperCommon.Services.Forces;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
using StructureHelperLogics.NdmCalculations.Triangulations;
|
||||
using StructureHelperLogics.Services.NdmPrimitives;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Text;
|
||||
using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperLogics.Services.Forces;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
|
||||
{
|
||||
@@ -126,12 +122,25 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
|
||||
catch (Exception ex)
|
||||
{
|
||||
var result = new ForcesResult() { IsValid = false };
|
||||
if (ex.Message == "") { result.Desctription = "Stiffness matrix is equal to zero"; }
|
||||
if (ex.Message == "Calculation result is not valid: stiffness matrix is equal to zero") { result.Desctription = "Stiffness matrix is equal to zero \nProbably section was collapsed"; }
|
||||
else { result.Desctription = $"Error is appeared due to analysis. Error: {ex}"; }
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
IForceCalculator calculator = new ForceCalculator();
|
||||
calculator.LimitStatesList.Clear();
|
||||
calculator.LimitStatesList.AddRange(LimitStatesList);
|
||||
calculator.CalcTermsList.Clear();
|
||||
calculator.CalcTermsList.AddRange(CalcTermsList);
|
||||
calculator.IterationAccuracy = IterationAccuracy;
|
||||
calculator.MaxIterationCount = MaxIterationCount;
|
||||
calculator.Primitives.AddRange(Primitives);
|
||||
calculator.ForceCombinationLists.AddRange(ForceCombinationLists);
|
||||
return calculator;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,12 @@
|
||||
using StructureHelperCommon.Infrastructures.Interfaces;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
|
||||
{
|
||||
public interface IForceCalculator : INdmCalculator, IHasPrimitives, IHasForceCombinations
|
||||
public interface IForceCalculator : INdmCalculator, IHasPrimitives, IHasForceCombinations, ICloneable
|
||||
{
|
||||
List<CalcTerms> CalcTermsList { get; }
|
||||
double IterationAccuracy { get; set; }
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Analyses
|
||||
{
|
||||
internal interface IExportResultLogic
|
||||
{
|
||||
void Export(INdmResult ndmResult);
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperCommon.Models.Shapes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Services.Forces
|
||||
{
|
||||
internal static class TupleService
|
||||
{
|
||||
public static IForceTuple MoveTupleIntoPoint(IForceTuple forceTuple, IPoint2D point2D)
|
||||
{
|
||||
var newTuple = forceTuple.Clone() as IForceTuple;
|
||||
newTuple.Mx += newTuple.Nz * point2D.Y;
|
||||
newTuple.My -= newTuple.Nz * point2D.X;
|
||||
return newTuple;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperCommon.Services.Forces;
|
||||
using StructureHelperLogics.Models.Primitives;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Services.NdmCalculations
|
||||
{
|
||||
public static class InterpolateService
|
||||
{
|
||||
public static IForceCalculator InterpolateForceCalculator(IForceCalculator source, IDesignForceTuple sourceTuple, int stepCount)
|
||||
{
|
||||
IForceCalculator calculator = new ForceCalculator();
|
||||
calculator.LimitStatesList.Clear();
|
||||
calculator.LimitStatesList.Add(sourceTuple.LimitState);
|
||||
calculator.CalcTermsList.Clear();
|
||||
calculator.CalcTermsList.Add(sourceTuple.CalcTerm);
|
||||
calculator.IterationAccuracy = source.IterationAccuracy;
|
||||
calculator.MaxIterationCount = source.MaxIterationCount;
|
||||
calculator.Primitives.AddRange(source.Primitives);
|
||||
calculator.ForceCombinationLists.Clear();
|
||||
var combination = new ForceCombinationList()
|
||||
{
|
||||
Name = "New combination",
|
||||
SetInGravityCenter = false
|
||||
};
|
||||
combination.DesignForces.Clear();
|
||||
combination.DesignForces.AddRange(TupleService.InterpolateDesignTuple(sourceTuple, stepCount));
|
||||
combination.ForcePoint.X = 0;
|
||||
combination.ForcePoint.Y = 0;
|
||||
calculator.ForceCombinationLists.Add(combination);
|
||||
return calculator;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,8 @@
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Infrastructures\" />
|
||||
<Folder Include="Services\CrossSections\" />
|
||||
<Folder Include="Services\Forces\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user