435 lines
12 KiB
C++
435 lines
12 KiB
C++
// ====================================================================================================
|
||
// ====================================================================================================
|
||
|
||
#include "StabCalculation/BasicInf.h"
|
||
#include "StabCalculation/StabCalculation.h"
|
||
|
||
|
||
|
||
|
||
BasicInf::BasicInf(bool hasIntact, bool hasInclining, bool hasDamProb)
|
||
{
|
||
// #region 公共
|
||
try
|
||
{
|
||
ShipName = StabCalcBaseData::FindByParamID("ShipName");
|
||
Design = StabCalcBaseData::FindByParamID("Design");
|
||
Signature = StabCalcBaseData::FindByParamID("Signature"); //20170901 added by czb
|
||
CalDate = StabCalcBaseData::FindByParamID("CalDate");
|
||
WorkNo = StabCalcBaseData::FindByParamID("WorkNo");
|
||
}
|
||
catch (...)
|
||
{
|
||
ShipName = "";
|
||
Design = "";
|
||
Signature = "";
|
||
CalDate = "";
|
||
}
|
||
|
||
StabCalcBaseData::FindByParamID("Origin", Origin);
|
||
StabCalcBaseData::FindByParamID("XType", XType);
|
||
|
||
{
|
||
// #region LabelX初始化
|
||
int nX = StabCalcBaseData::xlabel_data_grid_view.size(); // X标记个数
|
||
if (nX > 0)
|
||
{
|
||
if (nX < 2)
|
||
{
|
||
throw std::runtime_error("X标记表错误:标记个数小于2");
|
||
}
|
||
LabelX = std::vector<double>(nX); // X标记表X数组
|
||
for (int i = 0; i < nX; i++)
|
||
{
|
||
LabelX[i] = StabCalcBaseData::xlabel_data_grid_view[i].x;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
LabelX = std::vector<double>();
|
||
}
|
||
}
|
||
// #endregion
|
||
StabCalcBaseData::FindByParamID("IsCatamaran", IsCatamaran);
|
||
StabCalcBaseData::FindByParamID("L", L);
|
||
try
|
||
{
|
||
StabCalcBaseData::FindByParamID("Lpp", Lpp);
|
||
}
|
||
catch (...)
|
||
{
|
||
Lpp = L;
|
||
}
|
||
OrgOff = Lpp * Origin / 2; //20161014 by czb
|
||
|
||
// car-20190628 改回按站位定义
|
||
//#region LabelX初始化 cqr-20190109 改为固定的-1到21站
|
||
//{
|
||
// int nX = 23;// 计算-1到21站 mod.XLabel.Count; // X标记个数
|
||
|
||
// LabelX = new double[nX]; // X标记表X数组
|
||
// for (int i = 0; i < nX; i++)
|
||
// {
|
||
// LabelX[i] = (i - 1) * Lpp / 20 - Lpp * (Origin + 1) / 2; // 艉原点 Origin=-1,舯原点时 Origin=0,要减Lpp/2 //mod.XLabel[i].X;
|
||
// }
|
||
|
||
//}
|
||
//#endregion
|
||
|
||
StabCalcBaseData::FindByParamID("B", B);
|
||
StabCalcBaseData::FindByParamID("D", D);
|
||
StabCalcBaseData::FindByParamID("d", d);
|
||
// #region 计算吃水列表
|
||
//double.TryParse(mod.BInf.FindByParamID("DraftEvalMax").Value, out DraftEvalMax);
|
||
//double.TryParse(mod.BInf.FindByParamID("DraftEvalInterval").Value, out DraftEvalInterval);
|
||
DraftList = StabCalcBaseData::FindByParamID("DraftList");
|
||
{
|
||
// 将 std::string 转换为 QString
|
||
QString DraftList_tmp = QString::fromStdString(DraftList);
|
||
|
||
// 使用 QString::split() 方法,按多个分隔符拆分字符串,并移除空项
|
||
QStringList qlistDraftList = DraftList_tmp.split(QRegExp("[;:,;:,\\s]+"), QString::SkipEmptyParts); // \\s 用于匹配空格
|
||
|
||
// 将 QStringList 转换为 std::vector<std::string>
|
||
std::vector<std::string> ds;
|
||
for (const QString& token : qlistDraftList) {
|
||
ds.push_back(token.toStdString());
|
||
}
|
||
|
||
int nds = ds.size();
|
||
|
||
|
||
if (nds > 0)
|
||
{
|
||
std::vector<double> Dft(nds);
|
||
std::vector<double> Dft1;
|
||
for (int i = 0; i < nds; i++)
|
||
{
|
||
Dft[i] = std::stod(ds[i]);
|
||
Dft[i] = std::round(Dft[i] * std::pow(10, 3)) / std::pow(10, 3); // 输入计算吃水只保留三位小数
|
||
}
|
||
std::sort(Dft.begin(), Dft.end()); // 排序
|
||
|
||
// #region 排除Dft中的重复值 ,得到Dft1
|
||
Dft1.push_back(Dft[0]);
|
||
double td = Dft[0];
|
||
for (int i = 1; i < nds; i++)
|
||
{
|
||
|
||
//20200511 by czb,原函数不能完全排除重复值,只能排除相邻的重复值
|
||
if (std::find(Dft1.begin(), Dft1.end(), Dft[i]) != Dft1.end())
|
||
{
|
||
continue;
|
||
}
|
||
Dft1.push_back(Dft[i]);
|
||
}
|
||
// #endregion
|
||
|
||
Draft = Dft1;
|
||
}
|
||
else
|
||
{
|
||
Draft = std::vector<double>();
|
||
}
|
||
}
|
||
// #endregion
|
||
|
||
// #endregion
|
||
|
||
// #region 静水力、完整稳性、破损稳性、许用重心高度
|
||
StabCalcBaseData::FindByParamID("Density", Density);
|
||
if (Density <= 0.01)
|
||
{
|
||
Density = 1.0; // 20160725新增,解决舷外水密度未赋值的情况发生
|
||
}
|
||
//int.TryParse(mod.BInf.FindByParamID("HullAffect").Value, out HullAffect);
|
||
//double.TryParse(mod.BInf.FindByParamID("HullAffectCoef").Value, out HullAffectCoef);
|
||
// #region 静水力计算纵倾列表 20200511 by czb
|
||
std::string TrimList = StabCalcBaseData::FindByParamID("TrimList");
|
||
{
|
||
// 用于存储分隔符字符
|
||
std::vector<QChar> delimiters = { ';', ':', ',', ';', ':', ',', ' ' };
|
||
|
||
// 使用QString的split函数,按分隔符拆分字符串并移除空项
|
||
QStringList qlistTrimList = QString::fromStdString(TrimList).split(QRegExp("[;:,,;: ]+"), QString::SkipEmptyParts);
|
||
|
||
// 将QStringList转为std::vector<std::string>
|
||
std::vector<std::string> ds;
|
||
std::transform(qlistTrimList.begin(), qlistTrimList.end(), std::back_inserter(ds), [](const QString& s) { return s.toStdString(); });
|
||
|
||
int nds = ds.size();
|
||
|
||
if (nds > 0)
|
||
{
|
||
std::vector<double> Dft(nds);
|
||
std::vector<double> Dft1;
|
||
for (int i = 0; i < nds; i++)
|
||
{
|
||
Dft[i] = std::stod(ds[i]);
|
||
|
||
Dft[i] = std::round(Dft[i] * std::pow(10, 3)) / std::pow(10, 3); // 输入值只保留三位小数
|
||
}
|
||
std::sort(Dft.begin(), Dft.end()); // 排序
|
||
|
||
// #region 增加0为第一个,排除Dft中的重复值 ,得到Dft1
|
||
double td = 0;
|
||
Dft1.push_back(td);
|
||
for (int i = 0; i < nds; i++)
|
||
{
|
||
if (std::find(Dft1.begin(), Dft1.end(), Dft[i]) != Dft1.end())
|
||
{
|
||
continue;
|
||
}
|
||
Dft1.push_back(Dft[i]);
|
||
}
|
||
// #endregion
|
||
|
||
Trims = Dft1;
|
||
}
|
||
else
|
||
{
|
||
Trims = { 0 };
|
||
}
|
||
}
|
||
|
||
|
||
// #endregion
|
||
StabCalcBaseData::FindByParamID("AngleEvalMax", AngleEvalMax);
|
||
StabCalcBaseData::FindByParamID("AngleEvalInterval", AngleEvalInterval);
|
||
// #endregion
|
||
|
||
//cqr-20190702 舱容计算步长
|
||
try
|
||
{
|
||
StabCalcBaseData::FindByParamID("TankCapStep", this->TankCapStep); //20190601 added by czb
|
||
}
|
||
catch (...)
|
||
{
|
||
this->TankCapStep = 0; //没填时为0
|
||
}
|
||
|
||
if (hasIntact) //20191108 modified by czb
|
||
{
|
||
// #region 完整稳性、破损稳性、许用重心高度
|
||
ShipType = StabCalcBaseData::FindByParamID("ShipType");
|
||
//int.TryParse(mod.BInf.FindByParamID("ChildType").Value, out ChildType);
|
||
StabCalcBaseData::FindByParamID("IsSelfNav", IsSelfNav);
|
||
// bool.TryParse(mod.BInf.FindByParamID("IsHighspeed").Value, out IsHighspeed);
|
||
try //20190225增加高速船项 by czb
|
||
{
|
||
StabCalcBaseData::FindByParamID("IsHighspeed", IsHighspeed);
|
||
// double.TryParse(mod.BInf.FindByParamID("Vd").Value, out Vd);
|
||
}
|
||
catch (...) // 打开旧文件直接计算时会读不到这个值,需要用户打开计算参数编辑界面才会初始化BInf添加IsHighspeed信息
|
||
{
|
||
IsHighspeed = false;
|
||
// Vd = 0;
|
||
}
|
||
StabCalcBaseData::FindByParamID("IsBox", IsBox);
|
||
StabCalcBaseData::FindByParamID("IsDoubleDeck", IsDoubleDeck); //20201214 by czb 远洋渔船
|
||
NavArea = StabCalcBaseData::FindByParamID("NavArea");
|
||
StabCalcBaseData::FindByParamID("NavSeg", NavSeg);
|
||
StabCalcBaseData::FindByParamID("Vm", Vm);
|
||
StabCalcBaseData::FindByParamID("IsFullWindScale", IsFullWindScale);
|
||
//double.TryParse(mod.BInf.FindByParamID("FullWindScaleArea").Value, out FullWindScaleArea); //20160801删除此输入参数
|
||
//double.TryParse(mod.BInf.FindByParamID("FullWindScaleMoment").Value, out FullWindScaleMoment); //20160801删除此输入参数
|
||
// #region 侧投影计算纵剖面列表
|
||
ProfileYList = StabCalcBaseData::FindByParamID("ProfileYList");
|
||
{
|
||
// 将 std::string 转换为 QString
|
||
QString ProfileYList_tmp = QString::fromStdString(ProfileYList);
|
||
|
||
// 使用 QString::split() 方法,按多个分隔符拆分字符串,并移除空项
|
||
QStringList qlistProfileYList = ProfileYList_tmp.split(QRegExp("[;:,;:,]+"), QString::SkipEmptyParts);
|
||
|
||
// 将 QStringList 转换为 std::vector<std::string>
|
||
std::vector<std::string> ds;
|
||
for (const QString& token : qlistProfileYList) {
|
||
ds.push_back(token.toStdString());
|
||
}
|
||
int nds = ds.size();
|
||
|
||
if (nds > 0)
|
||
{
|
||
std::vector<double> Dft(nds);
|
||
std::vector<double> Dft1;
|
||
for (int i = 0; i < nds; i++)
|
||
{
|
||
Dft[i] = std::stod(ds[i]);
|
||
Dft[i] = std::round(Dft[i] * std::pow(10, 3)) / std::pow(10, 3); // 输入计算吃水只保留三位小数
|
||
}
|
||
std::sort(Dft.begin(), Dft.end()); // 排序
|
||
|
||
// #region 排除Dft中的重复值 ,得到Dft1
|
||
Dft1.push_back(Dft[0]);
|
||
double td = Dft[0];
|
||
for (int i = 1; i < nds; i++)
|
||
{
|
||
if (td == Dft[i])
|
||
{
|
||
continue;
|
||
}
|
||
else
|
||
{
|
||
Dft1.push_back(Dft[i]);
|
||
td = Dft[i];
|
||
}
|
||
|
||
}
|
||
// #endregion
|
||
|
||
ProfileY = Dft1;
|
||
}
|
||
else
|
||
{
|
||
ProfileY = std::vector<double>();
|
||
}
|
||
}
|
||
// #endregion
|
||
|
||
StabCalcBaseData::FindByParamID("BilgeKeelArea", BilgeKeelArea);
|
||
StabCalcBaseData::FindByParamID("BilgeType", BilgeType);
|
||
StabCalcBaseData::FindByParamID("BilgeC2", BilgeC2);
|
||
StabCalcBaseData::FindByParamID("BilgeC3", BilgeC3);
|
||
StabCalcBaseData::FindByParamID("BilgeC4", BilgeC4);
|
||
|
||
StabCalcBaseData::FindByParamID("HasMudHold", HasMudHold);
|
||
StabCalcBaseData::FindByParamID("StaticAngleReq", StaticAngleReq);
|
||
|
||
|
||
try //cqr-20190702
|
||
{
|
||
StabCalcBaseData::FindByParamID("IsStaticAngleReturnTest", IsStaticAngleReturnTest); //20190601 added by czb
|
||
StabCalcBaseData::FindByParamID("TankCapStep", TankCapStep);
|
||
|
||
}
|
||
catch (...)
|
||
{
|
||
IsStaticAngleReturnTest = false;
|
||
TankCapStep = 0.1;
|
||
}
|
||
|
||
|
||
StabCalcBaseData::FindByParamID("RollingPeriod", RollingPeriod); //20201214 by czb 远洋渔船
|
||
StabCalcBaseData::FindByParamID("RollingAngle", RollingAngle); //20201214 by czb 远洋渔船
|
||
|
||
|
||
|
||
//CriteriaFactor = mod.BInf.FindByParamID("CriteriaFactor").Value;
|
||
|
||
try
|
||
{
|
||
IntactRemark = StabCalcBaseData::FindByParamID("IntactRemark"); //20170601 by czb
|
||
}
|
||
catch (...)
|
||
{
|
||
IntactRemark = "";
|
||
}
|
||
|
||
// #endregion
|
||
|
||
}
|
||
|
||
if (hasInclining) //20191108 modified by czb
|
||
{
|
||
// #region 倾斜试验
|
||
|
||
StabCalcBaseData::FindByParamID("IncliningDensity", IncliningDensity);
|
||
StabCalcBaseData::FindByParamID("AT", AT);
|
||
StabCalcBaseData::FindByParamID("IncliningAH0", IncliningAH0);
|
||
StabCalcBaseData::FindByParamID("IncliningMobileWeightNo", IncliningMobileWeightNo);
|
||
int iTmp;
|
||
StabCalcBaseData::FindByParamID("IncliningDeviceType", iTmp);
|
||
IncliningDeviceType = iTmp;
|
||
StabCalcBaseData::FindByParamID("IncliningDeviceNo", IncliningDeviceNo);
|
||
StabCalcBaseData::FindByParamID("IncliningRecordNo", IncliningRecordNo);
|
||
StabCalcBaseData::FindByParamID("IncliningAngleAlgorithm", IncliningAngleAlgorithm);
|
||
StabCalcBaseData::FindByParamID("IncliningGMAlgorithm", IncliningGMAlgorithm);
|
||
// #endregion
|
||
}
|
||
|
||
if (hasDamProb) //cqr-20210817
|
||
{
|
||
try
|
||
{
|
||
StabCalcBaseData::FindByParamID("Ls_p", Ls_p);
|
||
}
|
||
catch (...)
|
||
{
|
||
Ls_p = 0;
|
||
}
|
||
|
||
try
|
||
{
|
||
StabCalcBaseData::FindByParamID("Bs_p", Bs_p);
|
||
}
|
||
catch (...)
|
||
{
|
||
Bs_p = 0;
|
||
}
|
||
|
||
try
|
||
{
|
||
StabCalcBaseData::FindByParamID("Xa_p", Xa_p);
|
||
}
|
||
catch (...)
|
||
{
|
||
Xa_p = 0;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
BasicInf::BasicInf()
|
||
{
|
||
StabCalcBaseData::FindByParamID("IncliningDensity", IncliningDensity);
|
||
StabCalcBaseData::FindByParamID("AT", AT);
|
||
StabCalcBaseData::FindByParamID("IncliningAH0", IncliningAH0);
|
||
StabCalcBaseData::FindByParamID("IncliningMobileWeightNo", IncliningMobileWeightNo);
|
||
int iTmp;
|
||
StabCalcBaseData::FindByParamID("IncliningDeviceType", iTmp);
|
||
IncliningDeviceType = iTmp;
|
||
StabCalcBaseData::FindByParamID("IncliningDeviceNo", IncliningDeviceNo);
|
||
StabCalcBaseData::FindByParamID("IncliningRecordNo", IncliningRecordNo);
|
||
StabCalcBaseData::FindByParamID("IncliningAngleAlgorithm", IncliningAngleAlgorithm);
|
||
StabCalcBaseData::FindByParamID("IncliningGMAlgorithm", IncliningGMAlgorithm);
|
||
|
||
}
|
||
|
||
double BasicInf::getXofAP() const
|
||
{
|
||
return -OrgOff - Lpp / 2;
|
||
}
|
||
|
||
double BasicInf::getXofMP() const
|
||
{
|
||
return -OrgOff;
|
||
}
|
||
|
||
double BasicInf::getXofFP() const
|
||
{
|
||
return -OrgOff + Lpp / 2;
|
||
}
|
||
|
||
double BasicInf::XofAP2User(double x)
|
||
{
|
||
return x - OrgOff - Lpp / 2;
|
||
}
|
||
|
||
double BasicInf::XofUser2AP(double x)
|
||
{
|
||
return x + OrgOff + Lpp / 2;
|
||
}
|
||
|
||
double BasicInf::XofMP2User(double x)
|
||
{
|
||
return x - OrgOff;
|
||
}
|
||
|
||
double BasicInf::XofUser2MP(double x)
|
||
{
|
||
return x + OrgOff;
|
||
|
||
}
|
||
|