#pragma once

#ifndef  FARFIELDFILECLASS_H
#define	FARFIELDFILECLASS_H
#include "referenceHeader.h"
#include "SARImage/FEKOBaseToolClass.h"


namespace FEKOBase {
    //
    // 参数 altair feko user guide 2018.1 
    // 章节 A-10 summary of feko file formats
    //

    const QString FEKOFARFIELDSPLITCHAT = u8" ";

    enum FEKOFARFIELDRESULTTYPE {
        GAIN, // 增益
        DIRECTIVITY,// 电场
        RCS,// 后向散射系数
        FARFIELDVALUES,// 远场值
        FEKOFARFIELDRESULTTYPEUNKOWN
    };
    FEKOBase::FEKOFARFIELDRESULTTYPE FEKOFARFIELDRESULTTYPEString2Enum(QString str);
    QString QString2FEKOFARFIELDRESULTTYPE(FEKOBase::FEKOFARFIELDRESULTTYPE mode);



//==========================================================
// FEKO 仿真结果文件   farfield 文件 ffe
// 解析ffe 文件
//==========================================================
    struct FEKOFarFieldFEKOFarFieldData // 仿真结果的数据项 ，行
	{
        double X=0;// cartesian coordinate system
        double Y=0;
        double Z=0;
        double U=0; // cartesian coordinate system
        double V=0;
        double radius=0; // nearfield
		double theta=0; // spherical coordinate system
		double phi=0;
        double re_Er=0;
        double im_Er=0;
		double re_Etheta=0; // theta
		double im_Etheta=0;
		double re_Ephi=0; // phi
		double im_Ephi=0;
        double re_Ex=0;// X
        double im_Ex=0;
        double re_Ey=0; //y
        double im_Ey=0;
        double re_Ez=0; //z
        double im_Ez=0;
		double gain_Theta=0; // gain in spherical coordinate system
		double gain_Phi=0;
		double gain_Total=0;
        double directivity_Theta=0; // directivity in spherical coordinate system
        double directivity_Phi = 0;
        double directivity_total = 0;
        double RCS_theta = 0;// RCS in spherical coordinate system
        double RCS_phi = 0;
        double RCS_total = 0;
	};

    class FEKOFARFIELDFEKODATABLOCK { // 数据块
    public:
        FEKOFARFIELDFEKODATABLOCK();
        ~FEKOFARFIELDFEKODATABLOCK();
	public: // 变量
		QString configurationName;
		QString requestName;
		double frequency;
		FEKOBase::FEKOCoordinateSystem coordinateSystem; // 
		FEKOBase::FEKOFARFIELDRESULTTYPE resultType;
        long thetaSamples;
        long phiSamples;
        long USamples;
        long VSamples;
        CartesianCoordinates Origin; // 坐标系原点
        long headerLines;
		QList<FEKOBase::FEKOFarFieldFEKOFarFieldData> dataList;
    public: // 相关函数
        // 解析文件
        int paraseFEKOFarFieldDataBlock(const QString& blockstr);  // 解析数据块
        int paraseFEKOFarFieldDataBlockFromList(QList<QString>& blockstr); // 解析数据块
        QString normalizationHeaderString(QString headerstr);// 对数据块头名称进行标准化
 
        // 保存文件
        QString saveFEKOFarFieldDataBlock(); // 生成数据块字符串
        QString saveFEKOFarFieldDataBlock_Gain(); // 根据类型生成数据块字符串
        QString saveFEKOFarFieldDataBlock_Directivity();
        QString saveFEKOFarFieldDataBlock_RCS();
        QString saveFEKOFarFieldDataBlock_FarFieldValues();
    };







class FEKOFarFieldFileClass: public QObject
{
    Q_OBJECT
public:
    FEKOFarFieldFileClass();
	~FEKOFarFieldFileClass();

public:
    QString FileType;
    QString FileFormat;
    QString Sourcestr;
    QString Datestr;
    QList<FEKOBase::FEKOFARFIELDFEKODATABLOCK> dataBlockList;


public:
    void parseFarFieldFile(const QString& fileName);
    void outputToFile(const QString& fileName);

};



//==========================================================
// FEKO 仿真结果文件   nearfield 文件 efe
// 解析efe 文件， 
//==========================================================






}
#endif // ! FARFIELDFILECLASS_H

