COMPASSi/trunk/code/inc/DataManager/DataManagerInterface/include/XLSXDataManager.h

272 lines
8.4 KiB
C
Raw Permalink Normal View History

2025-06-25 15:06:42 +08:00
#ifndef XLSXDataManager_H
#define XLSXDataManager_H
#include <deque>
#include <QString>
#include <QSettings>
#include <string>
#include <vector>
//#include <xlnt/xlnt.hpp>
#include "DataManagerGlobal.h"
#include "ModelData.h"
#include "PathUtil.h"
#include "xlnt/xlnt.hpp"
using namespace std;
class DATAMANAGER_DLL_API_EXPORTS ImportOffsetOption
{
public:
ImportOffsetOption()
{
m_fSectionLen = 5;
m_fBfY = 1;
m_bCreateBL = true;
m_bCreateWL = true;
}
string m_szFilePath; // 导入型值表所在路径
bool m_bCreateBL; // 是否导入控制点
bool m_bCreateWL; // 是否创建水线
double m_fSectionLen; // 船体分段长度单位mm
double m_fBfY; // 梁拱值
public:
// Getter and Setter functions
string getFilePath() { return m_szFilePath; }
void setFilePath( string& filePath) { m_szFilePath = filePath; }
bool getCreateBL() { return m_bCreateBL; }
void setCreateBL(bool createBL) { m_bCreateBL = createBL; }
bool getCreateWL() { return m_bCreateWL; }
void setCreateWL(bool createWL) { m_bCreateWL = createWL; }
float getSectionLen() { return m_fSectionLen; }
void setSectionLen(float sectionLen) { m_fSectionLen = sectionLen; }
float getBfY() { return m_fBfY; }
void setBfY(float bfY) { m_fBfY = bfY; }
};
// 型值点
class DATAMANAGER_DLL_API_EXPORTS OffsetPnt
{
public:
int m_nStIdx; // 横剖线的编号
double m_fStIdx; // 站号
double m_fStOffset; // 相对于站号的偏移量
double m_Y; // Y值
double m_Z; // Z值
bool m_bIsZhejiao; // 是否为折角点
public:
// Getter and Setter functions
int getnStIdx() { return m_nStIdx; }
void setnStIdx(int stIdx) { m_nStIdx = stIdx; }
double getfStIdxVal() { return m_fStIdx; }
void setfStIdxVal(double stIdx) { m_fStIdx = stIdx; }
double getStOffset() { return m_fStOffset; }
void setStOffset(double stOffset) { m_fStOffset = stOffset; }
double getY() { return m_Y; }
void setY(double Y) { m_Y = Y; }
double getZ() { return m_Z; }
void setZ(double Z) { m_Z = Z; }
bool isZhejiao() { return m_bIsZhejiao; }
void setIsZhejiao(bool isZhejiao) { m_bIsZhejiao = isZhejiao; }
};
// 横剖线
class DATAMANAGER_DLL_API_EXPORTS STLine
{
public:
string m_name; // 型线名称
string m_cmdName; // 命令名称
double m_fStIdx; // 站号
double m_fStOffset; // 相对于站号的偏移量
vector<OffsetPnt> m_ctrlPntLst; // 控制点集
public:
// Getter and Setter functions
string getName() { return m_name; }
void setName( string name) { m_name = name; }
string getCmdName() { return m_cmdName; }
void setCmdName( string cmdName) { m_cmdName = cmdName; }
double getfStIdx() { return m_fStIdx; }
void setfStIdx(double stIdx) { m_fStIdx = stIdx; }
double getStOffset() { return m_fStOffset; }
void setStOffset(double stOffset) { m_fStOffset = stOffset; }
vector<OffsetPnt>& getCtrlPntLst() { return m_ctrlPntLst; }
void setCtrlPntLst( vector<OffsetPnt>& ctrlPntLst) { m_ctrlPntLst = ctrlPntLst; }
};
// 纵剖线
class DATAMANAGER_DLL_API_EXPORTS BLLine
{
public:
string m_name; // 型线名称
double m_Y; // Y值
vector<OffsetPnt> m_ctrlPntLst; // 控制点集
public:
// Getter and Setter functions
string getName() { return m_name; }
void setName( string& name) { m_name = name; }
double getY() { return m_Y; }
void setY(double Y) { m_Y = Y; }
vector<OffsetPnt>& getCtrlPntLst() { return m_ctrlPntLst; }
void setCtrlPntLst( vector<OffsetPnt>& ctrlPntLst) { m_ctrlPntLst = ctrlPntLst; }
};
// 水线
class DATAMANAGER_DLL_API_EXPORTS WLLine
{
public:
string m_name; // 型线名称
double m_Z; // Z值
vector<OffsetPnt> m_ctrlPntLst; // 控制点集
public:
// Getter and Setter functions
string getName() { return m_name; }
void setName( string& name) { m_name = name; }
double getZ() { return m_Z; }
void setZ(double Z) { m_Z = Z; }
vector<OffsetPnt>& getCtrlPntLst() { return m_ctrlPntLst; }
void setCtrlPntLst( vector<OffsetPnt>& ctrlPntLst) { m_ctrlPntLst = ctrlPntLst; }
};
// 空间线
class DATAMANAGER_DLL_API_EXPORTS SpaceLine
{
public:
string m_name; // 型线名称
vector<OffsetPnt> m_ctrlPntLst; // 控制点集
public:
// Getter and Setter functions
string getName() { return m_name; }
void setName( string& name) { m_name = name; }
vector<OffsetPnt>& getCtrlPntLst() { return m_ctrlPntLst; }
void setCtrlPntLst( vector<OffsetPnt>& ctrlPntLst) { m_ctrlPntLst = ctrlPntLst; }
};
class DATAMANAGER_DLL_API_EXPORTS XLSXDataManager
{
public:
XLSXDataManager();
~XLSXDataManager();
void loadXLSXFile(std::string filePaht);
void setModeData(ModelData* _pModeData)
{
m_pModeData = _pModeData;
}
void setImportOffsetOption(ImportOffsetOption& _option)
{
m_impOption = _option;
}
//横向横剖线 命令集
std::vector<std::string>& getTransverseProfile_commad()
{
return m_vTransverseProfile_commad;
}
//梁拱命令
std::vector<std::string>& getCamber_commad()
{
return m_vCamber_commad;
}
//绘制纵剖线
std::vector<std::string>& getLongitudinalProfile_commad()
{
return m_vLongitudinalProfile_commad;
}
//水线
std::vector<std::string>& getWaterLine_commad()
{
return m_vWaterLine_commad;
}
//空间线
std::vector<std::string>& getSpaceLine_commad()
{
return m_vSpaceLine_commad;
}
private:
void GetStLineIdxAndOffset(string stLinestr, float& fSTIdx, float& fStOffset, STLine& tempSTLine);
//获取站号线的站号以及偏移量
void GetStLineIdxAndOffset(const std::string& stLinestr, double& fSTIdx, double& fStOffset) ;
bool IsDouble(const std::string& str);
bool IsNullOrEmptyAfterTrim(const std::string& str);
bool GetStationLine_H(xlnt::worksheet& heightSheet, xlnt::worksheet& halfBreadthSheet, float xSubSectionLen, float fSTIdx, float fStOffset, int rowIndex, vector<OffsetPnt>& pntLst, vector<int>& nH);
bool GetStationLine_W(xlnt::worksheet& halfBreadthSheet, float xSubSectionLen, float fSTIdx, float fStOffset, int rowIndex, std::vector<OffsetPnt>& pntLst, std::vector<int>& nW);
xlnt::cell_vector get_row_by_index(xlnt::worksheet& sheet, int row_idx) ;
void insertPnt1(OffsetPnt& pnt1, std::vector<OffsetPnt>& mergePntLst, int& np);
void insertPnt(std::vector<OffsetPnt>& pntLst_W, std::vector<OffsetPnt>& mergePntLst);
bool GetHalfBreadth(xlnt::worksheet& halfBreadthSheet, string sLineName, int rowIndex, double& dHalfBreath);
bool GetFlatSideHalfBreath(xlnt::worksheet& halfBreadthSheet, int rowIndex, double& dHalfBreath);
void SortBLLine(vector<OffsetPnt>& srcLst, vector<OffsetPnt>& sortLst);
//生成带引用的空间线命令 cqr-20210927
void CmdSpaceline(std::vector<STLine>& STLineLst,
SpaceLine& SpaceLineLst,
std::string& cmd) ;
void clear()
{
std::vector<std::string> _vTransverseProfile_commad;
_vTransverseProfile_commad.swap(m_vTransverseProfile_commad);
//梁拱命令
std::vector<std::string> _vCamber_commad;
_vCamber_commad.swap(m_vCamber_commad);
//绘制纵剖线
std::vector<std::string> _vLongitudinalProfile_commad;
_vLongitudinalProfile_commad.swap(m_vLongitudinalProfile_commad);
//水线
std::vector<std::string> _vWaterLine_commad;
_vWaterLine_commad.swap(m_vWaterLine_commad);
//空间线
std::vector<std::string> _vSpaceLine_commad;
_vSpaceLine_commad.swap(m_vSpaceLine_commad);
}
private:
//横剖线 命令集
std::vector<std::string> m_vTransverseProfile_commad;
//梁拱命令
std::vector<std::string> m_vCamber_commad;
//绘制纵剖线
std::vector<std::string> m_vLongitudinalProfile_commad;
//水线
std::vector<std::string> m_vWaterLine_commad;
//空间线
std::vector<std::string> m_vSpaceLine_commad;
ImportOffsetOption m_impOption;
ModelData* m_pModeData = nullptr;//外界赋值
};
#endif // FIFOCONTAINER_H