From 09dcf4e7e9c472d3865e383b8531cb2135da21fa Mon Sep 17 00:00:00 2001 From: Evgeny Redikultsev Date: Sun, 26 Oct 2025 22:19:25 +0500 Subject: [PATCH] Add triangulation of polygon --- .../DivisionSizeFromDTOConvertStrategy.cs | 32 ++++ ...mbinationFromFileFromDTOConvertStrategy.cs | 2 +- ...ceCombinationListFromDTOConvertStrategy.cs | 2 +- ...ForceFactoredListFromDTOConvertStrategy.cs | 2 +- ...lipseNdmPrimitiveFromDTOConvertStrategy.cs | 5 - .../HasPrimitivesFromDTOUpdateStrategy.cs | 5 - .../NdmElementFromDTOConvertStrategy.cs | 36 +++++ .../NdmElementToDTOConvertStrategy.cs | 14 +- .../NdmPrimitiveFromDTOConvertStrategy.cs | 19 ++- ...RebarNdmPrimitiveFromDTOConvertStrategy.cs | 5 - ...ShapeNdmPrimitiveFromDTOConvertStrategy.cs | 52 +++++++ .../LinePolygonFromDTOConvertStrategy.cs | 43 ++++++ .../Shapes/LinePolygonToDTOConvertStrategy.cs | 14 +- .../Shapes/Point2DFromDTOConvertStrategy.cs | 30 +--- .../Shapes/ShapeFromDTOConvertStrategy.cs | 6 + .../Shapes/VertexFtomDTOConvertStrategy.cs | 33 +++++ .../VisualPropertyFromDTOConvertStrategy.cs | 27 ++++ .../NdmCrossSections/NdmElementDTO.cs | 2 +- .../NdmCrossSections/ShapeNdmPrimitiveDTO.cs | 2 +- .../DTOEntities/Shapes/LinePolygonShapeDTO.cs | 5 +- .../DTOs/DTOEntities/TypeBinderListFactory.cs | 137 ++++++++++++------ .../Values/Primitives/ITrianglePrimitive.cs | 16 ++ .../Values/Primitives/TrianglePrimitive.cs | 31 ++++ .../PrimitiveServices/PrimitiveOperations.cs | 20 ++- .../FieldViewerViewModel.cs | 76 ++++++++-- .../Libraries/LoaderCalculator.dll | Bin 98816 -> 100352 bytes StructureHelper/Libraries/Triangle.dll | Bin 0 -> 200704 bytes .../ResultViewers/ShowIsoFieldResult.cs | 17 +++ .../Shapes/Logics/PolygonGeometryUtils.cs | 2 +- .../StructureHelperCommon.csproj | 2 +- .../Primitives/EllipseNdmPrimitive.cs | 2 +- .../Logics/EllipsePrimitiveUpdateStrategy.cs | 1 - .../Logics/NdmElementUpdateStrategy.cs | 1 + .../Primitives/PointNdmPrimitive.cs | 2 +- .../Primitives/RebarNdmPrimitive.cs | 4 +- .../Primitives/RectangleNdmPrimitive.cs | 2 +- .../Primitives/ShapeNdmPrimitive.cs | 12 +- .../CircleTriangulationLogic.cs | 6 +- .../CircleTriangulationLogicOptions.cs | 11 +- .../IShapeTriangulationLogicOptions.cs | 13 +- .../Triangulations/ITriangulationLogic.cs | 15 +- .../ITriangulationLogicOptions.cs | 2 +- .../LinePolygonTriangulationLogic.cs | 85 +++++++++++ .../LinePolygonTriangulationLogicOption.cs | 35 +++++ .../Triangulations/PointTriangulationLogic.cs | 2 +- .../PointTriangulationLogicOptions.cs | 2 +- .../Triangulations/RebarTriangulationLogic.cs | 4 +- .../RebarTriangulationLogicOptions.cs | 2 +- .../RectangleTriangulationLogic.cs | 6 +- .../RectangleTriangulationLogicOptions.cs | 17 +-- .../StructureHelperLogics.csproj | 3 + .../RectangleTriangulationTest.cs | 2 +- 52 files changed, 686 insertions(+), 180 deletions(-) create mode 100644 DataAccess/DTOs/Converters/DivisionSizeFromDTOConvertStrategy.cs create mode 100644 DataAccess/DTOs/Converters/NdmCrossSections/NdmElementFromDTOConvertStrategy.cs create mode 100644 DataAccess/DTOs/Converters/NdmCrossSections/ShapeNdmPrimitiveFromDTOConvertStrategy.cs create mode 100644 DataAccess/DTOs/Converters/Shapes/LinePolygonFromDTOConvertStrategy.cs create mode 100644 DataAccess/DTOs/Converters/Shapes/VertexFtomDTOConvertStrategy.cs create mode 100644 DataAccess/DTOs/Converters/VisualPropertyFromDTOConvertStrategy.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/ITrianglePrimitive.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/TrianglePrimitive.cs create mode 100644 StructureHelper/Libraries/Triangle.dll create mode 100644 StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogic.cs create mode 100644 StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogicOption.cs diff --git a/DataAccess/DTOs/Converters/DivisionSizeFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/DivisionSizeFromDTOConvertStrategy.cs new file mode 100644 index 0000000..053ebbb --- /dev/null +++ b/DataAccess/DTOs/Converters/DivisionSizeFromDTOConvertStrategy.cs @@ -0,0 +1,32 @@ +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperLogics.NdmCalculations.Primitives; + +namespace DataAccess.DTOs +{ + public class DivisionSizeFromDTOConvertStrategy : ConvertStrategy + { + IUpdateStrategy updateStrategy; + + public DivisionSizeFromDTOConvertStrategy(IUpdateStrategy updateStrategy) + { + this.updateStrategy = updateStrategy; + } + + public DivisionSizeFromDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) + { + updateStrategy = new DivisionSizeUpdateStrategy(); + } + + public override IDivisionSize GetNewItem(IDivisionSize source) + { + if (source is not DivisionSizeDTO sourceDTO) + { + throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(source)); + } + NewItem = new DivisionSize(source.Id); + updateStrategy.Update(NewItem, sourceDTO); + return NewItem; + } + } +} diff --git a/DataAccess/DTOs/Converters/Forces/ForceCombinationFromFileFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Forces/ForceCombinationFromFileFromDTOConvertStrategy.cs index c85c7d7..700de3d 100644 --- a/DataAccess/DTOs/Converters/Forces/ForceCombinationFromFileFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/Forces/ForceCombinationFromFileFromDTOConvertStrategy.cs @@ -104,7 +104,7 @@ namespace DataAccess.DTOs private void InitializeStrategies() { updateStrategy ??= new ForceCombinationFromFileUpdateStrategy(); - pointConvertStrategy = new Point2DFromDTOConvertStrategy() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger}; + pointConvertStrategy = new Point2DFromDTOConvertStrategy(this); combinationPropertyConvertStrategy = new FactoredCombinationPropertyFromDTOConvertStrategy(ReferenceDictionary, TraceLogger); fileConvertStrategy ??= new ColumnedFilePropertyFromDTOConvertStrategy() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger }; } diff --git a/DataAccess/DTOs/Converters/Forces/ForceCombinationListFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Forces/ForceCombinationListFromDTOConvertStrategy.cs index 56dd934..e532cd4 100644 --- a/DataAccess/DTOs/Converters/Forces/ForceCombinationListFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/Forces/ForceCombinationListFromDTOConvertStrategy.cs @@ -72,7 +72,7 @@ namespace DataAccess.DTOs { baseUpdateStrategy ??= new ForceActionBaseUpdateStrategy(); updateStrategy ??= new ForceCombinationListUpdateStrategy(); - pointConvertStrategy ??= new Point2DFromDTOConvertStrategy() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger}; + pointConvertStrategy ??= new Point2DFromDTOConvertStrategy(this); designTupleConvertStrategy ??= new DesignForceTupleFromDTOConvertStrategy() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger }; } } diff --git a/DataAccess/DTOs/Converters/Forces/ForceFactoredListFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Forces/ForceFactoredListFromDTOConvertStrategy.cs index 4bd8a3b..e2792fd 100644 --- a/DataAccess/DTOs/Converters/Forces/ForceFactoredListFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/Forces/ForceFactoredListFromDTOConvertStrategy.cs @@ -85,7 +85,7 @@ namespace DataAccess.DTOs { baseUpdateStrategy ??= new ForceActionBaseUpdateStrategy(); updateStrategy ??= new ForceFactoredListUpdateStrategy(); - pointConvertStrategy ??= new Point2DFromDTOConvertStrategy() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger}; + pointConvertStrategy ??= new Point2DFromDTOConvertStrategy(this); forceTupleConvertStrategy ??= new ForceTupleFromDTOConvertStrategy() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger }; combinationPropertyConvertStrategy ??= new FactoredCombinationPropertyFromDTOConvertStrategy(ReferenceDictionary, TraceLogger); } diff --git a/DataAccess/DTOs/Converters/NdmCrossSections/EllipseNdmPrimitiveFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/NdmCrossSections/EllipseNdmPrimitiveFromDTOConvertStrategy.cs index a8a328e..8a6b69f 100644 --- a/DataAccess/DTOs/Converters/NdmCrossSections/EllipseNdmPrimitiveFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/NdmCrossSections/EllipseNdmPrimitiveFromDTOConvertStrategy.cs @@ -1,10 +1,5 @@ using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperLogics.NdmCalculations.Primitives; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace DataAccess.DTOs { diff --git a/DataAccess/DTOs/Converters/NdmCrossSections/HasPrimitivesFromDTOUpdateStrategy.cs b/DataAccess/DTOs/Converters/NdmCrossSections/HasPrimitivesFromDTOUpdateStrategy.cs index 6d9b1b7..2126812 100644 --- a/DataAccess/DTOs/Converters/NdmCrossSections/HasPrimitivesFromDTOUpdateStrategy.cs +++ b/DataAccess/DTOs/Converters/NdmCrossSections/HasPrimitivesFromDTOUpdateStrategy.cs @@ -1,11 +1,6 @@ using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Services; using StructureHelperLogics.NdmCalculations.Primitives; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace DataAccess.DTOs.Converters { diff --git a/DataAccess/DTOs/Converters/NdmCrossSections/NdmElementFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/NdmCrossSections/NdmElementFromDTOConvertStrategy.cs new file mode 100644 index 0000000..97e6542 --- /dev/null +++ b/DataAccess/DTOs/Converters/NdmCrossSections/NdmElementFromDTOConvertStrategy.cs @@ -0,0 +1,36 @@ +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models.Forces; +using StructureHelperLogics.NdmCalculations.Primitives; +using StructureHelperLogics.NdmCalculations.Primitives.Logics; + +namespace DataAccess.DTOs +{ + public class NdmElementFromDTOConvertStrategy : ConvertStrategy + { + private IUpdateStrategy updateStrategy; + private IUpdateStrategy forceUpdateStrategy = new ForceTupleUpdateStrategy(); + private NdmElement newItem; + + public NdmElementFromDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) + { + } + + public override INdmElement GetNewItem(INdmElement source) + { + if (source is not NdmElementDTO sourceDTO) + { + throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(source)); + } + newItem = new NdmElement(sourceDTO.Id); + updateStrategy = new NdmElementUpdateStrategy() { UpdateChildren = false}; + updateStrategy.Update(newItem, sourceDTO); + forceUpdateStrategy.Update(newItem.UsersPrestrain, source.UsersPrestrain); + //newItem.UsersPrestrain.Id = source.UsersPrestrain.Id; + //forceUpdateStrategy.Update(newItem.AutoPrestrain, source.AutoPrestrain); + //(newItem.AutoPrestrain as ForceTupleDTO).Id = source.AutoPrestrain.Id; + NewItem = newItem; + return NewItem; + } + } +} diff --git a/DataAccess/DTOs/Converters/NdmCrossSections/NdmElementToDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/NdmCrossSections/NdmElementToDTOConvertStrategy.cs index 29895ec..83fd7b4 100644 --- a/DataAccess/DTOs/Converters/NdmCrossSections/NdmElementToDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/NdmCrossSections/NdmElementToDTOConvertStrategy.cs @@ -54,16 +54,20 @@ namespace DataAccess.DTOs updateStrategy.Update(newItem, source); headMaterialConvertStrategy.ReferenceDictionary = ReferenceDictionary; headMaterialConvertStrategy.TraceLogger = TraceLogger; - var convertLogic = new DictionaryConvertStrategy(this, headMaterialConvertStrategy); + var headMaterialLogic = new DictionaryConvertStrategy(this, headMaterialConvertStrategy); if (source.HeadMaterial != null) { - var headMaterial = convertLogic.Convert(source.HeadMaterial); + var headMaterial = headMaterialLogic.Convert(source.HeadMaterial); newItem.HeadMaterial = headMaterial; - } + } + else + { + newItem.HeadMaterial = null; + } forceUpdateStrategy.Update(newItem.UsersPrestrain, source.UsersPrestrain); (newItem.UsersPrestrain as ForceTupleDTO).Id = source.UsersPrestrain.Id; - forceUpdateStrategy.Update(newItem.AutoPrestrain, source.AutoPrestrain); - (newItem.AutoPrestrain as ForceTupleDTO).Id = source.AutoPrestrain.Id; + //forceUpdateStrategy.Update(newItem.AutoPrestrain, source.AutoPrestrain); + //(newItem.AutoPrestrain as ForceTupleDTO).Id = source.AutoPrestrain.Id; return newItem; } diff --git a/DataAccess/DTOs/Converters/NdmCrossSections/NdmPrimitiveFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/NdmCrossSections/NdmPrimitiveFromDTOConvertStrategy.cs index 7fc126f..f9d56e3 100644 --- a/DataAccess/DTOs/Converters/NdmCrossSections/NdmPrimitiveFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/NdmCrossSections/NdmPrimitiveFromDTOConvertStrategy.cs @@ -45,9 +45,12 @@ namespace DataAccess.DTOs public override INdmPrimitive GetNewItem(INdmPrimitive source) { - GetMaterial(source.NdmElement.HeadMaterial); INdmPrimitive newItem = GetNewPrimitive(source); - newItem.NdmElement.HeadMaterial = headMaterial; + if (source.NdmElement.HeadMaterial != null) + { + GetMaterial(source.NdmElement.HeadMaterial); + newItem.NdmElement.HeadMaterial = headMaterial; + } return newItem; } @@ -69,11 +72,23 @@ namespace DataAccess.DTOs { return GetRectangle(rectangle); } + if (source is ShapeNdmPrimitiveDTO shape) + { + return GetShape(shape); + } string errorString = ErrorStrings.ObjectTypeIsUnknownObj(source); TraceLogger.AddMessage(errorString, TraceLogStatuses.Error); throw new StructureHelperException(errorString); } + private INdmPrimitive GetShape(ShapeNdmPrimitiveDTO shape) + { + TraceLogger?.AddMessage($"{PrimitiveIs} shape ndm primitive"); + ShapeNdmPrimitiveFromDTOConvertStrategy convertStrategy = new(this); + IShapeNdmPrimitive shapeNdmPrimitive = convertStrategy.Convert(shape); + return shapeNdmPrimitive; + } + private void GetMaterial(IHeadMaterial source) { HeadMaterialFromDTOConvertStrategy convertStrategy = new() diff --git a/DataAccess/DTOs/Converters/NdmCrossSections/RebarNdmPrimitiveFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/NdmCrossSections/RebarNdmPrimitiveFromDTOConvertStrategy.cs index 2a46a4f..f51f571 100644 --- a/DataAccess/DTOs/Converters/NdmCrossSections/RebarNdmPrimitiveFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/NdmCrossSections/RebarNdmPrimitiveFromDTOConvertStrategy.cs @@ -1,10 +1,5 @@ using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperLogics.NdmCalculations.Primitives; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace DataAccess.DTOs { diff --git a/DataAccess/DTOs/Converters/NdmCrossSections/ShapeNdmPrimitiveFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/NdmCrossSections/ShapeNdmPrimitiveFromDTOConvertStrategy.cs new file mode 100644 index 0000000..fe508bd --- /dev/null +++ b/DataAccess/DTOs/Converters/NdmCrossSections/ShapeNdmPrimitiveFromDTOConvertStrategy.cs @@ -0,0 +1,52 @@ +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models.Shapes; +using StructureHelperLogics.NdmCalculations.Primitives; + +namespace DataAccess.DTOs +{ + public class ShapeNdmPrimitiveFromDTOConvertStrategy : ConvertStrategy + { + IUpdateStrategy updateStrategy; + private IConvertStrategy shapeConvertStrategy; + private IConvertStrategy ndmElementConvertStrategy; + private IConvertStrategy pointConvertStrategy; + private IConvertStrategy visualPropsConvertStrategy; + private IConvertStrategy divisionConvertStrategy; + + private ShapeNdmPrimitive newItem; + + public ShapeNdmPrimitiveFromDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) + { + updateStrategy = new ShapeNdmPrimitiveUpdateStrategy() { UpdateChildren = false }; + shapeConvertStrategy = new ShapeFromDTOConvertStrategy(this); + ndmElementConvertStrategy = new NdmElementFromDTOConvertStrategy(this); + pointConvertStrategy = new Point2DFromDTOConvertStrategy(this); + visualPropsConvertStrategy = new VisualPropertyFromDTOConvertStrategy(this); + divisionConvertStrategy = new DivisionSizeFromDTOConvertStrategy(this); + } + + public override IShapeNdmPrimitive GetNewItem(IShapeNdmPrimitive source) + { + ChildClass = this; + if (source is not ShapeNdmPrimitiveDTO sourceDTO) + { + throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(source) + ": source shape is not DTO object"); + } + newItem = new(source.Id); + updateStrategy.Update(newItem, sourceDTO); + updateChildProperties(sourceDTO); + NewItem = newItem; + return NewItem; + } + private void updateChildProperties(ShapeNdmPrimitiveDTO source) + { + newItem.SetShape(shapeConvertStrategy.Convert(source.Shape)); + newItem.NdmElement = ndmElementConvertStrategy.Convert(source.NdmElement); + newItem.Center = pointConvertStrategy.Convert(source.Center as Point2DDTO); + newItem.VisualProperty = visualPropsConvertStrategy.Convert(source.VisualProperty as VisualPropertyDTO); + newItem.DivisionSize = divisionConvertStrategy.Convert(source.DivisionSize); + } + + } +} diff --git a/DataAccess/DTOs/Converters/Shapes/LinePolygonFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Shapes/LinePolygonFromDTOConvertStrategy.cs new file mode 100644 index 0000000..6e04304 --- /dev/null +++ b/DataAccess/DTOs/Converters/Shapes/LinePolygonFromDTOConvertStrategy.cs @@ -0,0 +1,43 @@ +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models.Shapes; + +namespace DataAccess.DTOs +{ + public class LinePolygonFromDTOConvertStrategy : ConvertStrategy + { + private IUpdateStrategy updateStrategy; + private IConvertStrategy vertexConvertStrategy; + private LinePolygonShape newItem; + + public LinePolygonFromDTOConvertStrategy(IUpdateStrategy updateStrategy) + { + this.updateStrategy = updateStrategy; + } + + public LinePolygonFromDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) + { + updateStrategy = new LinePolygonShapeUpdateStrategy() { UpdateChildren = false }; + vertexConvertStrategy = new VertexFtomDTOConvertStrategy(this); + } + + public override ILinePolygonShape GetNewItem(ILinePolygonShape source) + { + ChildClass = this; + if (source is not LinePolygonShapeDTO sourceDTO) + { + throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(source) + ": source line polygon is not DTO object"); + } + newItem = new(sourceDTO.Id); + updateStrategy.Update(newItem, sourceDTO); + newItem.Clear(); + foreach (var item in source.Vertices) + { + IVertex newVertex = vertexConvertStrategy.Convert(item); + newItem.AddVertex(newVertex); + } + NewItem = newItem; + return NewItem; + } + } +} diff --git a/DataAccess/DTOs/Converters/Shapes/LinePolygonToDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Shapes/LinePolygonToDTOConvertStrategy.cs index 8a773c7..e3b1f7d 100644 --- a/DataAccess/DTOs/Converters/Shapes/LinePolygonToDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/Shapes/LinePolygonToDTOConvertStrategy.cs @@ -12,24 +12,26 @@ namespace DataAccess.DTOs { private IUpdateStrategy updateStrategy; private IConvertStrategy vertexConvertStrategy; + private LinePolygonShapeDTO newItem; public LinePolygonToDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) { + updateStrategy = new LinePolygonShapeUpdateStrategy() { UpdateChildren = false }; + vertexConvertStrategy = new VertexToDTOConvertStrategy(this); } public override LinePolygonShapeDTO GetNewItem(ILinePolygonShape source) { ChildClass = this; - NewItem = new(source.Id); - updateStrategy = new LinePolygonShapeUpdateStrategy() { UpdateChildren = false }; - vertexConvertStrategy = new VertexToDTOConvertStrategy(this); - updateStrategy.Update(NewItem, source); - NewItem.Clear(); + newItem = new(source.Id); + updateStrategy.Update(newItem, source); + newItem.Clear(); foreach (var item in source.Vertices) { VertexDTO newVertex = vertexConvertStrategy.Convert(item); - NewItem.AddVertex(newVertex); + newItem.AddVertex(newVertex); } + NewItem = newItem; return NewItem; } } diff --git a/DataAccess/DTOs/Converters/Shapes/Point2DFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Shapes/Point2DFromDTOConvertStrategy.cs index 0569170..f2d7787 100644 --- a/DataAccess/DTOs/Converters/Shapes/Point2DFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/Shapes/Point2DFromDTOConvertStrategy.cs @@ -1,12 +1,5 @@ using StructureHelperCommon.Infrastructures.Interfaces; -using StructureHelperCommon.Models.Loggers; -using StructureHelperCommon.Models; using StructureHelperCommon.Models.Shapes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace DataAccess.DTOs { @@ -24,27 +17,16 @@ namespace DataAccess.DTOs } - public override Point2D GetNewItem(Point2DDTO source) + public Point2DFromDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) { - TraceLogger?.AddMessage("Point 2D converting has been started"); - try - { - Point2D newItem = GetNewItemBySource(source); - TraceLogger?.AddMessage("Point 2D converting has been finished"); - return newItem; - } - catch (Exception ex) - { - TraceLogger?.AddMessage($"Logic: {LoggerStrings.LogicType(this)} made error: {ex.Message}", TraceLogStatuses.Error); - throw; - } + updateStrategy = new Point2DUpdateStrategy(); } - private Point2D GetNewItemBySource(Point2DDTO source) + public override Point2D GetNewItem(Point2DDTO source) { - Point2D newItem = new(source.Id); - updateStrategy.Update(newItem, source); - return newItem; + NewItem = new(source.Id); + updateStrategy.Update(NewItem, source); + return NewItem; } } } diff --git a/DataAccess/DTOs/Converters/Shapes/ShapeFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Shapes/ShapeFromDTOConvertStrategy.cs index df50109..69b0052 100644 --- a/DataAccess/DTOs/Converters/Shapes/ShapeFromDTOConvertStrategy.cs +++ b/DataAccess/DTOs/Converters/Shapes/ShapeFromDTOConvertStrategy.cs @@ -28,6 +28,12 @@ namespace DataAccess.DTOs (this, new CircleShapeFromDTOConvertStrategy(this)); NewItem = circleConvertStrategy.Convert(circleShapeDTO); } + else if (source is LinePolygonShapeDTO linePolygonDTO) + { + var polygonConvertStrategy = new DictionaryConvertStrategy + (this, new LinePolygonFromDTOConvertStrategy(this)); + NewItem = polygonConvertStrategy.Convert(linePolygonDTO); + } else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(source) + ": shape is unknown"); diff --git a/DataAccess/DTOs/Converters/Shapes/VertexFtomDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/Shapes/VertexFtomDTOConvertStrategy.cs new file mode 100644 index 0000000..6b2ce03 --- /dev/null +++ b/DataAccess/DTOs/Converters/Shapes/VertexFtomDTOConvertStrategy.cs @@ -0,0 +1,33 @@ +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models.Shapes; + +namespace DataAccess.DTOs +{ + public class VertexFtomDTOConvertStrategy : ConvertStrategy + { + private IUpdateStrategy updateStrategy; + private IConvertStrategy pointConvertStrategy; + private Vertex newItem; + + public VertexFtomDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) + { + updateStrategy = new VertexUpdateStrategy() { UpdateChildren = false }; + pointConvertStrategy = new Point2DFromDTOConvertStrategy(this); + } + + public override IVertex GetNewItem(IVertex source) + { + ChildClass = this; + if (source is not VertexDTO sourceDTO) + { + throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(source) + ": source vertex is not DTO object"); + } + newItem = new(sourceDTO.Id); + updateStrategy.Update(newItem, sourceDTO); + newItem.Point = pointConvertStrategy.Convert(sourceDTO.Point as Point2DDTO); + NewItem = newItem; + return NewItem; + } + } +} diff --git a/DataAccess/DTOs/Converters/VisualPropertyFromDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/VisualPropertyFromDTOConvertStrategy.cs new file mode 100644 index 0000000..d4f6038 --- /dev/null +++ b/DataAccess/DTOs/Converters/VisualPropertyFromDTOConvertStrategy.cs @@ -0,0 +1,27 @@ +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperLogics.NdmCalculations.Primitives; + +namespace DataAccess.DTOs +{ + public class VisualPropertyFromDTOConvertStrategy : ConvertStrategy + { + IUpdateStrategy updateStrategy; + + public VisualPropertyFromDTOConvertStrategy(IUpdateStrategy updateStrategy) + { + this.updateStrategy = updateStrategy; + } + + public VisualPropertyFromDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) + { + updateStrategy = new VisualPropsUpdateStrategy(); + } + + public override IVisualProperty GetNewItem(VisualPropertyDTO source) + { + NewItem = new VisualProperty(source.Id); + updateStrategy.Update(NewItem, source); + return NewItem; + } + } +} diff --git a/DataAccess/DTOs/DTOEntities/NdmCrossSections/NdmElementDTO.cs b/DataAccess/DTOs/DTOEntities/NdmCrossSections/NdmElementDTO.cs index 7e6db12..f9b2170 100644 --- a/DataAccess/DTOs/DTOEntities/NdmCrossSections/NdmElementDTO.cs +++ b/DataAccess/DTOs/DTOEntities/NdmCrossSections/NdmElementDTO.cs @@ -15,7 +15,7 @@ namespace DataAccess.DTOs public bool Triangulate { get; set; } [JsonProperty("UsersPrestrain")] public IForceTuple UsersPrestrain { get; set; } = new ForceTupleDTO(Guid.NewGuid()); - [JsonProperty("AutoPrestrain")] + [JsonIgnore] public IForceTuple AutoPrestrain { get; set; } = new ForceTupleDTO(Guid.NewGuid()); public NdmElementDTO(Guid id) diff --git a/DataAccess/DTOs/DTOEntities/NdmCrossSections/ShapeNdmPrimitiveDTO.cs b/DataAccess/DTOs/DTOEntities/NdmCrossSections/ShapeNdmPrimitiveDTO.cs index 6c7c2eb..aa03473 100644 --- a/DataAccess/DTOs/DTOEntities/NdmCrossSections/ShapeNdmPrimitiveDTO.cs +++ b/DataAccess/DTOs/DTOEntities/NdmCrossSections/ShapeNdmPrimitiveDTO.cs @@ -21,7 +21,7 @@ namespace DataAccess.DTOs [JsonProperty("Name")] public string? Name { get; set; } [JsonProperty("Shape")] - public IShape Shape => shape; + public IShape Shape { get => shape; set => shape = value; } [JsonProperty("NdmElement")] public INdmElement NdmElement { get; set; } [JsonProperty("Center")] diff --git a/DataAccess/DTOs/DTOEntities/Shapes/LinePolygonShapeDTO.cs b/DataAccess/DTOs/DTOEntities/Shapes/LinePolygonShapeDTO.cs index 3d8255e..02f43d4 100644 --- a/DataAccess/DTOs/DTOEntities/Shapes/LinePolygonShapeDTO.cs +++ b/DataAccess/DTOs/DTOEntities/Shapes/LinePolygonShapeDTO.cs @@ -9,10 +9,11 @@ namespace DataAccess.DTOs [JsonProperty("Id")] public Guid Id { get; } [JsonProperty("Vertices")] - public IReadOnlyList Vertices => _vertices; + public List VerticesList {get => _vertices;} [JsonProperty("IsClosed")] public bool IsClosed { get; set; } - + [JsonIgnore] + public IReadOnlyList Vertices => _vertices; public LinePolygonShapeDTO(Guid id) { diff --git a/DataAccess/DTOs/DTOEntities/TypeBinderListFactory.cs b/DataAccess/DTOs/DTOEntities/TypeBinderListFactory.cs index d93c2b8..0612a3a 100644 --- a/DataAccess/DTOs/DTOEntities/TypeBinderListFactory.cs +++ b/DataAccess/DTOs/DTOEntities/TypeBinderListFactory.cs @@ -5,6 +5,7 @@ using StructureHelperCommon.Models.Analyses; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Materials.Libraries; +using StructureHelperCommon.Models.Shapes; using StructureHelperLogics.Models.BeamShears; using StructureHelperLogics.NdmCalculations.Primitives; @@ -34,70 +35,117 @@ namespace DataAccess.DTOs List<(Type type, string name)> newList = new List<(Type type, string name)> { { (typeof(AccuracyDTO), "Accuracy") }, - { (typeof(CircleShapeDTO), "CircleShape") }, - { (typeof(ConcreteLibMaterialDTO), "ConcreteLibMaterial") }, { (typeof(ColumnFilePropertyDTO), "ColumnFileProperty") }, { (typeof(ColumnedFilePropertyDTO), "ColumnedFileProperty") }, { (typeof(CompressedMemberDTO), "CompressedMember") }, - { (typeof(CrackCalculatorDTO), "CrackCalculator") }, - { (typeof(CrackCalculatorInputDataDTO), "CrackCalculatorInputData") }, - { (typeof(CrossSectionDTO), "CrossSection") }, - { (typeof(CrossSectionNdmAnalysisDTO), "CrossSectionNdmAnalysis") }, - { (typeof(CrossSectionRepositoryDTO), "CrossSectionRepository") }, - { (typeof(DateVersionDTO), "DateVersion") }, - { (typeof(DesignForceTupleDTO), "DesignForceTuple") }, { (typeof(DivisionSizeDTO), "DivisionSize") }, - { (typeof(ElasticMaterialDTO), "ElasticMaterial") }, - { (typeof(EllipseNdmPrimitiveDTO), "EllipseNdmPrimitive") }, - { (typeof(FileVersionDTO), "FileVersion") }, - { (typeof(ForceCalculatorDTO), "ForceCalculator") }, - { (typeof(ForceCalculatorInputDataDTO), "ForceCalculatorInputData") }, - { (typeof(FRMaterialDTO), "FRMaterial") }, - { (typeof(HeadMaterialDTO), "HeadMaterial") }, - { (typeof(MaterialSafetyFactorDTO), "MaterialSafetyFactor") }, - { (typeof(NdmElementDTO), "NdmElement") }, - { (typeof(IVisualAnalysis), "IVisualAnalysis") }, { (typeof(List), "ListOfCalcTerms") }, { (typeof(List), "ColumnFileProperties") }, { (typeof(List), "ColumnedFileProperties") }, - { (typeof(List), "ListOfICalculator") }, - { (typeof(List), "ListOfIDateVersion") }, - { (typeof(List), "ListOfIDesignForceTuple") }, - { (typeof(List), "ListOfIForceAction") }, - { (typeof(List), "ListOfIForceTuple") }, - { (typeof(List), "ListOfIHeadMaterial") }, { (typeof(List), "ListOfLimitState") }, - { (typeof(List), "ListOfMaterialSafetyFactor") }, - { (typeof(List), "ListOfMaterialPartialFactor") }, - { (typeof(List), "ListOfINdmPrimitive") }, { (typeof(List), "ListOfPartialFactor") }, - { (typeof(List), "ListOfIVisualAnalysis") }, - { (typeof(Point2DDTO), "Point2D") }, - { (typeof(PointNdmPrimitiveDTO), "PointNdmPrimitive") }, - { (typeof(PrimitiveVisualPropertyDTO), "PrimitiveVisualProperty") }, - { (typeof(ProjectDTO), "Project") }, - { (typeof(RebarNdmPrimitiveDTO), "RebarNdmPrimitive") }, { (typeof(RebarSectionDTO), "RebarSection") }, - { (typeof(RectangleNdmPrimitiveDTO), "RectangleNdmPrimitive") }, - { (typeof(RectangleShapeDTO), "RectangleShape") }, - { (typeof(ReinforcementLibMaterialDTO), "ReinforcementLibMaterial") }, - { (typeof(RootObjectDTO), "RootObject") }, - { (typeof(MaterialPartialFactorDTO), "MaterialPartialFactor") }, - { (typeof(VersionProcessorDTO), "VersionProcessor") }, - { (typeof(VisualAnalysisDTO), "VisualAnalysis") }, { (typeof(VisualPropertyDTO), "VisualProperty") }, - { (typeof(UserCrackInputDataDTO), "UserCrackInputData") }, { (typeof(WorkPlanePropertyDTO), "WorkPlanePropertyDTO") }, }; + newList.AddRange(GetProjectList()); + newList.AddRange(GetGeometryShapeList()); newList.AddRange(GetForceList()); - newList.AddRange(GetListForBeamShear()); + newList.AddRange(GetMaterialList()); + newList.AddRange(GetCalculatorList()); + newList.AddRange(GetNdmPrimitiveList()); + newList.AddRange(GetBeamShearList()); return newList; } + private static List<(Type type, string name)> GetProjectList() + { + List<(Type type, string name)> newList = new() + { + { (typeof(List), "ListOfIVisualAnalysis") }, + { (typeof(List), "ListOfIDateVersion") }, + { (typeof(RootObjectDTO), "RootObject") }, + { (typeof(ProjectDTO), "Project") }, + { (typeof(VersionProcessorDTO), "VersionProcessor") }, + { (typeof(DateVersionDTO), "DateVersion") }, + { (typeof(IVisualAnalysis), "IVisualAnalysis") }, + { (typeof(VisualAnalysisDTO), "VisualAnalysis") }, + { (typeof(FileVersionDTO), "FileVersion") }, + + }; + return newList; + } + private static List<(Type type, string name)> GetMaterialList() + { + List<(Type type, string name)> newList = new() + { + { (typeof(List), "ListOfMaterialPartialFactor") }, + { (typeof(ConcreteLibMaterialDTO), "ConcreteLibMaterial") }, + { (typeof(ElasticMaterialDTO), "ElasticMaterial") }, + { (typeof(FRMaterialDTO), "FRMaterial") }, + { (typeof(HeadMaterialDTO), "HeadMaterial") }, + { (typeof(List), "ListOfIHeadMaterial") }, + { (typeof(MaterialSafetyFactorDTO), "MaterialSafetyFactor") }, + { (typeof(List), "ListOfMaterialSafetyFactor") }, + { (typeof(MaterialPartialFactorDTO), "MaterialPartialFactor") }, + { (typeof(ReinforcementLibMaterialDTO), "ReinforcementLibMaterial") }, + }; + return newList; + } + private static List<(Type type, string name)> GetCalculatorList() + { + List<(Type type, string name)> newList = new() + { + { (typeof(List), "ListOfICalculator") }, + { (typeof(ForceCalculatorDTO), "ForceCalculator") }, + { (typeof(ForceCalculatorInputDataDTO), "ForceCalculatorInputData") }, + { (typeof(CrackCalculatorDTO), "CrackCalculator") }, + { (typeof(CrackCalculatorInputDataDTO), "CrackCalculatorInputData") }, + { (typeof(UserCrackInputDataDTO), "UserCrackInputData") }, + + }; + return newList; + } + private static List<(Type type, string name)> GetNdmPrimitiveList() + { + List<(Type type, string name)> newList = new() + { + { (typeof(List), "ListOfINdmPrimitive") }, + { (typeof(CrossSectionNdmAnalysisDTO), "CrossSectionNdmAnalysis") }, + { (typeof(CrossSectionDTO), "CrossSection") }, + { (typeof(CrossSectionRepositoryDTO), "CrossSectionRepository") }, + { (typeof(NdmElementDTO), "NdmElement") }, + { (typeof(PointNdmPrimitiveDTO), "PointNdmPrimitive") }, + { (typeof(RebarNdmPrimitiveDTO), "RebarNdmPrimitive") }, + { (typeof(RectangleNdmPrimitiveDTO), "RectangleNdmPrimitive") }, + { (typeof(EllipseNdmPrimitiveDTO), "EllipseNdmPrimitive") }, + { (typeof(ShapeNdmPrimitiveDTO), "ShapeNdmPrimitive") }, + { (typeof(PrimitiveVisualPropertyDTO), "PrimitiveVisualProperty") }, + + }; + return newList; + } + private static List<(Type type, string name)> GetGeometryShapeList() + { + List<(Type type, string name)> newList = new() + { + { (typeof(List), "ListOfVertex2D") }, + { (typeof(Point2DDTO), "Point2D") }, + { (typeof(VertexDTO), "Vertex2D") }, + { (typeof(RectangleShapeDTO), "RectangleShape") }, + { (typeof(CircleShapeDTO), "CircleShape") }, + { (typeof(LinePolygonShapeDTO), "LinePolygonShape") }, + }; + return newList; + } private static List<(Type type, string name)> GetForceList() { List<(Type type, string name)> newList = new() { + { (typeof(List), "ListOfIForceAction") }, + { (typeof(List), "ListOfIDesignForceTuple") }, + { (typeof(List), "ListOfIForceTuple") }, + { (typeof(DesignForceTupleDTO), "DesignForceTuple") }, { (typeof(ConcentratedForceDTO), "ConcentratedForce") }, { (typeof(DistributedLoadDTO), "DistributedLoad") }, { (typeof(FactoredForceTupleDTO), "FactoredForceTuple") }, @@ -110,8 +158,7 @@ namespace DataAccess.DTOs }; return newList; } - - private static List<(Type type, string name)> GetListForBeamShear() + private static List<(Type type, string name)> GetBeamShearList() { List<(Type type, string name)> newList = new() { diff --git a/FieldVisualizer/Entities/Values/Primitives/ITrianglePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/ITrianglePrimitive.cs new file mode 100644 index 0000000..f800c68 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/ITrianglePrimitive.cs @@ -0,0 +1,16 @@ +using StructureHelperCommon.Models.Shapes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + public interface ITrianglePrimitive : IValuePrimitive + { + IPoint2D Point1 { get; set; } + IPoint2D Point2 { get; set; } + IPoint2D Point3 { get; set; } + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/TrianglePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/TrianglePrimitive.cs new file mode 100644 index 0000000..c377fe0 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/TrianglePrimitive.cs @@ -0,0 +1,31 @@ +using StructureHelperCommon.Models.Shapes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + public class TrianglePrimitive : ITrianglePrimitive + { + public double Value { get; set; } + + public IPoint2D Point1 { get; set; } + public IPoint2D Point2 { get; set; } + public IPoint2D Point3 { get; set; } + + // --- Computed properties --- + + // Centroid (geometric center) + public double CenterX => (Point1.X + Point2.X + Point3.X) / 3.0; + public double CenterY => (Point1.Y + Point2.Y + Point3.Y) / 3.0; + + // Triangle area using determinant formula + public double Area => + 0.5 * Math.Abs( + (Point2.X - Point1.X) * (Point3.Y - Point1.Y) - + (Point3.X - Point1.X) * (Point2.Y - Point1.Y) + ); + } +} diff --git a/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs b/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs index c043a8c..cb1913a 100644 --- a/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs +++ b/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs @@ -53,19 +53,23 @@ namespace FieldVisualizer.Services.PrimitiveServices List coords = new List(); foreach (var primitive in valuePrimitives) { - if (primitive is IRectanglePrimitive) + if (primitive is IRectanglePrimitive rectanglePrimitive) { - IRectanglePrimitive rectanglePrimitive = primitive as IRectanglePrimitive; coords.Add(rectanglePrimitive.CenterX + rectanglePrimitive.Width / 2); coords.Add(rectanglePrimitive.CenterX - rectanglePrimitive.Width / 2); } - else if (primitive is ICirclePrimitive) + else if (primitive is ICirclePrimitive circlePrimitive) { - ICirclePrimitive circlePrimitive = primitive as ICirclePrimitive; coords.Add(circlePrimitive.CenterX + circlePrimitive.Diameter / 2); coords.Add(circlePrimitive.CenterX - circlePrimitive.Diameter / 2); } - else { throw new FieldVisulizerException(ErrorStrings.PrimitiveTypeIsUnknown);} + else if (primitive is ITrianglePrimitive triangle) + { + coords.Add(triangle.Point1.X); + coords.Add(triangle.Point2.X); + coords.Add(triangle.Point3.X); + } + else { throw new FieldVisulizerException(ErrorStrings.PrimitiveTypeIsUnknown); } } return coords; } @@ -87,6 +91,12 @@ namespace FieldVisualizer.Services.PrimitiveServices coords.Add(circlePrimitive.CenterY + circlePrimitive.Diameter / 2); coords.Add(circlePrimitive.CenterY - circlePrimitive.Diameter / 2); } + else if (primitive is ITrianglePrimitive triangle) + { + coords.Add(triangle.Point1.Y); + coords.Add(triangle.Point2.Y); + coords.Add(triangle.Point3.Y); + } else { throw new FieldVisulizerException(ErrorStrings.PrimitiveTypeIsUnknown); } } return coords; diff --git a/FieldVisualizer/ViewModels/FieldViewerViewModels/FieldViewerViewModel.cs b/FieldVisualizer/ViewModels/FieldViewerViewModels/FieldViewerViewModel.cs index ca3b3a0..10c1708 100644 --- a/FieldVisualizer/ViewModels/FieldViewerViewModels/FieldViewerViewModel.cs +++ b/FieldVisualizer/ViewModels/FieldViewerViewModels/FieldViewerViewModel.cs @@ -14,7 +14,9 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; +using System.Windows; using System.Windows.Controls; +using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; @@ -50,20 +52,20 @@ namespace FieldVisualizer.ViewModels.FieldViewerViewModels set { primitiveSet = value; - OnPropertyChanged(nameof(PrimitiveSet)); AreaTotal = primitiveSet is null ? 0 : primitiveSet.ValuePrimitives.Sum(x => x.Area); - OnPropertyChanged(nameof(AreaTotal)); AreaNeg = primitiveSet is null ? 0 : primitiveSet.ValuePrimitives.Where(x => x.Value < 0d).Sum(x => x.Area); - OnPropertyChanged(nameof(AreaNeg)); AreaZero = primitiveSet is null ? 0 : primitiveSet.ValuePrimitives.Where(x => x.Value == 0d).Sum(x => x.Area); - OnPropertyChanged(nameof(AreaZero)); AreaPos = primitiveSet is null ? 0 : primitiveSet.ValuePrimitives.Where(x => x.Value > 0d).Sum(x => x.Area); - OnPropertyChanged(nameof(AreaPos)); SumTotal = primitiveSet is null ? 0 : primitiveSet.ValuePrimitives.Sum(x => x.Value); - OnPropertyChanged(nameof(SumTotal)); SumNeg = primitiveSet is null ? 0 : primitiveSet.ValuePrimitives.Where(x => x.Value < 0d).Sum(x => x.Value); - OnPropertyChanged(nameof(SumNeg)); SumPos = primitiveSet is null ? 0 : primitiveSet.ValuePrimitives.Where(x => x.Value > 0d).Sum(x => x.Value); + OnPropertyChanged(nameof(PrimitiveSet)); + OnPropertyChanged(nameof(AreaTotal)); + OnPropertyChanged(nameof(AreaNeg)); + OnPropertyChanged(nameof(AreaZero)); + OnPropertyChanged(nameof(AreaPos)); + OnPropertyChanged(nameof(SumTotal)); + OnPropertyChanged(nameof(SumNeg)); OnPropertyChanged(nameof(SumPos)); } @@ -215,21 +217,56 @@ namespace FieldVisualizer.ViewModels.FieldViewerViewModels WorkPlaneBox.Height = ScrolHeight - 50; foreach (var primitive in PrimitiveSet.ValuePrimitives) { - if (primitive is IRectanglePrimitive) + if (primitive is IRectanglePrimitive rectanglePrimitive) { - IRectanglePrimitive rectanglePrimitive = primitive as IRectanglePrimitive; Rectangle rectangle = ProcessRectanglePrimitive(rectanglePrimitive); WorkPlaneCanvas.Children.Add(rectangle); } - else if (primitive is ICirclePrimitive) + else if (primitive is ICirclePrimitive circlePrimitive) { - ICirclePrimitive circlePrimitive = primitive as ICirclePrimitive; Ellipse ellipse = ProcessCirclePrimitive(circlePrimitive); WorkPlaneCanvas.Children.Add(ellipse); } + else if (primitive is ITrianglePrimitive triangle) + { + Path path = ProcessTrianglePrimitive(triangle); + WorkPlaneCanvas.Children.Add(path); + } else { throw new FieldVisulizerException(ErrorStrings.PrimitiveTypeIsUnknown); } } } + + private Path ProcessTrianglePrimitive(ITrianglePrimitive triangle) + { + // Create the PathFigure using triangle vertices. + var figure = new PathFigure + { + StartPoint = new Point(triangle.Point1.X, triangle.Point1.Y), + IsClosed = true, + IsFilled = true + }; + + // Add the remaining vertices as LineSegments + var segments = new PathSegmentCollection + { + new LineSegment(new Point(triangle.Point2.X, triangle.Point2.Y), true), + new LineSegment(new Point(triangle.Point3.X, triangle.Point3.Y), true) + // Closing is handled by IsClosed = true, so we don't need to add a segment back to Point1 + }; + figure.Segments = segments; + + // Create geometry and path + var geometry = new PathGeometry(); + geometry.Figures.Add(figure); + + var path = new Path + { + Data = geometry, + }; + ProcessShape(path, triangle, 0, 0, false); + return path; + } + private Rectangle ProcessRectanglePrimitive(IRectanglePrimitive rectanglePrimitive) { Rectangle rectangle = new Rectangle @@ -239,7 +276,7 @@ namespace FieldVisualizer.ViewModels.FieldViewerViewModels }; double addX = rectanglePrimitive.Width / 2; double addY = rectanglePrimitive.Height / 2; - ProcessShape(rectangle, rectanglePrimitive, addX, addY); + ProcessShape(rectangle, rectanglePrimitive, addX, addY, true); return rectangle; } private Ellipse ProcessCirclePrimitive(ICirclePrimitive circlePrimitive) @@ -252,10 +289,10 @@ namespace FieldVisualizer.ViewModels.FieldViewerViewModels double addX = circlePrimitive.Diameter / 2; double addY = circlePrimitive.Diameter / 2; - ProcessShape(ellipse, circlePrimitive, addX, addY); + ProcessShape(ellipse, circlePrimitive, addX, addY, true); return ellipse; } - private void ProcessShape(Shape shape, IValuePrimitive valuePrimitive, double addX, double addY) + private void ProcessShape(Shape shape, IValuePrimitive valuePrimitive, double addX, double addY, bool addCenter) { SolidColorBrush brush = new SolidColorBrush(); brush.Color = ColorOperations.GetColorByValue(valueRange, _ColorMap, valuePrimitive.Value); @@ -269,8 +306,15 @@ namespace FieldVisualizer.ViewModels.FieldViewerViewModels shape.ToolTip = roundLogic.RoundValue(valuePrimitive.Value); shape.Tag = valuePrimitive; shape.Fill = brush; - Canvas.SetLeft(shape, valuePrimitive.CenterX - addX - dX); - Canvas.SetTop(shape, -valuePrimitive.CenterY - addY + dY); + double addLeft = - addX - dX; + double addTop = - addY + dY; + if (addCenter == true) + { + addLeft += valuePrimitive.CenterX; + addTop -= valuePrimitive.CenterY; + } + Canvas.SetLeft(shape, addLeft); + Canvas.SetTop(shape, addTop); } private void Zoom(double coefficient) { diff --git a/StructureHelper/Libraries/LoaderCalculator.dll b/StructureHelper/Libraries/LoaderCalculator.dll index ac7544e5efee5fc424a9f7ce826cea507907a8fc..1534490ffdae2341aae44cae9881263c4158ec5c 100644 GIT binary patch literal 100352 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 Uu$fRI*R21yiuK>6IXn&gFWWvra{vGU literal 98816 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 AY5)KL diff --git a/StructureHelper/Libraries/Triangle.dll b/StructureHelper/Libraries/Triangle.dll new file mode 100644 index 0000000000000000000000000000000000000000..4b74baf709cc60c48eb41082a5ffa87719bad113 GIT binary patch literal 200704 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
    }_ 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

    i@}63l0DZS+ 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 UlIk(XG436hxqtQZ{~rea59Y`ERsaA1 literal 0 HcmV?d00001 diff --git a/StructureHelper/Services/ResultViewers/ShowIsoFieldResult.cs b/StructureHelper/Services/ResultViewers/ShowIsoFieldResult.cs index fd225e0..402157a 100644 --- a/StructureHelper/Services/ResultViewers/ShowIsoFieldResult.cs +++ b/StructureHelper/Services/ResultViewers/ShowIsoFieldResult.cs @@ -5,6 +5,7 @@ using LoaderCalculator.Data.Ndms; using LoaderCalculator.Data.ResultData; using LoaderCalculator.Logics; using StructureHelperCommon.Infrastructures.Enums; +using StructureHelperCommon.Models.Shapes; using StructureHelperCommon.Services; using StructureHelperLogics.NdmCalculations.Cracking; using StructureHelperLogics.NdmCalculations.Triangulations; @@ -85,6 +86,10 @@ namespace StructureHelper.Services.ResultViewers { valuePrimitive = ProcessRectangle(shapeNdm, val); } + else if (ndm is ITriangleNdm triangle) + { + valuePrimitive = ProcessTriangle(triangle, val); + } else { valuePrimitive = ProcessCircle(ndm, val); @@ -92,6 +97,18 @@ namespace StructureHelper.Services.ResultViewers return valuePrimitive; } + private static IValuePrimitive ProcessTriangle(ITriangleNdm triangle, double val) + { + var primitive = new TrianglePrimitive() + { + Point1 = new Point2D() { X = triangle.Point1.X, Y = triangle.Point1.Y }, + Point2 = new Point2D() { X = triangle.Point2.X, Y = triangle.Point2.Y }, + Point3 = new Point2D() { X = triangle.Point3.X, Y = triangle.Point3.Y }, + Value = val + }; + return primitive; + } + private static IValuePrimitive ProcessRectangle(IRectangleNdm shapeNdm, double val) { return new RectanglePrimitive() diff --git a/StructureHelperCommon/Models/Shapes/Logics/PolygonGeometryUtils.cs b/StructureHelperCommon/Models/Shapes/Logics/PolygonGeometryUtils.cs index c88f7ab..7cbf59c 100644 --- a/StructureHelperCommon/Models/Shapes/Logics/PolygonGeometryUtils.cs +++ b/StructureHelperCommon/Models/Shapes/Logics/PolygonGeometryUtils.cs @@ -9,7 +9,7 @@ namespace StructureHelperCommon.Models.Shapes { public static class PolygonGeometryUtils { - public static ILinePolygonShape GetTratsfromedPolygon(ILinePolygonShape polygon, double dx, double dy) + public static ILinePolygonShape GetTransfromedPolygon(ILinePolygonShape polygon, double dx, double dy) { ILinePolygonShape newPolygon = new LinePolygonShape(Guid.Empty); var updateLogic = new LinePolygonShapeUpdateStrategy(); diff --git a/StructureHelperCommon/StructureHelperCommon.csproj b/StructureHelperCommon/StructureHelperCommon.csproj index 7ea0afb..f8c9854 100644 --- a/StructureHelperCommon/StructureHelperCommon.csproj +++ b/StructureHelperCommon/StructureHelperCommon.csproj @@ -11,7 +11,7 @@ - + diff --git a/StructureHelperLogics/NdmCalculations/Primitives/EllipseNdmPrimitive.cs b/StructureHelperLogics/NdmCalculations/Primitives/EllipseNdmPrimitive.cs index 4309574..2570944 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/EllipseNdmPrimitive.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/EllipseNdmPrimitive.cs @@ -67,7 +67,7 @@ namespace StructureHelperLogics.NdmCalculations.Primitives var ndms = new List(); var options = new CircleTriangulationLogicOptions(this) { - triangulationOptions = triangulationOptions + TriangulationOptions = triangulationOptions }; var logic = new CircleTriangulationLogic(options); ndms.AddRange(logic.GetNdmCollection()); diff --git a/StructureHelperLogics/NdmCalculations/Primitives/Logics/EllipsePrimitiveUpdateStrategy.cs b/StructureHelperLogics/NdmCalculations/Primitives/Logics/EllipsePrimitiveUpdateStrategy.cs index 5f4092a..e9ae41c 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/Logics/EllipsePrimitiveUpdateStrategy.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/Logics/EllipsePrimitiveUpdateStrategy.cs @@ -1,6 +1,5 @@ using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models.Shapes; -using StructureHelperCommon.Models.Shapes.Logics; using StructureHelperCommon.Services; namespace StructureHelperLogics.NdmCalculations.Primitives diff --git a/StructureHelperLogics/NdmCalculations/Primitives/Logics/NdmElementUpdateStrategy.cs b/StructureHelperLogics/NdmCalculations/Primitives/Logics/NdmElementUpdateStrategy.cs index 49739c8..c14e6a8 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/Logics/NdmElementUpdateStrategy.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/Logics/NdmElementUpdateStrategy.cs @@ -28,6 +28,7 @@ namespace StructureHelperLogics.NdmCalculations.Primitives.Logics if (ReferenceEquals(targetObject, sourceObject)) { return; } targetObject.Triangulate = sourceObject.Triangulate; tupleUpdateStrategy.Update(targetObject.UsersPrestrain, sourceObject.UsersPrestrain); + tupleUpdateStrategy.Update(targetObject.AutoPrestrain, sourceObject.AutoPrestrain); if (UpdateChildren == true) { if (sourceObject.HeadMaterial != null) diff --git a/StructureHelperLogics/NdmCalculations/Primitives/PointNdmPrimitive.cs b/StructureHelperLogics/NdmCalculations/Primitives/PointNdmPrimitive.cs index dbb6370..715dcf8 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/PointNdmPrimitive.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/PointNdmPrimitive.cs @@ -46,7 +46,7 @@ namespace StructureHelperLogics.NdmCalculations.Primitives public IEnumerable GetNdms(ITriangulationOptions triangulationOptions) { - var options = new PointTriangulationLogicOptions(this) { triangulationOptions = triangulationOptions}; + var options = new PointTriangulationLogicOptions(this) { TriangulationOptions = triangulationOptions}; var logic = new PointTriangulationLogic(options); return logic.GetNdmCollection(); } diff --git a/StructureHelperLogics/NdmCalculations/Primitives/RebarNdmPrimitive.cs b/StructureHelperLogics/NdmCalculations/Primitives/RebarNdmPrimitive.cs index 4b6fc31..a21d71e 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/RebarNdmPrimitive.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/RebarNdmPrimitive.cs @@ -78,7 +78,7 @@ namespace StructureHelperLogics.NdmCalculations.Primitives { var options = new RebarTriangulationLogicOptions(this) { - triangulationOptions = triangulationOptions + TriangulationOptions = triangulationOptions }; var logic = new RebarTriangulationLogic(options); var rebar = logic.GetRebarNdm(); @@ -89,7 +89,7 @@ namespace StructureHelperLogics.NdmCalculations.Primitives { var options = new RebarTriangulationLogicOptions(this) { - triangulationOptions = triangulationOptions + TriangulationOptions = triangulationOptions }; var logic = new RebarTriangulationLogic(options); var concrete = logic.GetConcreteNdm(); diff --git a/StructureHelperLogics/NdmCalculations/Primitives/RectangleNdmPrimitive.cs b/StructureHelperLogics/NdmCalculations/Primitives/RectangleNdmPrimitive.cs index b20fd89..269dec3 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/RectangleNdmPrimitive.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/RectangleNdmPrimitive.cs @@ -53,7 +53,7 @@ namespace StructureHelperLogics.NdmCalculations.Primitives var ndms = new List(); var options = new RectangleTriangulationLogicOptions(this) { - triangulationOptions = triangulationOptions + TriangulationOptions = triangulationOptions }; var logic = new RectangleTriangulationLogic(options); ndms.AddRange(logic.GetNdmCollection()); diff --git a/StructureHelperLogics/NdmCalculations/Primitives/ShapeNdmPrimitive.cs b/StructureHelperLogics/NdmCalculations/Primitives/ShapeNdmPrimitive.cs index 54f755d..84aa9ea 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/ShapeNdmPrimitive.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/ShapeNdmPrimitive.cs @@ -16,11 +16,11 @@ namespace StructureHelperLogics.NdmCalculations.Primitives public string? Name { get; set; } = string.Empty; public IPoint2D Center { get; set; } = new Point2D(); public IShape Shape => shape; - public INdmElement NdmElement { get; } = new NdmElement(Guid.NewGuid()); + public INdmElement NdmElement { get; set; } = new NdmElement(Guid.NewGuid()); public ICrossSection? CrossSection { get; set; } - public IVisualProperty VisualProperty { get; } = new VisualProperty { Opacity = 0.8d }; + public IVisualProperty VisualProperty { get; set; } = new VisualProperty { Opacity = 0.8d }; public double RotationAngle { get; set; } - public IDivisionSize DivisionSize { get; } = new DivisionSize(Guid.NewGuid()); + public IDivisionSize DivisionSize { get; set; } = new DivisionSize(Guid.NewGuid()); public ShapeNdmPrimitive(Guid id) { Id = id; @@ -38,7 +38,9 @@ namespace StructureHelperLogics.NdmCalculations.Primitives public IEnumerable GetNdms(ITriangulationOptions triangulationOptions) { - throw new NotImplementedException(); + var triangulationLogicOption = new LinePolygonTriangulationLogicOption(this, triangulationOptions); + var logic = new LinePolygonTriangulationLogic(triangulationLogicOption); + return logic.GetNdmCollection(); } public List GetValuePoints() @@ -74,7 +76,7 @@ namespace StructureHelperLogics.NdmCalculations.Primitives { if (shape is ILinePolygonShape polygon) { - var newShape = PolygonGeometryUtils.GetTratsfromedPolygon(polygon, Center.X, Center.Y); + var newShape = PolygonGeometryUtils.GetTransfromedPolygon(polygon, Center.X, Center.Y); var calculator = new PolygonCalculator(); return calculator.ContainsPoint(newShape, point); } diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogic.cs index 3f71f5a..d6d1355 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogic.cs @@ -23,13 +23,13 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations { double diameter = options.Circle.Diameter; - double ndmMaxSize = options.NdmMaxSize; - int ndmMinDivision = options.NdmMinDivision; + double ndmMaxSize = options.DivisionSize.NdmMaxSize; + int ndmMinDivision = options.DivisionSize.NdmMinDivision; var logicOptions = new LoaderCalculator.Triangulations.CircleTriangulationLogicOptions(diameter, ndmMaxSize, ndmMinDivision); var logic = LoaderCalculator.Triangulations.Triangulation.GetLogicInstance(logicOptions); var ndmCollection = logic.GetNdmCollection(new LoaderCalculator.Data.Planes.CirclePlane { - Material = options.HeadMaterial.GetLoaderMaterial(options.triangulationOptions.LimiteState, options.triangulationOptions.CalcTerm) + Material = options.HeadMaterial.GetLoaderMaterial(options.TriangulationOptions.LimiteState, options.TriangulationOptions.CalcTerm) }); TriangulationService.CommonTransform(ndmCollection, options); TriangulationService.SetPrestrain(ndmCollection, options.Prestrain); diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogicOptions.cs index 1e83906..985450d 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogicOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/CircleTriangulationLogicOptions.cs @@ -18,22 +18,19 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations public IPoint2D Center { get; set; } - public double NdmMaxSize { get; } - - public int NdmMinDivision { get; } - public StrainTuple Prestrain { get; set; } - public ITriangulationOptions triangulationOptions { get; set; } + public ITriangulationOptions TriangulationOptions { get; set; } public IHeadMaterial HeadMaterial { get; set; } public double RotationAngle { get; set; } + public IDivisionSize DivisionSize { get; } + public CircleTriangulationLogicOptions(IEllipseNdmPrimitive primitive) { Center = primitive.Center.Clone() as Point2D; //to do change to ellipse Circle = new CircleShape() { Diameter = primitive.Width }; - NdmMaxSize = primitive.DivisionSize.NdmMaxSize; - NdmMinDivision = primitive.DivisionSize.NdmMinDivision; + DivisionSize = primitive.DivisionSize; HeadMaterial = primitive.NdmElement.HeadMaterial; Prestrain = ForceTupleService.SumTuples(primitive.NdmElement.UsersPrestrain, primitive.NdmElement.AutoPrestrain) as StrainTuple; } diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/IShapeTriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/IShapeTriangulationLogicOptions.cs index 4d200f4..cf0b4b5 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/IShapeTriangulationLogicOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/IShapeTriangulationLogicOptions.cs @@ -1,5 +1,6 @@ using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models.Shapes; +using StructureHelperLogics.NdmCalculations.Primitives; using System; using System.Collections.Generic; using System.Linq; @@ -11,16 +12,8 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations public interface IShapeTriangulationLogicOptions : ITriangulationLogicOptions, IHasCenter2D { ///

    - /// Center of shape + /// Parameters of division /// - IPoint2D Center { get; } - /// - /// Maximum size (width or height) of ndm part after triangulation - /// - double NdmMaxSize { get; } - /// - /// Minimum quantity of division of side of rectangle after triangulation - /// - int NdmMinDivision { get; } + IDivisionSize DivisionSize { get; } } } diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogic.cs index 4f0639b..b1f234e 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogic.cs @@ -1,12 +1,21 @@ -using System.Collections.Generic; -using LoaderCalculator.Data.Ndms; -using LoaderCalculator.Data.Materials; +using LoaderCalculator.Data.Ndms; namespace StructureHelperLogics.NdmCalculations.Triangulations { + /// + /// Implements logic of obtaining of collection of ndm parts + /// public interface ITriangulationLogic { + /// + /// Returns collection of ndm parts + /// + /// IEnumerable GetNdmCollection(); + /// + /// Check options of triangulation + /// + /// void ValidateOptions(ITriangulationLogicOptions options); } } diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogicOptions.cs index 329d1fd..5388ff3 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogicOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/ITriangulationLogicOptions.cs @@ -6,7 +6,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations { public interface ITriangulationLogicOptions { - ITriangulationOptions triangulationOptions { get; set; } + ITriangulationOptions TriangulationOptions { get; set; } StrainTuple Prestrain { get; set; } IHeadMaterial HeadMaterial { get; set; } } diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogic.cs new file mode 100644 index 0000000..f9e9c8d --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogic.cs @@ -0,0 +1,85 @@ +using LoaderCalculator.Data.Materials; +using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Infrastructure.Geometry; +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Models.Shapes; +using TriangleNet.Geometry; +using TriangleNet.Meshing; +using static System.Windows.Forms.Design.AxImporter; + +namespace StructureHelperLogics.NdmCalculations.Triangulations +{ + /// + /// Logic for triangulation of line poligon shapr into collection of ndm parts + /// + public class LinePolygonTriangulationLogic : ITriangulationLogic + { + private LinePolygonTriangulationLogicOption options; + + public LinePolygonTriangulationLogic(LinePolygonTriangulationLogicOption triangulationLogicOption) + { + this.options = triangulationLogicOption; + } + + /// + public IEnumerable GetNdmCollection() + { + IMesh mesh = GetMesh(); + var material = options.HeadMaterial.GetLoaderMaterial(options.TriangulationOptions.LimiteState, options.TriangulationOptions.CalcTerm); + List ndms = GetNdmsByMesh(mesh, material); + return ndms; + } + + private List GetNdmsByMesh(IMesh mesh, IMaterial material) + { + List ndmCollection = []; + foreach (var triangle in mesh.Triangles) + { + List points = []; + for (int i = 0; i < 3; i++) + { + var vertex1 = triangle.GetVertex(i); + points.Add(new PointLd2D() { X = vertex1.X, Y = vertex1.Y }); + + } + var ndm = new TriangleNdm() { Point1 = points[0], Point2 = points[1], Point3 = points[2] }; + ndm.Material = material; + var ndm2 = new RectangleNdm() { Width = Math.Sqrt(ndm.Area), Height = Math.Sqrt(ndm.Area), CenterX = ndm.CenterX, CenterY = ndm.CenterY, Material = ndm.Material}; + ndmCollection.Add(ndm); + } + TriangulationService.SetPrestrain(ndmCollection, options.Prestrain); + return ndmCollection; + } + + private IMesh GetMesh() + { + if (options.Shape is not ILinePolygonShape polygonShape) + { + throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(options.Shape) + ": Shape is not line polygon shape"); + } + var polygon = new Polygon(); + List vertices = polygonShape.Vertices.ToList(); + var contour = new List(); + foreach (var vertex in vertices) + { + contour.Add(new TriangleNet.Geometry.Vertex(vertex.Point.X, vertex.Point.Y)); + + } + // Add contour to polygon — this automatically defines the connecting segments + polygon.Add(new Contour(contour)); + var quality = new QualityOptions() + { + MinimumAngle = 25.0, + MaximumArea = options.DivisionSize.NdmMaxSize * options.DivisionSize.NdmMaxSize, + }; + var mesh = polygon.Triangulate(quality); + return mesh; + } + + /// + public void ValidateOptions(ITriangulationLogicOptions options) + { + throw new NotImplementedException(); + } + } +} diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogicOption.cs b/StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogicOption.cs new file mode 100644 index 0000000..f19898c --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Triangulations/LinePolygonTriangulationLogicOption.cs @@ -0,0 +1,35 @@ +using StructureHelper.Models.Materials; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models.Forces; +using StructureHelperCommon.Models.Shapes; +using StructureHelperCommon.Services.Forces; +using StructureHelperLogics.Models.Primitives; +using StructureHelperLogics.NdmCalculations.Primitives; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StructureHelperLogics.NdmCalculations.Triangulations +{ + public class LinePolygonTriangulationLogicOption : IShapeTriangulationLogicOptions + { + public IPoint2D Center { get; set; } + public IDivisionSize DivisionSize { get; set; } + public ITriangulationOptions TriangulationOptions { get; set; } + public StrainTuple Prestrain { get; set; } + public IHeadMaterial HeadMaterial { get; set; } + public double RotationAngle { get; set; } = 0; + public IShape Shape { get; set; } + public LinePolygonTriangulationLogicOption(IShapeNdmPrimitive primitive, ITriangulationOptions triangulationOptions) + { + Center = primitive.Center; + DivisionSize = primitive.DivisionSize; + TriangulationOptions = triangulationOptions; + Shape = primitive.Shape; + HeadMaterial = primitive.NdmElement.HeadMaterial; + Prestrain = ForceTupleService.SumTuples(primitive.NdmElement.UsersPrestrain, primitive.NdmElement.AutoPrestrain) as StrainTuple; + } + } +} diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs index 49a3fc5..5d55567 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs @@ -22,7 +22,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations CenterX = options.Center.X, CenterY = options.Center.Y, Area = options.Area, - Material = options.HeadMaterial.GetLoaderMaterial(options.triangulationOptions.LimiteState, options.triangulationOptions.CalcTerm) + Material = options.HeadMaterial.GetLoaderMaterial(options.TriangulationOptions.LimiteState, options.TriangulationOptions.CalcTerm) }; List ndmCollection = new () { ndm}; NdmTransform.SetPrestrain(ndmCollection, TupleConverter.ConvertToLoaderStrainMatrix(options.Prestrain)); diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs index 26805d1..d6a5bad 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs @@ -12,7 +12,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations /// public class PointTriangulationLogicOptions : ITriangulationLogicOptions { - public ITriangulationOptions triangulationOptions { get; set; } + public ITriangulationOptions TriangulationOptions { get; set; } /// /// /// diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs index 4ad29ba..a4ce3d7 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs @@ -44,7 +44,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations CenterX = options.Center.X, CenterY = options.Center.Y, Area = options.Area, - Material = options.HeadMaterial.GetLoaderMaterial(options.triangulationOptions.LimiteState, options.triangulationOptions.CalcTerm) + Material = options.HeadMaterial.GetLoaderMaterial(options.TriangulationOptions.LimiteState, options.TriangulationOptions.CalcTerm) }; ; NdmTransform.SetPrestrain(rebarNdm, TupleConverter.ConvertToLoaderStrainMatrix(options.Prestrain)); @@ -58,7 +58,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations var material = hostPrimitive .NdmElement .HeadMaterial - .GetLoaderMaterial(options.triangulationOptions.LimiteState, options.triangulationOptions.CalcTerm); + .GetLoaderMaterial(options.TriangulationOptions.LimiteState, options.TriangulationOptions.CalcTerm); var prestrain = ForceTupleService.SumTuples(hostPrimitive.NdmElement.UsersPrestrain, hostPrimitive.NdmElement.AutoPrestrain) diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogicOptions.cs index 5d5fff9..d3e5351 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogicOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogicOptions.cs @@ -13,7 +13,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations { public class RebarTriangulationLogicOptions : ITriangulationLogicOptions { - public ITriangulationOptions triangulationOptions { get; set; } + public ITriangulationOptions TriangulationOptions { get; set; } /// /// /// diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs index 5aed9f5..2b739db 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs @@ -16,13 +16,13 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations { double width = options.Rectangle.Width; double height = options.Rectangle.Height; - double ndmMaxSize = options.NdmMaxSize; - int ndmMinDivision = options.NdmMinDivision; + double ndmMaxSize = options.DivisionSize.NdmMaxSize; + int ndmMinDivision = options.DivisionSize.NdmMinDivision; LoaderCalculator.Triangulations.RectangleTriangulationLogicOptions logicOptions = new LoaderCalculator.Triangulations.RectangleTriangulationLogicOptions(width, height, ndmMaxSize, ndmMinDivision); var logic = LoaderCalculator.Triangulations.Triangulation.GetLogicInstance(logicOptions); var ndmCollection = logic.GetNdmCollection(new LoaderCalculator.Data.Planes.RectangularPlane { - Material = options.HeadMaterial.GetLoaderMaterial(options.triangulationOptions.LimiteState, options.triangulationOptions.CalcTerm) + Material = options.HeadMaterial.GetLoaderMaterial(options.TriangulationOptions.LimiteState, options.TriangulationOptions.CalcTerm) }); TriangulationService.CommonTransform(ndmCollection, options); double angle = options.RotationAngle; diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogicOptions.cs index 54db198..eda2a3a 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogicOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogicOptions.cs @@ -16,21 +16,20 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations public double RotationAngle { get; set; } = 0d; /// public IRectangleShape Rectangle { get; } - /// - public double NdmMaxSize { get; } - /// - public int NdmMinDivision { get; } + /// public StrainTuple Prestrain { get; set; } - public ITriangulationOptions triangulationOptions { get; set; } + public ITriangulationOptions TriangulationOptions { get; set; } public IHeadMaterial HeadMaterial { get; set; } + public IDivisionSize DivisionSize { get; } = new DivisionSize(Guid.Empty); + public RectangleTriangulationLogicOptions(IPoint2D center, IRectangleShape rectangle, double ndmMaxSize, int ndmMinDivision) { Center = center; Rectangle = rectangle; - NdmMaxSize = ndmMaxSize; - NdmMinDivision = ndmMinDivision; + DivisionSize.NdmMaxSize = ndmMaxSize; + DivisionSize.NdmMinDivision = ndmMinDivision; Prestrain = new StrainTuple(); } @@ -39,8 +38,8 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations Center = new Point2D() {X = primitive.Center.X, Y = primitive.Center.Y }; RotationAngle = primitive.RotationAngle; Rectangle = primitive; - NdmMaxSize = primitive.DivisionSize.NdmMaxSize; - NdmMinDivision = primitive.DivisionSize.NdmMinDivision; + DivisionSize.NdmMaxSize = primitive.DivisionSize.NdmMaxSize; + DivisionSize.NdmMinDivision = primitive.DivisionSize.NdmMinDivision; HeadMaterial = primitive.NdmElement.HeadMaterial; Prestrain = ForceTupleService.SumTuples(primitive.NdmElement.UsersPrestrain, primitive.NdmElement.AutoPrestrain) as StrainTuple; } diff --git a/StructureHelperLogics/StructureHelperLogics.csproj b/StructureHelperLogics/StructureHelperLogics.csproj index cfe1fd5..3517da1 100644 --- a/StructureHelperLogics/StructureHelperLogics.csproj +++ b/StructureHelperLogics/StructureHelperLogics.csproj @@ -14,6 +14,9 @@ ..\StructureHelper\Libraries\LoaderCalculator.dll + + ..\StructureHelper\Libraries\Triangle.dll + diff --git a/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs b/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs index d366ccf..902a7e4 100644 --- a/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs +++ b/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs @@ -44,7 +44,7 @@ namespace StructureHelperTests.UnitTests.Ndms.Triangulations IRectangleShape rectangle = new RectangleShape { Width = width, Height = height}; var options = new RectangleTriangulationLogicOptions(center, rectangle, ndmMaxSize, ndmMinDivision) { - triangulationOptions = new TriangulationOptions() { LimiteState = LimitStates.ULS, CalcTerm = CalcTerms.ShortTerm }, + TriangulationOptions = new TriangulationOptions() { LimiteState = LimitStates.ULS, CalcTerm = CalcTerms.ShortTerm }, HeadMaterial = materialMock.Object, RotationAngle = angle };