using EletroBim.Services;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Controls.Primitives;
namespace EletroBim.Model
public struct VerticalPlane
public static double ScbPeso = 0;
public static double ScbDiam = 0;
public static double ScbSec = 0;
public static double ScbMde = 0;
public static double ScbCdt = 0;
public static int ScbN = 0;
public static double ScdComp1 = 0;
public static double ScdPeso1 = 0;
public static double ScdDisc1 = 0;
public static int ScdN1 = 0;
public static double ScdComp2 = 0;
public static double ScdPeso2 = 0;
public static double ScdDisc2 = 0;
public static int ScdN2 = 0;
public static double xabs;
public static double pesape;
public static double pesapd;
public static double fpc;
public static VerticalPlane CreatePlaneFromPoints(XYZ p1, XYZ p2)
XYZ pTop = (p1.Z >= p2.Z) ? p1 : p2;
XYZ pLow = (p1.Z >= p2.Z) ? p2 : p1;
double dx = pLow.X - pTop.X;
double dy = pLow.Y - pTop.Y;
XYZ horizontal = new XYZ(dx, dy, 0.0);
double length = horizontal.GetLength();
XYZ xAxis = horizontal.Normalize();
XYZ zAxis = xAxis.CrossProduct(yAxis);
zAxis = zAxis.Normalize();
yAxis = zAxis.CrossProduct(xAxis);
yAxis = yAxis.Normalize();
public static XYZ Transform2DTo3D(VerticalPlane plane, UV uvEmMetros)
double METERS_TO_FEET = 3.2808399;
double uFeet = uvEmMetros.U * METERS_TO_FEET;
double vFeet = uvEmMetros.V * METERS_TO_FEET;
XYZ point3D = plane.Origin
public static double Asinh(double value)
return System.Math.Log(value + System.Math.Sqrt(value * value + 1));
#region Versões anterioes do calculo
public static MDCatenary CalcularCatenaria3(MDCable objCabo, MDChain objCadeia1, MDChain objCadeia2)
objCabo.UnevenTerrain = UnitUtils.ConvertFromInternalUnits(objCabo.PtInitial.Z - objCabo.PtFinal.Z, UnitTypeId.Meters);
MDCatenary ObjCatenary = new MDCatenary();
double ScbPeso = objCabo.Weight;
double ScbDiam = objCabo.Diameter;
double ScbSec = objCabo.Section;
double ScbMde = objCabo.Mde;
double ScbCdt = objCabo.Cdt;
int ScbN = objCabo.NumberOfCable;
double ScdComp1 = objCadeia1.Comprimento;
double ScdPeso1 = objCadeia1.Weight;
double ScdDisc1 = objCadeia1.DiscDiameter;
int ScdN1 = objCadeia1.NumberOfChain;
double ScdComp2 = objCadeia2.Comprimento;
double ScdPeso2 = objCadeia2.Weight;
double ScdDisc2 = objCadeia2.DiscDiameter;
int ScdN2 = objCadeia2.NumberOfChain;
double Tpi = Convert.ToDouble(objCabo.MinimumCableTemperature);
double Tpf = Convert.ToDouble(objCabo.MaximumCableTemperature);
double Vi = Convert.ToDouble(objCabo.MaximumWindSpeed);
double cdDisc1 = ScdDisc1;
double cdDisc2 = ScdDisc2;
double Tx = Convert.ToDouble(objCabo.Traction);
double L = Convert.ToDouble(objCabo.SpanLength);
double d = Convert.ToDouble(objCabo.UnevenTerrain);
r = L / (2 * Ca1 + 2 * Ca2);
pt = p / (1 + c * (Tpi - 20));
pv = System.Math.Sqrt(System.Math.Pow((0.0000047 * System.Math.Pow(Vi, 2) * ScbDiam), 2) + System.Math.Pow(pt, 2));
Piv1 = System.Math.Sqrt(System.Math.Pow(Pi1, 2) + System.Math.Pow((0.0000047 * System.Math.Pow(Vi, 2) * cdDisc1 * Ca1 * cdN1), 2));
Piv2 = System.Math.Sqrt(System.Math.Pow(Pi2, 2) + System.Math.Pow((0.0000047 * System.Math.Pow(Vi, 2) * cdDisc2 * Ca2 * cdN2), 2));
x0 = a * Asinh(dr / (2 * a * System.Math.Sinh(Lr / (2 * a)))) - (Lr / 2);
l = 2 * a * System.Math.Sinh(Lr / (2 * a)) * System.Math.Cosh((x0 + (Lr / 2)) / a);
P0 = a * System.Math.Sinh(-x0 / a) * pv * ScbN;
PL = a * System.Math.Sinh((x0 + Lr) / a) * pv * ScbN;
phi = System.Math.Atan((P0 + Piv1 / 2) / Tx);
B = System.Math.Atan((PL + Piv2 / 2) / Tx);
Lr = (L - Ca1 * System.Math.Cos(phi) - Ca2 * System.Math.Cos(B));
dr = (d + Ca1 * System.Math.Sin(phi) - Ca2 * System.Math.Sin(B));
TL = ((Tx / ScbN) / 2) * (Lr + a * ((System.Math.Pow(l, 2) + System.Math.Pow(dr, 2)) / (System.Math.Pow(l, 2) - System.Math.Pow(dr, 2))) * System.Math.Sinh(Lr / a));
P0ve = System.Math.Sqrt(System.Math.Pow(P0, 2) - System.Math.Pow((a * System.Math.Sinh(-x0 / a) * pt * ScbN), 2));
PLve = System.Math.Sqrt(System.Math.Pow(PL, 2) - System.Math.Pow((a * System.Math.Sinh((x0 + Lr) / a) * pt * ScbN), 2));
Pive1 = System.Math.Sqrt(System.Math.Pow(Piv1, 2) - System.Math.Pow(Pi1, 2));
Pive2 = System.Math.Sqrt(System.Math.Pow(Piv2, 2) - System.Math.Pow(Pi2, 2));
Vesq = System.Math.Round(Vesq, 2);
Vdir = System.Math.Round(Vdir, 2);
ObjCatenary.LeftSupport = Vesq;
ObjCatenary.RightSupport = Vdir;
pt = p / (1 + c * (Tpf - 20));
Tk0 = ((Tk1 - Tk2) / 2) + Tk2;
x0 = a * Asinh(dr / (2 * a * System.Math.Sinh(Lr / (2 * a)))) - (Lr / 2);
l = 2 * a * System.Math.Sinh(Lr / (2 * a)) * System.Math.Cosh((x0 + (Lr / 2)) / a);
P0 = a * System.Math.Sinh(-x0 / a) * pt * ScbN;
PL = a * System.Math.Sinh((x0 + Lr) / a) * pt * ScbN;
phi = System.Math.Atan((P0 + Pi1 / 2) / Tk0);
B = System.Math.Atan((PL + Pi2 / 2) / Tk0);
Lr = (L - Ca1 * System.Math.Cos(phi) - Ca2 * System.Math.Cos(B));
dr = (d + Ca1 * System.Math.Sin(phi) - Ca2 * System.Math.Sin(B));
TL = ((Tk0 / ScbN) / 2) * (Lr + a * ((System.Math.Pow(l, 2) + System.Math.Pow(dr, 2)) / (System.Math.Pow(l, 2) - System.Math.Pow(dr, 2))) * System.Math.Sinh(Lr / a));
k = System.Math.Sqrt(System.Math.Pow((dtemp1 - dtemp), 2));
pt = p / (1 + c * (Tpf - 20));
Tk0 = ((Tk1 - Tk2) / 2) + Tk2;
x0 = a * Asinh(dr / (2 * a * System.Math.Sinh(Lr / (2 * a)))) - (Lr / 2);
l = 2 * a * System.Math.Sinh(Lr / (2 * a)) * System.Math.Cosh((x0 + (Lr / 2)) / a);
P0 = a * System.Math.Sinh(-x0 / a) * pt * ScbN;
PL = a * System.Math.Sinh((x0 + Lr) / a) * pt * ScbN;
phi = System.Math.Atan((P0 + Pi1 / 2) / Tk0);
B = System.Math.Atan((PL + Pi2 / 2) / Tk0);
Lr = (L - Ca1 * System.Math.Cos(phi) - Ca2 * System.Math.Cos(B));
dr = (d + Ca1 * System.Math.Sin(phi) - Ca2 * System.Math.Sin(B));
TL = ((Tk0 / ScbN) / 2) * (Lr + a * ((System.Math.Pow(l, 2) + System.Math.Pow(dr, 2)) / (System.Math.Pow(l, 2) - System.Math.Pow(dr, 2))) * System.Math.Sinh(Lr / a));
k = System.Math.Sqrt(System.Math.Pow((dtemp1 - dtemp), 2));
xa = x0 - Ca1 * System.Math.Cos(phi);
xb = x1 + Ca2 * System.Math.Cos(B);
FMv = (System.Math.Tan(B) * (xb - x1) + a * System.Math.Cosh(x1 / a)) - a * System.Math.Cosh(x0 / a);
FMv = System.Math.Round(FMv, 2);
ObjCatenary.MaximumArrow = FMv;
fpc = 100 * (FMv - d) / (2 * (x0 - xa));
fpc = System.Math.Round(fpc, 2);
ObjCatenary.SpanPercentage = fpc;
xabs = System.Math.Round(xabs, 2);
ObjCatenary.Abscissa = xabs;
pesape = System.Math.Round(pesape, 2);
pesapd = System.Math.Round(pesapd, 2);
ObjCatenary.LeftSupportWeight = pesape;
ObjCatenary.RightSupportWeight = pesapd;
ObjCatenary.LeftIsolatingAngleVertical = System.Math.Round(phi * (180 / Math.PI) + 90, 0);
ObjCatenary.RightIsolatingAngleVertical = System.Math.Round(B * (180 / Math.PI) + 90, 0);
FMv = (System.Math.Tan(B) * (xb - x1) + a * System.Math.Cosh(x1 / a) - (Tx / ScbN) / pt);
FMv = System.Math.Round(FMv, 2);
ObjCatenary.MaximumArrow = FMv;
fpc = 100 * (FMv - d) / (-2 * xa);
fpc = System.Math.Round(fpc, 2);
ObjCatenary.SpanPercentage = fpc;
xabs = System.Math.Round(xb, 2);
ObjCatenary.Abscissa = xabs;
pesape = System.Math.Round(pesape, 2);
pesapd = System.Math.Round(pesapd, 2);
ObjCatenary.LeftSupportWeight = pesape;
ObjCatenary.RightSupportWeight = pesapd;
ObjCatenary.LeftIsolatingAngleVertical = System.Math.Round(phi * (180 / Math.PI) + 90, 0);
ObjCatenary.RightIsolatingAngleVertical = System.Math.Round(B * (180 / Math.PI) + 90, 0);
TFv = System.Math.Round(Tx, 2);
ObjCatenary.TractionMax = TFv;
deltaX = objCabo.SpanLength / 100;
double numPontos = (x1 - x0) / deltaX;
VerticalPlane Plano2D = CreatePlaneFromPoints(objCabo.PtInitial, objCabo.PtFinal);
for (int i = 0; i <= numPontos; i++)
double Xponto = Math.Abs(xb - x1) + i * deltaX;
double Yponto = (Math.Tan(B) * (xb - x1) + a * Math.Cosh(x1 / a) - (a * Math.Cosh((xb - Xponto) / a)));
UV Ponto2D = new UV(Xponto, -Yponto);
XYZ Ponto3D = Transform2DTo3D(Plano2D, Ponto2D);
ObjCatenary.LstPointsXYZ.Add((Ponto3D.X, Ponto3D.Y, Ponto3D.Z));
double Xponto = Math.Abs(xb - x0);
double Yponto = (Math.Tan(B) * (xb - x1) + a * Math.Cosh(x1 / a) - (a * Math.Cosh((xb - Xponto) / a)));
UV Ponto2D = new UV(Xponto, -Yponto);
XYZ Ponto3D = Transform2DTo3D(Plano2D, Ponto2D);
ObjCatenary.LstPointsXYZ.Add((Ponto3D.X, Ponto3D.Y, Ponto3D.Z));
MessageBox.Show("Vão muito curto.");
MessageBox.Show("Variação de temperatura exagerada.");
MessageBox.Show("Dados incorretos");
objCabo.ObjCatenary = ObjCatenary;
static (UV firstPoint, UV secondPoint) TransformPointsTo2d(XYZ firstPt3d, XYZ secondPt3d)
(XYZ origin, XYZ xAxis, XYZ yAxis, XYZ zAxis) = CreateLocalCoordinateSystem(firstPt3d, secondPt3d);
UV point1Local = TransformToLocal(firstPt3d, origin, xAxis, yAxis, zAxis);
UV point2Local = TransformToLocal(secondPt3d, origin, xAxis, yAxis, zAxis);
return (point1Local, point2Local);
List<UV> localPoints = new List<UV> { point1Local, point2Local };
List<XYZ> globalPoints = TransformPointsT3D(localPoints, firstPt3d, secondPt3d);
static (XYZ origin, XYZ xAxis, XYZ yAxis, XYZ zAxis) CreateLocalCoordinateSystem(XYZ p1, XYZ p2)
XYZ xAxis = (p2 - p1).Normalize();
XYZ zAxis = new XYZ(0, 0, 1);
XYZ yAxis = zAxis.CrossProduct(xAxis).Normalize();
return (origin, xAxis, yAxis, zAxis);
static UV TransformToLocal(XYZ point, XYZ origin, XYZ xAxis, XYZ yAxis, XYZ zAxis)
XYZ vectorToPoint = point - origin;
double uLocal = vectorToPoint.DotProduct(xAxis);
double vLocal = vectorToPoint.DotProduct(yAxis);
return new UV(uLocal, vLocal);
static List<XYZ> TransformPointsT3D(List<UV> localPoints, XYZ firstPt3d, XYZ secondPt3d)
(XYZ origin, XYZ xAxis, XYZ yAxis, XYZ zAxis) = CreateLocalCoordinateSystem(firstPt3d, secondPt3d);
var globalPoints = new List<XYZ>();
foreach (UV localPoint in localPoints)
globalPoints.Add(globalPoint);
public void CalcularTabela(MDCatenary objUserInput, MDCable objCabo, MDChain objCadeia, MDStructure objEstrutura1, MDStructure objEstrutura2)
double SesAlt1 = objEstrutura1.Height;
double SesAlt2 = objEstrutura2.Height;
double Tpi = objCabo.MinimumCableTemperature;
string arqpasta = AppDomain.CurrentDomain.BaseDirectory;
string arqnome = DateTime.Now.ToString("Tab_dd-MM-yyyy_hh-mm-ss");
TextWriter sw = new StreamWriter(@arqpasta + "\\" + arqnome + ".txt");
sw.WriteLine("Temperatura (°C);Tração (kgf);Flecha (m);Flecha (%);Abscissa (m)");
for (Tpf = 0; Tpf < cont + 1; Tpf++)
double Tx = objUserInput.TractionMax;
double p = objCabo.Weight;
double s = objCabo.Section;
double L = objCabo.SpanLength;
double dt = objCabo.UnevenTerrain;
double dtemp = Tpf - Tpi;
double l = 0, li = 0, dlh = 0, dlt = 0;
double FIv, TMv, TFv, FMv, Fpap;
double Opap = objUserInput.Abscissa;
double Pi = objCabo.Weight;
double Ca = objCadeia.Comprimento;
double x0 = 0, xa = 0, x1 = 0, xb = 0, P0 = 0, PL = 0, phi = 0, B = 0;
double pt = p / (1 + c * (Tpi - 20));
double Tk0 = 0, Tk1 = 0, Tk2 = 0;
ScbN = objCabo.NumberOfCable;
double escD = 0, esc = 0;
if (SesAlt1 >= SesAlt2 || SesAlt2 <= SesAlt1 + dt)
d = SesAlt1 + dt - SesAlt2;
if (SesAlt2 > SesAlt1 + dt)
d = SesAlt2 - SesAlt1 - dt;
if (SesAlt2 >= SesAlt1 || SesAlt1 <= SesAlt2 + dt)
d = SesAlt2 + dt - SesAlt1;
if (SesAlt1 > SesAlt2 + dt)
d = SesAlt1 - SesAlt2 - dt;
Vi = objCabo.MaximumWindSpeed;
pv = System.Math.Sqrt(System.Math.Pow((0.0000047 * System.Math.Pow(Vi, 2) * ScbDiam), 2) + System.Math.Pow(pt, 2));
Piv = System.Math.Sqrt(System.Math.Pow(Pi, 2) + System.Math.Pow((0.0000047 * System.Math.Pow(Vi, 2) * objCadeia.DiscDiameter * objCadeia.Comprimento * objCabo.NumberOfCable), 2));
x0 = a * Asinh(dr / (2 * a * System.Math.Sinh(Lr / (2 * a)))) - (Lr / 2);
l = 2 * a * System.Math.Sinh(Lr / (2 * a)) * System.Math.Cosh((x0 + (Lr / 2)) / a);
P0 = a * System.Math.Sinh(-x0 / a) * pv * ScbN;
PL = a * System.Math.Sinh((x0 + Lr) / a) * pv * ScbN;
phi = System.Math.Atan((P0 + Piv / 2) / Tx);
B = System.Math.Atan((PL + Piv / 2) / Tx);
Lr = (L - Ca * System.Math.Cos(phi) - Ca * System.Math.Cos(B));
dr = (d + Ca * System.Math.Sin(phi) - Ca * System.Math.Sin(B));
TL = ((Tx / ScbN) / 2) * (Lr + a * ((System.Math.Pow(l, 2) + System.Math.Pow(dr, 2)) / (System.Math.Pow(l, 2) - System.Math.Pow(dr, 2))) * System.Math.Sinh(Lr / a));
Tk0 = ((Tk1 - Tk2) / 2) + Tk2;
x0 = a * Asinh(dr / (2 * a * System.Math.Sinh(Lr / (2 * a)))) - (Lr / 2);
l = 2 * a * System.Math.Sinh(Lr / (2 * a)) * System.Math.Cosh((x0 + (Lr / 2)) / a);
P0 = a * System.Math.Sinh(-x0 / a) * pt * ScbN;
PL = a * System.Math.Sinh((x0 + Lr) / a) * pt * ScbN;
phi = System.Math.Atan((P0 + Pi / 2) / Tk0);
B = System.Math.Atan((PL + Pi / 2) / Tk0);
Lr = (L - Ca * System.Math.Cos(phi) - Ca * System.Math.Cos(B));
dr = (d + Ca * System.Math.Sin(phi) - Ca * System.Math.Sin(B));
TL = ((Tk0 / ScbN) / 2) * (Lr + a * ((System.Math.Pow(l, 2) + System.Math.Pow(dr, 2)) / (System.Math.Pow(l, 2) - System.Math.Pow(dr, 2))) * System.Math.Sinh(Lr / a));
dlt = l - li - (TL / (E * s));
k = System.Math.Sqrt(System.Math.Pow((dlt), 2));
xa = x0 - Ca * System.Math.Cos(phi);
xb = x1 + Ca * System.Math.Cos(B);
TMv = System.Math.Round(Tx, 2);
FIv = (System.Math.Tan(B) * (xb - x1) + a * System.Math.Cosh(x1 / a)) - a * System.Math.Cosh(x0 / a);
FIv = System.Math.Round(FIv, 2);
FIv = (System.Math.Tan(B) * (xb - x1) + a * System.Math.Cosh(x1 / a) - (Tx / ScbN) / pt);
FIv = System.Math.Round(FIv, 2);
pt = p / (1 + c * (Tpf - 20));
Tk0 = ((Tk1 - Tk2) / 2) + Tk2;
x0 = a * Asinh(dr / (2 * a * System.Math.Sinh(Lr / (2 * a)))) - (Lr / 2);
l = 2 * a * System.Math.Sinh(Lr / (2 * a)) * System.Math.Cosh((x0 + (Lr / 2)) / a);
P0 = a * System.Math.Sinh(-x0 / a) * pt * ScbN;
PL = a * System.Math.Sinh((x0 + Lr) / a) * pt * ScbN;
phi = System.Math.Atan((P0 + Pi / 2) / Tk0);
B = System.Math.Atan((PL + Pi / 2) / Tk0);
Lr = (L - Ca * System.Math.Cos(phi) - Ca * System.Math.Cos(B));
dr = (d + Ca * System.Math.Sin(phi) - Ca * System.Math.Sin(B));
TL = ((Tk0 / ScbN) / 2) * (Lr + a * ((System.Math.Pow(l, 2) + System.Math.Pow(dr, 2)) / (System.Math.Pow(l, 2) - System.Math.Pow(dr, 2))) * System.Math.Sinh(Lr / a));
k = System.Math.Sqrt(System.Math.Pow((dtemp1 - dtemp), 2));
pt = p / (1 + c * (Tpf - 20));
Tk0 = ((Tk1 - Tk2) / 2) + Tk2;
x0 = a * Asinh(dr / (2 * a * System.Math.Sinh(Lr / (2 * a)))) - (Lr / 2);
l = 2 * a * System.Math.Sinh(Lr / (2 * a)) * System.Math.Cosh((x0 + (Lr / 2)) / a);
P0 = a * System.Math.Sinh(-x0 / a) * pt * ScbN;
PL = a * System.Math.Sinh((x0 + Lr) / a) * pt * ScbN;
phi = System.Math.Atan((P0 + Pi / 2) / Tk0);
B = System.Math.Atan((PL + Pi / 2) / Tk0);
Lr = (L - Ca * System.Math.Cos(phi) - Ca * System.Math.Cos(B));
dr = (d + Ca * System.Math.Sin(phi) - Ca * System.Math.Sin(B));
TL = ((Tk0 / ScbN) / 2) * (Lr + a * ((System.Math.Pow(l, 2) + System.Math.Pow(dr, 2)) / (System.Math.Pow(l, 2) - System.Math.Pow(dr, 2))) * System.Math.Sinh(Lr / a));
k = System.Math.Sqrt(System.Math.Pow((dtemp1 - dtemp), 2));
xa = x0 - Ca * System.Math.Cos(phi);
xb = x1 + Ca * System.Math.Cos(B);
FMv = (System.Math.Tan(B) * (xb - x1) + a * System.Math.Cosh(x1 / a)) - a * System.Math.Cosh(x0 / a);
fpc = 100 * (FMv - d) / (2 * (x0 - xa));
FMv = System.Math.Round(FMv, 2);
fpc = System.Math.Round(fpc, 2);
FMst = Convert.ToString(FMv);
FMPst = Convert.ToString(fpc);
xabs = System.Math.Round(xabs, 2);
ABSst = Convert.ToString(xabs);
FMv = (System.Math.Tan(B) * (xb - x1) + a * System.Math.Cosh(x1 / a) - (Tx / ScbN) / pt);
fpc = 100 * (FMv - d) / (-2 * xa);
FMv = System.Math.Round(FMv, 2);
fpc = System.Math.Round(fpc, 2);
FMst = Convert.ToString(FMv);
FMPst = Convert.ToString(fpc);
xabs = System.Math.Round(xb, 2);
ABSst = Convert.ToString(xabs);
TFv = System.Math.Round(Tx, 2);
TFst = Convert.ToString(TFv);
Tpfst = Convert.ToString(Tpf);
sw.WriteLine(Tpfst + ";" + TFst + ";" + FMst + ";" + FMPst + ";" + ABSst);
MessageBox.Show("Vão muito curto.");
MessageBox.Show("Variação de temperatura exagerada.");
MessageBox.Show("Tabela exportada com sucesso");
catch { MessageBox.Show("Dados incorretos"); }