454 lines
15 KiB
C++
454 lines
15 KiB
C++
#include "ModelProcess.h"
|
|
#include "FEKOResultImport.h"
|
|
#include "TaskTreeClass.h"
|
|
#include <QDebug>
|
|
#include <BRepPrimAPI_MakeBox.hxx>
|
|
#include <BRepOffsetAPI_DraftAngle.hxx>
|
|
#include "ui_ModelProcess.h"
|
|
|
|
ModelProcess::ModelProcess(QWidget *parent)
|
|
: QMainWindow(parent)
|
|
{
|
|
ui->setupUi(this);
|
|
this->initConstVariable();
|
|
// 设置背景色
|
|
this->showConntentsWindows();
|
|
//this->showModelInfoWindows();
|
|
this->showInnerModelWindow();
|
|
this->initOCCTView();
|
|
//this->initModelInformationShow();
|
|
this->initMenuList();
|
|
this->initBandingEvent();
|
|
this->initTaskDocker();
|
|
|
|
this->initFileOperatorMenu();
|
|
}
|
|
|
|
ModelProcess::~ModelProcess()
|
|
{
|
|
|
|
}
|
|
|
|
void ModelProcess::on_action_Open_triggered()
|
|
{
|
|
//myDocument3d->OpenFile();
|
|
this->myGeomWidget->Show3d();
|
|
|
|
}
|
|
|
|
|
|
void ModelProcess::on_action_Modelsave_triggered() // 保存整体模型
|
|
{
|
|
this->myDocument3d->SaveModelFile();
|
|
|
|
}
|
|
|
|
void ModelProcess::on_actionCalibrationConstCreate_triggered()
|
|
{
|
|
|
|
|
|
}
|
|
|
|
void ModelProcess::on_actionImageSetting_triggered()
|
|
{
|
|
// FEKOImageSettingTaskNodeClass* imageNode = new FEKOImageSettingTaskNodeClass();
|
|
// QString xmlfilepath = getSaveFilePath(this, QString::fromUtf8(u8"任务xml"), QString::fromUtf8(u8"xml文件 (*.xml)"));
|
|
// imageNode->loadXmlFile(xmlfilepath);
|
|
// imageNode->TaskWindows->setOCCTDocument(this->myDocument3d->myContext);
|
|
// this->addTaskNode(imageNode);
|
|
// imageNode->ExcuteTask();
|
|
}
|
|
|
|
void ModelProcess::on_action_ScatterExport_triggered()
|
|
{
|
|
EchoTableEditWindow* echoEditwindow = new EchoTableEditWindow(this);
|
|
|
|
echoEditwindow->show();
|
|
|
|
}
|
|
|
|
void ModelProcess::on_actionFEKOImage_triggered()
|
|
{
|
|
LAMPImageCreateClass* imagewindows = new LAMPImageCreateClass;
|
|
imagewindows->on_pushButton_loadfekosimulationxml_clicked();
|
|
imagewindows->show();
|
|
}
|
|
|
|
void ModelProcess::on_action_antScatteringFEKOSetting_triggered()
|
|
{
|
|
// FEKOScatterSettingTaskNodeClass* scattertasknode=new FEKOScatterSettingTaskNodeClass();
|
|
// QString xmlfilepath = getSaveFilePath(this, QString::fromUtf8(u8"任务xml"), QString::fromUtf8(u8"xml文件 (*.xml)"));
|
|
// scattertasknode->loadXmlFile(xmlfilepath);
|
|
// scattertasknode->TaskWindows->setDocument3d(this->myDocument3d->myContext);
|
|
// this->addTaskNode(scattertasknode);
|
|
// scattertasknode->ExcuteTask();
|
|
}
|
|
|
|
void ModelProcess::on_action_openImageShowWindows_triggered()
|
|
{
|
|
LAMPDataShowClass* datashowclass=new LAMPDataShowClass();
|
|
datashowclass->show();
|
|
}
|
|
|
|
void ModelProcess::ShowTaskListMenu(QPoint p)
|
|
{
|
|
qDebug() << u8"成像任务管理右击菜单";
|
|
this->TaskListContextMenu->exec(QCursor::pos());
|
|
}
|
|
|
|
void ModelProcess::ShowTaskWindows()
|
|
{
|
|
QList<QTreeWidgetItem*> selectNodes = this->ui->treeWidgetTask->selectedItems(); // 获取顶层
|
|
QTreeWidgetItem* imageNode = selectNodes.at(0);
|
|
imageNode->data(0, Qt::UserRole).value<TaskNode*>()->ExcuteTask();
|
|
}
|
|
|
|
void ModelProcess::addTaskNode(TaskNode* Node)
|
|
{
|
|
// 往qtTree 添加节点
|
|
QTreeWidgetItem* topNode = this->ui->treeWidgetTask->topLevelItem(0); // 获取顶层
|
|
QTreeWidgetItem* imageSetNode = new QTreeWidgetItem();
|
|
imageSetNode->setText(0, Node->getTaskName());
|
|
imageSetNode->setData(0, Qt::UserRole, QVariant::fromValue(Node));
|
|
topNode->addChild(imageSetNode);
|
|
}
|
|
|
|
void ModelProcess::removeTaskNode(TaskNode* Node)
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
bool ModelProcess::showConntentsWindows()
|
|
{
|
|
qDebug() << u8"showConntentsWindows\n";
|
|
if (this->dockWidget) {
|
|
|
|
}
|
|
else {
|
|
this->dockWidget = new QDockWidget(this);
|
|
this->dockWidget->setObjectName(QString::fromUtf8("dockWidget"));
|
|
this->dockWidget->setWindowTitle(QString::fromUtf8(u8"模型窗口列表"));
|
|
}
|
|
if (this->dockWidgetContents) {
|
|
|
|
}
|
|
else {
|
|
this->dockWidgetContents = new QWidget();
|
|
this->dockWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents"));
|
|
this->dockWidgetContents->setWindowTitle(QString::fromUtf8(u8"模型详细列表"));
|
|
}
|
|
|
|
verticalLayout = new QVBoxLayout(this->dockWidgetContents);
|
|
verticalLayout->setSpacing(6);
|
|
verticalLayout->setContentsMargins(11, 11, 11, 11);
|
|
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
|
|
dockWidget->setWidget(this->dockWidgetContents);
|
|
this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::showModelInfoWindows()
|
|
{
|
|
qDebug() << u8"showModelInfoWindows\n";
|
|
if (this->dockWidget_modelinfoshow) {
|
|
|
|
}
|
|
else {
|
|
|
|
dockWidget_modelinfoshow = new QDockWidget(this);
|
|
dockWidget_modelinfoshow->setObjectName(QString::fromUtf8("dockWidget_modelinfoshow"));
|
|
}
|
|
if (this->dockWidget_ModelInfoShowWindows) {
|
|
|
|
}
|
|
else {
|
|
dockWidget_ModelInfoShowWindows = new QWidget();
|
|
dockWidget_ModelInfoShowWindows->setObjectName(QString::fromUtf8("dockWidget_ModelInfoShowWindows"));
|
|
}
|
|
verticalLayout_ModelInfoShowWindows = new QVBoxLayout(dockWidget_ModelInfoShowWindows);
|
|
verticalLayout_ModelInfoShowWindows->setSpacing(6);
|
|
verticalLayout_ModelInfoShowWindows->setContentsMargins(11, 11, 11, 11);
|
|
verticalLayout_ModelInfoShowWindows->setObjectName(QString::fromUtf8("verticalLayout_2"));
|
|
dockWidget_modelinfoshow->setWidget(dockWidget_ModelInfoShowWindows);
|
|
this->addDockWidget(Qt::RightDockWidgetArea, this->dockWidget_modelinfoshow);
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::showInnerModelWindow()
|
|
{
|
|
qDebug() << u8"showInnerModelWindow\n";
|
|
if(this->dockWidget_InnerModel){}
|
|
else {
|
|
dockWidget_InnerModel = new QDockWidget(this);
|
|
dockWidget_InnerModel->setObjectName(QString::fromUtf8("dockWidget_InnerModel"));
|
|
}
|
|
if (this->dockWidget_InnerModelWindows) {
|
|
|
|
}
|
|
else {
|
|
dockWidget_InnerModelWindows = new QWidget();
|
|
dockWidget_InnerModelWindows->setObjectName(QString::fromUtf8("dockWidget_InnerModelWindows"));
|
|
}
|
|
this->dockWidget_InnerModel->setWindowTitle(u8"内置模式库");
|
|
verticalLayout_ModelInfoShowWindows = new QVBoxLayout(dockWidget_InnerModelWindows);
|
|
verticalLayout_ModelInfoShowWindows->setSpacing(6);
|
|
verticalLayout_ModelInfoShowWindows->setContentsMargins(11, 11, 11, 11);
|
|
verticalLayout_ModelInfoShowWindows->setObjectName(QString::fromUtf8("verticalLayout_3"));
|
|
dockWidget_InnerModel->setWidget(dockWidget_InnerModelWindows);
|
|
this->addDockWidget(Qt::RightDockWidgetArea, dockWidget_InnerModel);
|
|
return true;
|
|
}
|
|
|
|
void ModelProcess::actionOpenRaster()
|
|
{
|
|
QString filename = getOpenFilePath(this, u8"打开影像文件",u8"ENVI Data (*.dat);;tiff (*.tif);;");
|
|
// 判断是否为复数对象?
|
|
qDebug() << filename;
|
|
QFileInfo fileinfo(filename);
|
|
qDebug() << fileinfo.fileName();
|
|
GDALDataType dataType = getGDALDataType(filename);
|
|
if (dataType == GDT_CFloat32 || dataType == GDT_CFloat64) {
|
|
ComplexDataShowNode* node = new ComplexDataShowNode(this);
|
|
node->bangdindWindows(this);
|
|
node->OpenData(filename);
|
|
this->myDocument3d->addTaskNode(node);
|
|
}
|
|
else {
|
|
DataShowNode* node = new DataShowNode(this);
|
|
node->bangdindWindows(this);
|
|
node->OpenData(filename);
|
|
this->myDocument3d->addTaskNode(node);
|
|
}
|
|
}
|
|
|
|
void ModelProcess::actionOpenModel()
|
|
{
|
|
QString stlpath = getOpenFilePath(
|
|
this,
|
|
QString::fromUtf8(u8"导入模型"),
|
|
QString::fromUtf8(u8"STL Files (*.stl);;STL Files (*.stla);;step Files (*.stp);;step Files (*.step);;IGES Files (*.iges);;IGES Files (*.igs)"));
|
|
OCCTShapeModelNode* node = new OCCTShapeModelNode(this);
|
|
node->setDataFile(stlpath);
|
|
this->myDocument3d->addTaskNode(node);
|
|
}
|
|
|
|
bool ModelProcess::initFileOperatorMenu()
|
|
{
|
|
QAction* action_OpenFileRaster=this->ui->menu_FileOpenOperator->addAction(u8"打开影像");
|
|
QObject::connect(action_OpenFileRaster, SIGNAL(triggered()), this, SLOT(actionOpenRaster()));
|
|
QAction* action_OpenModelStl = this->ui->menu_FileOpenOperator->addAction(u8"打开模型");
|
|
QObject::connect(action_OpenModelStl, SIGNAL(triggered()), this, SLOT(actionOpenModel()));
|
|
|
|
|
|
return false;
|
|
}
|
|
|
|
bool ModelProcess::initConstVariable()
|
|
{
|
|
// 模型相关界面
|
|
this->dockWidget = nullptr;
|
|
this->dockWidgetContents = nullptr;
|
|
this->verticalLayout = nullptr;
|
|
this->dockWidget_modelinfoshow = nullptr;
|
|
this->dockWidget_ModelInfoShowWindows = nullptr;
|
|
this->verticalLayout_ModelInfoShowWindows = nullptr;
|
|
this->dockWidget_InnerModel = nullptr;
|
|
this->dockWidget_InnerModelWindows = nullptr;
|
|
this->verticalLayout_InnerModelWindows = nullptr;
|
|
this->myDocument3d = nullptr;
|
|
this->selectModeMenu = nullptr; // 选择模式切换
|
|
this->showModelMenu = nullptr;
|
|
this->myGeomWidget = nullptr; // 模型渲染串口
|
|
this->TopoShapeTreeViewer = nullptr;
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::initOCCTView()
|
|
{
|
|
// 初始化 OCCT
|
|
if (this->myDocument3d) {
|
|
|
|
}
|
|
else {
|
|
this->myDocument3d = new DocumentCommon(this); // 3D 模型
|
|
|
|
}
|
|
this->verticalLayout->addWidget(this->myDocument3d);
|
|
QVBoxLayout* aViewLayout = new QVBoxLayout(this->ui->OCCViewGLWidget);
|
|
aViewLayout->setContentsMargins(0, 0, 0, 0);
|
|
this->myGeomWidget = new GeomWidget(myDocument3d, this->ui->OCCViewGLWidget);// 创建一个三维显示对象
|
|
aViewLayout->addWidget(this->myGeomWidget);
|
|
this->myGeomWidget->setContentsMargins(0, 0, 0, 0);
|
|
this->myDocument3d->InitAixs(); // 计算三维坐标轴
|
|
this->myGeomWidget->FitAll();
|
|
|
|
return true;
|
|
}
|
|
|
|
void ModelProcess::on_action_FEKO2csv_triggered() {
|
|
|
|
qDebug() << u8"启动FEKO->csv 文件 \n";
|
|
QString xmlfilepath = getSaveFilePath(this, QString::fromUtf8(u8"设置FEKO结果导入任务xml"), QString::fromUtf8(u8"xml文件 (*.xml)"));
|
|
qDebug() << u8"选择 xmlfile 文件路径:\t " + xmlfilepath + u8"\n" ;
|
|
FEKOResultImportTaskNode* fekoresulttask = new FEKOResultImportTaskNode();
|
|
fekoresulttask->loadXmlFile(xmlfilepath);
|
|
fekoresulttask->ExcuteTask();
|
|
return;
|
|
}
|
|
|
|
// 初始化对象数据
|
|
bool ModelProcess::initSelectModeMenu()
|
|
{
|
|
this->selectModeMenu = new QMenu(u8"模型选择模式",this);
|
|
QAction* actiion_VerticesSelect3dSample = this->selectModeMenu->addAction(u8"选择顶点");
|
|
QObject::connect(actiion_VerticesSelect3dSample, SIGNAL(triggered()), this->myDocument3d, SLOT(VerticesSelect3dSample()));
|
|
|
|
QAction* actiion_EdgesSelect3dSample = this->selectModeMenu->addAction(u8"选择边");
|
|
QObject::connect(actiion_EdgesSelect3dSample, SIGNAL(triggered()), this->myDocument3d, SLOT(EdgesSelect3dSample()));
|
|
|
|
QAction* actiion_FacesSelect3dSample = this->selectModeMenu->addAction(u8"选择面");
|
|
QObject::connect(actiion_FacesSelect3dSample, SIGNAL(triggered()), this->myDocument3d, SLOT(FacesSelect3dSample()));
|
|
|
|
QAction* actiion_NeutralPointSelect3dSample = this->selectModeMenu->addAction(u8"模型整体选择");
|
|
QObject::connect(actiion_NeutralPointSelect3dSample, SIGNAL(triggered()), this->myDocument3d, SLOT(NeutralPointSelect3dSample()));
|
|
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::initGeometryShowModelMenu()
|
|
{
|
|
this->showModelMenu = new QMenu(u8"视图显示模式");
|
|
QAction* actiion_ShowHideMehsGrid = this->showModelMenu->addAction(u8"显示/关闭平面网格");
|
|
QObject::connect(actiion_ShowHideMehsGrid, SIGNAL(triggered()), this->myDocument3d, SLOT(ShowOrHideActivateGridMesh()));
|
|
|
|
QAction* actiion_ShowHideAixesGrid = this->showModelMenu->addAction(u8"显示/关闭立方网格");
|
|
QObject::connect(actiion_ShowHideMehsGrid, SIGNAL(triggered()), this->myDocument3d, SLOT(ShowOrHideActivateAxisGris()));
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::initModelInformationShow()
|
|
{
|
|
|
|
if (this->TopoShapeTreeViewer) {
|
|
|
|
}
|
|
else {
|
|
this->TopoShapeTreeViewer = new OCCTopoShapeTreeViewer(this); // 3D 模型
|
|
}
|
|
this->verticalLayout_ModelInfoShowWindows->addWidget(this->TopoShapeTreeViewer);
|
|
this->myDocument3d->setShapeInfomationWindows(this->TopoShapeTreeViewer);
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::initMenuList()
|
|
{
|
|
|
|
|
|
|
|
this->initSelectModeMenu();
|
|
this->initGeometryShowModelMenu();
|
|
this->ui->menu_modelOperator->addMenu(this->selectModeMenu);
|
|
this->ui->menu_modelOperator->addMenu(this->showModelMenu);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::initBandingEvent()
|
|
{
|
|
QObject::connect(this->myDocument3d, SIGNAL(ShowSelectItemFullExtend(const TopoDS_Shape &)), this->myGeomWidget, SLOT(ShowExtend(const TopoDS_Shape & )));
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::initTaskDocker()
|
|
{
|
|
this->ui->dockWidget_Task->setHidden(false);
|
|
this->ui->dockWidget_Task->setWindowTitle(QString::fromUtf8(u8"任务列表"));
|
|
// 初始化任务列表
|
|
// this->ui->treeWidgetTask->setColumnCount(0);
|
|
QStringList headerLabels;
|
|
headerLabels <<u8"名称" << u8"描述";
|
|
this->ui->treeWidgetTask->setHeaderLabels(headerLabels);
|
|
QTreeWidgetItem* topNode = this->ui->treeWidgetTask->topLevelItem(0); // 获取顶层
|
|
if (topNode) {
|
|
topNode->setText(0, u8"成像任务");
|
|
}
|
|
else {
|
|
this->ui->treeWidgetTask->insertTopLevelItem(0, new QTreeWidgetItem(this->ui->treeWidgetTask, QStringList(u8"任务")));
|
|
}
|
|
|
|
|
|
this->ui->treeWidgetTask->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
|
|
this->TaskListContextMenu = new QMenu(this->ui->treeWidgetTask);
|
|
QAction* openTaskNodeAction = this->TaskListContextMenu->addAction(u8"打开"); //
|
|
QObject::connect(openTaskNodeAction, SIGNAL(triggered()), this, SLOT(ShowTaskWindows()));
|
|
|
|
QObject::connect(this->ui->treeWidgetTask, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(ShowTaskListMenu(QPoint)));
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
QDockWidget* ModelProcess::getdockWidget_command(QString dockerTitle,Qt::DockWidgetArea layoutear)
|
|
{
|
|
QDockWidget* dockWidget_command = new QDockWidget(this);
|
|
dockWidget_command->setObjectName(dockerTitle);
|
|
dockWidget_command->setWindowTitle(dockerTitle);
|
|
this->addDockWidget(layoutear, dockWidget_command);
|
|
return dockWidget_command;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////
|
|
// ModelProcess 常见命令
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
QString ModelProcess::moveTopoShape(QString toponame, QString move_x, QString move_y, QString move_z)
|
|
{
|
|
// OCCTObjectCheckBox* topoShapeItem = this->getTopoShapeItem(toponame);
|
|
|
|
return QString();
|
|
}
|
|
|
|
|
|
bool ModelProcess::ShowTopoShape(TopoDS_Shape topoShape, QString topoName, bool isShow)
|
|
{
|
|
this->myDocument3d->addOCCTObjItem(topoShape, topoName, isShow);
|
|
return true;
|
|
}
|
|
|
|
bool ModelProcess::removeShape(QString topoName)
|
|
{
|
|
this->myDocument3d->removeTaskNode(topoName);
|
|
return false;
|
|
}
|
|
|
|
QString ModelProcess::createBox(QString topoName,double dx,double dy,double dz,double angle)
|
|
{
|
|
TopoDS_Shape S = BRepPrimAPI_MakeBox(dx, dy, dz);
|
|
BRepOffsetAPI_DraftAngle adraft(S);
|
|
TopExp_Explorer Ex;
|
|
for (Ex.Init(S, TopAbs_FACE); Ex.More(); Ex.Next()) {
|
|
TopoDS_Face F = TopoDS::Face(Ex.Current());
|
|
Handle(Geom_Plane) surf = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(F));
|
|
gp_Pln apln = surf->Pln();
|
|
gp_Dir dirF = apln.Axis().Direction();
|
|
if (dirF.IsNormal(gp_Dir(0., 0., 1.), Precision::Angular()))
|
|
adraft.Add(F, gp_Dir(0., 0., 1.), angle * M_PI / 180, gp_Pln(gp::XOY()));
|
|
}
|
|
TopoDS_Shape resultShape = adraft.Shape();
|
|
this->myDocument3d->addOCCTObjItem(resultShape, topoName, true);
|
|
|
|
return topoName;
|
|
}
|
|
|