LAMPCAE/src/PluginWBFZExchangePlugin/EchoTableEditWindow.cpp

525 lines
18 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "EchoTableEditWindow.h"
#include "TableProcess/TableMainWindow.h"
#include "TableProcess/TableViewModel.h"
#include "SharedModuleLib/BaseUiTool.h"
#include "LAMPImageCreateClass.h"
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <QFileDialog>
#include <QClipboard>
#include <QItemSelectionModel>
#include <QDebug>
#include "ui_EchoTableEditWindow.h"
EchoTableEditWindow::EchoTableEditWindow(QWidget* parent)
{
DebugInfo(" EchoTableEditWindow::EchoTableEditWindow has init\n");
this->FILEOPENLOCK = false;
this->CheckFieldContextHasEmptyCeilLOCK = false;
DebugInfo(" EchoTableEditWindow::EchoTableEditWindow has init ui\n");
this->ui=new Ui::EchoTableEditWindow ;
this->ui->setupUi(this);
DebugInfo(" EchoTableEditWindow::EchoTableEditWindow has init ui finish\n");
this->setWindowTitle(u8"FEKO Simulation Echo Result Convert ");
this->initTableViewContextMenu();
this->initTableViewStatusBarControl();
DebugInfo(" EchoTableEditWindow::EchoTableEditWindow has init initTableViewContextMenu finish\n");
// 定标常数界面关闭
this->ui->tab_calibration->setEnabled(false);
this->ui->tabWidget->removeTab(1);// 删除定标常数界面
DebugInfo(" EchoTableEditWindow::EchoTableEditWindow has init finish\n");
connect(ui->actionOpen, SIGNAL(triggered()),this, SLOT(on_actionOpen_triggered()));
connect(ui->actionSave, SIGNAL(triggered()),this, SLOT(on_actionSave_triggered()));
connect(ui->actionSaveAs, SIGNAL(triggered()),this, SLOT(on_actionSaveAs_triggered()));
connect(ui->actionRCSExport ,SIGNAL(triggered()),this,SLOT(on_actionRCSExport()));
}
EchoTableEditWindow::~EchoTableEditWindow()
{
delete this->statusprogressBar;
delete this->tableViewContextMenu;
delete this->m_undoStack;
}
int EchoTableEditWindow::initTableViewContextMenu()
{
//qDebug() << u8"正在初始化contextMenu";
m_undoStack = new QUndoStack(this); //存放命令的栈
this->ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
//this->ui->tableView->setFocusPolicy(Qt::NoFocus); // 允许快捷键
this->tableViewContextMenu = new QMenu(this->ui->tableView); // 表格控件的右键菜单
QAction* m_undoAction = m_undoStack->createUndoAction(this, u8"撤销");//添加QActionCtrl-Z作为回撤的快捷键
m_undoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z));
QObject::connect(m_undoAction, SIGNAL(triggered()), this, SLOT(tableView_UndoAction()));
QAction* m_redoAction = m_undoStack->createRedoAction(this, u8"重做");//添加QActionCtrl-Y左右前进的快捷键
m_redoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Y));
QObject::connect(m_redoAction, SIGNAL(triggered()), this, SLOT(tableView_RedoAction()));
this->tableViewContextMenu->addAction(m_undoAction);
this->tableViewContextMenu->addAction(m_redoAction);
QAction *copyAction= this->tableViewContextMenu->addAction(u8"复制"); // 复制
copyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C));
QObject::connect(copyAction, SIGNAL(triggered()), this, SLOT(tableView_CopyAction()));
QAction* PasteAction = this->tableViewContextMenu->addAction(u8"粘贴"); // 粘贴
PasteAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_V));
QObject::connect(PasteAction, SIGNAL(triggered()), this, SLOT(tableView_PasteAction()));
QAction* CheckFieldHasEmptyCeilAction = this->tableViewContextMenu->addAction(u8"检查单元格为空");
QObject::connect(CheckFieldHasEmptyCeilAction, SIGNAL(triggered()), this, SLOT(tableView_CheckFieldHasEmptyCeilAction()));
//qDebug() << u8"初始化contextMenu结束";
return 0;
}
void EchoTableEditWindow::ShowTableViewContextMenu(QPoint p)
{
//qDebug() << u8"正在展示tableview 右键菜单";
//Q_UNUSED(pos);
this->tableViewContextMenu->exec(QCursor::pos());
}
void EchoTableEditWindow::tableView_CopyAction()
{
//qDebug() << u8"正在启动tableview 右键复制代码";
QItemSelectionModel* selectionModel = this->ui->tableView->selectionModel();
QModelIndexList selectedIndexes = selectionModel->selectedIndexes();
if (selectedIndexes.count() == 0) {
return;
}
QTableView* tableView = this->ui->tableView; // Your table view object
/*
* a\tb\tc\n
* d\tf\te\n
**/
int min_row, max_row, min_col, max_col;
min_row = selectedIndexes.at(0).row();
max_row = selectedIndexes.at(0).row();
min_col = selectedIndexes.at(0).column();
max_col = selectedIndexes.at(0).column();
for (int i = 0; i < selectedIndexes.count(); i++) {
min_row = min_row > selectedIndexes.at(i).row() ? selectedIndexes.at(i).row() : min_row;
max_row = max_row < selectedIndexes.at(i).row() ? selectedIndexes.at(i).row() : max_row;
min_col = min_col > selectedIndexes.at(i).column() ? selectedIndexes.at(i).column() : min_col;
max_col = max_col < selectedIndexes.at(i).column() ? selectedIndexes.at(i).column() : max_col;
}
std::vector<std::vector<QString>> copylist(max_row-min_row+1);
for (int i = min_row; i <= max_row; i++) {
copylist[i - min_row] = std::vector<QString>(max_col - min_col + 1);
}
// qDebug() << u8"minRow"<<min_row;
// qDebug() << u8"maxRow" << max_row;
// qDebug() << u8"minCol" << min_col;
// qDebug() << u8"maxCol" << max_col;
for (int i = 0; i < selectedIndexes.count(); i++) {
QString tempstring= selectedIndexes.at(i).data().toString();
copylist[selectedIndexes.at(i).row() - min_row]
[selectedIndexes.at(i).column() - min_col] = tempstring;
}
QString clipboardText = "";
for (int i = 0; i < copylist.size(); i++) {
for(int j=0;j<copylist[i].size()-1;j++){
clipboardText = clipboardText + copylist[i][j]+u8"\t";
}
clipboardText = clipboardText + copylist[i][copylist[i].size() - 1] + u8"\n";
//clipboardData.append("\n");
}
// Add header data
//QHeaderView* header = tableView->horizontalHeader();
//for (int i = 0; i < header->count(); i++) {
// QVariant headerData = header->model()->headerData(i, Qt::Horizontal);
// clipboardData.insert(i, headerData.toString());
//}
// qDebug() << u8"============================";
// qDebug() << clipboardText;
// qDebug() << u8"============================";
QApplication::clipboard()->setText(clipboardText);
}
int EchoTableEditWindow::setDragDropOverwriteMode(bool flag) {
this->ui->tableView->setDragDropOverwriteMode(flag);
return 0;
}
int EchoTableEditWindow::setTablCalibrationTab(bool flag)
{
if (flag) {
this->ui->tab_calibration->setEnabled(true);
this->ui->tabWidget->insertTab(1, this->ui->tab_calibration, u8"定标常数");
}
else {
this->ui->tab_calibration->setEnabled(false);
this->ui->tabWidget->removeTab(1);// 删除定标常数界面
}
return 0;
}
void EchoTableEditWindow::tableView_PasteAction() {
// qDebug() << u8"正在启动tableview 右键粘贴代码";
QTableView* tableview = this->ui->tableView;
QClipboard* clipboard = QApplication::clipboard();
QString clipboardData = QApplication::clipboard()->text();
QItemSelectionModel* selectionModel = this->ui->tableView->selectionModel();
QModelIndexList selectedIndexes = selectionModel->selectedIndexes();
this->m_undoStack->push(new PasteCommand(this->ui->tableView, selectedIndexes, clipboardData));
tableview->show();
}
void EchoTableEditWindow::tableView_UndoAction()
{
// qDebug() << u8"正在撤销命令";
int index = this->m_undoStack->index();
this->m_undoStack->setIndex(index);
}
void EchoTableEditWindow::tableView_RedoAction()
{
// qDebug() << u8"正在重做命令";
int index = this->m_undoStack->index();
this->m_undoStack->setIndex(index );
}
// 检查存在空单元格的列,并修改展示
void EchoTableEditWindow::tableView_CheckFieldHasEmptyCeilAction()
{
this->ui->statusbar->showMessage(u8"正在检查存在空数据的单元列");
size_t colcount = this->ui->tableView->model()->columnCount();
size_t rowcount = this->ui->tableView->model()->rowCount();
this->statusprogressBar->setRange(0, colcount - 1);
this->statusprogressBar->setValue(0);
QList<QModelIndex> cellIndexes;
for (int j = 0; j < colcount; j++) {
for (int i = 0; i < rowcount; i++) {
if (this->ui->tableView->model()->index(i, j).data().toString().count() < 1) {
cellIndexes.append(this->ui->tableView->model()->index(i, j));
break;
}
}
this->statusprogressBar->setValue(j);
}
if (cellIndexes.count() == 0) {
return;
}
else {}
this->ui->statusbar->showMessage(u8"正在选择空格");
this->statusprogressBar->setRange(0, cellIndexes.count()-1);
this->statusprogressBar->setValue(0);
QItemSelectionModel* selectionModel = this->ui->tableView->selectionModel();
for (int i = 0; i < cellIndexes.count(); i++) {
selectionModel->select(cellIndexes[i], QItemSelectionModel::Select);
this->statusprogressBar->setValue(i);
}
this->ui->tableView->show();
this->ui->tableView->scrollTo(cellIndexes[0], QAbstractItemView::EnsureVisible);
}
void EchoTableEditWindow::on_actionOpen_triggered()
{
this->OpenCSVDialog();
}
void EchoTableEditWindow::on_actionSave_triggered()
{
this->SaveCSVDialog();
}
void EchoTableEditWindow::on_actionSaveAs_triggered()
{
this->SaveAsDialog();
}
void EchoTableEditWindow::on_actionEchoSplitExport_triggered()
{
// 在窗口关闭事件中询问用户是否关闭
QMessageBox::StandardButton reply;
qDebug() << u8"检查乱码文件所在位置";
reply = QMessageBox::question(this, u8"询问", u8"导出回波文件前,请保存文件", QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
// 用户点击了"Yes"按钮,关闭窗口
this->SaveCSVDialog();
}
else {
// 用户点击了"No"按钮,取消关闭操作
return;
}
// 保存并导出回波文件
this->ui->statusbar->showMessage(u8"正在分析回波文件");
this->statusprogressBar->setRange(0,100);
this->statusprogressBar->setValue(10);
// 检查是否远场回波
bool isfar=false;
bool isnear=false;
//this->model;
//判断指针
std::shared_ptr<FEKOResultCsvTableModel> echoTableModel(new FEKOResultCsvTableModel);
echoTableModel->loadCSVFilePath(this->model->getCSVPath());
if(echoTableModel->rowCount()<=0||echoTableModel->colCount()<=0){
QMessageBox::warning(this, u8"警告", u8"回波文件结构解析错误,请检查文件");
return ;
}else{}
if(echoTableModel){
QStringList colnames=echoTableModel->getColumnNames();
for(size_t i=0;i<colnames.count();i++){
if(colnames[i].toLower().contains("file type")||colnames[i]=="File Type"){
size_t colidx=echoTableModel->getColumnIdxByColumName(colnames[i]);
QString filetypeStr=echoTableModel->itemText(0,colidx);
if(filetypeStr.toLower().contains("far field")||filetypeStr.contains("Far Field")||filetypeStr=="Far Field"){
isfar=true;
}else{}
if(filetypeStr.toLower().contains("near field")||filetypeStr=="Electric near field"){
isnear= true;
}else{}
}
}
}else{
QMessageBox::warning(this, u8"警告", u8"回波文件结构解析错误,请检查文件");
return ;
}
// ---------------------- 远场结果 --------------------------------------------------
if(isfar){
FEKOBase::FarFieldEchoCSVParser farfilePraseclass;
QString echocsvfilepath = this->model->getCSVPath();
if(!farfilePraseclass.parseCSV(echocsvfilepath)) {
QMessageBox::warning(this, u8"警告", u8"回波文件结构解析错误,请检查文件");
return;
}
this->statusprogressBar->setValue(25);
QMessageBox::information(this, u8"信息",
u8"请分别为theta极化、phi极化、R极化分量回波指定保存路径");
QString thetafilepath = getSaveFilePath(
this, QString::fromUtf8(u8"另存为"),
QString::fromUtf8(u8"theta文件 (*.theta)")); // 多组扩展名用双分号";;"隔开
QString phifilepath =
getSaveFilePath(this, QString::fromUtf8(u8"另存为"),
QString::fromUtf8(u8"phi文件 (*.phi)")); // 多组扩展名用双分号";;"隔开
// QString Rfilepath =
// getSaveFilePath(this, QString::fromUtf8(u8"另存为"),
// QString::fromUtf8(u8"R文件 (*.R)")); // 多组扩展名用双分号";;"隔开
this->ui->statusbar->showMessage(u8"正在导出theta极化");
farfilePraseclass.toThetapolar(thetafilepath);
this->statusprogressBar->setValue(50);
this->ui->statusbar->showMessage(u8"正在导出phi极化");
farfilePraseclass.toPhiPolar(phifilepath);
this->statusprogressBar->setValue(75);
QMessageBox::information(this, u8"信息", u8"极化回波已经保存完毕");
}else{};
// ---------------------- 近场结果 --------------------------------------------------
if(isnear) {
FEKOBase::NearFieldEchoCSVParser nearfilePraseclass;
QString echocsvfilepath = this->model->getCSVPath();
if(!nearfilePraseclass.parseCSV(echocsvfilepath)) {
QMessageBox::warning(this, u8"警告", u8"回波文件结构解析错误,请检查文件");
return;
}
this->statusprogressBar->setValue(25);
QMessageBox::information(this, u8"信息",
u8"请分别为theta极化、phi极化、R极化分量回波指定保存路径");
QString thetafilepath = getSaveFilePath(
this, QString::fromUtf8(u8"另存为"),
QString::fromUtf8(u8"theta文件 (*.theta)")); // 多组扩展名用双分号";;"隔开
QString phifilepath =
getSaveFilePath(this, QString::fromUtf8(u8"另存为"),
QString::fromUtf8(u8"phi文件 (*.phi)")); // 多组扩展名用双分号";;"隔开
QString Rfilepath =
getSaveFilePath(this, QString::fromUtf8(u8"另存为"),
QString::fromUtf8(u8"R文件 (*.R)")); // 多组扩展名用双分号";;"隔开
this->ui->statusbar->showMessage(u8"正在导出theta极化");
nearfilePraseclass.toThetapolar(thetafilepath);
this->statusprogressBar->setValue(50);
this->ui->statusbar->showMessage(u8"正在导出phi极化");
nearfilePraseclass.toPhiPolar(phifilepath);
this->statusprogressBar->setValue(75);
this->ui->statusbar->showMessage(u8"正在导出R极化");
nearfilePraseclass.toRPolar(Rfilepath);
this->statusprogressBar->setValue(99);
QMessageBox::information(this, u8"信息", u8"极化回波已经保存完毕");
}else{}
// 询问用户是否关闭窗口
this->statusprogressBar->setValue(100);
if(isfar || isnear) {
reply = QMessageBox::question(this, u8"提示", u8"是否直接进行成像?",
QMessageBox::Yes | QMessageBox::No);
if(reply == QMessageBox::Yes) {
LAMPImageCreateClass* imagewindows = new LAMPImageCreateClass;
imagewindows->show();
} else {
return;
}
} else {
QMessageBox::information(this, u8"信息", u8"文件格式读取错误");
}
}
void EchoTableEditWindow::on_actionCalibrationConst_triggered()
{
// 补充定标软件功能
}
int EchoTableEditWindow::LockFileOpen(bool flag)
{
this->FILEOPENLOCK = flag;
return 0;
}
int EchoTableEditWindow::setCheckFieldContextHasEmptyCeilLOCK(bool flag)
{
this->CheckFieldContextHasEmptyCeilLOCK = flag;
return 0;
}
int EchoTableEditWindow::loadTablemode(std::shared_ptr<AbstractTableModel> mode)
{
this->model = mode;
this->ui->tableView->setModel(this->model.get());
if (this->model->rowCount() > 1e4) {
this->ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
}
return 0;
}
int EchoTableEditWindow::setTableViewAutoSort(bool flag)
{
this->ui->tableView->setSortingEnabled(flag);
return flag;
}
int EchoTableEditWindow::initTableViewStatusBarControl()
{
this->statusprogressBar = new QProgressBar();
this->statusprogressBar->setRange(0, 100); // 设置进度条范围
this->statusprogressBar->setValue(0); // 设置当前进度
this->ui->statusbar->addPermanentWidget(this->statusprogressBar); // 在状态栏中添加进度条
return 0;
}
int EchoTableEditWindow::OpenCSVDialog()
{
if (this->FILEOPENLOCK) {
return 0;
}
else {}
QString tableFilepath = getOpenFilePath(
this,
QString::fromUtf8(u8"打开表格文件"),
QString::fromUtf8(u8"csv文件 (*.csv);;xls文件(*.xls)"));
this->ui->statusbar->showMessage(u8"正在打开文件....");
std::shared_ptr< FEKOResultCsvTableModel> tablemode = std::make_shared< FEKOResultCsvTableModel>();
tablemode->loadCSVFilePath(tableFilepath);
this->loadTablemode(tablemode);
this->setTableViewAutoSort(true);
this->LockFileOpen();
this->ui->statusbar->showMessage(u8"文件打开结束");
QFileInfo fileinfo(tableFilepath);
this->setWindowTitle(fileinfo.fileName());
return -1;
}
int EchoTableEditWindow::SaveCSVDialog()
{
this->model->saveFilePath();
return 0;
}
int EchoTableEditWindow::SaveAsDialog()
{
QString filepath = getSaveFilePath(
this,
QString::fromUtf8(u8"另存为"),
QString::fromUtf8(u8"csv文件 (*.csv)"));//多组扩展名用双分号";;"隔开
this->model->saveAsFilePath(filepath);
return 0;
}
void EchoTableEditWindow::on_actionRCSExport() {
// 检查是否远场回波
bool isfar=false;
bool isnear=false;
//this->model;
//判断指针
std::shared_ptr<FEKOResultCsvTableModel> echoTableModel(new FEKOResultCsvTableModel);
echoTableModel->loadCSVFilePath(this->model->getCSVPath());
if(echoTableModel->rowCount()<=0||echoTableModel->colCount()<=0){
QMessageBox::warning(this, u8"警告", u8"回波文件结构解析错误,请检查文件");
return ;
}else{}
if(echoTableModel){
QStringList colnames=echoTableModel->getColumnNames();
for(size_t i=0;i<colnames.count();i++){
if(colnames[i].toLower().contains("file type")||colnames[i]=="File Type"){
size_t colidx=echoTableModel->getColumnIdxByColumName(colnames[i]);
QString filetypeStr=echoTableModel->itemText(0,colidx);
if(filetypeStr.toLower().contains("far field")||filetypeStr.contains("Far Field")||filetypeStr=="Far Field"){
isfar=true;
}else{}
if(filetypeStr.toLower().contains("near field")||filetypeStr=="Electric near field"){
isnear= true;
}else{}
}
}
}else{
QMessageBox::warning(this, u8"警告", u8"回波文件结构解析错误,请检查文件");
return ;
}
// ---------------------- 远场结果 --------------------------------------------------
if(isfar){
QString filepath =
getSaveFilePath(this, QString::fromUtf8(u8"另存为"),
QString::fromUtf8(u8"RCS (*.csv)")); // 多组扩展名用双分号";;"隔开
FEKOBase::RCSEchoDataComputer rsccomputer;
rsccomputer.ComputerFromFile(this->model->getCSVPath());
rsccomputer.toCSV(filepath);
QMessageBox::information(this, u8"信息",QString(u8"保存至:%1").arg(filepath));
}else{
QMessageBox::warning(this, u8"警告",u8"请使用远场数据作为RCS计算输入");
};
}