447 lines
14 KiB
C++
447 lines
14 KiB
C++
#include "FEKOFarFieldFileClass.h"
|
|
|
|
FEKOBase::FEKOFarFieldFileClass::FEKOFarFieldFileClass()
|
|
{
|
|
|
|
}
|
|
|
|
FEKOBase::FEKOFarFieldFileClass::~FEKOFarFieldFileClass()
|
|
{
|
|
|
|
}
|
|
|
|
void FEKOBase::FEKOFarFieldFileClass::parseFarFieldFile(const QString& fileName)
|
|
{
|
|
QFile file(fileName);
|
|
// 加载文本文件中的所有数据到一个 QString 中
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
|
{
|
|
qDebug() << "Failed to open file for reading";
|
|
return;
|
|
}
|
|
QTextStream in(&file);
|
|
QString line;
|
|
bool dataSectionStarted = false;
|
|
|
|
|
|
QList<QString> dataBlockStrList;
|
|
dataBlockStrList.clear();
|
|
while (!in.atEnd()) {
|
|
line = in.readLine().trimmed();
|
|
if (line.startsWith(u8"##")) {
|
|
if (line.indexOf(u8"File Type:") != -1) {
|
|
this->FileType = line.split(":")[1].trimmed();
|
|
}
|
|
else if (line.indexOf(u8"File Format:") != -1) {
|
|
this->FileFormat = line.split(":")[1].trimmed();
|
|
}
|
|
else if (line.indexOf(u8"Source:") != -1) {
|
|
this->Sourcestr = line.split(":")[1].trimmed();
|
|
}
|
|
else if (line.indexOf(u8"Date:") != -1) {
|
|
this->Datestr = line.split(":")[1].trimmed();
|
|
}
|
|
else {
|
|
continue;
|
|
}
|
|
}
|
|
else if (line.startsWith("**")) {
|
|
dataBlockStrList.clear();
|
|
continue;
|
|
}
|
|
else {
|
|
if (line.length() < 5) {
|
|
if (dataBlockStrList.length() > 0) {
|
|
FEKOFARFIELDFEKODATABLOCK temp_dataBlock;
|
|
temp_dataBlock.paraseFEKOFarFieldDataBlockFromList(dataBlockStrList);
|
|
this->dataBlockList.push_back(temp_dataBlock);
|
|
}
|
|
else {
|
|
|
|
}
|
|
dataBlockStrList.clear();
|
|
}
|
|
else {
|
|
dataBlockStrList.append(line);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dataBlockStrList.length() > 0) {
|
|
FEKOFARFIELDFEKODATABLOCK temp_dataBlock;
|
|
temp_dataBlock.paraseFEKOFarFieldDataBlockFromList(dataBlockStrList);
|
|
this->dataBlockList.push_back(temp_dataBlock);
|
|
}
|
|
|
|
file.close();
|
|
}
|
|
|
|
void FEKOBase::FEKOFarFieldFileClass::outputToFile(const QString& fileName)
|
|
{
|
|
QFile file(fileName);
|
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
|
{
|
|
qDebug() << "Failed to open file for writing";
|
|
return;
|
|
}
|
|
|
|
QTextStream out(&file);
|
|
|
|
file.close();
|
|
|
|
}
|
|
|
|
FEKOBase::FEKOFARFIELDRESULTTYPE FEKOBase::FEKOFARFIELDRESULTTYPEString2Enum(QString str)
|
|
{
|
|
if (str.toUpper() == "GAIN") { return FEKOBase::GAIN; }
|
|
else if (str.toUpper() == "DIRECTIVITY") { return FEKOBase::DIRECTIVITY; }
|
|
else if (str.toUpper() == "RCS") { return FEKOBase::RCS; }
|
|
else if (str.toUpper() == "FARFIELDVALUES") { return FEKOBase::FARFIELDVALUES; }
|
|
else {
|
|
return FEKOBase::FEKOFARFIELDRESULTTYPEUNKOWN;
|
|
}
|
|
return FEKOBase::FEKOFARFIELDRESULTTYPE();
|
|
}
|
|
|
|
QString FEKOBase::QString2FEKOFARFIELDRESULTTYPE(FEKOBase::FEKOFARFIELDRESULTTYPE mode)
|
|
{
|
|
switch (mode) {
|
|
case FEKOBase::GAIN:
|
|
return "GAIN";
|
|
case FEKOBase::DIRECTIVITY:
|
|
return "DIRECTIVITY";
|
|
case FEKOBase::RCS:
|
|
return "RCS";
|
|
case FEKOBase::FARFIELDVALUES:
|
|
return "FARFIELDVALUES";
|
|
default:
|
|
return "FEKOFARFIELDRESULTTYPEUNKOWN";
|
|
|
|
}
|
|
}
|
|
|
|
FEKOBase::FEKOFARFIELDFEKODATABLOCK::FEKOFARFIELDFEKODATABLOCK()
|
|
{
|
|
this->dataList.clear();
|
|
this->thetaSamples = 0;
|
|
this->phiSamples = 0;
|
|
this->USamples = 0;
|
|
this->VSamples = 0;
|
|
this->configurationName.clear();
|
|
this->requestName.clear();
|
|
this->frequency = 0;
|
|
this->Origin = { 0,0,0 };
|
|
this->headerLines = 0;
|
|
this->coordinateSystem = FEKOBase::UNKONWFEKOCOORDINATESYSTEM;
|
|
this->resultType = FEKOBase::FEKOFARFIELDRESULTTYPEUNKOWN;
|
|
}
|
|
|
|
FEKOBase::FEKOFARFIELDFEKODATABLOCK::~FEKOFARFIELDFEKODATABLOCK()
|
|
{
|
|
|
|
}
|
|
|
|
int FEKOBase::FEKOFARFIELDFEKODATABLOCK::paraseFEKOFarFieldDataBlock(const QString& blockstr)
|
|
{
|
|
// 按行进行解析
|
|
QList<QString> lines= blockstr.split("\n");
|
|
return this->paraseFEKOFarFieldDataBlockFromList(lines);
|
|
return 1;
|
|
|
|
}
|
|
|
|
int FEKOBase::FEKOFARFIELDFEKODATABLOCK::paraseFEKOFarFieldDataBlockFromList(QList<QString>& lines)
|
|
{
|
|
bool in_readHeaderState = false;
|
|
size_t headerlineCount = 0;
|
|
std::vector<QString> headerLines;// 解析行列时保证结果
|
|
|
|
|
|
for (size_t i = 0; i < lines.size(); i++) {
|
|
if (lines[i].startsWith("#")) { // 参数项是以# 开头作为配置项
|
|
// 针对不同参数项提取参数
|
|
QString configName = normalizationHeaderString(lines[i]); // 获取参数的归一化名称
|
|
if (configName == u8"") { // 未知参数项
|
|
// 进入字段解析状态
|
|
if (in_readHeaderState) { // 解析字段
|
|
QList<QString> temp_headerLines=lines[i].split(FEKOFARFIELDSPLITCHAT);
|
|
for (size_t ii = 0; ii < temp_headerLines.size();ii++) {
|
|
if (temp_headerLines[ii].length() > 2) {
|
|
QString temp_header_str= this->normalizationHeaderString(temp_headerLines[ii]);
|
|
headerLines.push_back(temp_header_str);
|
|
}
|
|
else {
|
|
continue;
|
|
}
|
|
}
|
|
headerlineCount++;
|
|
if (headerlineCount >= this->headerLines) {
|
|
in_readHeaderState = false;
|
|
}
|
|
}
|
|
else {
|
|
continue;
|
|
}
|
|
}
|
|
else if (configName == u8"ConfigurationName") {
|
|
this->configurationName = lines[i].split(":")[1].trimmed();
|
|
}
|
|
else if (configName == u8"RequestName") {
|
|
this->requestName = lines[i].split(":")[1].trimmed();
|
|
}
|
|
else if (configName == u8"Frequency") {
|
|
this->frequency = lines[i].split(":")[1].trimmed().toDouble();
|
|
}
|
|
else if (configName == u8"CoordinateSystem") {
|
|
this->coordinateSystem = FEKOBase::FEKOCoordinateSystemString2Enum(lines[i].split(":")[1].trimmed());
|
|
}
|
|
else if (configName == u8"ThetaSamplePointsNumber") {
|
|
this->thetaSamples = lines[i].split(":")[1].trimmed().toInt();
|
|
}
|
|
else if (configName == u8"PhiSamplePointsNumber") {
|
|
this->phiSamples = lines[i].split(":")[1].trimmed().toInt();
|
|
}
|
|
else if (configName == u8"USamplePointNumber") {
|
|
this->USamples = lines[i].split(":")[1].trimmed().toInt();
|
|
}
|
|
else if (configName == u8"VSamplePointNumber") {
|
|
this->VSamples = lines[i].split(":")[1].trimmed().toInt();
|
|
}
|
|
else if (configName == u8"ORIGIN") {
|
|
QStringList originstrlist = lines[i].replace("(", "").replace(")", "").split(":")[1].trimmed().split(",");
|
|
this->Origin = { originstrlist[0].trimmed().toDouble(),originstrlist[1].trimmed().toDouble(),originstrlist[2].trimmed().toDouble() };
|
|
}
|
|
else if (configName == u8"ResultType") {
|
|
this->resultType = FEKOBase::FEKOFARFIELDRESULTTYPEString2Enum(lines[i].split(":")[1].trimmed());
|
|
}
|
|
else if (configName == u8"HeaderLines") {
|
|
this->headerLines = lines[i].split(":")[1].trimmed().toInt();
|
|
in_readHeaderState = true;
|
|
|
|
}
|
|
else {
|
|
continue;
|
|
}
|
|
}
|
|
else if (lines[i].size() > 10) { // 解析数据块
|
|
QList<QString> dataline = lines[i].split(FEKOFARFIELDSPLITCHAT);
|
|
FEKOBase::FEKOFarFieldFEKOFarFieldData temp_data;
|
|
long field_idx =-1;
|
|
for (size_t ii = 0; ii < dataline.count(); ii++) {
|
|
if (dataline[ii] == u8"") { continue; }
|
|
else { field_idx = field_idx + 1; }
|
|
if (headerLines[field_idx] == "theta") { temp_data.theta = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "phi") { temp_data.phi = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "re(etheta)") { temp_data.re_Etheta = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "im(etheta)") { temp_data.im_Etheta = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "re(ephi)") { temp_data.re_Ephi = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "im(ephi)") { temp_data.im_Ephi = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "gain(theta)") { temp_data.gain_Theta = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "gain(phi)") { temp_data.gain_Phi = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "gain(total)") { temp_data.gain_Total = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "radius") { temp_data.radius = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "x") { temp_data.X = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "y") { temp_data.Y = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "z") { temp_data.Z = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "re(ex)") { temp_data.re_Ex = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "re(ey)") { temp_data.re_Ey = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "re(ez)") { temp_data.re_Ez = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "im(ex)") { temp_data.im_Ex = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "im(ey)") { temp_data.im_Ey = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "im(ez)") { temp_data.im_Ez = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "re(er)") { temp_data.re_Er = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "im(er)") { temp_data.im_Er = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "u") { temp_data.U = dataline[ii].toDouble(); }
|
|
else if (headerLines[field_idx] == "v") { temp_data.V = dataline[ii].toDouble(); }
|
|
else {
|
|
continue;
|
|
}
|
|
}
|
|
this->dataList.push_back(temp_data);
|
|
}
|
|
else {
|
|
continue;
|
|
}
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
QString FEKOBase::FEKOFARFIELDFEKODATABLOCK::normalizationHeaderString(QString headerstr)
|
|
{
|
|
headerstr = headerstr.replace("'", "").replace(u8"\"",u8"");
|
|
if(headerstr.indexOf("#Configuration Name") != -1)
|
|
{
|
|
return u8"ConfigurationName";
|
|
}
|
|
else if (headerstr.indexOf("#Request Name") != -1)
|
|
{
|
|
return u8"RequestName";
|
|
}
|
|
else if (headerstr.indexOf("#Frequency") != -1)
|
|
{
|
|
return u8"Frequency";
|
|
}
|
|
else if (headerstr.indexOf("#Coordinate System:") != -1)
|
|
{
|
|
return u8"CoordinateSystem";
|
|
}
|
|
else if (headerstr.indexOf("#No. of Theta Samples:") != -1)
|
|
{
|
|
return u8"ThetaSamplePointsNumber";
|
|
}
|
|
else if (headerstr.indexOf("#No. of Phi Samples:") != -1)
|
|
{
|
|
return u8"PhiSamplePointsNumber";
|
|
}
|
|
else if (headerstr.indexOf("#No. of U Samples:") != -1)
|
|
{
|
|
return u8"USamplePointNumber";
|
|
}
|
|
else if (headerstr.indexOf("#No. of V Samples:") != -1)
|
|
{
|
|
return u8"VSamplePointNumber";
|
|
}
|
|
else if (headerstr.indexOf("#No. of X Samples:") != -1)
|
|
{
|
|
return u8"XSamplePointNumber";
|
|
}
|
|
else if (headerstr.indexOf("#No. of Y Samples:") != -1)
|
|
{
|
|
return u8"YSamplePointNumber";
|
|
}
|
|
else if (headerstr.indexOf("#No. of Z Samples:") != -1)
|
|
{
|
|
return u8"ZSamplePointNumber";
|
|
}
|
|
else if (headerstr.indexOf("#Origin:") != -1)
|
|
{
|
|
return u8"ORIGIN";
|
|
}
|
|
else if (headerstr.indexOf("#Result Type:") != -1)
|
|
{
|
|
return u8"ResultType";
|
|
}
|
|
else if (headerstr.indexOf("#No. of Header Lines:") != -1)
|
|
{
|
|
return u8"HeaderLines";
|
|
}
|
|
else if (headerstr.toLower().trimmed()==u8"theta"|| headerstr.toLower().trimmed() == u8"theta'") {
|
|
return u8"theta";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"phi"|| headerstr.toLower().trimmed() == u8"phi'") {
|
|
return u8"phi";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"re(etheta)"|| headerstr.toLower().trimmed() == u8"re(etheta')") {
|
|
return u8"re(etheta)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"im(etheta)"|| headerstr.toLower().trimmed() == u8"im(etheta')") {
|
|
return u8"im(etheta)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"re(ephi)"|| headerstr.toLower().trimmed() == u8"re(ephi')") {
|
|
return u8"re(ephi)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"im(ephi)"|| headerstr.toLower().trimmed() == u8"im(ephi')") {
|
|
return u8"im(ephi)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"re(er)"|| headerstr.toLower().trimmed() == u8"re(er')") {
|
|
return u8"re(ephi)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"im(er)"|| headerstr.toLower().trimmed() == u8"im(er')") {
|
|
return u8"im(ephi)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"gain(theta)"|| headerstr.toLower().trimmed() == u8"gain(theta')") {
|
|
return u8"gain(theta)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"gain(phi)"|| headerstr.toLower().trimmed() == u8"gain(phi')") {
|
|
return u8"gain(phi)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"gain(total)"|| headerstr.toLower().trimmed() == u8"gain(total')") {
|
|
return u8"gain(total)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"radius"|| headerstr.toLower().trimmed() == u8"radius'") {
|
|
return u8"radius";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"x" || headerstr.toLower().trimmed() == "x'") {
|
|
return u8"x";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"y" || headerstr.toLower().trimmed() == "y'") {
|
|
return u8"y";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == u8"z" || headerstr.toLower().trimmed() == "z'") {
|
|
return u8"z";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "re(ex)" || headerstr.toLower().trimmed() == "re(ex')") {
|
|
return u8"re(ex)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "re(ey)" || headerstr.toLower().trimmed() == "re(ey')") {
|
|
return u8"re(ey)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "re(ez)" || headerstr.toLower().trimmed() == "re(ez')") {
|
|
return u8"re(ez)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "im(ex)" || headerstr.toLower().trimmed() == "im(ex')") {
|
|
return u8"im(ex)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "im(ey)" || headerstr.toLower().trimmed() == "im(ey')") {
|
|
return u8"im(ey)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "im(ez)" || headerstr.toLower().trimmed() == "im(ez')") {
|
|
return u8"im(ez)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "re(er)" || headerstr.toLower().trimmed() == "re(er')") {
|
|
return u8"re(er)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "im(er)" || headerstr.toLower().trimmed() == "im(er')") {
|
|
return u8"im(er)";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "u" || headerstr.toLower().trimmed() == "u'") {
|
|
return u8"u";
|
|
}
|
|
else if (headerstr.toLower().trimmed() == "v" || headerstr.toLower().trimmed() == "v'") {
|
|
return u8"v";
|
|
}
|
|
else {
|
|
return u8"";
|
|
}
|
|
|
|
;
|
|
}
|
|
|
|
QString FEKOBase::FEKOFARFIELDFEKODATABLOCK::saveFEKOFarFieldDataBlock()
|
|
{
|
|
|
|
switch (this->resultType) {
|
|
case FEKOBase::GAIN:
|
|
return this->saveFEKOFarFieldDataBlock_Gain();
|
|
case FEKOBase::DIRECTIVITY:
|
|
return this->saveFEKOFarFieldDataBlock_Directivity();
|
|
case FEKOBase::RCS:
|
|
return this->saveFEKOFarFieldDataBlock_RCS();
|
|
case FEKOBase::FARFIELDVALUES:
|
|
return this->saveFEKOFarFieldDataBlock_FarFieldValues();
|
|
default:
|
|
return QString();
|
|
}
|
|
}
|
|
|
|
QString FEKOBase::FEKOFARFIELDFEKODATABLOCK::saveFEKOFarFieldDataBlock_Gain()
|
|
{
|
|
return QString();
|
|
}
|
|
|
|
QString FEKOBase::FEKOFARFIELDFEKODATABLOCK::saveFEKOFarFieldDataBlock_Directivity()
|
|
{
|
|
return QString();
|
|
}
|
|
|
|
QString FEKOBase::FEKOFARFIELDFEKODATABLOCK::saveFEKOFarFieldDataBlock_RCS()
|
|
{
|
|
return QString();
|
|
}
|
|
|
|
QString FEKOBase::FEKOFARFIELDFEKODATABLOCK::saveFEKOFarFieldDataBlock_FarFieldValues()
|
|
{
|
|
return QString();
|
|
}
|