#include "DialogMeshChecking.h" #include "ui_DialogMeshChecking.h" #include "MeshData/meshChecker.h" #include "PostWidgets/PostCustomPlot.h" #include "MainWindow/MainWindow.h" #include #include #include #include #include #include #include #include #include #include #include namespace MainWidget { QHash MeshCheckingDialog::TYPECOLORS = QHash(); MeshCheckingDialog::MeshCheckingDialog(GUI::MainWindow *m) : QFDialog(m) { _ui = new Ui::MeshCheckingDialog; _ui->setupUi(this); _checker = new MeshData::MeshChecker; QSize size = _ui->gifLabel->size(); QMovie *gif = new QMovie(":/QUI/icon/water_drop.gif"); gif->setScaledSize(size); _ui->gifLabel->setMovie(gif); gif->start(); _customplot = new Post::PostCustomPlot(this); //_ui->tabWidget->insertTab(2,_customplot,"Res"); connect(_checker, SIGNAL(finished()), this, SLOT(checkerFinished())); connect(_ui->checkBox, SIGNAL(stateChanged(int)), this, SLOT(on_checkbox_changed())); connect(this, SIGNAL(highLight(vtkDataSet *)), _mainWindow, SIGNAL(highLightDataSetSig(vtkDataSet *))); connect(this, SIGNAL(setDisplay(QString)), _mainWindow, SIGNAL(displayModeChangedSig(QString))); TYPECOLORS[VTK_TRIANGLE] = QColor(111, 9, 176); TYPECOLORS[VTK_QUAD] = QColor(250, 170, 20); TYPECOLORS[VTK_TETRA] = QColor(0, 168, 140); TYPECOLORS[VTK_HEXAHEDRON] = QColor(10, 132, 255); init(); } void MeshCheckingDialog::init() { _ui->statusLabel->setText("Waitting"); _ui->tabWidget->setCurrentIndex(0); _ui->tabWidget->widget(1)->setEnabled(false); const int w = this->width() - 70; _ui->inputTab->setColumnWidth(0, w / 2); _ui->inputTab->setColumnWidth(1, w / 2); _ui->checkedTab->setColumnWidth(0, w / 2); _ui->checkedTab->setColumnWidth(1, w / 2); _ui->inputTab->verticalHeader()->hide(); _ui->checkedTab->verticalHeader()->hide(); _ui->inputTab->setRowCount(0); _ui->checkedTab->setRowCount(0); // _ui->minBox->setMinimum(-1e32); // _ui->maxBox->setMinimum(-1e32); // _ui->maxBox->setMaximum(1e32); // _ui->minBox->setMaximum(1e32); on_checkbox_changed(); } MeshCheckingDialog::~MeshCheckingDialog() { delete _checker; if (_ui != nullptr) delete _ui; } void MeshCheckingDialog::on_checkButton_clicked() { init(); int index = _ui->comboBox->currentIndex(); _ui->statusLabel->setText("Checking..."); MeshData::QualityMeasure m = (MeshData::QualityMeasure)index; _checker->setQualityMeasure(m); _checker->start(); } void MeshCheckingDialog::on_closeButton_clicked() { this->close(); } void MeshCheckingDialog::checkerFinished() { _ui->statusLabel->setText("Completed"); _ui->tabWidget->setCurrentIndex(1); _ui->tabWidget->widget(1)->setEnabled(true); refreshBasicInfo(); updatePlot(); } void MeshCheckingDialog::refreshBasicInfo() { // input QList types = _checker->getInputCellType(); int row = types.size() + 1; _ui->inputTab->setRowCount(row); for (int i = 0; i < row - 1; ++i) { VTKCellType type = types.at(i); QString stype = MeshData::MeshChecker::VTKCellTypeToString(type); QTableWidgetItem *desitem = new QTableWidgetItem(stype); _ui->inputTab->setItem(i, 0, desitem); QString svalue = QString::number(_checker->getInputCellCount(type)); QTableWidgetItem *valitem = new QTableWidgetItem(svalue); _ui->inputTab->setItem(i, 1, valitem); } QTableWidgetItem *desAllinput = new QTableWidgetItem(tr("All Count")); _ui->inputTab->setItem(row - 1, 0, desAllinput); QString allcount = QString::number(_checker->getInputCellCount()); QTableWidgetItem *allInputNum = new QTableWidgetItem(allcount); _ui->inputTab->setItem(row - 1, 1, allInputNum); // output types = _checker->getQualityCellType(); row = types.size() + 4; _ui->checkedTab->setRowCount(row); for (int i = 0; i < row - 4; ++i) { VTKCellType type = types.at(i); QString stype = MeshData::MeshChecker::VTKCellTypeToString(type); QTableWidgetItem *desitem = new QTableWidgetItem(stype); _ui->checkedTab->setItem(i, 0, desitem); QString svalue = QString::number(_checker->gettQualityCellCount(type)); QTableWidgetItem *valitem = new QTableWidgetItem(svalue); _ui->checkedTab->setItem(i, 1, valitem); } desAllinput = new QTableWidgetItem(tr("All Count")); _ui->checkedTab->setItem(row - 4, 0, desAllinput); allcount = QString::number(_checker->gettQualityCellCount()); allInputNum = new QTableWidgetItem(allcount); _ui->checkedTab->setItem(row - 4, 1, allInputNum); if (_checker->gettQualityCellCount() == 0) { _ui->checkedTab->setRowCount(row - 3); return; } double range[2] = {0}; _checker->getQualityRange(range); QTableWidgetItem *desMin = new QTableWidgetItem("Min"); _ui->checkedTab->setItem(row - 3, 0, desMin); QTableWidgetItem *valueMin = new QTableWidgetItem(QString::number(range[0])); _ui->checkedTab->setItem(row - 3, 1, valueMin); QTableWidgetItem *desMax = new QTableWidgetItem("Max"); _ui->checkedTab->setItem(row - 2, 0, desMax); QTableWidgetItem *valueMax = new QTableWidgetItem(QString::number(range[1])); _ui->checkedTab->setItem(row - 2, 1, valueMax); QTableWidgetItem *desAve = new QTableWidgetItem("Average"); _ui->checkedTab->setItem(row - 1, 0, desAve); QTableWidgetItem *valueAve = new QTableWidgetItem(QString::number(_checker->getAverageQuality())); _ui->checkedTab->setItem(row - 1, 1, valueAve); _ui->minBox->setValue(range[0]); _ui->maxBox->setValue(range[1]); } void MeshCheckingDialog::updatePlot() { // _customplot->clearPlottables(); // /*_customplot->addGraph();*/ // // _customplot->legend->clear(); // // double range[2] = { 0 }; // // _checker->getQualityRange(range); // // double em = (range[1] - range[0])*0.1; // // _customplot->xAxis->setRange(range[0]-em, range[1]+em); // _customplot->xAxis->grid()->setVisible(false); // // QVector ticks = _checker->getTicks(); // // QHash bars; // QList typeList = _checker->getQualityCellType(); // for (int i = 0; i < typeList.size(); ++i) // { // VTKCellType type = typeList.at(i); // QCPBars* bar = new QCPBars(_customplot->xAxis, _customplot->yAxis); // bars[type] = bar; // bar->setAntialiased(false); // bar->setStackingGap(1); // QString name = MeshData::MeshChecker::VTKCellTypeToString(type); // bar->setName(name); // QColor color = TYPECOLORS.value(type); // bar->setPen(QPen(color.lighter())); // bar->setBrush(color); // bar->setWidthType(QCPBars::wtAxisRectRatio); // bar->setWidth(0.05); // if (i > 0) // { // QCPBars* b = bars.value(typeList.at(i - 1)); // bar->moveAbove(b); // } // // QVector data = _checker->getCountList(type); // if (data.size() == ticks.size()) // bar->setData(ticks, data); // } // // int ymax = _checker->getMaxCellCount(); // // _customplot->yAxis->setRange(0,ymax*1.05); // _customplot->rescaleAxes(); // _customplot->legend->setVisible(true); // _customplot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop | Qt::AlignRight); // _customplot->legend->setBrush(QColor(255, 255, 255, 100)); // _customplot->legend->setBorderPen(Qt::NoPen); // _customplot->replot(); } void MeshCheckingDialog::on_checkbox_changed() { bool checked = _ui->checkBox->isChecked(); _ui->minlabel->setVisible(checked); _ui->maxlabel->setVisible(checked); _ui->maxBox->setVisible(checked); _ui->minBox->setVisible(checked); } void MeshCheckingDialog::closeEvent(QCloseEvent *e) { bool checked = _ui->checkBox->isChecked(); if (!checked) return; double min = _ui->minBox->value(); double max = _ui->maxBox->value(); if (max < min) return; QList datasetList = _checker->getResultList(); const int n = datasetList.size(); vtkSmartPointer appf = vtkSmartPointer::New(); for (int i = 0; i < n; ++i) { vtkDataSet *dataset = datasetList.at(i); vtkDataArray *qua = dataset->GetCellData()->GetScalars("CellQuality"); if (qua == nullptr) continue; const int nv = qua->GetNumberOfValues(); if (nv != dataset->GetNumberOfCells()) continue; vtkSmartPointer array = vtkSmartPointer::New(); for (int j = 0; j < nv; ++j) { double q = qua->GetComponent(j, 0); if (q < min || q > max) array->InsertNextValue(j); } vtkSmartPointer selectionNode = vtkSmartPointer::New(); selectionNode->SetFieldType(vtkSelectionNode::CELL); selectionNode->SetContentType(vtkSelectionNode::INDICES); selectionNode->SetSelectionList(array); vtkSmartPointer selection = vtkSmartPointer::New(); selection->AddNode(selectionNode); vtkSmartPointer extractionSelection = vtkSmartPointer::New(); extractionSelection->SetInputData(0, dataset); extractionSelection->SetInputData(1, selection); extractionSelection->Update(); vtkSmartPointer DataSet = vtkSmartPointer::New(); DataSet->DeepCopy(extractionSelection->GetOutput()); appf->AddInputData(DataSet); } appf->Update(); vtkDataSet *bad = appf->GetOutput(); emit setDisplay("wireframe"); emit highLight(bad); QDialog::closeEvent(e); } }