CrackedCalculator and TriangulationLogic were changed

This commit is contained in:
Evgeny Redikultsev
2024-05-05 16:39:02 +05:00
parent f158ba3336
commit e75521dc20
34 changed files with 645 additions and 125 deletions

View File

@@ -22,6 +22,8 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews
internal class CrackDiagramLogic : ILongProcessLogic internal class CrackDiagramLogic : ILongProcessLogic
{ {
static readonly CrackForceCalculator calculator = new(); static readonly CrackForceCalculator calculator = new();
private ITriangulatePrimitiveLogic triangulateLogic;
private List<IForcesTupleResult> ValidTupleList { get; set; } private List<IForcesTupleResult> ValidTupleList { get; set; }
ArrayParameter<double> arrayParameter; ArrayParameter<double> arrayParameter;
private IEnumerable<IForcesTupleResult> TupleList { get; set; } private IEnumerable<IForcesTupleResult> TupleList { get; set; }
@@ -102,7 +104,14 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews
calculator.EndTuple = validTupleList[i].DesignForceTuple.ForceTuple; calculator.EndTuple = validTupleList[i].DesignForceTuple.ForceTuple;
var limitState = validTupleList[i].DesignForceTuple.LimitState; var limitState = validTupleList[i].DesignForceTuple.LimitState;
var calcTerm = validTupleList[i].DesignForceTuple.CalcTerm; var calcTerm = validTupleList[i].DesignForceTuple.CalcTerm;
var ndms = NdmPrimitivesService.GetNdms(ndmPrimitives, limitState, calcTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = ndmPrimitives,
LimitState = limitState,
CalcTerm = calcTerm,
TraceLogger = TraceLogger
};
var ndms = triangulateLogic.GetNdms();
calculator.NdmCollection = ndms; calculator.NdmCollection = ndms;
calculator.Run(); calculator.Run();
var result = (CrackForceResult)calculator.Result; var result = (CrackForceResult)calculator.Result;

View File

@@ -18,6 +18,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
internal class ShowCrackResultLogic internal class ShowCrackResultLogic
{ {
private CrackForceCalculator calculator; private CrackForceCalculator calculator;
private ITriangulatePrimitiveLogic triangulateLogic;
public static GeometryNames GeometryNames => ProgramSetting.GeometryNames; public static GeometryNames GeometryNames => ProgramSetting.GeometryNames;
public LimitStates LimitState { get; set; } public LimitStates LimitState { get; set; }
@@ -42,7 +43,13 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
calculator.TraceLogger = new ShiftTraceLogger(); calculator.TraceLogger = new ShiftTraceLogger();
calculator.StartTuple = startDesignTuple; calculator.StartTuple = startDesignTuple;
calculator.EndTuple = finishDesignTuple; calculator.EndTuple = finishDesignTuple;
calculator.NdmCollection = NdmPrimitivesService.GetNdms(ndmPrimitives, LimitState, CalcTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = ndmPrimitives,
LimitState = LimitState,
CalcTerm = CalcTerm
};
calculator.NdmCollection = triangulateLogic.GetNdms();
calculator.Run(); calculator.Run();
var result = (CrackForceResult)calculator.Result; var result = (CrackForceResult)calculator.Result;
if (result.IsValid) if (result.IsValid)

View File

@@ -19,14 +19,14 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
internal void Show() internal void Show()
{ {
var inputData = new CrackWidthCalculatorInputData() var inputData = new TupleCrackInputData()
{ {
//LimitState = LimitState, //LimitState = LimitState,
//CalcTerm = CalcTerm, //CalcTerm = CalcTerm,
LongTermTuple = ForceTuple, LongTermTuple = ForceTuple,
NdmPrimitives = ndmPrimitives NdmPrimitives = ndmPrimitives
}; };
var calculator = new CrackWidthCalculator() { InputData = inputData }; var calculator = new TupleCrackCalculator() { InputData = inputData };
calculator.Run(); calculator.Run();
var result = calculator.Result; var result = calculator.Result;

View File

@@ -1,4 +1,5 @@
using LoaderCalculator; using LoaderCalculator;
using LoaderCalculator.Data.Materials.MaterialBuilders;
using LoaderCalculator.Data.Matrix; using LoaderCalculator.Data.Matrix;
using LoaderCalculator.Data.Ndms; using LoaderCalculator.Data.Ndms;
using LoaderCalculator.Data.ResultData; using LoaderCalculator.Data.ResultData;
@@ -9,6 +10,7 @@ using StructureHelper.Services.Primitives;
using StructureHelper.UnitSystem; using StructureHelper.UnitSystem;
using StructureHelper.UnitSystem.Systems; using StructureHelper.UnitSystem.Systems;
using StructureHelperCommon.Infrastructures.Enums; using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Models;
using StructureHelperCommon.Services.Units; using StructureHelperCommon.Services.Units;
using StructureHelperLogics.Models.Calculations.CalculationProperties; using StructureHelperLogics.Models.Calculations.CalculationProperties;
using StructureHelperLogics.Models.CrossSections; using StructureHelperLogics.Models.CrossSections;
@@ -26,6 +28,8 @@ namespace StructureHelper.Windows.MainWindow
{ {
public class CrossSectionModel public class CrossSectionModel
{ {
private ITriangulatePrimitiveLogic triangulateLogic;
public ICrossSection Section { get; private set; } public ICrossSection Section { get; private set; }
private IPrimitiveRepository primitiveRepository; private IPrimitiveRepository primitiveRepository;
public IHeadMaterialRepository HeadMaterialRepository { get; } public IHeadMaterialRepository HeadMaterialRepository { get; }
@@ -52,7 +56,13 @@ namespace StructureHelper.Windows.MainWindow
public IEnumerable<INdm> GetNdms(ICalculationProperty calculationProperty) public IEnumerable<INdm> GetNdms(ICalculationProperty calculationProperty)
{ {
var ndmPrimitives = Section.SectionRepository.Primitives; var ndmPrimitives = Section.SectionRepository.Primitives;
return NdmPrimitivesService.GetNdms(ndmPrimitives, calculationProperty.LimitState, calculationProperty.CalcTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = ndmPrimitives,
LimitState = calculationProperty.LimitState,
CalcTerm = calculationProperty.CalcTerm
};
return triangulateLogic.GetNdms();
////Настройки триангуляции, пока опции могут быть только такие ////Настройки триангуляции, пока опции могут быть только такие
//ITriangulationOptions options = new TriangulationOptions { LimiteState = calculationProperty.LimitState, CalcTerm = calculationProperty.CalcTerm }; //ITriangulationOptions options = new TriangulationOptions { LimiteState = calculationProperty.LimitState, CalcTerm = calculationProperty.CalcTerm };

View File

@@ -201,7 +201,7 @@
<ContentControl ContentTemplate="{DynamicResource DiagramCalculator}"/> <ContentControl ContentTemplate="{DynamicResource DiagramCalculator}"/>
</Viewbox> </Viewbox>
</Button> </Button>
<Button Visibility="Hidden" Style="{DynamicResource ToolButton}" Command="{Binding Add}" CommandParameter="{x:Static enums:CalculatorTypes.CrackCalculator}" ToolTip="Add Interaction Diagram Calculator"> <Button Style="{DynamicResource ToolButton}" Command="{Binding Add}" CommandParameter="{x:Static enums:CalculatorTypes.CrackCalculator}" ToolTip="Add Crack Calculator">
<Viewbox> <Viewbox>
<ContentControl ContentTemplate="{DynamicResource CrackCalculator}"/> <ContentControl ContentTemplate="{DynamicResource CrackCalculator}"/>
</Viewbox> </Viewbox>
@@ -357,7 +357,7 @@
</Viewbox> </Viewbox>
</MenuItem.Icon> </MenuItem.Icon>
</MenuItem> </MenuItem>
<MenuItem Visibility="Hidden" Header="Add Crack Calculator" Command="{Binding Add}" CommandParameter="{x:Static enums:CalculatorTypes.CrackCalculator}"> <MenuItem Header="Add Crack Calculator" Command="{Binding Add}" CommandParameter="{x:Static enums:CalculatorTypes.CrackCalculator}">
<MenuItem.Icon> <MenuItem.Icon>
<Viewbox Width="16" Height="16"> <Viewbox Width="16" Height="16">
<ContentControl ContentTemplate="{DynamicResource CrackCalculator}"/> <ContentControl ContentTemplate="{DynamicResource CrackCalculator}"/>

View File

@@ -29,6 +29,8 @@ namespace StructureHelper.Windows.MainWindow
{ {
private ICrossSection section; private ICrossSection section;
private ICrossSectionRepository repository => section.SectionRepository; private ICrossSectionRepository repository => section.SectionRepository;
private ITriangulatePrimitiveLogic triangulateLogic;
public CrossSectionVisualPropertyVM VisualProperty { get; private set; } public CrossSectionVisualPropertyVM VisualProperty { get; private set; }
@@ -172,7 +174,13 @@ namespace StructureHelper.Windows.MainWindow
MovePrimitiveToGravityCenterCommand = new RelayCommand(o => MovePrimitiveToGravityCenterCommand = new RelayCommand(o =>
{ {
if (CheckMaterials() == false) { return;} if (CheckMaterials() == false) { return;}
var ndms = NdmPrimitivesService.GetNdms(repository.Primitives, LimitStates.SLS, CalcTerms.ShortTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = repository.Primitives,
LimitState = LimitStates.SLS,
CalcTerm = CalcTerms.ShortTerm
};
var ndms = triangulateLogic.GetNdms();
var center = GeometryOperations.GetGravityCenter(ndms); var center = GeometryOperations.GetGravityCenter(ndms);
foreach (var item in PrimitiveLogic.Items) foreach (var item in PrimitiveLogic.Items)
{ {

View File

@@ -11,6 +11,7 @@ using StructureHelperCommon.Models.Calculators;
using StructureHelperLogics.Models.CrossSections; using StructureHelperLogics.Models.CrossSections;
using StructureHelperLogics.NdmCalculations.Analyses.ByForces; using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
using StructureHelperLogics.NdmCalculations.Analyses.Logics; using StructureHelperLogics.NdmCalculations.Analyses.Logics;
using StructureHelperLogics.NdmCalculations.Cracking;
using System; using System;
using System.Windows; using System.Windows;
using System.Windows.Forms; using System.Windows.Forms;
@@ -56,7 +57,13 @@ namespace StructureHelper.Windows.ViewModels.NdmCrossSections
private void AddCrackCalculator() private void AddCrackCalculator()
{ {
throw new NotImplementedException(); var inputData = new CrackInputData();
var calculator = new CrackCalculator(inputData)
{
Name = "New crack calculator",
TraceLogger = new ShiftTraceLogger(),
};
NewItem = calculator;
} }
private void AddLimitCurveCalculator() private void AddLimitCurveCalculator()
@@ -102,20 +109,15 @@ namespace StructureHelper.Windows.ViewModels.NdmCrossSections
private void EditCalculator() private void EditCalculator()
{ {
if (SelectedItem is ForceCalculator) if (SelectedItem is ForceCalculator forceCalculator) { EditForceCalculator(forceCalculator);}
{ else if (SelectedItem is LimitCurvesCalculator limitCurvesCalculator) { EditLimitCurveCalculator(limitCurvesCalculator); }
var calculator = SelectedItem as ForceCalculator; else if (SelectedItem is CrackCalculator crackCalculator) { EditCrackCalculator(crackCalculator);}
EditForceCalculator(calculator); else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(SelectedItem));}
} }
else if (SelectedItem is LimitCurvesCalculator)
{ private void EditCrackCalculator(CrackCalculator crackCalculator)
var calculator = SelectedItem as LimitCurvesCalculator; {
EditLimitCurveCalculator(calculator); throw new NotImplementedException();
}
else
{
throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(SelectedItem));
}
} }
private void EditLimitCurveCalculator(LimitCurvesCalculator calculator) private void EditLimitCurveCalculator(LimitCurvesCalculator calculator)
@@ -193,6 +195,7 @@ namespace StructureHelper.Windows.ViewModels.NdmCrossSections
ProcessResult(); ProcessResult();
} }
} }
if (SelectedItem.TraceLogger is not null) if (SelectedItem.TraceLogger is not null)
{ {
var wnd = new TraceDocumentView(SelectedItem.TraceLogger.TraceLoggerEntries); var wnd = new TraceDocumentView(SelectedItem.TraceLogger.TraceLoggerEntries);
@@ -214,12 +217,15 @@ namespace StructureHelper.Windows.ViewModels.NdmCrossSections
private void ProcessResult() private void ProcessResult()
{ {
if (SelectedItem is IForceCalculator) if (SelectedItem is ForceCalculator forceCalculator)
{ {
var calculator = SelectedItem as ForceCalculator; var vm = new ForcesResultsViewModel(forceCalculator);
var vm = new ForcesResultsViewModel(calculator);
var wnd = new ForceResultsView(vm); var wnd = new ForceResultsView(vm);
wnd.ShowDialog(); wnd.ShowDialog();
}
else if (SelectedItem is CrackCalculator crackCalculator)
{
} }
else else
{ {

View File

@@ -5,6 +5,9 @@ namespace StructureHelperCommon.Infrastructures.Interfaces
{ {
public interface IHasForceCombinations public interface IHasForceCombinations
{ {
/// <summary>
/// Collection of force actions
/// </summary>
List<IForceAction> ForceActions { get; } List<IForceAction> ForceActions { get; }
} }
} }

View File

@@ -10,6 +10,7 @@ namespace StructureHelperCommon.Models.Loggers
{ {
public static string DimensionLess => "(dimensionless)"; public static string DimensionLess => "(dimensionless)";
public static string MethodBasedOn => "Method of calculation based on "; public static string MethodBasedOn => "Method of calculation based on ";
public static string CalculationError => "Some errors happened during calculations: ";
public static string CalculationHasDone => "Calculation has done succesfully"; public static string CalculationHasDone => "Calculation has done succesfully";
public static string Summary => "Summary"; public static string Summary => "Summary";
public static string Maximum => "Maximum"; public static string Maximum => "Maximum";

View File

@@ -1,6 +1,7 @@
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Calculators;
using StructureHelperLogics.NdmCalculations.Analyses.ByForces; using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
using StructureHelperLogics.NdmCalculations.Cracking;
namespace StructureHelperLogics.Models.Templates.CrossSections namespace StructureHelperLogics.Models.Templates.CrossSections
{ {
@@ -8,14 +9,19 @@ namespace StructureHelperLogics.Models.Templates.CrossSections
{ {
public IEnumerable<ICalculator> GetNdmCalculators() public IEnumerable<ICalculator> GetNdmCalculators()
{ {
var calculators = new List<ICalculator> var calculators = new List<ICalculator>();
var forceCalculator = new ForceCalculator()
{ {
new ForceCalculator() Name = "New Force Calculator",
{ TraceLogger = new ShiftTraceLogger()
Name = "New Force Calculator",
TraceLogger = new ShiftTraceLogger()
}
}; };
calculators.Add(forceCalculator);
var crackCalculator = new CrackCalculator(new CrackInputData())
{
Name = "New Crack Calculator",
TraceLogger = new ShiftTraceLogger()
};
calculators.Add(crackCalculator);
return calculators; return calculators;
} }
} }

View File

@@ -4,6 +4,7 @@ using StructureHelperCommon.Models.Forces;
using StructureHelperLogics.Models.CrossSections; using StructureHelperLogics.Models.CrossSections;
using StructureHelperLogics.Models.Templates.RCs; using StructureHelperLogics.Models.Templates.RCs;
using StructureHelperLogics.NdmCalculations.Analyses; using StructureHelperLogics.NdmCalculations.Analyses;
using StructureHelperLogics.NdmCalculations.Cracking;
using StructureHelperLogics.NdmCalculations.Primitives; using StructureHelperLogics.NdmCalculations.Primitives;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -62,6 +63,10 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
var forceCalculator = calculator as IHasForceCombinations; var forceCalculator = calculator as IHasForceCombinations;
forceCalculator.ForceActions.AddRange(combinations); forceCalculator.ForceActions.AddRange(combinations);
} }
if (calculator is CrackCalculator crackCalculator)
{
crackCalculator.InputData.ForceActions.AddRange(combinations);
}
} }
} }
private void AddAllPrimitivesToCalculator() private void AddAllPrimitivesToCalculator()
@@ -73,6 +78,10 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
var primitiveCalculator = calculator as IHasPrimitives; var primitiveCalculator = calculator as IHasPrimitives;
primitiveCalculator.Primitives.AddRange(primitives); primitiveCalculator.Primitives.AddRange(primitives);
} }
if (calculator is CrackCalculator crackCalculator)
{
crackCalculator.InputData.Primitives.AddRange(primitives);
}
} }
} }
} }

View File

@@ -1,6 +1,5 @@
using LoaderCalculator.Data.Ndms; using LoaderCalculator.Data.Ndms;
using StructureHelperCommon.Infrastructures.Enums; using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Forces;
@@ -8,12 +7,10 @@ using StructureHelperCommon.Models.Loggers;
using StructureHelperCommon.Models.Sections; using StructureHelperCommon.Models.Sections;
using StructureHelperCommon.Models.Sections.Logics; using StructureHelperCommon.Models.Sections.Logics;
using StructureHelperCommon.Models.Shapes; using StructureHelperCommon.Models.Shapes;
using StructureHelperCommon.Services.Forces;
using StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics; using StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics;
using StructureHelperLogics.NdmCalculations.Buckling; using StructureHelperLogics.NdmCalculations.Buckling;
using StructureHelperLogics.NdmCalculations.Primitives; using StructureHelperLogics.NdmCalculations.Primitives;
using StructureHelperLogics.Services.NdmPrimitives; using StructureHelperLogics.Services.NdmPrimitives;
using System;
namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
{ {
@@ -24,6 +21,8 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
private ForcesResults result; private ForcesResults result;
private IProcessorLogic<IForceTuple> eccentricityLogic; private IProcessorLogic<IForceTuple> eccentricityLogic;
private ForceTupleBucklingLogic bucklingLogic; private ForceTupleBucklingLogic bucklingLogic;
private ITriangulatePrimitiveLogic triangulateLogic;
public string Name { get; set; } public string Name { get; set; }
public List<LimitStates> LimitStatesList { get; private set; } public List<LimitStates> LimitStatesList { get; private set; }
@@ -99,7 +98,14 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
IForcesTupleResult tupleResult; IForcesTupleResult tupleResult;
LimitStates limitState = tuple.LimitState; LimitStates limitState = tuple.LimitState;
CalcTerms calcTerm = tuple.CalcTerm; CalcTerms calcTerm = tuple.CalcTerm;
var ndms = NdmPrimitivesService.GetNdms(Primitives, limitState, calcTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = Primitives,
LimitState = limitState,
CalcTerm = calcTerm,
TraceLogger = TraceLogger
};
var ndms = triangulateLogic.GetNdms();
IPoint2D point2D; IPoint2D point2D;
IProcessorLogic<IForceTuple> forcelogic = new ForceTupleCopier(tuple.ForceTuple); IProcessorLogic<IForceTuple> forcelogic = new ForceTupleCopier(tuple.ForceTuple);
if (combination.SetInGravityCenter == true) if (combination.SetInGravityCenter == true)
@@ -196,7 +202,11 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
string result = ""; string result = "";
try try
{ {
NdmPrimitivesService.CheckPrimitives(Primitives); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = Primitives
};
triangulateLogic.CheckPrimitives(Primitives);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -15,6 +15,8 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
{ {
private LimitCurvesResult result; private LimitCurvesResult result;
private int curvesIterationCount; private int curvesIterationCount;
private ITriangulatePrimitiveLogic triangulateLogic;
private LimitCurvesCalculatorUpdateStrategy updateStrategy => new(); private LimitCurvesCalculatorUpdateStrategy updateStrategy => new();
public Guid Id { get; } public Guid Id { get; }
@@ -78,7 +80,14 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
{ {
foreach (var calcTerm in InputData.CalcTerms) foreach (var calcTerm in InputData.CalcTerms)
{ {
var ndms = NdmPrimitivesService.GetNdms(primitiveSeries.Collection, limitState, calcTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = primitiveSeries.Collection,
LimitState = limitState,
CalcTerm = calcTerm,
TraceLogger = TraceLogger
};
var ndms = triangulateLogic.GetNdms();
TraceLogger?.AddMessage($"Number of elementary parts N={ndms.Count()} were obtainded succesfully"); TraceLogger?.AddMessage($"Number of elementary parts N={ndms.Count()} were obtainded succesfully");
TraceLogger?.AddMessage($"Summary area of elementary parts Asum={ndms.Sum(x=>x.Area * x.StressScale)}", TraceLogStatuses.Debug); TraceLogger?.AddMessage($"Summary area of elementary parts Asum={ndms.Sum(x=>x.Area * x.StressScale)}", TraceLogStatuses.Debug);
foreach (var predicateEntry in InputData.PredicateEntries) foreach (var predicateEntry in InputData.PredicateEntries)

View File

@@ -2,6 +2,7 @@
using LoaderCalculator.Data.Ndms; using LoaderCalculator.Data.Ndms;
using LoaderCalculator.Logics; using LoaderCalculator.Logics;
using LoaderCalculator.Logics.Geometry; using LoaderCalculator.Logics.Geometry;
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Forces;
@@ -24,6 +25,7 @@ namespace StructureHelperLogics.NdmCalculations.Buckling
private List<INdm> concreteNdms; private List<INdm> concreteNdms;
private List<INdm> otherNdms; private List<INdm> otherNdms;
IForcesTupleResult forcesResults; IForcesTupleResult forcesResults;
private ITriangulatePrimitiveLogic triangulateLogic;
public string Name { get; set; } public string Name { get; set; }
@@ -52,7 +54,13 @@ namespace StructureHelperLogics.NdmCalculations.Buckling
Accuracy = accuracy; Accuracy = accuracy;
var allPrimitives = options.Primitives; var allPrimitives = options.Primitives;
ndmCollection = NdmPrimitivesService.GetNdms(allPrimitives, options.LimitState, options.CalcTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = allPrimitives,
LimitState = options.LimitState,
CalcTerm = options.CalcTerm
};
ndmCollection = triangulateLogic.GetNdms();
concreteNdms = ndmCollection.Where(x => x.Material is ICrackMaterial).ToList(); concreteNdms = ndmCollection.Where(x => x.Material is ICrackMaterial).ToList();
otherNdms = ndmCollection.Except(concreteNdms).ToList(); otherNdms = ndmCollection.Except(concreteNdms).ToList();
} }

View File

@@ -0,0 +1,93 @@
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Infrastructures.Settings;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Loggers;
using StructureHelperLogics.NdmCalculations.Primitives;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class CrackCalculator : ICalculator
{
const LimitStates limitState = LimitStates.SLS;
const CalcTerms longTerm = CalcTerms.LongTerm;
const CalcTerms shortTerm = CalcTerms.ShortTerm;
private CrackResult result;
private IGetTupleInputDatasLogic datasLogic;
private CrackCalculatorUpdateStrategy updateStrategy = new();
public string Name { get; set; }
public CrackInputData InputData { get; set; }
public IResult Result => result;
public IShiftTraceLogger? TraceLogger { get; set; }
public CrackCalculator(CrackInputData inputData)
{
InputData = inputData;
}
public object Clone()
{
var newItem = new CrackCalculator(new CrackInputData());
updateStrategy.Update(newItem, this);
return newItem;
}
public void Run()
{
PrepareNewResult();
TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Service);
try
{
ProcessCalculations();
TraceLogger?.AddMessage(LoggerStrings.CalculationHasDone);
}
catch (Exception ex)
{
result.IsValid = false;
result.Description += ex;
TraceLogger?.AddMessage(LoggerStrings.CalculationError + ex, TraceLogStatuses.Error);
}
}
private void ProcessCalculations()
{
datasLogic = new GetTupleInputDatasLogic(InputData.Primitives, InputData.ForceActions)
{
LimitState = limitState,
LongTerm = longTerm,
ShortTerm = shortTerm,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
var datas = datasLogic.GetTupleInputDatas();
foreach (var data in datas)
{
var calculator = new TupleCrackCalculator()
{
InputData = data,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
calculator.Run();
var calcResult = calculator.Result as TupleCrackResult;
result.TupleResults.Add(calcResult);
}
}
private void PrepareNewResult()
{
result = new CrackResult
{
IsValid = true,
Description = string.Empty
};
}
}
}

View File

@@ -0,0 +1,24 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class CrackCalculatorUpdateStrategy : IUpdateStrategy<CrackCalculator>
{
private CrackInputDataUpdateStrategy inputDataUpdateStrategy => new();
public void Update(CrackCalculator targetObject, CrackCalculator sourceObject)
{
if (ReferenceEquals(targetObject, sourceObject)) { return; }
CheckObject.CompareTypes(targetObject, sourceObject);
targetObject.Name = sourceObject.Name;
targetObject.InputData ??= new();
inputDataUpdateStrategy.Update(targetObject.InputData, sourceObject.InputData);
}
}
}

View File

@@ -0,0 +1,25 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces;
using StructureHelperLogics.NdmCalculations.Primitives;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class CrackInputData : IInputData, IHasPrimitives, IHasForceCombinations
{
/// <inheritdoc/>
public List<INdmPrimitive> Primitives { get; private set; }
/// <inheritdoc/>
public List<IForceAction> ForceActions { get; private set; }
public CrackInputData()
{
Primitives = new();
ForceActions = new();
}
}
}

View File

@@ -0,0 +1,23 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class CrackInputDataUpdateStrategy : IUpdateStrategy<CrackInputData>
{
public void Update(CrackInputData targetObject, CrackInputData sourceObject)
{
if (ReferenceEquals(targetObject, sourceObject)) { return; }
CheckObject.CompareTypes(targetObject, sourceObject);
targetObject.ForceActions.Clear();
targetObject.ForceActions.AddRange(sourceObject.ForceActions);
targetObject.Primitives.Clear();
targetObject.Primitives.AddRange(sourceObject.Primitives);
}
}
}

View File

@@ -0,0 +1,20 @@
using StructureHelperCommon.Models.Calculators;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class CrackResult : IResult
{
public bool IsValid { get; set; }
public string? Description { get; set; }
public List<TupleCrackResult> TupleResults {get;set;}
public CrackResult()
{
TupleResults = new();
}
}
}

View File

@@ -0,0 +1,101 @@
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StructureHelperCommon.Models.Loggers;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperLogics.NdmCalculations.Primitives;
using StructureHelperCommon.Infrastructures.Interfaces;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class GetTupleInputDatasLogic : IGetTupleInputDatasLogic
{
public List<IForceAction> ForceActions { get; set; }
public List<INdmPrimitive> Primitives { get; set; }
public IShiftTraceLogger? TraceLogger { get; set; }
public LimitStates LimitState { get; set; }
public CalcTerms LongTerm { get; set; }
public CalcTerms ShortTerm { get; set; }
public GetTupleInputDatasLogic(List<INdmPrimitive> primitives, List<IForceAction> forceActions)
{
Primitives = primitives;
ForceActions = forceActions;
}
public List<TupleCrackInputData> GetTupleInputDatas()
{
TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Service);
List<TupleCrackInputData> resultList = new();
CheckInputData();
foreach (var action in ForceActions)
{
var tuple = GetTuplesByActions(action);
if (tuple.isValid == false)
{
resultList.Add(new TupleCrackInputData()
{
IsValid = false,
});
}
else
{
resultList.Add(new TupleCrackInputData()
{
IsValid = true,
LongTermTuple = tuple.LongTuple,
ShortTermTuple = tuple.ShortTuple,
NdmPrimitives = Primitives
});
}
}
TraceLogger?.AddMessage(LoggerStrings.CalculationHasDone);
return resultList;
}
private void CheckInputData()
{
if (ForceActions is null)
{
TraceLogger?.AddMessage("Force action is null", TraceLogStatuses.Error);
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + $": {nameof(ForceActions)} is null");
}
}
private (bool isValid, IForceTuple? LongTuple, IForceTuple? ShortTuple) GetTuplesByActions(IForceAction action)
{
IForceTuple longTuple, shortTuple;
var combinations = action.GetCombinations().DesignForces;
try
{
longTuple = GetTupleByCombination(combinations, LimitState, LongTerm);
TraceLogger?.AddMessage("Long term force combination");
TraceLogger?.AddEntry(new TraceTablesFactory().GetByForceTuple(longTuple));
shortTuple = GetTupleByCombination(combinations, LimitState, ShortTerm);
TraceLogger?.AddMessage("Short term force combination");
TraceLogger?.AddEntry(new TraceTablesFactory().GetByForceTuple(longTuple));
}
catch (Exception ex)
{
TraceLogger?.AddMessage("Force combination is not obtained: \n" + ex, TraceLogStatuses.Error);
return (false, null, null);
}
return (true, longTuple, shortTuple);
}
private static IForceTuple GetTupleByCombination(List<IDesignForceTuple> combinations, LimitStates limitState, CalcTerms calcTerm)
{
return combinations
.Where(x => x.LimitState == limitState & x.CalcTerm == calcTerm)
.Single()
.ForceTuple;
}
}
}

View File

@@ -0,0 +1,15 @@
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Forces;
using StructureHelperLogics.NdmCalculations.Primitives;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public interface IGetTupleInputDatasLogic : ILogic, IHasPrimitives, IHasForceCombinations
{
LimitStates LimitState { get; set; }
CalcTerms LongTerm { get; set; }
CalcTerms ShortTerm { get; set; }
List<TupleCrackInputData> GetTupleInputDatas();
}
}

View File

@@ -3,10 +3,10 @@ using StructureHelperCommon.Models.Calculators;
namespace StructureHelperLogics.NdmCalculations.Cracking namespace StructureHelperLogics.NdmCalculations.Cracking
{ {
public class CrackWidthSimpleCalculator : ICalculator public class RebarCrackCalculator : ICalculator
{ {
ICrackWidthLogic crackWidthLogic = new CrackWidthLogicSP63(); ICrackWidthLogic crackWidthLogic = new CrackWidthLogicSP63();
CrackWidthSimpleCalculatorResult result; RebarCrackResult result;
public string Name { get; set; } public string Name { get; set; }
public ICrackWidthSimpleCalculatorInputData InputData { get; set; } public ICrackWidthSimpleCalculatorInputData InputData { get; set; }
public IResult Result => result; public IResult Result => result;

View File

@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking namespace StructureHelperLogics.NdmCalculations.Cracking
{ {
public class CrackWidthSimpleCalculatorInputData : ICrackWidthSimpleCalculatorInputData public class RebarCrackInputData : ICrackWidthSimpleCalculatorInputData
{ {
public CalcTerms CalcTerm { get; set; } public CalcTerms CalcTerm { get; set; }
public StrainTuple StrainTuple { get; set; } public StrainTuple StrainTuple { get; set; }

View File

@@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking namespace StructureHelperLogics.NdmCalculations.Cracking
{ {
public class CrackWidthSimpleCalculatorResult : IResult public class RebarCrackResult : IResult
{ {
public bool IsValid { get; set; } public bool IsValid { get; set; }
public string Description { get; set; } public string Description { get; set; }

View File

@@ -4,6 +4,7 @@ using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Loggers;
using StructureHelperCommon.Services.Forces; using StructureHelperCommon.Services.Forces;
using StructureHelperLogics.NdmCalculations.Analyses.ByForces; using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
using StructureHelperLogics.NdmCalculations.Primitives; using StructureHelperLogics.NdmCalculations.Primitives;
@@ -11,37 +12,54 @@ using StructureHelperLogics.Services.NdmPrimitives;
namespace StructureHelperLogics.NdmCalculations.Cracking namespace StructureHelperLogics.NdmCalculations.Cracking
{ {
public class CrackWidthCalculator : ICalculator public class TupleCrackCalculator : ICalculator
{ {
private static readonly ILengthBetweenCracksLogic lengthLogic = new LengthBetweenCracksLogicSP63(); private static readonly ILengthBetweenCracksLogic lengthLogic = new LengthBetweenCracksLogicSP63();
private CrackWidthCalculatorResult result; private TupleCrackResult result;
private IEnumerable<INdmPrimitive> ndmPrimitives; private IEnumerable<INdmPrimitive> ndmPrimitives;
private List<RebarPrimitive>? rebarPrimitives; private List<RebarPrimitive>? rebarPrimitives;
private IEnumerable<INdm> ndmCollection; private IEnumerable<INdm> defaultNdm;
private IEnumerable<INdm> fulyCrackedNdm;
private CrackForceResult crackForceResult; private CrackForceResult crackForceResult;
private StrainTuple strainTuple; private StrainTuple strainTuple;
private ITriangulatePrimitiveLogic triangulateLogic;
public string Name { get; set; } public string Name { get; set; }
public CrackWidthCalculatorInputData InputData { get; set; } public TupleCrackInputData InputData { get; set; }
public IResult Result => result; public IResult Result => result;
public IShiftTraceLogger? TraceLogger { get; set; } public IShiftTraceLogger? TraceLogger { get; set; }
public void Run() public void Run()
{ {
result = new() { IsValid = true, Description = ""}; PrepareNewResult();
TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Service);
try try
{ {
ProcessCalculations(); ProcessCalculations();
TraceLogger?.AddMessage(LoggerStrings.CalculationHasDone);
} }
catch (Exception ex) catch (Exception ex)
{ {
result.IsValid = false; result.IsValid = false;
result.Description += ex; result.Description += ex;
TraceLogger?.AddMessage(LoggerStrings.CalculationError + ex, TraceLogStatuses.Error);
} }
} }
private void PrepareNewResult()
{
result = new()
{
IsValid = true,
Description = string.Empty
};
}
private void ProcessCalculations() private void ProcessCalculations()
{ {
CheckInputData(); CheckInputData();
@@ -49,12 +67,16 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
CalcStrainMatrix(); CalcStrainMatrix();
CalcCrackForce(); CalcCrackForce();
var crackInputData = GetCrackInputData(); var crackInputData = GetCrackInputData();
var calculator = new CrackWidthSimpleCalculator { InputData = crackInputData }; var calculator = new RebarCrackCalculator
{
InputData = crackInputData,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
foreach (var item in rebarPrimitives) foreach (var item in rebarPrimitives)
{ {
crackInputData.RebarPrimitive = item; crackInputData.RebarPrimitive = item;
calculator.Run(); calculator.Run();
var rebarResult = calculator.Result as CrackWidthSimpleCalculatorResult; var rebarResult = calculator.Result as RebarCrackResult;
//if (crackForceResult.IsSectionCracked == false) //if (crackForceResult.IsSectionCracked == false)
//{ //{
// rebarResult.CrackWidth = 0d; // rebarResult.CrackWidth = 0d;
@@ -65,19 +87,19 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private void CalcStrainMatrix() private void CalcStrainMatrix()
{ {
IForceTupleInputData inputData = new ForceTupleInputData() { NdmCollection = ndmCollection, Tuple = InputData.LongTermTuple}; IForceTupleInputData inputData = new ForceTupleInputData() { NdmCollection = defaultNdm, Tuple = InputData.LongTermTuple};
IForceTupleCalculator calculator = new ForceTupleCalculator() { InputData = inputData }; IForceTupleCalculator calculator = new ForceTupleCalculator() { InputData = inputData };
calculator.Run(); calculator.Run();
var forceResult = calculator.Result as IForcesTupleResult; var forceResult = calculator.Result as IForcesTupleResult;
strainTuple = TupleConverter.ConvertToStrainTuple(forceResult.LoaderResults.StrainMatrix); strainTuple = TupleConverter.ConvertToStrainTuple(forceResult.LoaderResults.StrainMatrix);
} }
private CrackWidthSimpleCalculatorInputData GetCrackInputData() private RebarCrackInputData GetCrackInputData()
{ {
lengthLogic.NdmCollection = ndmCollection; lengthLogic.NdmCollection = defaultNdm;
lengthLogic.StrainMatrix = TupleConverter.ConvertToLoaderStrainMatrix(strainTuple); lengthLogic.StrainMatrix = TupleConverter.ConvertToLoaderStrainMatrix(strainTuple);
var length = lengthLogic.GetLength(); var length = lengthLogic.GetLength();
var crackInputData = new CrackWidthSimpleCalculatorInputData var crackInputData = new RebarCrackInputData
{ {
PsiSFactor = crackForceResult.PsiS, PsiSFactor = crackForceResult.PsiS,
Length = length, Length = length,
@@ -97,14 +119,21 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
rebarPrimitives.Add(item as RebarPrimitive); rebarPrimitives.Add(item as RebarPrimitive);
} }
} }
ndmCollection = NdmPrimitivesService.GetNdms(ndmPrimitives, LimitStates.SLS, CalcTerms.ShortTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = ndmPrimitives,
LimitState = LimitStates.SLS,
CalcTerm = CalcTerms.ShortTerm,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
defaultNdm = triangulateLogic.GetNdms();
} }
private void CalcCrackForce() private void CalcCrackForce()
{ {
var calculator = new CrackForceCalculator(); var calculator = new CrackForceCalculator();
calculator.EndTuple = InputData.LongTermTuple; calculator.EndTuple = InputData.LongTermTuple;
calculator.NdmCollection = ndmCollection; calculator.NdmCollection = defaultNdm;
calculator.Run(); calculator.Run();
crackForceResult = calculator.Result as CrackForceResult; crackForceResult = calculator.Result as CrackForceResult;
} }

View File

@@ -10,10 +10,11 @@ using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking namespace StructureHelperLogics.NdmCalculations.Cracking
{ {
public class CrackWidthCalculatorInputData : IInputData public class TupleCrackInputData : IInputData
{ {
public IForceTuple LongTermTuple { get; set; } public bool IsValid { get; set; }
public IForceTuple ShortTermTuple { get; set; } public IForceTuple? LongTermTuple { get; set; }
public List<INdmPrimitive> NdmPrimitives {get;set;} public IForceTuple? ShortTermTuple { get; set; }
public List<INdmPrimitive>? NdmPrimitives {get;set;}
} }
} }

View File

@@ -8,20 +8,20 @@ using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking namespace StructureHelperLogics.NdmCalculations.Cracking
{ {
public class CrackWidthCalculatorResult : IResult public class TupleCrackResult : IResult
{ {
public bool IsValid { get; set; } public bool IsValid { get; set; }
public string Description { get; set; } public string Description { get; set; }
public IForceTuple LongTermTuple { get; set; } public IForceTuple LongTermTuple { get; set; }
public IForceTuple ShortTermTuple { get; set; } public IForceTuple ShortTermTuple { get; set; }
public bool IsCracked { get; set; } public bool IsCracked { get; set; }
public List<CrackWidthSimpleCalculatorResult> RebarResults { get; set; } public List<RebarCrackResult> RebarResults { get; set; }
public double MaxLongTermCrackWidth => IsCracked? RebarResults.Select(x => x.LongTermResult.CrackWidth).Max() : 0d; public double MaxLongTermCrackWidth => IsCracked? RebarResults.Select(x => x.LongTermResult.CrackWidth).Max() : 0d;
public double MaxShortTermCrackWidth => IsCracked? RebarResults.Select(x => x.ShortTermResult.CrackWidth).Max() : 0d; public double MaxShortTermCrackWidth => IsCracked? RebarResults.Select(x => x.ShortTermResult.CrackWidth).Max() : 0d;
public CrackWidthCalculatorResult() public TupleCrackResult()
{ {
RebarResults = new List<CrackWidthSimpleCalculatorResult>(); RebarResults = new ();
} }
} }
} }

View File

@@ -4,6 +4,9 @@ namespace StructureHelperLogics.NdmCalculations.Primitives
{ {
public interface IHasPrimitives public interface IHasPrimitives
{ {
/// <summary>
/// Collection of NdmPrimitives
/// </summary>
List<INdmPrimitive> Primitives { get; } List<INdmPrimitive> Primitives { get; }
} }
} }

View File

@@ -21,11 +21,18 @@ namespace StructureHelperLogics.Services.NdmCalculations
public class CalculationService public class CalculationService
{ {
private ICalculationProperty calculationProperty; private ICalculationProperty calculationProperty;
private ITriangulatePrimitiveLogic triangulateLogic;
public IStrainMatrix GetPrimitiveStrainMatrix(INdmPrimitive[] ndmPrimitives, double mx, double my, double nz) public IStrainMatrix GetPrimitiveStrainMatrix(INdmPrimitive[] ndmPrimitives, double mx, double my, double nz)
{ {
var ndmCollection = new List<INdm>(); var ndmCollection = new List<INdm>();
ndmCollection.AddRange(NdmPrimitivesService.GetNdms(ndmPrimitives, calculationProperty.LimitState, calculationProperty.CalcTerm)); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = ndmPrimitives,
LimitState = calculationProperty.LimitState,
CalcTerm = calculationProperty.CalcTerm
};
ndmCollection.AddRange(triangulateLogic.GetNdms());
var loaderData = new LoaderOptions var loaderData = new LoaderOptions
{ {
Preconditions = new Preconditions Preconditions = new Preconditions

View File

@@ -0,0 +1,16 @@
using LoaderCalculator.Data.Ndms;
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperLogics.NdmCalculations.Primitives;
namespace StructureHelperLogics.Services.NdmPrimitives
{
public interface ITriangulatePrimitiveLogic : ILogic
{
IEnumerable<INdmPrimitive> Primitives { get; set; }
LimitStates LimitState { get; set; }
CalcTerms CalcTerm { get; set; }
List<INdm> GetNdms();
bool CheckPrimitives(IEnumerable<INdmPrimitive> primitives);
}
}

View File

@@ -1,56 +0,0 @@
using LoaderCalculator.Data.Ndms;
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models.Shapes;
using StructureHelperLogics.NdmCalculations.Primitives;
using StructureHelperLogics.NdmCalculations.Triangulations;
namespace StructureHelperLogics.Services.NdmPrimitives
{
public static class NdmPrimitivesService
{
public static List<INdm> GetNdms(IEnumerable<INdmPrimitive> primitives, LimitStates limitState, CalcTerms calcTerm)
{
var orderedNdmPrimitives = primitives.OrderBy(x => x.VisualProperty.ZIndex);
var ndms = new List<INdm>();
var triangulationOptions = new TriangulationOptions() { LimiteState = limitState, CalcTerm = calcTerm };
foreach (var item in orderedNdmPrimitives)
{
if (item is IHasDivisionSize)
{
var hasDivision = item as IHasDivisionSize;
if (hasDivision.ClearUnderlying == true)
{
ndms.RemoveAll(x => hasDivision.IsPointInside(new Point2D() { X = x.CenterX, Y = x.CenterY }) == true);
}
}
if (item.Triangulate == true)
{
ndms.AddRange(item.GetNdms(triangulationOptions));
}
}
return ndms;
}
public static bool CheckPrimitives(IEnumerable<INdmPrimitive> primitives)
{
if (!primitives.Any())
{
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + $": Count of primitive must be greater than zero");
}
if (!primitives.Any(x => x.Triangulate == true))
{
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + $": There are not primitives to triangulate");
}
foreach (var item in primitives)
{
if (item.Triangulate == true &
item.HeadMaterial is null)
{
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + $": Primitive: {item.Name} can't be triangulated since material is null");
}
}
return true;
}
}
}

View File

@@ -0,0 +1,105 @@
using LoaderCalculator.Data.Ndms;
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Shapes;
using StructureHelperLogics.NdmCalculations.Primitives;
using StructureHelperLogics.NdmCalculations.Triangulations;
namespace StructureHelperLogics.Services.NdmPrimitives
{
public class TriangulatePrimitiveLogic : ITriangulatePrimitiveLogic
{
private List<INdm> ndmCollection;
public IEnumerable<INdmPrimitive> Primitives { get; set; }
public LimitStates LimitState { get; set; }
public CalcTerms CalcTerm { get; set; }
public bool ConsiderCracking { get; set; }
public IShiftTraceLogger? TraceLogger { get; set; }
public TriangulatePrimitiveLogic()
{
ConsiderCracking = false;
}
public List<INdm> GetNdms()
{
TraceLogger?.AddMessage($"Total count of primitives n = {Primitives.Count()}", TraceLogStatuses.Service);
TraceLogger?.AddMessage($"Limit state is {LimitState}", TraceLogStatuses.Service);
TraceLogger?.AddMessage($"Calc term is {CalcTerm}", TraceLogStatuses.Service);
var orderedNdmPrimitives = Primitives.OrderBy(x => x.VisualProperty.ZIndex);
ndmCollection = new List<INdm>();
foreach (var item in orderedNdmPrimitives)
{
TraceLogger?.AddMessage($"Triangulation of primitive {item.Name} has started", TraceLogStatuses.Service);
ProcessHasDivision(item);
TriangulatePrimitive(item);
}
if (TraceLogger is not null)
{
TraceService.TraceNdmCollection(TraceLogger, ndmCollection);
}
return ndmCollection;
}
private void TriangulatePrimitive(INdmPrimitive item)
{
if (item.Triangulate == true)
{
var triangulationOptions = new TriangulationOptions()
{
LimiteState = LimitState,
CalcTerm = CalcTerm
};
var itemNdms = item.GetNdms(triangulationOptions);
ndmCollection.AddRange(itemNdms);
TraceLogger?.AddMessage($"Triangulation of primitive {item.Name} was finished, {itemNdms.Count()} part(s) were obtained", TraceLogStatuses.Service);
}
else
{
TraceLogger?.AddMessage($"Triangulation of primitive was skiped cause its settings", TraceLogStatuses.Service);
}
}
private void ProcessHasDivision(INdmPrimitive? item)
{
if (item is IHasDivisionSize hasDivision)
{
if (hasDivision.ClearUnderlying == true)
{
TraceLogger?.AddMessage("Removing of background part has started", TraceLogStatuses.Service);
ndmCollection
.RemoveAll(x =>
hasDivision
.IsPointInside(new Point2D() { X = x.CenterX, Y = x.CenterY }) == true);
}
}
}
public bool CheckPrimitives(IEnumerable<INdmPrimitive> primitives)
{
if (!primitives.Any())
{
string errorMessage = string.Intern(ErrorStrings.DataIsInCorrect + $": Count of primitive must be greater than zero");
TraceLogger?.AddMessage(errorMessage, TraceLogStatuses.Error);
throw new StructureHelperException(errorMessage);
}
if (!primitives.Any(x => x.Triangulate == true))
{
string errorMessage = string.Intern(ErrorStrings.DataIsInCorrect + $": There are not primitives to triangulate");
TraceLogger?.AddMessage(errorMessage, TraceLogStatuses.Error);
throw new StructureHelperException(errorMessage);
}
foreach (var item in primitives)
{
if (item.Triangulate == true &
item.HeadMaterial is null)
{
string errorMessage = string.Intern(ErrorStrings.DataIsInCorrect + $": Primitive: {item.Name} can't be triangulated since material is null");
TraceLogger?.AddMessage(errorMessage, TraceLogStatuses.Error);
throw new StructureHelperException(errorMessage);
}
}
return true;
}
}
}

View File

@@ -18,6 +18,8 @@ namespace StructureHelperTests.FunctionalTests.Ndms.Calculators.CrackCalculatorT
{ {
internal class CrackCalculatorTest internal class CrackCalculatorTest
{ {
private ITriangulatePrimitiveLogic triangulateLogic;
[TestCase(0.4d, 0.6d, 0.012d, 0.025d, 2, 2, 0.81d)] [TestCase(0.4d, 0.6d, 0.012d, 0.025d, 2, 2, 0.81d)]
public void Run_ShouldPass(double width, double height, double topDiametr, double bottomDiametr, int widthCount, int heightCount, double expectedFactor) public void Run_ShouldPass(double width, double height, double topDiametr, double bottomDiametr, int widthCount, int heightCount, double expectedFactor)
{ {
@@ -25,7 +27,13 @@ namespace StructureHelperTests.FunctionalTests.Ndms.Calculators.CrackCalculatorT
var template = new RectangleBeamTemplate(width, height) { TopDiameter = topDiametr, BottomDiameter = bottomDiametr, WidthCount = widthCount, HeightCount = heightCount }; var template = new RectangleBeamTemplate(width, height) { TopDiameter = topDiametr, BottomDiameter = bottomDiametr, WidthCount = widthCount, HeightCount = heightCount };
var newSection = new SectionTemplate(new RectGeometryLogic(template)).GetCrossSection(); var newSection = new SectionTemplate(new RectGeometryLogic(template)).GetCrossSection();
var ndmPrimitives = newSection.SectionRepository.Primitives; var ndmPrimitives = newSection.SectionRepository.Primitives;
var ndms = NdmPrimitivesService.GetNdms(ndmPrimitives, LimitStates.SLS, CalcTerms.ShortTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = ndmPrimitives,
LimitState = LimitStates.SLS,
CalcTerm = CalcTerms.ShortTerm
};
var ndms = triangulateLogic.GetNdms();
var calculator = new CrackForceCalculator(); var calculator = new CrackForceCalculator();
calculator.EndTuple = new ForceTuple() { Mx = -50e3d, My = -50e3d, Nz = 0d }; calculator.EndTuple = new ForceTuple() { Mx = -50e3d, My = -50e3d, Nz = 0d };
calculator.NdmCollection = ndms; calculator.NdmCollection = ndms;

View File

@@ -17,6 +17,8 @@ namespace StructureHelperTests.UnitTests.Ndms.Triangulations
public class RectangleTriangulationTest public class RectangleTriangulationTest
{ {
private Mock<IHeadMaterial> materialMock; private Mock<IHeadMaterial> materialMock;
private ITriangulatePrimitiveLogic triangulateLogic;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
@@ -75,7 +77,13 @@ namespace StructureHelperTests.UnitTests.Ndms.Triangulations
opening.VisualProperty.ZIndex = 1; opening.VisualProperty.ZIndex = 1;
var primitives = new List<INdmPrimitive>() { mainBlock, opening }; var primitives = new List<INdmPrimitive>() { mainBlock, opening };
//Act //Act
var ndms = NdmPrimitivesService.GetNdms(primitives, LimitStates.ULS, CalcTerms.ShortTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = primitives,
LimitState = LimitStates.ULS,
CalcTerm = CalcTerms.ShortTerm
};
var ndms = triangulateLogic.GetNdms();
//Assert //Assert
var area = ndms.Sum(x => x.Area); var area = ndms.Sum(x => x.Area);
var moments = GeometryOperations.GetReducedMomentsOfInertia(ndms); var moments = GeometryOperations.GetReducedMomentsOfInertia(ndms);
@@ -106,7 +114,13 @@ namespace StructureHelperTests.UnitTests.Ndms.Triangulations
opening.VisualProperty.ZIndex = 1; opening.VisualProperty.ZIndex = 1;
var primitives = new List<INdmPrimitive>() { mainBlock, opening }; var primitives = new List<INdmPrimitive>() { mainBlock, opening };
//Act //Act
var ndms = NdmPrimitivesService.GetNdms(primitives, LimitStates.ULS, CalcTerms.ShortTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = primitives,
LimitState = LimitStates.ULS,
CalcTerm = CalcTerms.ShortTerm
};
var ndms = triangulateLogic.GetNdms();
//Assert //Assert
var area = ndms.Sum(x => x.Area); var area = ndms.Sum(x => x.Area);
var moments = GeometryOperations.GetReducedMomentsOfInertia(ndms); var moments = GeometryOperations.GetReducedMomentsOfInertia(ndms);
@@ -138,7 +152,13 @@ namespace StructureHelperTests.UnitTests.Ndms.Triangulations
opening.VisualProperty.ZIndex = 1; opening.VisualProperty.ZIndex = 1;
var primitives = new List<INdmPrimitive>() { mainBlock, opening }; var primitives = new List<INdmPrimitive>() { mainBlock, opening };
//Act //Act
var ndms = NdmPrimitivesService.GetNdms(primitives, LimitStates.ULS, CalcTerms.ShortTerm); triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = primitives,
LimitState = LimitStates.ULS,
CalcTerm = CalcTerms.ShortTerm
};
var ndms = triangulateLogic.GetNdms();
//Assert //Assert
var area = ndms.Sum(x => x.Area); var area = ndms.Sum(x => x.Area);
var moments = GeometryOperations.GetReducedMomentsOfInertia(ndms); var moments = GeometryOperations.GetReducedMomentsOfInertia(ndms);