From 22bd35da980e2f6b2df420e0b555cec4497f6950 Mon Sep 17 00:00:00 2001 From: Evgeny Redikultsev Date: Mon, 16 Jun 2025 21:46:33 +0500 Subject: [PATCH] Fix repository clone strategy --- StructureHelper/StructureHelper.csproj.user | 6 +++ .../BeamShearCalculatorsViewModel.cs | 16 ++++++ .../CalculatorsViews/SelectResultSettings.cs | 13 +++++ .../SelectResultsForExportView.xaml | 35 +++++++++++++ .../SelectResultsForExportView.xaml.cs | 18 +++++++ .../SelectResultsForExportViewModel.cs | 50 +++++++++++++++++++ .../Windows/Errors/ErrorMessage.xaml | 2 +- .../Models/BeamShears/BeamShearCalculator.cs | 10 +--- .../BeamShears/BeamShearCalculatorLogic.cs | 13 ++--- .../BeamShearCalculatorCloneStrategy.cs | 33 ++++++++++++ ...amShearCalculatorInputDataCloneStrategy.cs | 41 +++++++++++++++ .../BeamShearRepositoryCloneStrategy.cs | 4 ++ .../HasCalculatorsUpdateCloneStrategy.cs | 41 +++++++++++++++ .../Logics/GetLogitudinalForceFactorLogic.cs | 2 +- 14 files changed, 266 insertions(+), 18 deletions(-) create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultSettings.cs create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml.cs create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportViewModel.cs create mode 100644 StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorCloneStrategy.cs create mode 100644 StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorInputDataCloneStrategy.cs create mode 100644 StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/HasCalculatorsUpdateCloneStrategy.cs diff --git a/StructureHelper/StructureHelper.csproj.user b/StructureHelper/StructureHelper.csproj.user index 00a08fd..25f4bbb 100644 --- a/StructureHelper/StructureHelper.csproj.user +++ b/StructureHelper/StructureHelper.csproj.user @@ -63,6 +63,9 @@ Code + + Code + Code @@ -227,6 +230,9 @@ Designer + + Designer + Designer diff --git a/StructureHelper/Windows/BeamShears/BeamShearCalculatorsViewModel.cs b/StructureHelper/Windows/BeamShears/BeamShearCalculatorsViewModel.cs index f71d812..d3b704c 100644 --- a/StructureHelper/Windows/BeamShears/BeamShearCalculatorsViewModel.cs +++ b/StructureHelper/Windows/BeamShears/BeamShearCalculatorsViewModel.cs @@ -1,6 +1,7 @@ using StructureHelper.Infrastructure; using StructureHelper.Infrastructure.Enums; using StructureHelper.Windows.CalculationWindows.ProgressViews; +using StructureHelper.Windows.Errors; using StructureHelper.Windows.ViewModels; using StructureHelper.Windows.ViewModels.Errors; using StructureHelperCommon.Infrastructures.Exceptions; @@ -115,6 +116,12 @@ namespace StructureHelper.Windows.BeamShears { beamShearCalculator.Run(); var result = beamShearCalculator.Result as IBeamShearCalculatorResult; + if (result.IsValid == false) + { + ErrorProcessor vm = ShowInvalidResult(result); + new ErrorMessage(vm).ShowDialog(); + return; + } Window window = new BeamShearResultView(result); window.ShowDialog(); if (beamShearCalculator.ShowTraceData == true) @@ -127,5 +134,14 @@ namespace StructureHelper.Windows.BeamShears throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(SelectedItem)); } } + + private static ErrorProcessor ShowInvalidResult(IBeamShearCalculatorResult? result) + { + return new ErrorProcessor() + { + ShortText = "Result of calculation is not valid", + DetailText = $"{result.Description}" + }; + } } } diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultSettings.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultSettings.cs new file mode 100644 index 0000000..dc91501 --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultSettings.cs @@ -0,0 +1,13 @@ +using StructureHelperCommon.Models.Calculators; +using System.Collections.Generic; + +namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews +{ + public class SelectResultSettings + { + public string Filename { get; set; } = string.Empty; + public bool ExportValidResults { get; set; } + public bool ExportInValidResults { get; set; } + public IEnumerable? Results { get; set; } + } +} diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml new file mode 100644 index 0000000..f5d7bbb --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml.cs new file mode 100644 index 0000000..1fae7b1 --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportView.xaml.cs @@ -0,0 +1,18 @@ +using System.Windows; + +namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews +{ + /// + /// Interaction logic for SelectResultsForExportView.xaml + /// + public partial class SelectResultsForExportView : Window + { + private SelectResultsForExportViewModel viewModel; + public SelectResultsForExportView(SelectResultsForExportViewModel viewModel) + { + InitializeComponent(); + this.viewModel = viewModel; + this.DataContext = this.viewModel; + } + } +} diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportViewModel.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportViewModel.cs new file mode 100644 index 0000000..70da95c --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/SelectResultsForExportViewModel.cs @@ -0,0 +1,50 @@ +using StructureHelper.Windows.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews +{ + public class SelectResultsForExportViewModel : OkCancelViewModelBase + { + private readonly SelectResultSettings resultSettings; + + public string Filename + { + get => resultSettings.Filename; + set + { + resultSettings.Filename = value; + OnPropertyChanged(nameof(Filename)); + } + } + + public bool ExportValidResults + { + get => resultSettings.ExportValidResults; + set + { + resultSettings.ExportValidResults = value; + OnPropertyChanged(nameof(ExportValidResults)); + } + } + public bool ExportInValidResults + { + get => resultSettings.ExportInValidResults; + set + { + resultSettings.ExportInValidResults = value; + OnPropertyChanged(nameof(ExportInValidResults)); + } + } + public ValidResultCounterVM ValidResultCounter {get;} + + public SelectResultsForExportViewModel(SelectResultSettings resultSettings) + { + this.resultSettings = resultSettings; + ValidResultCounter = new(this.resultSettings.Results); + } + } +} diff --git a/StructureHelper/Windows/Errors/ErrorMessage.xaml b/StructureHelper/Windows/Errors/ErrorMessage.xaml index 31887ec..9c0069b 100644 --- a/StructureHelper/Windows/Errors/ErrorMessage.xaml +++ b/StructureHelper/Windows/Errors/ErrorMessage.xaml @@ -21,7 +21,7 @@ - + diff --git a/StructureHelperLogics/Models/BeamShears/BeamShearCalculator.cs b/StructureHelperLogics/Models/BeamShears/BeamShearCalculator.cs index cd75d1f..019f3e7 100644 --- a/StructureHelperLogics/Models/BeamShears/BeamShearCalculator.cs +++ b/StructureHelperLogics/Models/BeamShears/BeamShearCalculator.cs @@ -38,11 +38,10 @@ namespace StructureHelperLogics.Models.BeamShears { TraceLogger?.AddMessage(LoggerStrings.LogicType(this), TraceLogStatuses.Service); PrepareNewResult(); - //PrepareInputData(); + InitializeStrategies(); + if (CheckInputData() == false) { return;} try { - InitializeStrategies(); - if (CheckInputData() == false) { return;} CalculateResult(); } catch (Exception ex) @@ -52,11 +51,6 @@ namespace StructureHelperLogics.Models.BeamShears } } - private void PrepareInputData() - { - throw new NotImplementedException(); - } - private bool CheckInputData() { var checkResult = checkInputDataLogic.Check(); diff --git a/StructureHelperLogics/Models/BeamShears/BeamShearCalculatorLogic.cs b/StructureHelperLogics/Models/BeamShears/BeamShearCalculatorLogic.cs index 4946198..2b52676 100644 --- a/StructureHelperLogics/Models/BeamShears/BeamShearCalculatorLogic.cs +++ b/StructureHelperLogics/Models/BeamShears/BeamShearCalculatorLogic.cs @@ -3,11 +3,6 @@ using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Loggers; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StructureHelperLogics.Models.BeamShears { @@ -18,7 +13,7 @@ namespace StructureHelperLogics.Models.BeamShears private IBeamShearSectionLogic beamShearSectionLogic; private List actionResults; private IBeamShearCalculatorInputData inputData; - private List calcTerms = new() { CalcTerms.LongTerm, CalcTerms.ShortTerm }; + private readonly List calcTerms = new() { CalcTerms.LongTerm, CalcTerms.ShortTerm }; public IShiftTraceLogger? TraceLogger { get; set; } @@ -166,13 +161,15 @@ namespace StructureHelperLogics.Models.BeamShears private List GetInclinedSections(IBeamShearSection beamShearSection) { IGetInclinedSectionListInputData inclinedSectionInputDataLogic = new GetInclinedSectionListInputData(beamShearSection); - IGetInclinedSectionListLogic getInclinedSectionListLogic = new GetInclinedSectionListLogic(inclinedSectionInputDataLogic, TraceLogger); + //IGetInclinedSectionListLogic getInclinedSectionListLogic = new GetInclinedSectionListLogic(inclinedSectionInputDataLogic, TraceLogger); + IGetInclinedSectionListLogic getInclinedSectionListLogic = new GetInclinedSectionListLogic(inclinedSectionInputDataLogic, null); return getInclinedSectionListLogic.GetInclinedSections(); } private IForceTuple GetForceTupleByShearAction(IBeamShearAction beamShearAction, IInclinedSection inclinedSection, LimitStates limitState, CalcTerms calcTerm) { - IGetDirectShearForceLogic getDirectShearForceLogic = new GetDirectShearForceLogic(beamShearAction, inclinedSection, limitState, calcTerm, TraceLogger); + //IGetDirectShearForceLogic getDirectShearForceLogic = new GetDirectShearForceLogic(beamShearAction, inclinedSection, limitState, calcTerm, TraceLogger); + IGetDirectShearForceLogic getDirectShearForceLogic = new GetDirectShearForceLogic(beamShearAction, inclinedSection, limitState, calcTerm, null); return getDirectShearForceLogic.CalculateShearForceTuple(); } } diff --git a/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorCloneStrategy.cs b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorCloneStrategy.cs new file mode 100644 index 0000000..4f67b49 --- /dev/null +++ b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorCloneStrategy.cs @@ -0,0 +1,33 @@ +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Services; + +namespace StructureHelperLogics.Models.BeamShears +{ + internal class BeamShearCalculatorCloneStrategy : ICloneStrategy + { + private readonly ICloningStrategy cloningStrategy; + private IUpdateStrategy updateStrategy; + private ICloneStrategy inputDataCloningStrategy; + public BeamShearCalculatorCloneStrategy(ICloningStrategy cloningStrategy) + { + this.cloningStrategy = cloningStrategy; + } + + public IBeamShearCalculator GetClone(IBeamShearCalculator sourceObject) + { + CheckObject.IsNull(cloningStrategy); + CheckObject.IsNull(sourceObject); + InitializeStrategies(); + BeamShearCalculator calculator = new(Guid.NewGuid()); + updateStrategy.Update(calculator, sourceObject); + calculator.InputData = inputDataCloningStrategy.GetClone(sourceObject.InputData); + return calculator; + } + + private void InitializeStrategies() + { + updateStrategy ??= new BeamShearCalculatorUpdateStrategy(); + inputDataCloningStrategy ??= new BeamShearCalculatorInputDataCloneStrategy(cloningStrategy); + } + } +} diff --git a/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorInputDataCloneStrategy.cs b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorInputDataCloneStrategy.cs new file mode 100644 index 0000000..9b54264 --- /dev/null +++ b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearCalculatorInputDataCloneStrategy.cs @@ -0,0 +1,41 @@ +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.Models.BeamShears +{ + internal class BeamShearCalculatorInputDataCloneStrategy : ICloneStrategy + { + private readonly ICloningStrategy cloningStrategy; + private IUpdateStrategy actionUpdateStrategy; + private IUpdateStrategy sectionUpdateStrategy; + private IUpdateStrategy stirrupUpdateStrategy; + public BeamShearCalculatorInputDataCloneStrategy(ICloningStrategy cloningStrategy) + { + this.cloningStrategy = cloningStrategy; + } + + public IBeamShearCalculatorInputData GetClone(IBeamShearCalculatorInputData sourceObject) + { + CheckObject.IsNull(cloningStrategy); + CheckObject.IsNull(sourceObject); + InitializeStrategies(); + BeamShearCalculatorInputData inputData = new(Guid.NewGuid()); + actionUpdateStrategy.Update(inputData, sourceObject); + sectionUpdateStrategy.Update(inputData, sourceObject); + stirrupUpdateStrategy.Update(inputData, sourceObject); + return inputData; + } + + private void InitializeStrategies() + { + actionUpdateStrategy ??= new HasActionsUpdateCloneStrategy(cloningStrategy); + sectionUpdateStrategy ??= new HasSectionsUpdateCloneStrategy(cloningStrategy); + stirrupUpdateStrategy ??= new HasStirrupsUpdateCloneStrategy(cloningStrategy); + } + } +} diff --git a/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearRepositoryCloneStrategy.cs b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearRepositoryCloneStrategy.cs index 09a5c5c..f37d7cf 100644 --- a/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearRepositoryCloneStrategy.cs +++ b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/BeamShearRepositoryCloneStrategy.cs @@ -1,4 +1,5 @@ using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models.Calculators; //Copyright (c) 2025 Redikultsev Evgeny, Ekaterinburg, Russia //All rights reserved. @@ -11,6 +12,7 @@ namespace StructureHelperLogics.Models.BeamShears private IUpdateStrategy actionUpdateStrategy; private IUpdateStrategy sectionUpdateStrategy; private IUpdateStrategy stirrupUpdateStrategy; + private IUpdateStrategy calculatorUpdateStrategy; private BeamShearRepository targetRepository; public BeamShearRepositoryCloneStrategy(ICloningStrategy cloningStrategy) @@ -24,6 +26,7 @@ namespace StructureHelperLogics.Models.BeamShears actionUpdateStrategy.Update(targetRepository, sourceObject); sectionUpdateStrategy.Update(targetRepository, sourceObject); stirrupUpdateStrategy.Update(targetRepository, sourceObject); + calculatorUpdateStrategy.Update(targetRepository, sourceObject); return targetRepository; } @@ -32,6 +35,7 @@ namespace StructureHelperLogics.Models.BeamShears actionUpdateStrategy ??= new HasActionsUpdateCloneStrategy(cloningStrategy); sectionUpdateStrategy ??= new HasSectionsUpdateCloneStrategy(cloningStrategy); stirrupUpdateStrategy ??= new HasStirrupsUpdateCloneStrategy(cloningStrategy); + calculatorUpdateStrategy ??= new HasCalculatorsUpdateCloneStrategy(cloningStrategy); } } } diff --git a/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/HasCalculatorsUpdateCloneStrategy.cs b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/HasCalculatorsUpdateCloneStrategy.cs new file mode 100644 index 0000000..befb886 --- /dev/null +++ b/StructureHelperLogics/Models/BeamShears/Logics/CloneStrategies/HasCalculatorsUpdateCloneStrategy.cs @@ -0,0 +1,41 @@ +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models.Calculators; +using StructureHelperCommon.Services; + +namespace StructureHelperLogics.Models.BeamShears +{ + internal class HasCalculatorsUpdateCloneStrategy : IUpdateStrategy + { + private readonly ICloningStrategy cloningStrategy; + private ICloneStrategy beamShearCalculatorCloneStrategy; + + public HasCalculatorsUpdateCloneStrategy(ICloningStrategy cloningStrategy) + { + this.cloningStrategy = cloningStrategy; + } + + public void Update(IHasCalculators targetObject, IHasCalculators sourceObject) + { + CheckObject.IsNull(cloningStrategy); + CheckObject.IsNull(sourceObject); + CheckObject.IsNull(targetObject); + if (ReferenceEquals(targetObject, sourceObject)) { return; } + targetObject.Calculators.Clear(); + foreach (var calculator in sourceObject.Calculators) + { + ICalculator newCalculator; + if (calculator is IBeamShearCalculator shearCalculator) + { + beamShearCalculatorCloneStrategy ??= new BeamShearCalculatorCloneStrategy(cloningStrategy); + newCalculator = beamShearCalculatorCloneStrategy.GetClone(shearCalculator); + } + else + { + throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(calculator)); + } + targetObject.Calculators.Add(newCalculator); + } + } + } +} diff --git a/StructureHelperLogics/Models/BeamShears/Logics/GetLogitudinalForceFactorLogic.cs b/StructureHelperLogics/Models/BeamShears/Logics/GetLogitudinalForceFactorLogic.cs index 9abbf07..2e4f037 100644 --- a/StructureHelperLogics/Models/BeamShears/Logics/GetLogitudinalForceFactorLogic.cs +++ b/StructureHelperLogics/Models/BeamShears/Logics/GetLogitudinalForceFactorLogic.cs @@ -44,7 +44,7 @@ namespace StructureHelperLogics.Models.BeamShears.Logics } else { - TraceLogger?.AddMessage("Longitudinal force N={LongitudinalForce}(N) is positive (tension)", TraceLogStatuses.Service); + TraceLogger?.AddMessage($"Longitudinal force N={LongitudinalForce}(N) is positive (tension)", TraceLogStatuses.Service); return GetPosForceResult(); } }