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();
}
}