using System;
using System.Collections.Generic;
using System.Diagnostics;
using Deltares.Geometry;
using Deltares.Stability;
using Deltares.Standard.Extensions;
namespace Deltares.MStab.IO.Classic
{
internal class Definitions
{
///
/// TODO: Replace static reference to method argument (Variable now prevents garbage collection of this big object!)
///
private StabilityModel mStabProject = null;
///
/// Create all Definitions
///
public void GetDefinitions(int handle, StabilityModel stabilityModel,
Dictionary aSurfaceDictionary)
{
mStabProject = stabilityModel;
try
{
if (mStabProject == null)
{
throw new DefinitionException("Stability not instantiated");
}
if (mStabProject.Geometry == null)
{
throw new DefinitionException("Geometry not instantiated");
}
SlipCircle(handle);
ForbiddenLines(handle);
ReferenceLevelForRatioCuCp(handle, aSurfaceDictionary);
SlipPlanes(handle);
HorizontalBalance(handle);
SlipPlaneUpliftVan(handle);
ZoneAreas(handle);
}
catch (DefinitionException e)
{
Debug.Assert(false, e.ToString());
}
}
///
/// SlipPlanes implementation
///
private void SlipPlaneUpliftVan(int handle)
{
ClassicMStabFunctionDefinitions.MStabLiftSlipData classicSlipData = null;
GetClassicMStab.GetClassicSlipLiftData(handle, ref classicSlipData);
var newUpliftVan = new SlipPlaneUpliftVan();
newUpliftVan.Name = "UpliftVan SlipPlane";
var slipplaneleftgrid = new SlipCircleGrid();
slipplaneleftgrid.GridZTop = classicSlipData.leftGridYtop;
slipplaneleftgrid.GridXLeft = classicSlipData.leftGridXleft;
slipplaneleftgrid.GridXNumber = classicSlipData.leftGridNX;
slipplaneleftgrid.GridXRight = classicSlipData.leftGridXright;
slipplaneleftgrid.GridZBottom = classicSlipData.leftGridYbottom;
slipplaneleftgrid.GridZNumber = classicSlipData.leftGridNY;
newUpliftVan.SlipPlaneLeftGrid = slipplaneleftgrid;
var slipplanerightgrid = new SlipCircleGrid();
slipplanerightgrid.GridZTop = classicSlipData.rightGridYtop;
slipplanerightgrid.GridXLeft = classicSlipData.rightGridXleft;
slipplanerightgrid.GridXNumber = classicSlipData.rightGridNX;
slipplanerightgrid.GridXRight = classicSlipData.rightGridXright;
slipplanerightgrid.GridZBottom = classicSlipData.rightGridYbottom;
slipplanerightgrid.GridZNumber = classicSlipData.rightGridNY;
newUpliftVan.SlipPlaneRightGrid = slipplanerightgrid;
var tangentline = new SlipCircleTangentLine();
tangentline.TangentLineNumber = classicSlipData.numberTangentLines;
tangentline.TangentLineZBottom = classicSlipData.bottomTangentLine;
tangentline.TangentLineZTop = classicSlipData.topTangentLine;
tangentline.AutomaticAtBoundaries = classicSlipData.isAutomaticTangentUplift;
newUpliftVan.SlipPlaneTangentLine = tangentline;
mStabProject.Create(newUpliftVan);
}
///
/// SlipPlanes implementation
///
private void SlipPlanes(int handle)
{
ClassicMStabFunctionDefinitions.MStabSlipSpencer spencerplanes1 = null;
ClassicMStabFunctionDefinitions.MStabSlipSpencer spencerplanes2 = null;
GetClassicMStab.GetClassicSpencer1(handle, ref spencerplanes1);
GetClassicMStab.GetClassicSpencer2(handle, ref spencerplanes2);
ClassicMStabFunctionDefinitions.MStabSlipInterval mStabSlipInterval = null;
GetClassicMStab.GetClassicSlipInterval(handle, ref mStabSlipInterval);
var newplane1 = new SlipPlane();
newplane1.Name = "Slip Plane 1";
mStabProject.SlipInterval = mStabSlipInterval.slipInterval;
for (int i = 0; i < spencerplanes1.nCoordinates; i++)
{
var geoPointBegin = new GeometryPoint();
geoPointBegin.X = spencerplanes1.points[i].x;
geoPointBegin.Z = spencerplanes1.points[i].y;
geoPointBegin.Y = 0;
newplane1.Points.Add(geoPointBegin);
}
if (newplane1.Points.Count > 1)
{
mStabProject.Create(newplane1);
}
var newplane2 = new SlipPlane();
newplane2.Name = "Slip Plane 2";
mStabProject.SlipInterval = mStabSlipInterval.slipInterval;
for (int i = 0; i < spencerplanes2.nCoordinates; i++)
{
var geoPointBegin = new GeometryPoint();
geoPointBegin.X = spencerplanes2.points[i].x;
geoPointBegin.Z = spencerplanes2.points[i].y;
geoPointBegin.Y = 0;
newplane2.Points.Add(geoPointBegin);
}
if (newplane2.Points.Count > 1)
{
mStabProject.Create(newplane2);
}
}
///
/// Horizontal balance implementation
///
private void HorizontalBalance(int handle)
{
ClassicMStabFunctionDefinitions.MStabHorizontalBalance classicHorizontalBalance = null;
GetClassicMStab.GetClassicHorizontalBalance(handle, ref classicHorizontalBalance);
var newHorizontalBalance = new HorizontalBalance();
newHorizontalBalance.Name = "Horizontal Balance";
newHorizontalBalance.NZInterval = classicHorizontalBalance.nYInterval;
newHorizontalBalance.XLeft = classicHorizontalBalance.xLeft;
newHorizontalBalance.XRight = classicHorizontalBalance.xRight;
newHorizontalBalance.ZBottom = classicHorizontalBalance.yBottom;
newHorizontalBalance.ZTop = classicHorizontalBalance.yTop;
mStabProject.Create(newHorizontalBalance);
}
///
/// Slip circle implementation
///
private void SlipCircle(int handle)
{
try
{
ClassicMStabFunctionDefinitions.MStabCircles circles = null;
GetClassicMStab.GetClassicCircles(handle, ref circles);
ClassicMStabFunctionDefinitions.MStabRequestedCircleSlices circleslices = null;
GetClassicMStab.GetClassicRequestedCircleSlices(handle, ref circleslices);
//SlipCircle Definition
var slipcircle = new SlipCircle();
slipcircle.Name = "SlipCircle";
slipcircle.SlipCircleFixedPoint.UseFixedPoint = circles.bUseFixPoint;
slipcircle.SlipCircleFixedPoint.XFixed = circles.xFixed;
slipcircle.SlipCircleFixedPoint.ZFixed = circles.yFixed;
var circlegrid = new SlipCircleGrid();
circlegrid.Name = "SlipCircleGrid";
circlegrid.GridXLeft = circles.gridXleft;
circlegrid.GridXRight = circles.gridXRight;
circlegrid.GridXNumber = circles.gridNX;
circlegrid.GridZBottom = circles.gridYBottom;
circlegrid.GridZTop = circles.gridYTop;
circlegrid.GridZNumber = circles.gridNY;
slipcircle.SlipCircleGrid = circlegrid;
var tangentline = new SlipCircleTangentLine();
tangentline.Name = "Tangentline";
tangentline.TangentLineNumber = circles.nTan;
tangentline.TangentLineZTop = circles.tanYtop;
tangentline.TangentLineZBottom = circles.tanYBottom;
slipcircle.SlipCircleTangentLine = tangentline;
mStabProject.RequestedNumberOfSlices = circleslices.StriveCircle;
mStabProject.Create(slipcircle);
}
catch (DefinitionException e)
{
Debug.Assert(false, e.ToString());
}
}
///
/// Forbidden Lines implementations
///
private void ForbiddenLines(int handle)
{
try
{
ClassicMStabFunctionDefinitions.MStabForbiddenLines classicforbiddenlines = null;
GetClassicMStab.GetClassicForbiddenLines(handle, ref classicforbiddenlines);
for (int i = 0; i < classicforbiddenlines.numberLines; i++)
{
var forbiddenlines = new ForbiddenLines();
forbiddenlines.Name = classicforbiddenlines.lines[i].itemName;
//Step one add forbidden points in non geometry list
var forbiddenline = new ForbiddenLines();
forbiddenline.StartX = classicforbiddenlines.lines[i].x1;
forbiddenline.StartZ = classicforbiddenlines.lines[i].y1;
forbiddenline.EndX = classicforbiddenlines.lines[i].x2;
forbiddenline.EndZ = classicforbiddenlines.lines[i].y2;
mStabProject.Create(forbiddenlines);
}
}
catch (DefinitionException e)
{
Debug.Assert(false, e.ToString());
}
}
///
/// ReferenceLevelforRatioCuCp implementations
///
private void ReferenceLevelForRatioCuCp(int handle, Dictionary aSurfaceDictionary)
{
try
{
ClassicMStabFunctionDefinitions.MStabReferenceLevelCU referencelevelcu = null;
GetClassicMStab.GetClassicReferenceCu(handle, ref referencelevelcu);
ClassicGeometryFunctionDefinitions.GeometryBoundaries classicGeometryBoundaries = null;
GetClassicGeometry.GetClassicGeometryBoundaries(handle, ref classicGeometryBoundaries);
List classicGeometryCurves = null;
GetClassicGeometry.GetClassicGeometryCurves(handle, ref classicGeometryCurves);
ClassicGeometryFunctionDefinitions.GeometryLayers classicGeometryLayers = null;
GetClassicGeometry.GetClassicGeometryLayers(handle, ref classicGeometryLayers);
List classicGeometryPoints = null;
GetClassicGeometry.GetClassicGeometryPoints(handle, ref classicGeometryPoints);
int boundaryIndex = classicGeometryLayers.layers[referencelevelcu.cuReferenceLevel - 1].boundaryTopLayer;
int numberCurvesTop = classicGeometryBoundaries.boundaries[boundaryIndex].numberOfCurvesOnBoundary;
GeometryPoint geoPoint = null;
var referenceline = new ReferenceLevelLine();
for (int curvesTop = 0; curvesTop < numberCurvesTop; curvesTop++)
{
int curveIndex = classicGeometryBoundaries.boundaries[boundaryIndex].curvesIndices[curvesTop] - 1;
if (curvesTop == 0)
{
geoPoint = mStabProject.Geometry.Points.Find(x => ((Math.Abs(x.X - classicGeometryPoints[classicGeometryCurves[curveIndex].pointIndices[0] - 1].x) < GeometryPoint.Precision) &&
(Math.Abs(x.Y - classicGeometryPoints[classicGeometryCurves[curveIndex].pointIndices[0] - 1].z) < GeometryPoint.Precision) &&
(Math.Abs(x.Z - classicGeometryPoints[classicGeometryCurves[curveIndex].pointIndices[0] - 1].y) < GeometryPoint.Precision)));
geoPoint = new GeometryPoint(geoPoint);
referenceline.Points.Add(geoPoint);
}
geoPoint = mStabProject.Geometry.Points.Find(x => ((Math.Abs(x.X - classicGeometryPoints[classicGeometryCurves[curveIndex].pointIndices[1] - 1].x) < GeometryPoint.Precision) &&
(Math.Abs(x.Y - classicGeometryPoints[classicGeometryCurves[curveIndex].pointIndices[1] - 1].z) < GeometryPoint.Precision) &&
(Math.Abs(x.Z - classicGeometryPoints[classicGeometryCurves[curveIndex].pointIndices[1] - 1].y) < GeometryPoint.Precision)));
geoPoint = new GeometryPoint(geoPoint);
referenceline.Points.Add(geoPoint);
}
//mStabProject.ReferenceLevelLine = referenceline;
mStabProject.Create(referenceline);
mStabProject.UpdateGeometryBounds();
}
catch (DefinitionException e)
{
Debug.Assert(false, e.ToString());
}
}
private void ZoneAreas(int handle)
{
ClassicMStabFunctionDefinitions.MStabNewZonePlotData zonearea = null;
GetClassicMStab.GetClassicPlotData(handle, ref zonearea);
mStabProject.SafetyZoneAreas.DikeTableHeight = zonearea.dikeTableHeight;
mStabProject.SafetyZoneAreas.SafetyZone1a = zonearea.safetyZone1a;
mStabProject.SafetyZoneAreas.SafetyZone1b = zonearea.safetyZone1b;
mStabProject.SafetyZoneAreas.SafetyZone2a = zonearea.safetyZone2a;
mStabProject.SafetyZoneAreas.SafetyZone2b = zonearea.safetyZone2b;
mStabProject.SafetyZoneAreas.SafetyZone3a = zonearea.safetyZone3a;
mStabProject.SafetyZoneAreas.SafetyZone3b = zonearea.safetyZone3b;
mStabProject.SafetyZoneAreas.Calculationside = (StabilityCalculationSide) zonearea.stabilitySide;
mStabProject.SafetyZoneAreas.LeftSideMinimalRoad = zonearea.xRoadLeft;
mStabProject.SafetyZoneAreas.RightSideMinimalRoad = zonearea.xRoadRight;
mStabProject.SafetyZoneAreas.RestProfileStartX = zonearea.xStart;
mStabProject.SafetyZoneAreas.DesignLevelInfluenceX = zonearea.xMHWInfluence;
mStabProject.SafetyZoneAreas.DesignLevelInfluenceY = zonearea.yMHWInfluence;
mStabProject.SafetyZoneAreas.StandardOvertopping = zonearea.standardOvertopping ? ZoneOvertoppingType.Standard : ZoneOvertoppingType.Extended;
}
}
}