Add beam shear clone strategies

This commit is contained in:
Evgeny Redikultsev
2025-06-01 21:58:06 +05:00
parent 34ad25b2ea
commit 957ab62ece
28 changed files with 343 additions and 167 deletions

View File

@@ -3,32 +3,32 @@ using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Analyses; using StructureHelperCommon.Models.Analyses;
using StructureHelperLogic.Models.Analyses; using StructureHelperLogic.Models.Analyses;
using System; using StructureHelperLogics.Models.Analyses;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip;
namespace DataAccess.DTOs.Converters namespace DataAccess.DTOs
{ {
public class AnalysisToDTOConvertStrategy : IConvertStrategy<IAnalysis, IAnalysis> public class AnalysisToDTOConvertStrategy : ConvertStrategy<IAnalysis, IAnalysis>
{ {
private const string Message = "Analysis type is"; private const string Message = "Analysis type is";
private IConvertStrategy<CrossSectionNdmAnalysisDTO, ICrossSectionNdmAnalysis> convertCrossSectionNdmAnalysisStrategy = new CrossSectionNdmAnalysisToDTOConvertStrategy();
private DictionaryConvertStrategy<CrossSectionNdmAnalysisDTO, ICrossSectionNdmAnalysis> convertLogic;
public Dictionary<(Guid id, Type type), ISaveable> ReferenceDictionary { get; set; } private IConvertStrategy<CrossSectionNdmAnalysisDTO, ICrossSectionNdmAnalysis> crossSectionConvertLogic;
public IShiftTraceLogger TraceLogger { get; set; } private IConvertStrategy<BeamShearAnalysisDTO, IBeamShearAnalysis> beamShearConvertLogic;
public IAnalysis Convert(IAnalysis source) public AnalysisToDTOConvertStrategy(Dictionary<(Guid id, Type type), ISaveable> referenceDictionary, IShiftTraceLogger traceLogger) : base(referenceDictionary, traceLogger)
{
}
public override IAnalysis GetNewItem(IAnalysis source)
{ {
Check();
IAnalysis analysis; IAnalysis analysis;
if (source is ICrossSectionNdmAnalysis crossSectionNdmAnalysis) if (source is ICrossSectionNdmAnalysis crossSectionNdmAnalysis)
{ {
analysis = GetCrossSectionNdmAnalysisDTO(crossSectionNdmAnalysis); analysis = GetCrossSectionNdmAnalysisDTO(crossSectionNdmAnalysis);
} }
else if (source is IBeamShearAnalysis beamShearAnalysis)
{
analysis = GetBeamShearAnalysis(beamShearAnalysis);
}
else else
{ {
string errorString = ErrorStrings.ObjectTypeIsUnknownObj(source); string errorString = ErrorStrings.ObjectTypeIsUnknownObj(source);
@@ -41,23 +41,26 @@ namespace DataAccess.DTOs.Converters
} }
return analysis; return analysis;
} }
private BeamShearAnalysisDTO GetBeamShearAnalysis(IBeamShearAnalysis beamShearAnalysis)
{
TraceLogger?.AddMessage(Message + " Beam Shear Analysis", TraceLogStatuses.Debug);
beamShearConvertLogic ??= new DictionaryConvertStrategy<BeamShearAnalysisDTO, IBeamShearAnalysis>
(this,
new BeamShearAnalysisToDTOConvertStrategy(ReferenceDictionary, TraceLogger)
);
BeamShearAnalysisDTO newItem = beamShearConvertLogic.Convert(beamShearAnalysis);
return newItem;
}
private CrossSectionNdmAnalysisDTO GetCrossSectionNdmAnalysisDTO(ICrossSectionNdmAnalysis crossSectionNdmAnalysis) private CrossSectionNdmAnalysisDTO GetCrossSectionNdmAnalysisDTO(ICrossSectionNdmAnalysis crossSectionNdmAnalysis)
{ {
TraceLogger?.AddMessage(Message + " Cross-Section Ndm Analysis", TraceLogStatuses.Debug); TraceLogger?.AddMessage(Message + " Cross-Section Ndm Analysis", TraceLogStatuses.Debug);
convertCrossSectionNdmAnalysisStrategy.ReferenceDictionary = ReferenceDictionary; crossSectionConvertLogic ??= new DictionaryConvertStrategy<CrossSectionNdmAnalysisDTO, ICrossSectionNdmAnalysis>
convertCrossSectionNdmAnalysisStrategy.TraceLogger = TraceLogger; (this,
convertLogic = new DictionaryConvertStrategy<CrossSectionNdmAnalysisDTO, ICrossSectionNdmAnalysis>(this, convertCrossSectionNdmAnalysisStrategy); new CrossSectionNdmAnalysisToDTOConvertStrategy(ReferenceDictionary, TraceLogger)
CrossSectionNdmAnalysisDTO crossSectionNdmAnalysisDTO = convertLogic.Convert(crossSectionNdmAnalysis); );
return crossSectionNdmAnalysisDTO; CrossSectionNdmAnalysisDTO newItem = crossSectionConvertLogic.Convert(crossSectionNdmAnalysis);
} return newItem;
private void Check()
{
var checkLogic = new CheckConvertLogic<IAnalysis, IAnalysis>();
checkLogic.ConvertStrategy = this;
checkLogic.TraceLogger = TraceLogger;
checkLogic.Check();
} }
} }
} }

