#include "nmPebiGridViewDataBuilder.h" #include "nmPebiGridViewData.h" #include "nmDataAnalyzeManager.h" #include "nmDataNumericalAnalysisCase.h" #include #include #include #include #include #include namespace { QString builderText(const char* pText) { return QCoreApplication::translate("nmPebiGridViewDataBuilder", pText); } bool isBuilderGuiThread() { QCoreApplication* pApplication = QCoreApplication::instance(); return pApplication == NULL || pApplication->thread() == QThread::currentThread(); } } bool nmPebiGridViewDataBuilder::build( nmDataAnalyzeManager* pDataManager, nmPebiGridViewData* pViewData, QString* pError) { Q_ASSERT(isBuilderGuiThread()); if(pError != NULL) { pError->clear(); } if(!isBuilderGuiThread()) { if(pError != NULL) { *pError = builderText( "Grid preview data must be built in the GUI thread."); } return false; } if(pDataManager == NULL || pViewData == NULL) { if(pError != NULL) { *pError = builderText("The grid data source is unavailable."); } return false; } if(pDataManager->thread() != QThread::currentThread()) { if(pError != NULL) { *pError = builderText( "Grid preview data must be built in the GUI thread."); } return false; } if(!pDataManager->isPebiGridValid()) { if(pError != NULL) { *pError = builderText("The PEBI grid has not been committed."); } return false; } if(pDataManager->getGridType() != NM_Grid_PEBI) { if(pError != NULL) { *pError = builderText("The committed grid is not a PEBI grid."); } return false; } vtkSmartPointer pGrid = pDataManager->getUnstructuredGrid(); if(pGrid == NULL || pGrid->GetNumberOfPoints() <= 0 || pGrid->GetNumberOfCells() <= 0) { if(pError != NULL) { *pError = builderText("The committed PEBI grid is empty."); } return false; } const nmDataNumericalAnalysisCase* pAnalysisCase = pDataManager->getNumericalAnalysisCase(); if(pAnalysisCase == NULL) { if(pError != NULL) { *pError = builderText("The grid version is unavailable."); } return false; } // 先在局部对象中收集完整数据,任何校验错误都不会覆盖调用方旧数据。 nmPebiGridViewData oCandidate; oCandidate.m_pGrid = pGrid; oCandidate.m_eGridType = NM_Grid_PEBI; oCandidate.m_nGridInputRevision = pAnalysisCase->getGridInputRevision(); oCandidate.m_nValidCellCount = pGrid->GetNumberOfCells(); // Material 只认可 CellData 中与 VTK 单元一一对应的数组。 vtkCellData* pCellData = pGrid->GetCellData(); vtkDataArray* pMaterialArray = pCellData != NULL ? pCellData->GetArray("Material") : NULL; oCandidate.m_bHasMaterial = pMaterialArray != NULL && pMaterialArray->GetNumberOfTuples() == pGrid->GetNumberOfCells(); *pViewData = oCandidate; return true; }