Change value diagram calculator

This commit is contained in:
Evgeny Redikultsev
2025-11-16 21:03:57 +05:00
parent f7e60e0bb3
commit 215f631bb0
170 changed files with 2108 additions and 387 deletions

View File

@@ -89,10 +89,9 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
private void CheckActions()
{
var checkLogic = new CheckForceActionsLogic()
var checkLogic = new CheckForceActionsLogic(TraceLogger)
{
Entity = InputData.ForceActions,
TraceLogger = TraceLogger
Entity = InputData.ForceActions
};
if (checkLogic.Check() == false)
{

View File

@@ -41,7 +41,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
}
public void Update(IForceCalculatorInputData targetObject, IForceCalculatorInputData sourceObject)
{
CheckObject.IsNull(targetObject, sourceObject, "Force calculator input data");
CheckObject.ThrowIfNull(targetObject, sourceObject, "Force calculator input data");
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Accuracy ??= new Accuracy();
targetObject.CheckStrainLimit = sourceObject.CheckStrainLimit;

View File

@@ -15,7 +15,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces.LimitCurve
{
public void Update(ILimitCurvesCalculatorInputData targetObject, ILimitCurvesCalculatorInputData sourceObject)
{
CheckObject.IsNull(targetObject, sourceObject, "Limit curve calculator input data");
CheckObject.ThrowIfNull(targetObject, sourceObject, "Limit curve calculator input data");
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.LimitStates.Clear();
targetObject.CalcTerms.Clear();

View File

@@ -30,9 +30,9 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces.LimitCurve
public void Update(ILimitCurvesCalculator targetObject, ILimitCurvesCalculator sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
CheckObject.ThrowIfNull(cloningStrategy);
CheckObject.ThrowIfNull(sourceObject);
CheckObject.ThrowIfNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
var targetData = targetObject.InputData;
limitCurvesInputDataUpdateStrategy.Update(targetData, sourceObject.InputData);

View File

@@ -33,9 +33,9 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics
public void Update(ICrackCalculator targetObject, ICrackCalculator sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
CheckObject.ThrowIfNull(cloningStrategy);
CheckObject.ThrowIfNull(sourceObject);
CheckObject.ThrowIfNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
var sourceData = sourceObject.InputData;
var targetData = targetObject.InputData;

View File

@@ -31,9 +31,9 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics
public void Update(IForceCalculator targetObject, IForceCalculator sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
CheckObject.ThrowIfNull(cloningStrategy);
CheckObject.ThrowIfNull(sourceObject);
CheckObject.ThrowIfNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
var sourceData = sourceObject.InputData;
var targetData = targetObject.InputData;

View File

@@ -13,8 +13,8 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics
public ForceCalculatorUpdateStrategy() : this(new ForceCalculatorInputDataUpdateStrategy()) { }
public void Update(IForceCalculator targetObject, IForceCalculator sourceObject)
{
CheckObject.IsNull(targetObject);
CheckObject.IsNull(sourceObject);
CheckObject.ThrowIfNull(targetObject);
CheckObject.ThrowIfNull(sourceObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Name = sourceObject.Name;
targetObject.ShowTraceData = sourceObject.ShowTraceData;

View File

@@ -39,9 +39,9 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
public void Update(IHasCalculators targetObject, IHasCalculators sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
CheckObject.ThrowIfNull(cloningStrategy);
CheckObject.ThrowIfNull(sourceObject);
CheckObject.ThrowIfNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Calculators.Clear();
foreach (var calculator in sourceObject.Calculators)

View File

@@ -14,7 +14,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
/// <summary>
/// Collection of diagram for calculation
/// </summary>
List<IValueDiagramEntity> Digrams { get; }
List<IValueDiagramEntity> Diagrams { get; }
bool CheckStrainLimit { get; set; }
}
}

View File

@@ -6,6 +6,6 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
{
string Name { get; set; }
bool IsTaken { get; set; }
IValueDiagram ValueDigram { get; set; }
IValueDiagram ValueDiagram { get; set; }
}
}

View File

@@ -21,7 +21,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
public void Update(IValueDiagramCalculatorInputData targetObject, IValueDiagramCalculatorInputData sourceObject)
{
CheckObject.IsNull(targetObject, sourceObject);
CheckObject.ThrowIfNull(targetObject, sourceObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.CheckStrainLimit = sourceObject.CheckStrainLimit;
targetObject.StateTermPair.LimitState = sourceObject.StateTermPair.LimitState;
@@ -32,12 +32,12 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
targetObject.Primitives.AddRange(sourceObject.Primitives);
targetObject.ForceActions.Clear();
targetObject.ForceActions.AddRange(sourceObject.ForceActions);
targetObject.Digrams.Clear();
targetObject.Diagrams.Clear();
entityUpdateStrategy ??= new ValueDiagramEntityUpdateStrategy();
foreach (var entity in sourceObject.Digrams)
foreach (var entity in sourceObject.Diagrams)
{
var newItem = entity.Clone() as IValueDiagramEntity;
targetObject.Digrams.Add(newItem);
targetObject.Diagrams.Add(newItem);
}
}
}

View File

@@ -90,7 +90,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
private void GetEntitiesResults()
{
var entities = InputData.Digrams
var entities = InputData.Diagrams
.Where(x => x.IsTaken == true);
foreach (var entity in entities)
{

View File

@@ -31,9 +31,9 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
public void Update(IValueDiagramCalculator targetObject, IValueDiagramCalculator sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
CheckObject.ThrowIfNull(cloningStrategy);
CheckObject.ThrowIfNull(sourceObject);
CheckObject.ThrowIfNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
var sourceData = sourceObject.InputData;
var targetData = targetObject.InputData;

View File

@@ -10,14 +10,14 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
public void Update(IValueDiagramCalculator targetObject, IValueDiagramCalculator sourceObject)
{
CheckObject.IsNull(targetObject, sourceObject);
CheckObject.ThrowIfNull(targetObject, sourceObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Name = sourceObject.Name;
targetObject.ShowTraceData = sourceObject.ShowTraceData;
if (UpdateChildren == true)
{
CheckObject.IsNull(targetObject.InputData, ": target value diagram calculator input data");
CheckObject.IsNull(sourceObject.InputData, ": source value diagram calculator input data");
CheckObject.ThrowIfNull(targetObject.InputData, ": target value diagram calculator input data");
CheckObject.ThrowIfNull(sourceObject.InputData, ": source value diagram calculator input data");
inputDataUpdateStrategy ??= new ValueDiagramCalculatorInputDataUpdateStrategy();
inputDataUpdateStrategy.Update(targetObject.InputData, sourceObject.InputData);
}

View File

@@ -0,0 +1,30 @@
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Infrastructures.Interfaces;
namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams.Logics
{
public class ValueDiagramCheckLogic : CheckEntityLogic<IValueDiagram>
{
private const double minDistance = 1e-3;
private bool result;
public override bool Check()
{
result = true;
if (Entity is null)
{
string errorString = ErrorStrings.ParameterIsNull + ": value diagram";
TraceMessage(errorString);
throw new StructureHelperException(errorString);
}
double dx = Entity.Point2DRange.StartPoint.X - Entity.Point2DRange.EndPoint.X;
double dy = Entity.Point2DRange.StartPoint.Y - Entity.Point2DRange.EndPoint.Y;
if (Math.Abs(dx) < minDistance && Math.Abs(dy) < minDistance)
{
result = false;
TraceMessage($"Distance between point of diagram is too small");
}
return result;
}
}
}

View File

@@ -0,0 +1,46 @@
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models;
using StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams.Logics;
namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
{
public class ValueDiagramEntityCheckLogic : CheckEntityLogic<IValueDiagramEntity>
{
private ICheckEntityLogic<IValueDiagram> valueDiagramCheckLogic;
public ValueDiagramEntityCheckLogic(IShiftTraceLogger? traceLogger)
{
valueDiagramCheckLogic = new ValueDiagramCheckLogic();
TraceLogger = traceLogger;
}
public ValueDiagramEntityCheckLogic(ICheckEntityLogic<IValueDiagram> valueDiagramCheckLogic, IShiftTraceLogger? traceLogger)
{
TraceLogger = traceLogger;
this.valueDiagramCheckLogic = valueDiagramCheckLogic;
}
public override bool Check()
{
bool result = true;
if (Entity is null)
{
string errorString = ErrorStrings.ParameterIsNull + ": value diagram entity";
TraceMessage(errorString);
throw new StructureHelperException(errorString);
}
valueDiagramCheckLogic.Entity = Entity.ValueDiagram;
bool IsValid = valueDiagramCheckLogic.Check();
if (IsValid == false)
{
result = false;
string name = string.IsNullOrWhiteSpace(Entity.Name)
? "<unnamed>"
: Entity.Name;
TraceMessage($"Diagram: {name} has error: {valueDiagramCheckLogic.CheckResult}");
}
return result;
}
}
}

View File

@@ -25,12 +25,12 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
private List<IPoint2D> GetPoints()
{
TraceLogger?.AddMessage($"Getting point for diagram {ValueDiagramEntity.Name} has been started");
var startPoint = ValueDiagramEntity.ValueDigram.Point2DRange.StartPoint;
var endPoint = ValueDiagramEntity.ValueDigram.Point2DRange.EndPoint;
double dx = (endPoint.X - startPoint.X) / ValueDiagramEntity.ValueDigram.StepNumber;
double dy = (endPoint.Y - startPoint.Y) / ValueDiagramEntity.ValueDigram.StepNumber;
var startPoint = ValueDiagramEntity.ValueDiagram.Point2DRange.StartPoint;
var endPoint = ValueDiagramEntity.ValueDiagram.Point2DRange.EndPoint;
double dx = (endPoint.X - startPoint.X) / ValueDiagramEntity.ValueDiagram.StepNumber;
double dy = (endPoint.Y - startPoint.Y) / ValueDiagramEntity.ValueDiagram.StepNumber;
List<IPoint2D> point2Ds = [];
for (int i = 0; i < ValueDiagramEntity.ValueDigram.StepNumber + 1; i++)
for (int i = 0; i < ValueDiagramEntity.ValueDiagram.StepNumber + 1; i++)
{
double x = startPoint.X + dx * i;
double y = startPoint.Y + dy * i;

View File

@@ -21,14 +21,14 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
public void Update(IValueDiagramEntity targetObject, IValueDiagramEntity sourceObject)
{
CheckObject.IsNull(targetObject, sourceObject);
CheckObject.ThrowIfNull(targetObject, sourceObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.IsTaken = sourceObject.IsTaken;
targetObject.Name = sourceObject.Name;
if (UpdateChildren == true)
{
valueDiagramUpdateStrategy ??= new ValueDiagramUpdateStrategy();
valueDiagramUpdateStrategy.Update(targetObject.ValueDigram, sourceObject.ValueDigram);
valueDiagramUpdateStrategy.Update(targetObject.ValueDiagram, sourceObject.ValueDiagram);
}
}
}

View File

@@ -0,0 +1,100 @@
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Forces.Logics;
using StructureHelperLogics.NdmCalculations.Primitives;
using StructureHelperLogics.NdmCalculations.Primitives.Logics;
namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
{
public class ValueDiagramInputDataCheckLogic : CheckEntityLogic<IValueDiagramCalculatorInputData>
{
private ICheckEntityLogic<IValueDiagramEntity> checkEntityLogic;
private ICheckEntityLogic<IHasPrimitives> primitivesCheckLogic;
private ICheckEntityLogic<IEnumerable<IForceAction>> actionsCheckLogic;
private bool result;
public ValueDiagramInputDataCheckLogic(
ICheckEntityLogic<IValueDiagramEntity> checkEntityLogic,
ICheckEntityLogic<IHasPrimitives> primitivesCheckLogic,
ICheckEntityLogic<IEnumerable<IForceAction>> actionsCheckLogic)
{
this.checkEntityLogic = checkEntityLogic;
this.primitivesCheckLogic = primitivesCheckLogic;
this.actionsCheckLogic = actionsCheckLogic;
}
public ValueDiagramInputDataCheckLogic()
{
checkEntityLogic = new ValueDiagramEntityCheckLogic(TraceLogger);
CheckRebarPrimitiveLogic checkRebarPrimitiveLogic = new()
{
CheckRebarHostMaterial = false,
CheckRebarPlacement = false
};
primitivesCheckLogic = new CheckPrimitiveCollectionLogic(TraceLogger, checkRebarPrimitiveLogic);
actionsCheckLogic = new CheckForceActionsLogic(TraceLogger);
}
public override bool Check()
{
result = true;
if (Entity is null)
{
string errorString = ErrorStrings.ParameterIsNull + ": input data";
TraceMessage(errorString);
throw new StructureHelperException(errorString);
}
if (Entity.Primitives is null || !Entity.Primitives.Any())
{
TraceMessage("Calculator does not contain any primitives");
result = false;
}
if (Entity.ForceActions is null || !Entity.ForceActions.Any())
{
TraceMessage("Calculator does not contain any forces");
result = false;
}
if (Entity.Diagrams is null || !Entity.Diagrams.Any() || !Entity.Diagrams.Where(x=> x.IsTaken == true).Any())
{
TraceMessage("Calculator does not contain any diagrams for calculation");
result = false;
}
foreach (var entity in Entity.Diagrams)
{
checkEntityLogic.Entity = entity;
bool isValid = checkEntityLogic.Check();
if (isValid == false)
{
result = false;
TraceMessage(checkEntityLogic.CheckResult);
}
}
CheckPrimitives();
CheckActions();
return result;
}
private void CheckPrimitives()
{
primitivesCheckLogic.Entity = Entity;
if (primitivesCheckLogic.Check() == false)
{
result = false;
}
TraceMessage(primitivesCheckLogic.CheckResult);
}
private void CheckActions()
{
actionsCheckLogic.Entity = Entity.ForceActions;
if (actionsCheckLogic.Check() == false)
{
result = false;
}
TraceMessage(actionsCheckLogic.CheckResult);
}
}
}

View File

@@ -1,4 +1,5 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Shapes;
using StructureHelperCommon.Services;
@@ -6,19 +7,36 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
{
public class ValueDiagramUpdateStrategy : IParentUpdateStrategy<IValueDiagram>
{
private IUpdateStrategy<IPoint2DRange> rangeUpdateStrategy;
private IUpdateStrategy<IPoint2DRange>? _rangeUpdateStrategy;
public ValueDiagramUpdateStrategy(IUpdateStrategy<IPoint2DRange> rangeUpdateStrategy)
{
_rangeUpdateStrategy = rangeUpdateStrategy ?? throw new StructureHelperException("rangeUpdateStrategy cannot be null");
}
public ValueDiagramUpdateStrategy() { }
public bool UpdateChildren { get; set; } = true;
private IUpdateStrategy<IPoint2DRange> RangeUpdateStrategy
=> _rangeUpdateStrategy ??= new Point2DRangeUpdateStrategy();
public void Update(IValueDiagram targetObject, IValueDiagram sourceObject)
{
CheckObject.IsNull(targetObject, sourceObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
CheckObject.ThrowIfNull(targetObject, nameof(targetObject));
CheckObject.ThrowIfNull(sourceObject, nameof(sourceObject));
if (ReferenceEquals(targetObject, sourceObject))
return;
targetObject.StepNumber = sourceObject.StepNumber;
if (UpdateChildren == true)
if (UpdateChildren)
{
rangeUpdateStrategy ??= new Point2DRangeUpdateStrategy();
rangeUpdateStrategy.Update(targetObject.Point2DRange, sourceObject.Point2DRange);
// Use property for lazy initialization
RangeUpdateStrategy.Update(targetObject.Point2DRange, sourceObject.Point2DRange);
}
}
}
}

View File

@@ -4,8 +4,17 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
{
public class ValueDiagram : IValueDiagram
{
private int stepNumber = 50;
public Guid Id { get; }
public int StepNumber { get; set; } = 50;
public int StepNumber
{
get => stepNumber;
set
{
stepNumber = Math.Max(value, 10);
}
}
public IPoint2DRange Point2DRange { get; set; } = new Point2DRange(Guid.NewGuid());

View File

@@ -1,13 +1,17 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators;
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
using StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams.Logics;
namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
{
public class ValueDiagramCalculator : IValueDiagramCalculator
{
private readonly IValueDiagramCalculatorLogic valueDiagramCalculatorLogic = new ValueDiagramCalculatorLogic();
private readonly ICheckInputDataLogic<IValueDiagramCalculatorInputData> checkInputDataLogic;
private readonly ICheckEntityLogic<IValueDiagramCalculatorInputData> checkInputDataLogic;
private IValueDiagramCalculatorResult result;
public Guid Id { get; }
@@ -20,9 +24,15 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
public IValueDiagramCalculatorInputData InputData { get; set; } = new ValueDiagramCalculatorInputData(Guid.NewGuid());
public ValueDiagramCalculator(ICheckEntityLogic<IValueDiagramCalculatorInputData> checkInputDataLogic)
{
this.checkInputDataLogic = checkInputDataLogic;
}
public ValueDiagramCalculator(Guid id)
{
Id = id;
checkInputDataLogic = new ValueDiagramInputDataCheckLogic();
}
public object Clone()
@@ -35,6 +45,16 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
public void Run()
{
checkInputDataLogic.Entity = InputData;
if (checkInputDataLogic.Check() != true)
{
result = new ValueDiagramCalculatorResult()
{
IsValid = false,
Description = checkInputDataLogic.CheckResult
};
return;
}
valueDiagramCalculatorLogic.InputData = InputData;
result = valueDiagramCalculatorLogic.GetResult();
}

View File

@@ -17,7 +17,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams
public Guid Id { get; }
/// <inheritdoc/>
public List<IValueDiagramEntity> Digrams { get; } = [];
public List<IValueDiagramEntity> Diagrams { get; } = [];
/// <inheritdoc/>
public List<IForceAction> ForceActions { get; } = [];
/// <inheritdoc/>

View File

@@ -6,7 +6,7 @@
public string Name { get; set; } = string.Empty;
public bool IsTaken { get; set; } = true;
public IValueDiagram ValueDigram { get; set; } = new ValueDiagram(Guid.NewGuid());
public IValueDiagram ValueDiagram { get; set; } = new ValueDiagram(Guid.NewGuid());
public ValueDiagramEntity(Guid id)
{