View File

@@ -0,0 +1,31 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models;
using StructureHelperLogics.Models.Analyses;
namespace DataAccess.DTOs
{
public class BeamShearAnalysisToDTOConvertStrategy : ConvertStrategy<BeamShearAnalysisDTO, IBeamShearAnalysis>
{
private IUpdateStrategy<IBeamShearAnalysis> updateStrategy;
public BeamShearAnalysisToDTOConvertStrategy(Dictionary<(Guid id, Type type), ISaveable> referenceDictionary, IShiftTraceLogger traceLogger) : base(referenceDictionary, traceLogger)
{
}
public override BeamShearAnalysisDTO GetNewItem(IBeamShearAnalysis source)
{
updateStrategy ??= new BeamShearAnalysisUpdateStrategy();
try
{
NewItem = new(source.Id);
updateStrategy.Update(NewItem, source);
return NewItem;
}
catch (Exception ex)
{
TraceErrorByEntity(this, ex.Message);
throw;
}
}
}
}

View File

@@ -4,13 +4,8 @@ using StructureHelperCommon.Models.Analyses;
using StructureHelperCommon.Models.Loggers; using StructureHelperCommon.Models.Loggers;
using StructureHelperLogic.Models.Analyses; using StructureHelperLogic.Models.Analyses;
using StructureHelperLogics.Models.Analyses; using StructureHelperLogics.Models.Analyses;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataAccess.DTOs.Converters namespace DataAccess.DTOs
{ {
internal class CrossSectionNdmAnalysisToDTOConvertStrategy : IConvertStrategy<CrossSectionNdmAnalysisDTO, ICrossSectionNdmAnalysis> internal class CrossSectionNdmAnalysisToDTOConvertStrategy : IConvertStrategy<CrossSectionNdmAnalysisDTO, ICrossSectionNdmAnalysis>
{ {
@@ -37,6 +32,16 @@ namespace DataAccess.DTOs.Converters
} }
public CrossSectionNdmAnalysisToDTOConvertStrategy(Dictionary<(Guid id, Type type), ISaveable> referenceDictionary, IShiftTraceLogger? traceLogger)
: this(
new CrossSectionNdmAnalysisUpdateStrategy(),
new VersionProcessorToDTOConvertStrategy(),
null)
{
ReferenceDictionary = referenceDictionary;
TraceLogger = traceLogger;
}
public CrossSectionNdmAnalysisDTO Convert(ICrossSectionNdmAnalysis source) public CrossSectionNdmAnalysisDTO Convert(ICrossSectionNdmAnalysis source)
{ {
try try

View File

@@ -1,49 +1,33 @@
using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Infrastructures.Settings;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Analyses; using StructureHelperCommon.Models.Analyses;
using StructureHelperCommon.Models.Projects; using StructureHelperCommon.Models.Projects;
using StructureHelperLogics.Models.CrossSections;
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataAccess.DTOs namespace DataAccess.DTOs
{ {
public class ProjectToDTOConvertStrategy : IConvertStrategy<ProjectDTO, IProject> public class ProjectToDTOConvertStrategy : ConvertStrategy<ProjectDTO, IProject>
{ {
private IUpdateStrategy<IProject> updateStrategy; private IUpdateStrategy<IProject> updateStrategy;
private IConvertStrategy<VisualAnalysisDTO, IVisualAnalysis> convertStrategy;
private DictionaryConvertStrategy<VisualAnalysisDTO, IVisualAnalysis> convertLogic; private DictionaryConvertStrategy<VisualAnalysisDTO, IVisualAnalysis> convertLogic;
public Dictionary<(Guid id, Type type), ISaveable> ReferenceDictionary { get; set; }
public IShiftTraceLogger TraceLogger { get; set; }
public ProjectToDTOConvertStrategy(IUpdateStrategy<IProject> updateStrategy, IConvertStrategy<VisualAnalysisDTO, IVisualAnalysis> convertStrategy) public ProjectToDTOConvertStrategy()
{
}
public ProjectToDTOConvertStrategy(
IUpdateStrategy<IProject> updateStrategy,
DictionaryConvertStrategy<VisualAnalysisDTO, IVisualAnalysis> convertLogic)
{ {
this.updateStrategy = updateStrategy; this.updateStrategy = updateStrategy;
this.convertStrategy = convertStrategy; this.convertLogic = convertLogic;
} }
public ProjectToDTOConvertStrategy() : this(new ProjectUpdateStrategy(), new VisualAnalysisToDTOConvertStrategy()) public override ProjectDTO GetNewItem(IProject source)
{ {
InitializeStrategies();
} ProjectDTO newItem = new(source.Id);
public ProjectDTO Convert(IProject source)
{
Check();
ProjectDTO newItem = new()
{
Id = source.Id
};
updateStrategy.Update(newItem, source); updateStrategy.Update(newItem, source);
convertStrategy.ReferenceDictionary = ReferenceDictionary;
convertStrategy.TraceLogger = TraceLogger;
convertLogic = new DictionaryConvertStrategy<VisualAnalysisDTO, IVisualAnalysis>(this, convertStrategy);
newItem.VisualAnalyses.Clear(); newItem.VisualAnalyses.Clear();
foreach (var item in source.VisualAnalyses) foreach (var item in source.VisualAnalyses)
{ {
@@ -51,15 +35,15 @@ namespace DataAccess.DTOs
newItem.VisualAnalyses.Add(newVisualAnalysis); newItem.VisualAnalyses.Add(newVisualAnalysis);
} }
return newItem; return newItem;
} }
private void Check() private void InitializeStrategies()
{ {
var checkLogic = new CheckConvertLogic<ProjectDTO, IProject>(); updateStrategy ??= new ProjectUpdateStrategy();
checkLogic.ConvertStrategy = this; convertLogic ??= new DictionaryConvertStrategy<VisualAnalysisDTO, IVisualAnalysis>
checkLogic.TraceLogger = TraceLogger; (this,
checkLogic.Check(); new VisualAnalysisToDTOConvertStrategy(ReferenceDictionary, TraceLogger)
);
} }
} }
} }

View File

@@ -1,35 +1,16 @@
using DataAccess.DTOs.Converters; using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Infrastructures.Settings;
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Analyses; using StructureHelperCommon.Models.Analyses;
using StructureHelperCommon.Models.Loggers; using StructureHelperCommon.Models.Loggers;
using StructureHelperCommon.Models.Projects;
using StructureHelperLogic.Models.Analyses; //Copyright (c) 2025 Redikultsev Evgeny, Ekaterinburg, Russia
using StructureHelperLogics.Models.CrossSections; //All rights reserved.
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace DataAccess.DTOs namespace DataAccess.DTOs
{ {
internal class VisualAnalysisToDTOConvertStrategy : ConvertStrategy<VisualAnalysisDTO, IVisualAnalysis> internal class VisualAnalysisToDTOConvertStrategy : ConvertStrategy<VisualAnalysisDTO, IVisualAnalysis>
{ {
private IConvertStrategy<IAnalysis, IAnalysis> convertStrategy; private IConvertStrategy<IAnalysis, IAnalysis> convertLogic;
public VisualAnalysisToDTOConvertStrategy(IConvertStrategy<IAnalysis, IAnalysis> convertStrategy)
{
this.convertStrategy = convertStrategy;
}
public VisualAnalysisToDTOConvertStrategy() : this(new AnalysisToDTOConvertStrategy())
{
}
public override VisualAnalysisDTO GetNewItem(IVisualAnalysis source) public override VisualAnalysisDTO GetNewItem(IVisualAnalysis source)
{ {
@@ -40,30 +21,29 @@ namespace DataAccess.DTOs
return visualAnalysisDTO; return visualAnalysisDTO;
} }
public VisualAnalysisToDTOConvertStrategy
(Dictionary<(Guid id, Type type), ISaveable> referenceDictionary,
IShiftTraceLogger traceLogger)
: base(referenceDictionary, traceLogger)
{
}
private VisualAnalysisDTO GetNewAnalysis(IVisualAnalysis source) private VisualAnalysisDTO GetNewAnalysis(IVisualAnalysis source)
{ {
VisualAnalysisDTO visualAnalysisDTO = new() InitializeStrategies();
VisualAnalysisDTO visualAnalysisDTO = new(source.Id)
{ {
Id = source.Id Analysis = convertLogic.Convert(source.Analysis)
}; };
convertStrategy.ReferenceDictionary = ReferenceDictionary;
convertStrategy.TraceLogger = TraceLogger;
var convertLogic = new DictionaryConvertStrategy<IAnalysis, IAnalysis>(this, convertStrategy)
{
ReferenceDictionary = ReferenceDictionary,
ConvertStrategy = convertStrategy,
TraceLogger = TraceLogger
};
visualAnalysisDTO.Analysis = convertLogic.Convert(source.Analysis);
return visualAnalysisDTO; return visualAnalysisDTO;
} }
private void Check() private void InitializeStrategies()
{ {
var checkLogic = new CheckConvertLogic<VisualAnalysisDTO, IVisualAnalysis>(); convertLogic ??= new DictionaryConvertStrategy<IAnalysis, IAnalysis>
checkLogic.ConvertStrategy = this; (this,
checkLogic.TraceLogger = TraceLogger; new AnalysisToDTOConvertStrategy(ReferenceDictionary, TraceLogger)
checkLogic.Check(); );
} }
} }
} }

View File

@@ -3,7 +3,7 @@ using StructureHelperCommon.Models.Analyses;
using StructureHelperLogics.Models.Analyses; using StructureHelperLogics.Models.Analyses;
using System.Windows.Media; using System.Windows.Media;
namespace DataAccess.DTOs.DTOEntities namespace DataAccess.DTOs
{ {
public class BeamShearAnalysisDTO : IBeamShearAnalysis public class BeamShearAnalysisDTO : IBeamShearAnalysis
{ {
@@ -18,6 +18,10 @@ namespace DataAccess.DTOs.DTOEntities
[JsonProperty("Color")] [JsonProperty("Color")]
public Color Color { get; set; } public Color Color { get; set; }
public IVersionProcessor VersionProcessor { get; set; } = new VersionProcessorDTO(); public IVersionProcessor VersionProcessor { get; set; } = new VersionProcessorDTO();
public BeamShearAnalysisDTO(Guid id)
{
Id = id;
}
public object Clone() public object Clone()

View File

@@ -13,16 +13,19 @@ namespace DataAccess.DTOs
public class ProjectDTO : IProject public class ProjectDTO : IProject
{ {
[JsonProperty("Id")] [JsonProperty("Id")]
public Guid Id { get; set; } public Guid Id { get;}
[JsonIgnore] [JsonIgnore]
public string FullFileName { get; set; } public string FullFileName { get; set; }
[JsonIgnore] [JsonIgnore]
public bool IsActual { get; set; } public bool IsActual { get; set; }
[JsonProperty("VisualAnalyses")] [JsonProperty("VisualAnalyses")]
public List<IVisualAnalysis> VisualAnalyses { get; set; } = new(); public List<IVisualAnalysis> VisualAnalyses { get; set; } = new();
[JsonIgnore] [JsonIgnore]
public string FileName { get; set; } public string FileName { get; set; }
public ProjectDTO(Guid id)
{
Id = id;
}
} }
} }

View File

@@ -13,12 +13,16 @@ namespace DataAccess.DTOs
{ {
[JsonProperty("Id")] [JsonProperty("Id")]
public Guid Id { get; set; } public Guid Id { get;}
[JsonProperty("Analysis")] [JsonProperty("Analysis")]
public IAnalysis Analysis { get; set; } public IAnalysis Analysis { get; set; }
[JsonIgnore] [JsonIgnore]
public Action ActionToRun { get; set; } public Action ActionToRun { get; set; }
public VisualAnalysisDTO(Guid id)
{
Id = id;
}
public object Clone() public object Clone()
{ {
return this; return this;

View File

@@ -30,6 +30,7 @@ namespace DataAccess.Infrastructures
catch (Exception ex) catch (Exception ex)
{ {
result.IsValid = false; result.IsValid = false;
TraceLogger?.AddMessage(ex.Message, TraceLogStatuses.Error);
result.Description += ex.Message; result.Description += ex.Message;
} }
return result; return result;

View File

@@ -1,11 +1,8 @@
using StructureHelperCommon.Models.Calculators; using StructureHelperLogics.Models.BeamShears;
using StructureHelperLogics.Models.BeamShears;
using StructureHelperLogics.NdmCalculations.Analyses; using StructureHelperLogics.NdmCalculations.Analyses;
using System;
using System.Collections.Generic; //Copyright (c) 2025 Redikultsev Evgeny, Ekaterinburg, Russia
using System.Linq; //All rights reserved.
using System.Text;
using System.Threading.Tasks;
namespace StructureHelper.Windows.BeamShears namespace StructureHelper.Windows.BeamShears
{ {

View File

@@ -49,6 +49,7 @@ namespace StructureHelper.Windows.BeamShears
var valueList = new List<double> var valueList = new List<double>
{ {
results[i].InputData.InclinedSection.EndCoord, results[i].InputData.InclinedSection.EndCoord,
results[i].InputData.InclinedSection.EndCoord / results[i].InputData.InclinedSection.EffectiveDepth,
results[i].InputData.ForceTuple.Nz * unitForce.Multiplyer, results[i].InputData.ForceTuple.Nz * unitForce.Multiplyer,
results[i].InputData.ForceTuple.Qy * unitForce.Multiplyer, results[i].InputData.ForceTuple.Qy * unitForce.Multiplyer,
results[i].TotalStrength * unitForce.Multiplyer, results[i].TotalStrength * unitForce.Multiplyer,
@@ -68,9 +69,10 @@ namespace StructureHelper.Windows.BeamShears
List<string> strings = new() List<string> strings = new()
{ {
"End coord", "End coord",
"a/d-ratio",
"Nz", "Nz",
"Qy", "Qy",
"Qlim", "Qult",
"Qb", "Qb",
"Qsw", "Qsw",
"Uf" "Uf"

View File

@@ -19,6 +19,12 @@ namespace StructureHelperCommon.Infrastructures.Interfaces
TraceLogger = traceLogger; TraceLogger = traceLogger;
} }
protected ConvertStrategy(IConvertStrategy<ISaveable, ISaveable> convertStrategy)
{
ReferenceDictionary = convertStrategy.ReferenceDictionary;
TraceLogger = convertStrategy.TraceLogger;
}
public ConvertStrategy() public ConvertStrategy()
{ {

View File

@@ -1,19 +1,21 @@
using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Infrastructures.Interfaces;
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media; using System.Windows.Media;
namespace StructureHelperCommon.Models.Analyses namespace StructureHelperCommon.Models.Analyses
{ {
/// <summary>
/// Implements propertis of analysis
/// </summary>
public interface IAnalysis : ISaveable, ICloneable public interface IAnalysis : ISaveable, ICloneable
{ {
string Name { get; set; } string Name { get; set; }
string Tags { get; set; } string Tags { get; set; }
string Comment { get; set; } string Comment { get; set; }
Color Color { get; set; } Color Color { get; set; }
/// <summary>
/// Processor of subversions of analysis
/// </summary>
IVersionProcessor VersionProcessor { get; set; } IVersionProcessor VersionProcessor { get; set; }
} }
} }

View File

@@ -9,14 +9,20 @@ using System.Windows.Media;
namespace StructureHelperLogics.Models.Analyses namespace StructureHelperLogics.Models.Analyses
{ {
/// <inheritdoc/>
public class BeamShearAnalysis : IBeamShearAnalysis public class BeamShearAnalysis : IBeamShearAnalysis
{ {
/// <inheritdoc/>
public Guid Id { get; } public Guid Id { get; }
/// <inheritdoc/>
public string Name { get; set; } = string.Empty; public string Name { get; set; } = string.Empty;
/// <inheritdoc/>
public string Tags { get; set; } = string.Empty; public string Tags { get; set; } = string.Empty;
/// <inheritdoc/>
public string Comment { get; set; } = string.Empty; public string Comment { get; set; } = string.Empty;
/// <inheritdoc/>
public Color Color { get; set; } = Color.FromRgb(128, 0, 0); public Color Color { get; set; } = Color.FromRgb(128, 0, 0);
/// <inheritdoc/>
public IVersionProcessor VersionProcessor { get; set; } = new VersionProcessor(); public IVersionProcessor VersionProcessor { get; set; } = new VersionProcessor();
public BeamShearAnalysis(Guid id) public BeamShearAnalysis(Guid id)
{ {

View File

@@ -3,12 +3,6 @@ using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Analyses; using StructureHelperCommon.Models.Analyses;
using StructureHelperCommon.Services; using StructureHelperCommon.Services;
using StructureHelperLogics.Models.BeamShears; using StructureHelperLogics.Models.BeamShears;
using StructureHelperLogics.Models.CrossSections;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.Models.Analyses namespace StructureHelperLogics.Models.Analyses
{ {

View File

@@ -7,6 +7,9 @@ using System.Threading.Tasks;
namespace StructureHelperLogics.Models.Analyses namespace StructureHelperLogics.Models.Analyses
{ {
/// <summary>
/// Implemants properties for analysis of beam for shear
/// </summary>
public interface IBeamShearAnalysis : IAnalysis public interface IBeamShearAnalysis : IAnalysis
{ {
} }

View File

@@ -1,16 +1,12 @@
using System; using StructureHelperCommon.Infrastructures.Interfaces;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.Models.BeamShears namespace StructureHelperLogics.Models.BeamShears
{ {
public class BeamShear : IBeamShear public class BeamShear : IBeamShear
{ {
private ICloneStrategy<IBeamShear> cloneStrategy;
public Guid Id { get; } public Guid Id { get; }
public IBeamShearRepository Repository { get; } = new BeamShearRepository(Guid.NewGuid()); public IBeamShearRepository Repository { get; set; } = new BeamShearRepository(Guid.NewGuid());
public BeamShear(Guid id) public BeamShear(Guid id)
{ {
Id = id; Id = id;
@@ -18,7 +14,10 @@ namespace StructureHelperLogics.Models.BeamShears
public object Clone() public object Clone()
{ {
throw new NotImplementedException(); var cloningStrategy = new DeepCloningStrategy();
cloneStrategy = new BeamShearCloneStrategy(cloningStrategy);
var newItem = cloneStrategy.GetClone(this);
return newItem;
} }
} }
} }

View File

@@ -1,25 +1,16 @@
using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Forces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.Models.BeamShears namespace StructureHelperLogics.Models.BeamShears
{ {
public class BeamShearRepository : IBeamShearRepository public class BeamShearRepository : IBeamShearRepository
{ {
private ICloneStrategy<IBeamShearRepository> cloneStrategy;
public Guid Id { get; } public Guid Id { get; }
public List<IBeamShearAction> Actions { get; } = new(); public List<IBeamShearAction> Actions { get; } = new();
public List<ICalculator> Calculators { get; } = new(); public List<ICalculator> Calculators { get; } = new();
public List<IBeamShearSection> Sections { get; } = new(); public List<IBeamShearSection> Sections { get; } = new();
public List<IStirrup> Stirrups { get; } = new(); public List<IStirrup> Stirrups { get; } = new();
@@ -30,7 +21,10 @@ namespace StructureHelperLogics.Models.BeamShears
public object Clone() public object Clone()
{ {
throw new NotImplementedException(); var cloningStrategy = new DeepCloningStrategy();
cloneStrategy = new BeamShearRepositoryCloneStrategy(cloningStrategy);
var newItem = cloneStrategy.GetClone(this);
return newItem;
} }
} }
} }

View File

@@ -9,6 +9,6 @@ namespace StructureHelperLogics.Models.BeamShears
{ {
public interface IBeamShear : ISaveable, ICloneable public interface IBeamShear : ISaveable, ICloneable
{ {
IBeamShearRepository Repository { get; } IBeamShearRepository Repository { get; set; }
} }
} }

View File

@@ -1,11 +1,8 @@
using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces;
using System; //Copyright (c) 2025 Redikultsev Evgeny, Ekaterinburg, Russia
using System.Collections.Generic; //All rights reserved.
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.Models.BeamShears namespace StructureHelperLogics.Models.BeamShears
{ {

View File

@@ -0,0 +1,31 @@
using StructureHelperCommon.Infrastructures.Interfaces;
namespace StructureHelperLogics.Models.BeamShears
{
public class BeamShearCloneStrategy : ICloneStrategy<IBeamShear>
{
private ICloningStrategy cloningStrategy;
private ICloneStrategy<IBeamShearRepository> cloneStrategy;
private BeamShear beamShear;
public BeamShearCloneStrategy(ICloningStrategy cloningStrategy)
{
this.cloningStrategy = cloningStrategy;
}
public IBeamShear GetClone(IBeamShear sourceObject)
{
InitializeStrategies();
beamShear = new(Guid.NewGuid())
{
Repository = cloneStrategy.GetClone(sourceObject.Repository)
};
return beamShear;
}
private void InitializeStrategies()
{
cloningStrategy = new DeepCloningStrategy();
cloneStrategy ??= new BeamShearRepositoryCloneStrategy(cloningStrategy);
}
}
}

View File

@@ -0,0 +1,37 @@
using StructureHelperCommon.Infrastructures.Interfaces;
//Copyright (c) 2025 Redikultsev Evgeny, Ekaterinburg, Russia
//All rights reserved.
namespace StructureHelperLogics.Models.BeamShears
{
public class BeamShearRepositoryCloneStrategy : ICloneStrategy<IBeamShearRepository>
{
private ICloningStrategy cloningStrategy;
private IUpdateStrategy<IHasBeamShearActions> actionUpdateStrategy;
private IUpdateStrategy<IHasBeamShearSections> sectionUpdateStrategy;
private IUpdateStrategy<IHasStirrups> stirrupUpdateStrategy;
private BeamShearRepository targetRepository;
public BeamShearRepositoryCloneStrategy(ICloningStrategy cloningStrategy)
{
this.cloningStrategy = cloningStrategy;
}
public IBeamShearRepository GetClone(IBeamShearRepository sourceObject)
{
InitializeStrategies();
targetRepository = new(Guid.NewGuid());
actionUpdateStrategy.Update(targetRepository, sourceObject);
sectionUpdateStrategy.Update(targetRepository, sourceObject);
stirrupUpdateStrategy.Update(targetRepository, sourceObject);
return targetRepository;
}
private void InitializeStrategies()
{
actionUpdateStrategy ??= new HasActionsUpdateCloneStrategy(cloningStrategy);
sectionUpdateStrategy ??= new HasSectionsUpdateCloneStrategy(cloningStrategy);
stirrupUpdateStrategy ??= new HasStirrupsUpdateCloneStrategy(cloningStrategy);
}
}
}

View File

@@ -0,0 +1,29 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Services;
namespace StructureHelperLogics.Models.BeamShears
{
public class HasActionsUpdateCloneStrategy : IUpdateStrategy<IHasBeamShearActions>
{
private readonly ICloningStrategy cloningStrategy;
public HasActionsUpdateCloneStrategy(ICloningStrategy cloningStrategy)
{
this.cloningStrategy = cloningStrategy;
}
public void Update(IHasBeamShearActions targetObject, IHasBeamShearActions sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Actions.Clear();
foreach (var item in sourceObject.Actions)
{
var newItem = cloningStrategy.Clone(item);
targetObject.Actions.Add(newItem);
}
}
}
}

View File

@@ -0,0 +1,29 @@
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Services;
namespace StructureHelperLogics.Models.BeamShears
{
public class HasSectionsUpdateCloneStrategy : IUpdateStrategy<IHasBeamShearSections>
{
private readonly ICloningStrategy cloningStrategy;
public HasSectionsUpdateCloneStrategy(ICloningStrategy cloningStrategy)
{
this.cloningStrategy = cloningStrategy;
}
public void Update(IHasBeamShearSections targetObject, IHasBeamShearSections sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Sections.Clear();
foreach (var item in sourceObject.Sections)
{
IBeamShearSection newSection = cloningStrategy.Clone(item);
targetObject.Sections.Add(newSection);
}
}
}
}

View File

@@ -0,0 +1,34 @@
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
{
public class HasStirrupsUpdateCloneStrategy : IUpdateStrategy<IHasStirrups>
{
private readonly ICloningStrategy cloningStrategy;
public HasStirrupsUpdateCloneStrategy(ICloningStrategy cloningStrategy)
{
this.cloningStrategy = cloningStrategy;
}
public void Update(IHasStirrups targetObject, IHasStirrups sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Stirrups.Clear();
foreach (var item in sourceObject.Stirrups)
{
IStirrup newStirrup = cloningStrategy.Clone(item);
targetObject.Stirrups.Add(newStirrup);
}
}
}
}

View File

@@ -11,7 +11,7 @@ namespace StructureHelperLogics.Models.CrossSections
{ {
public class CrossSectionRepositoryCloneStrategy : ICloneStrategy<ICrossSectionRepository> public class CrossSectionRepositoryCloneStrategy : ICloneStrategy<ICrossSectionRepository>
{ {
private ICloningStrategy cloningStrategy; private readonly ICloningStrategy cloningStrategy;
private CrossSectionRepository targetRepository; private CrossSectionRepository targetRepository;
private IUpdateStrategy<IHasForceActions> forcesUpdateStrategy; private IUpdateStrategy<IHasForceActions> forcesUpdateStrategy;
private IUpdateStrategy<IHasHeadMaterials> materialsUpdateStrategy; private IUpdateStrategy<IHasHeadMaterials> materialsUpdateStrategy;

View File

@@ -4,6 +4,7 @@ using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperLogics.Models.BeamShears.Logics; using StructureHelperLogics.Models.BeamShears.Logics;
using StructureHelperLogics.Models.BeamShears; using StructureHelperLogics.Models.BeamShears;
using StructureHelperCommon.Infrastructures.Enums;
namespace StructureHelperTests.UnitTests.BeamShearTests namespace StructureHelperTests.UnitTests.BeamShearTests
{ {
@@ -23,18 +24,18 @@ namespace StructureHelperTests.UnitTests.BeamShearTests
{ {
_mockLogger = new Mock<IShiftTraceLogger>(); _mockLogger = new Mock<IShiftTraceLogger>();
_mockSummaryForceLogic = new Mock<ISumForceByShearLoadLogic>(); _mockSummaryForceLogic = new Mock<ISumForceByShearLoadLogic>();
var mockAxisAction = new Mock<IBeamShearAxisAction>(); var mockAction = new Mock<IBeamShearAction>();
var mockInclinedSection = new Mock<IInclinedSection>(); var mockInclinedSection = new Mock<IInclinedSection>();
var mockShearLoad = new Mock<IBeamSpanLoad>(); var mockShearLoad = new Mock<IBeamSpanLoad>();
mockAxisAction.Setup(a => a.SupportForce.ForceTuple.Qx).Returns(100.0); mockAction.Setup(a => a.SupportAction.SupportForce.ForceTuple.Qx).Returns(100.0);
mockAxisAction.Setup(a => a.ShearLoads).Returns(new List<IBeamSpanLoad> { mockShearLoad.Object }); mockAction.Setup(a => a.SupportAction.ShearLoads).Returns(new List<IBeamSpanLoad> { mockShearLoad.Object });
mockInclinedSection.Setup(i => i.StartCoord).Returns(2.0); mockInclinedSection.Setup(i => i.StartCoord).Returns(2.0);
mockInclinedSection.Setup(i => i.EndCoord).Returns(5.0); mockInclinedSection.Setup(i => i.EndCoord).Returns(5.0);
_mockSummaryForceLogic.Setup(s => s.GetSumShearForce(mockShearLoad.Object, 2.0, 5.0)).Returns(new ForceTuple() { Qy = 50.0}); _mockSummaryForceLogic.Setup(s => s.GetSumShearForce(mockShearLoad.Object, 2.0, 5.0)).Returns(new ForceTuple() { Qy = 50.0});
_logic = new GetDirectShearForceLogic(mockAxisAction.Object, mockInclinedSection.Object, _mockLogger.Object, _mockSummaryForceLogic.Object); _logic = new GetDirectShearForceLogic(mockAction.Object, mockInclinedSection.Object, LimitStates.ULS, CalcTerms.ShortTerm, _mockLogger.Object, _mockSummaryForceLogic.Object);
} }
[Test] [Test]

View File

@@ -38,7 +38,7 @@ namespace StructureHelperTests.UnitTests.ConvertStrategiesTest
public void GetNewItem_ShouldLogStartAndEndMessages() public void GetNewItem_ShouldLogStartAndEndMessages()
{ {
// Arrange // Arrange
var projectDto = new ProjectDTO var projectDto = new ProjectDTO(Guid.Empty)
{ {
VisualAnalyses = new List<IVisualAnalysis> { new Mock<IVisualAnalysis>().Object } VisualAnalyses = new List<IVisualAnalysis> { new Mock<IVisualAnalysis>().Object }
}; };
@@ -59,7 +59,7 @@ namespace StructureHelperTests.UnitTests.ConvertStrategiesTest
public void GetNewItem_ShouldLogWarningIfNoAnalyses() public void GetNewItem_ShouldLogWarningIfNoAnalyses()
{ {
// Arrange // Arrange
var projectDto = new ProjectDTO var projectDto = new ProjectDTO(Guid.Empty)
{ {
VisualAnalyses = Enumerable.Empty<IVisualAnalysis>().ToList() VisualAnalyses = Enumerable.Empty<IVisualAnalysis>().ToList()
}; };
@@ -75,7 +75,7 @@ namespace StructureHelperTests.UnitTests.ConvertStrategiesTest
public void GetAnalyses_ShouldConvertEachVisualAnalysisAndLogCount() public void GetAnalyses_ShouldConvertEachVisualAnalysisAndLogCount()
{ {
// Arrange // Arrange
var projectDto = new ProjectDTO var projectDto = new ProjectDTO(Guid.Empty)
{ {
VisualAnalyses = new List<IVisualAnalysis> { new Mock<IVisualAnalysis>().Object, new Mock<IVisualAnalysis>().Object } VisualAnalyses = new List<IVisualAnalysis> { new Mock<IVisualAnalysis>().Object, new Mock<IVisualAnalysis>().Object }
}; };
@@ -98,7 +98,7 @@ namespace StructureHelperTests.UnitTests.ConvertStrategiesTest
public void GetAnalyses_ShouldLogConvertedAnalysisCount() public void GetAnalyses_ShouldLogConvertedAnalysisCount()
{ {
// Arrange // Arrange
var projectDto = new ProjectDTO var projectDto = new ProjectDTO(Guid.Empty)
{ {
VisualAnalyses = new List<IVisualAnalysis> { new Mock<IVisualAnalysis>().Object } VisualAnalyses = new List<IVisualAnalysis> { new Mock<IVisualAnalysis>().Object }
}; };