#include "ChangeFSPos.h" #include void ChangeFSPos::reset() { Lbp = 0.0; stnap = 0.0; stnfp = 0.0; rfrno = 0.0; iframe = 1; nfrtab = 0; // 肋位数 std::vector t_fr; frno.swap(t_fr); // 肋位号 std::vector t_frsp; frsp.swap(t_frsp); // 肋距 std::vector t_yfr; yfr.swap(t_yfr); // 肋位号的纵向坐标位置 yreffr = 0.0; // 0号肋号位置 stationpos = 0.0; // 0号站号起始位置 nsp = 0; // 站数 std::vector t_sno; sno.swap(t_sno); // 站号 std::vector t_ssp; ssp.swap(t_ssp); // 站距 std::vector t_ys; ys.swap(t_ys); // 站号的纵向坐标位置 fn = "f4"; } void ChangeFSPos::gpos_lpos(double gpos, int Ref, std::string &tlpos) { double add = 0.0; // Stno, Lsno; double vlpos = 0.0; int N; tlpos = " "; switch (Ref) { case 1: tlpos = std:: to_string(gpos); return; case 2: vlpos = gpos; tlpos = "A " + std:: to_string(vlpos); break; case 3: vlpos = gpos - Lbp / 2; tlpos = "M " + std:: to_string(vlpos); break; case 4: // gpos = Convert.ToDouble(String.Format((gpos - 0.0001).ToString (), "#0.0000")); // 'on-2006-11-2 Frout(gpos, vlpos, add); tlpos = "# " + std:: to_string(vlpos); break; case 5: // Stno = (gpos - stationpos) / (Lbp / (stnfp - stnap)) + stnap; // Lsno = Lbp / (stnfp - stnap); // vlpos = Convert.ToInt16(Stno); // add = (Stno - vlpos) * Lbp / (stnfp - stnap); Sout(gpos, vlpos, add); tlpos = "$"; break; default: break; } // 单位转换成mm add *= 1000; // string temp_tpos = tpos.Substring(1,1); tlpos = tlpos.substr(0, 1) + std:: to_string(vlpos); if (std::abs(add) < 0.000001) { return; } N = tlpos.length() + 1; // if (N < 5) tlpos = tlpos + " "; N = fnmax(N, 5); if (add >= -0.0005) { tlpos = tlpos.substr(0, N - 1) + "+"; N = N + 1; } // string tempadd = add.ToString(); // tlpos = tlpos.Substring(0, N - 1) + Convert.ToDouble(String.Format("{0:0.0000}", add));//Format(add, formatStr); std::ostringstream oss; oss << std::fixed << std::setprecision(4) << add; tlpos = tlpos.substr(0, N - 1) + oss.str(); } void ChangeFSPos::lpos_gpos(const std::string &lpos, double &vgpos) { double add = 0.0, vlpos; int Sign, N, Ref; std::string tpos; if (StringHelper::trim(lpos) == "") { return; } vgpos = 0; Ref = 2; tpos = StringHelper::toUpper(StringHelper::trim(lpos)); // UCase(Trim(lpos)); std::string temp_tpos = tpos.substr(0, 1); if (temp_tpos != "M") { Ref = 4; if (temp_tpos == "F" && temp_tpos == "#") { if (nfrtab <= 0) { throw std::runtime_error("肋位不存在"); } } else { Ref = 5; if (temp_tpos != "S" && temp_tpos != "$") { Ref = 1; } } } else { tpos = tpos.substr(2, tpos.length() - 1); vgpos = std::stod(tpos); switch (Ref) { case 3: vgpos = Lbp / 2 + vgpos; return; default: break; } } tpos = tpos.substr(1, tpos.length() - 1); tpos = StringHelper::trim(tpos); if (tpos.substr(0, 1) == "-") { Sign = -1; tpos = tpos.substr(1, tpos.length() - 1); } else { Sign = 1; if (tpos.substr(0, 1) == "+") { tpos = tpos.substr(1, tpos.length() - 1); } } // Sign = 1 + 2 * (Mid(tpos, 1, 1) = "-"); N = (int)tpos.find( "+"); if (N > 0) { add = std::stod(tpos.substr(N, tpos.length() - N)); tpos = tpos.substr(0, N); } else { N = (int)tpos.find( "-"); if (N > 0) { add = std::stod(tpos.substr(N, tpos.length() - N)); tpos = tpos.substr(0, N); } } // 单位转换成m add /= 1000; vlpos = std::stod(tpos) * Sign; if (Ref != 5) { frin(vlpos, add, vgpos, iframe, rfrno, yreffr, nfrtab, frno, yfr, frsp); } else { // if (stnap != stnfp) // vgpos = Lbp / (stnfp - stnap) * (vlpos - stnap) + add + stationpos; if (!Sin(vlpos, add, vgpos)) { throw std::runtime_error("站不存在"); } } } bool ChangeFSPos::Frout(double gpos, double &Vlpos, double &Add) { if (nfrtab == 0) { return false; } int I; std::vector frList = GetFX(); int startFr = frno[1]; int endFr = frno[1 + nfrtab]; Vlpos = 0; Add = 0; for (I = startFr; I <= endFr; I++) { if (std::abs(gpos - frList[I - startFr]) < 1e-7) { break; } if (gpos > frList[I - startFr]) { continue; } else { if (I == startFr) { break; } else { I--; break; } } } if (I > endFr) { I = endFr; } Vlpos = I; Add = gpos - frList[I - startFr]; return true; } double ChangeFSPos::FNFract(double X) { if (std::floor(X + 0.00001) > std::floor(X)) { X = X + 0.00001; } return X - std::floor(X + 0.00001); // if (Int(X + 0.00001) > Int(X)) // X = X + 0.00001; // return X - Int(X + 0.00001) } double ChangeFSPos::FNFract_(double X) { return X - std::floor(X); } void ChangeFSPos::frin(double vlpos, double add, double &gpos, int iframe, double rfrno, double Yreffr, double nfrtab, std::vector &frno, std::vector &yfr, std::vector &frsp) { int I, Sign; Sign = 2 * iframe - 1; if (nfrtab == 0) { throw std::runtime_error("未定义肋位,请先定义肋位!"); } if (vlpos < frno[1] || vlpos > frno[static_cast(nfrtab) + 1]) { throw std::runtime_error("肋位超出范围!"); } if (nfrtab <= 1) { gpos = Sign * (vlpos - rfrno) * frsp[1] + Yreffr; } else { if (vlpos <= frno[1]) { gpos = yfr[1] + Sign * frsp[1] * (vlpos - frno[1]); } else { for (I = 2; I <= nfrtab; I++) { if (frno[I] > vlpos) { break; } } gpos = yfr[I - 1] + Sign * frsp[I - 1] * (vlpos - frno[I - 1]); } } gpos = gpos + add; } int ChangeFSPos::fnmax(int X1, int X2) { int FNMMAX1; FNMMAX1 = X1; if (FNMMAX1 >= X2) { return FNMMAX1; } FNMMAX1 = X2; return FNMMAX1; } bool ChangeFSPos::Sout(double gpos, double &Vlpos, double &Add) { int I; std::vector Ds1(nsp + 1); Vlpos = 0; Add = 0; if (nsp == 0) { return false; } for (I = 1; I <= nsp; I++) { if (std::abs(gpos - ys[I]) < 1e-7) { break; } if (gpos > ys[I]) { continue; } else { if (I == 0) { break; } else { I--; break; ; } } } if (I > nsp) { I = nsp; } Vlpos = sno[I]; Add = gpos - ys[I]; return true; } bool ChangeFSPos::Sin(double vlpos, double add, double &gpos) { if (nsp == 0) { throw std::runtime_error("未定义站位,清先定义站位!"); } // if(!ResetS(ref vlpos, ref add)) //{ // return false; // } int i; for (i = 1; i <= nsp; i++) { if (std::abs(sno[i] - vlpos) < 0.0001) { break; } } if (i > nsp) // 站不存在 { return false; } gpos = ys[i] + add; return true; } bool ChangeFSPos::ResetS(double &vlpos, double &add) { double vlpos_ = vlpos; double add_ = add; vlpos = static_cast(vlpos); double v = vlpos_ - vlpos; if (std::abs(v) < 1e-7) { return true; } int i; for (i = 1; i <= nsp; i++) { if (std::abs(sno[i] - vlpos) < 0.0001) { if (i == nsp) { return false; } add = add_ + v * (ys[i + 1] - ys[i]); break; } } if (i > nsp) // 站不存在 { return false; } return true; } double ChangeFSPos::ShowX(const std::string &str) { try { double tem_val = 0.0; std::string tem_str; if (str == "") { return NAN; } tem_str = str; // C# TO C++ CONVERTER NOTE: The following 'switch' operated on a string and was converted to C++ 'if-else' logic: // switch (str.Substring(0, 1).ToUpper()) // ORIGINAL LINE: case "F": if (StringHelper::toUpper(str.substr(0, 1)) == "F" || StringHelper::toUpper(str.substr(0, 1)) == "$" || StringHelper::toUpper(str.substr(0, 1)) == "S" || StringHelper::toUpper(str.substr(0, 1)) == "#" || StringHelper::toUpper(str.substr(0, 1)) == "M") { lpos_gpos(tem_str, tem_val); } else { return std::stod(str); } return tem_val; } catch (...) { return 0; } } std::string ChangeFSPos::ShowF_Sharp(std::string &str) { return StringHelper::replace(ShowF(str), "F", "#"); } std::string ChangeFSPos::ShowF(std::string str) { double tem_val; std::string tem_str; if (str == "") { return ""; } tem_str = str; std::string temstr1 = str.substr(0, 1); // C# TO C++ CONVERTER NOTE: The following 'switch' operated on a string and was converted to C++ 'if-else' logic: // switch (temstr1.ToUpper()) // ORIGINAL LINE: case "#": if (StringHelper::toUpper(temstr1) == "#" || StringHelper::toUpper(temstr1) == "F") { } else { tem_val = std::stod(str); gpos_lpos(tem_val, 4, tem_str); str = tem_str; } return str; } std::string ChangeFSPos::ShowS(std::string str) { double tem_val; std::string tem_str; if (str == "") { return ""; } tem_str = str; // C# TO C++ CONVERTER NOTE: The following 'switch' operated on a string and was converted to C++ 'if-else' logic: // switch (str.Substring(0, 1).ToUpper()) // ORIGINAL LINE: case "$": if (StringHelper::toUpper(str.substr(0, 1)) == "$" || StringHelper::toUpper(str.substr(0, 1)) == "S") { } else { tem_val = std::stod(str); gpos_lpos(tem_val, 5, tem_str); str = tem_str; } return str; } std::string ChangeFSPos::ShowNonPlusS(std::string &str) { if (str == "") { return ""; } std::string tem_str = str; // C# TO C++ CONVERTER NOTE: The following 'switch' operated on a string and was converted to C++ 'if-else' logic: // switch (str.Substring(0, 1).ToUpper()) // ORIGINAL LINE: case "$": if (StringHelper::toUpper(str.substr(0, 1)) == "$" || StringHelper::toUpper(str.substr(0, 1)) == "S") { } else { // double gpos = double.Parse(str); // double Stno = (gpos - stationpos) / (Lbp / (stnfp - stnap)) + stnap; // str = "S"+Stno.ToString("f3"); double gpos = std::stod(str); double Stno = 0, add = 0; Sout(gpos, Stno, add); // C# TO C++ CONVERTER TASK: There is no C++ equivalent to 'ToString': std::ostringstream oss; oss << std::fixed << std::setprecision(3) << Stno; str = "S" + oss.str(); } return str; } void ChangeFSPos::SetSecConvert(ModelData *model) { try { int count, i, iframe1; std::vector frno1; std::vector frsp1; double tem_sign; std::vector sno1; std::vector ys1; Lbp = model->getLpp(); i = 0; stationpos = model->getSt0X(); count = model->getStationSize(); for (auto dKey : model->getStation()) // 取得起始、终止站号 { if (i == 0) { stnap = dKey.second.m_Num; } else if (i == (count - 1)) { stnfp = dKey.second.m_Num; } i++; } nsp = count; // 站个数 sno = std::vector(count + 1); ssp = std::vector(count + 1); ys = std::vector(count + 1); // 站表 if (count > 0) { sno1 = std::vector(count); ys1 = std::vector(count); i = 0; for (auto pair : model->getStation()) { sno1[i] = pair.second.m_Num; ys1[i] = pair.second.m_Pos; i++; } for (i = 1; i <= count; i++) { sno[i] = sno1[i - 1]; // 站号 ys[i] = ys1[i - 1]; } ssp[count] = 0; for (i = 1; i < count; i++) { ssp[i] = ys[i + 1] - ys[i]; } } //================================================================= // 肋位表 iframe1 = -1; // 默认是递增 iframe1 = model->getShipFrame(); iframe = std::abs(iframe1); rfrno = 0; // 默认是从0号肋位开始 yreffr = model->getF0X(); // 0号肋位起始位置 count = model->getFrames().size(); // 肋位个数 nfrtab = count; // 肋位个数 frno = std::vector(count + 2); frsp = std::vector(count + 1); yfr = std::vector(count + 1); if (count > 0) { frno1 = std::vector(count + 1); frsp1 = std::vector(count); i = 0; for (auto pair : model->getFrames()) { frno1[i] = pair.second.m_NumS; frno1[i + 1] = pair.second.m_Num; frsp1[i] = pair.second.m_Dis; i++; } for (i = 1; i <= count; i++) { frno[i] = frno1[i - 1]; // 肋位号 frsp[i] = frsp1[i - 1]; } frno[i] = frno1[i - 1]; tem_sign = 2 * iframe - 1; yfr[1] = 0; // 第一个肋位起始位置 for (i = 2; i <= count; i++) { yfr[i] = yfr[i - 1] + tem_sign * frsp[i - 1] * (frno[i] - frno[i - 1]); } double vgpos = 0; frin(0, 0, vgpos, 1, rfrno, yreffr, nfrtab, frno, yfr, frsp); for (i = 0; i < count; i++) { yfr[i + 1] -= vgpos - yreffr; } } } catch (...) { } } std::vector ChangeFSPos::GetFX() { std::vector fx; if (nfrtab < 1) { return fx; } int startNo = frno[1]; int endNo = frno[1 + nfrtab]; for (int i = startNo; i < endNo + 1; i++) { fx.push_back(ShowX( "#" + std:: to_string(i))); } return fx; } std::vector ChangeFSPos::GetSX() { std::vector sx; for (int i = 0; i < nsp; i++) { sx.push_back(ys[i + 1]); } return sx; }