#include "ProjectTreeWithBasicNode.h" #include "ModelData/modelDataBaseExtend.h" #include "ConfigOptions/TreeItemData.h" #include "MeshData/meshSet.h" #include "DialogImport.h" #include "MeshData/meshSingleton.h" #include "DialogAddBC.h" #include "DialogAddProperty.h" #include "BCBase/BCBase.h" #include "BCBase/BCUserDef.h" #include "MainWindow/MainWindow.h" #include "DialogRemoveReport.h" #include "ModelData/simulationSettingBase.h" #include "ModelData/solverSettingBase.h" #include "ModelData/elementProperty.h" #include "Geometry/geometryData.h" #include "Geometry/geometrySet.h" #include "Geometry/GeoComponent.h" #include "DialogAssignProperty.h" #include "DataProperty/PropertyBase.h" #include "DataProperty/PropertyString.h" #include "ConfigOptions/ConfigOptions.h" #include "ConfigOptions/PostConfig.h" #include "ConfigOptions/PostConfigInfo.h" #include "ConfigOptions/PostCurve.h" #include "ConfigOptions/GlobalConfig.h" #include "PostWidgets/Post2DWidget.h" #include "PostWidgets/Post3DWidget.h" #include "PostWidgets/Post2DInterface.h" #include "PostWidgets/Post3DInterface.h" #include "PostWidgets/RealTimeWindowBase.h" #include "Material/MaterialSingletion.h" #include "Material/Material.h" #include "PythonModule/PyAgent.h" #include #include #include #include #include #include #include #include #include namespace ProjectTree { ProjectTreeWithBasicNode::ProjectTreeWithBasicNode(GUI::MainWindow *mainwindow) : ProjectTreeBase(mainwindow) { connect(this, SIGNAL(highLightSet(MeshData::MeshSet *)), mainwindow, SIGNAL(highLightSetSig(MeshData::MeshSet *))); connect(this, SIGNAL(highLightGeoComponent(Geometry::GeoComponent *)), mainwindow, SIGNAL(highLightGeoComponentSig(Geometry::GeoComponent *))); connect(mainwindow, SIGNAL(closePostWindowSig(Post::PostWindowBase *)), this, SLOT(closePostWindow(Post::PostWindowBase *))); connect(this, SIGNAL(openRealTimeWin(Post::RealTimeWindowBase *, int)), mainwindow, SIGNAL(openRealTimeWindowSig(Post::RealTimeWindowBase *, int))); connect(this, SIGNAL(clearAllHighLightSig()), mainwindow, SIGNAL(clearAllHighLight())); connect(this, SIGNAL(addComponentRootItemSig()), this, SLOT(addComponentRootItemSlot())); _nodeMenu = new QMenu; _cellMeun = new QMenu; } ProjectTreeWithBasicNode::~ProjectTreeWithBasicNode() { if (_postMapper != nullptr) delete _postMapper; if (_nodeMenu != nullptr) delete _nodeMenu; if (_cellMeun != nullptr) delete _cellMeun; } void ProjectTreeWithBasicNode::initBasicNode(QTreeWidgetItem *phyroot) { _root = new QTreeWidgetItem(phyroot, TreeItemType::ProjectRoot); _root->setFlags(_root->flags() | Qt::ItemIsEditable); _root->setIcon(0, QIcon("://QUI/icon/physics.png")); // int id = _data->getID(); _root->setText(0, _data->getName()); //根据项目名称确定 _root->setData(0, Qt::UserRole, _data->getID()); _root->setExpanded(true); double time = _data->getSolveTime(); if (time > 0) _solveStatus = Finished; _data->setOutputFileName(_outputFile); // _geometryRootItem = new QTreeWidgetItem(_root, TreeItemType::ProjectGeometry); // _geometryRootItem->setText(0, tr("Geometry")); // _geometryRootItem->setIcon(0, QIcon("://QUI/icon/geometry.png")); // _textItemHash["Geometry"] = _geometryRootItem; _propertyRootItem = new QTreeWidgetItem(_root, TreeItemType::ProjectEleProperty); _propertyRootItem->setText(0, tr("Element Property")); _propertyRootItem->setIcon(0, QIcon("://QUI/icon/solumationsetting.png")); _textItemHash["Element Property"] = _propertyRootItem; _ComponentRootItem = new QTreeWidgetItem(_root, TreeItemType::ProjectComponent); _ComponentRootItem->setText(0, tr("Set")); _ComponentRootItem->setIcon(0, QIcon("://QUI/icon/mesh.png")); _textItemHash["Set"] = _ComponentRootItem; _simulationSettingItem = new QTreeWidgetItem(_root, TreeItemType::ProjectSimulationSetting); _simulationSettingItem->setText(0, tr("Simulation Setting")); _simulationSettingItem->setIcon(0, QIcon("://QUI/icon/solumationsetting.png")); _textItemHash["Simulation Setting"] = _simulationSettingItem; _boundaryConditionItem = new QTreeWidgetItem(_root, TreeItemType::ProjectBoundaryCondation); _boundaryConditionItem->setText(0, tr("Boundary Condition")); _boundaryConditionItem->setIcon(0, QIcon("://QUI/icon/bc.png")); _textItemHash["Boundary Condition"] = _boundaryConditionItem; _solverSettingItem = new QTreeWidgetItem(_root, TreeItemType::ProjectSolver); _solverSettingItem->setText(0, tr("Solver Setting")); _solverSettingItem->setIcon(0, QIcon("://QUI/icon/setting.png")); _textItemHash["Solver Setting"] = _solverSettingItem; _monitorRootItem = new QTreeWidgetItem(_root, TreeItemType::ProjectMonitor); _monitorRootItem->setText(0, tr("Monitor")); _monitorRootItem->setIcon(0, QIcon("://QUI/icon/monitor.png")); _textItemHash["Monitor"] = _monitorRootItem; _postRootItem = new QTreeWidgetItem(_root, TreeItemType::ProjectPost); _postRootItem->setText(0, tr("Post")); _postRootItem->setIcon(0, QIcon("://QUI/icon/post.png")); _textItemHash["Post"] = _postRootItem; _post2DItem = new QTreeWidgetItem(_postRootItem, TreeItemType::ProJectPost2DGraph); _post2DItem->setText(0, tr("2D Plot")); _post2DItem->setIcon(0, QIcon("://QUI/icon/curve.png")); _textItemHash["2D Plot"] = _post2DItem; _postCounterItem = new QTreeWidgetItem(_postRootItem, TreeItemType::ProjectPostCounter); _postCounterItem->setText(0, tr("Counter")); _postCounterItem->setIcon(0, QIcon("://QUI/icon/counter.png")); _textItemHash["Counter"] = _postCounterItem; _postVectorItem = new QTreeWidgetItem(_postRootItem, TreeItemType::ProjectPostVector); _postVectorItem->setText(0, tr("Vector")); _postVectorItem->setIcon(0, QIcon("://QUI/icon/vector.png")); _textItemHash["Vector"] = _postVectorItem; _postStreamLineItem = new QTreeWidgetItem(_postRootItem, TreeItemType::ProjectPostStreamLine); _postStreamLineItem->setText(0, tr("Stream Line")); _postStreamLineItem->setIcon(0, QIcon("://QUI/icon/streamline.png")); _textItemHash["Stream Line"] = _postStreamLineItem; _postStreamLineItem->setHidden(true); _reportItem = new QTreeWidgetItem(_root, TreeItemType::ProjectReport); _reportItem->setText(0, tr("Report")); _reportItem->setHidden(true); _textItemHash["Report"] = _reportItem; } void ProjectTreeWithBasicNode::reTranslate() { if (_geometryRootItem != nullptr) _geometryRootItem->setText(0, tr("Geometry")); _ComponentRootItem->setText(0, tr("Set")); _simulationSettingItem->setText(0, tr("Simulation Setting")); _boundaryConditionItem->setText(0, tr("Boundary Condition")); _solverSettingItem->setText(0, tr("Solver Setting")); _monitorRootItem->setText(0, tr("Monitor")); _postRootItem->setText(0, tr("Post")); _post2DItem->setText(0, tr("2D Plot")); _postCounterItem->setText(0, tr("Counter")); _postVectorItem->setText(0, tr("Vector")); _postStreamLineItem->setText(0, tr("Stream Line")); // _post3DItem->setText(0, tr("3D Graph")); _reportItem->setText(0, tr("Report")); ProjectTreeBase::reTranslate(); } void ProjectTreeWithBasicNode::setData(ModelData::ModelDataBase *data) { ProjectTreeBase::setData(data); _modelDataExtend = dynamic_cast(_data); } void ProjectTreeWithBasicNode::contextMenu(QMenu *menu) { QAction *action = nullptr; TreeItemType type = (TreeItemType)_currentItem->type(); auto glo = ConfigOption::ConfigOption::getInstance()->getGlobalConfig(); switch (type) { case ProjectGeometry: action = menu->addAction(tr("Import Geometry")); connect(action, SIGNAL(triggered()), this, SLOT(importGeometry())); break; case ProjectEleProperty: action = menu->addAction(tr("Add Property")); connect(action, SIGNAL(triggered()), this, SLOT(addEleProperty())); break; case ProjectElePropertyChild: action = menu->addAction(tr("Remove")); connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); break; case ProjectComponent: action = menu->addAction(tr("Import Set")); connect(action, SIGNAL(triggered()), this, SLOT(importComponents())); if (glo->isMaterialEnabled()) { action = menu->addAction(tr("Assign Property")); connect(action, SIGNAL(triggered()), this, SLOT(assignProperty())); } break; case ProjectComponentChild: action = menu->addAction(tr("Remove")); connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); break; case ProjectBoundaryCondation: action = menu->addAction(tr("Add Boundary Condition")); connect(action, SIGNAL(triggered()), this, SLOT(addBC())); break; case ProjectBoundaryCondationChild: action = menu->addAction(tr("Remove")); connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); break; case ProjectMonitor: action = menu->addAction(tr("View")); connect(action, SIGNAL(triggered()), this, SLOT(viewRealTimeWindow())); break; case ProJectPost2DGraph: this->d2PlotContextMenu(menu); break; case ProJectPost2DGraphChild: action = menu->addAction(tr("Remove")); connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); break; case ProjectPostCounter: this->counterContextMenu(menu); break; case ProjectPostCounterChild: action = menu->addAction(tr("Remove")); connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); break; case ProjectPostVector: this->vectorContextMenu(menu); break; case ProjectPostVectorChild: action = menu->addAction(tr("Remove")); connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); break; case ProjectPostStreamLine: break; case ProjectReport: action = menu->addAction(tr("Create Report")); connect(action, SIGNAL(triggered()), this, SLOT(createReport())); break; case ProjectReportChild: action = menu->addAction(tr("Remove")); connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); break; default: break; } ProjectTreeBase::contextMenu(menu); } void ProjectTreeWithBasicNode::importComponents() { ImportDialog dlg(_mainWindow, _modelDataExtend, MeshSet); dlg.exec(); // if (dlg.exec() == QDialog::Accepted) // updateMeshSubTree(); } void ProjectTreeWithBasicNode::importGeometry() { ImportDialog dlg(_mainWindow, _modelDataExtend, Geometry); dlg.exec(); } void ProjectTreeWithBasicNode::updateTree() { updatePropTree(); updateGeometrySubTree(); updateComponentSubTree(); updateBCSubTree(); updateMonitorTree(); updatePostTree(); updateReportTree(); } void ProjectTreeWithBasicNode::updateComponentSubTree() { if (_ComponentRootItem == nullptr) return; _ComponentRootItem->takeChildren(); QList IDs = _modelDataExtend->getComponentIDList(); if (IDs.size() == 0) return; auto meshData = MeshData::MeshData::getInstance(); auto geoData = Geometry::GeometryData::getInstance(); auto materialData = Material::MaterialSingleton::getInstance(); QString name{}; QString icon{}; for (int id : IDs) { auto type = DataProperty::ComponentBase::getComponentTypeByID(id); if (type == 0) continue; if (type == DataProperty::ComponentType::MESH) { auto set = meshData->getMeshSetByID(id); if (set == nullptr) continue; name = set->getName(); MeshData::SetType type = set->getSetType(); if (type == MeshData::Element) icon = "://QUI/icon/eleset.png"; else if (type == MeshData::Family) icon = "://QUI/icon/family.png"; else icon = "://QUI/icon/nodeset.png"; } else if (type == DataProperty::ComponentType::GEOMETRY) { auto gc = geoData->getGeoComponentByID(id); name = gc->getName(); icon = "://QUI/icon/geometry.png"; } if (_modelDataExtend->isPropertySetted(id)) //是否指定材料 { int pid = _modelDataExtend->getPropertyID(id); auto m = _modelDataExtend->getElePropertyByID(pid); if (!m) continue; QString mname = m->getName(); name.append(QString("-[%1]").arg(mname)); } QTreeWidgetItem *temp = new QTreeWidgetItem(/*_ComponentRootItem, */ TreeItemType::ProjectComponentChild); temp->setIcon(0, QIcon(icon)); temp->setText(0, name); temp->setData(0, Qt::UserRole, id); _ComponentItems.append(temp); } emit addComponentRootItemSig(); /*_ComponentRootItem->setExpanded(true); emit clearAllHighLightSig();*/ } /*void ProjectTreeWithBasicNode::updateMeshSetSubTree() { QList setIDs = _modelDataExtend->getMeshSetList(); if (setIDs.size() == 0) return; MeshData::MeshData* meshdata = MeshData::MeshData::getInstance(); Material::MaterialSingleton* materialData = Material::MaterialSingleton::getInstance(); for (int i = 0; i < setIDs.size(); ++i) { int id = setIDs.at(i); MeshData::MeshSet* set = meshdata->getMeshSetByID(id); // assert(set != nullptr); if (set == nullptr) continue; QString name = set->getName(); MeshData::SetType type = set->getSetType(); QString icon = "://QUI/icon/nodeset.png"; if (type == MeshData::Element) { icon = "://QUI/icon/eleset.png"; if (_modelDataExtend->isMaterialSetted(id)) { int materialid = _modelDataExtend->getMaterialID(id); Material::Material* m = materialData->getMaterialByID(materialid); if (m != nullptr) { QString mname = m->getName(); name.append(QString("-[%1]").arg(mname)); } } } else if (type == MeshData::Family) { icon = "://QUI/icon/family.png"; } QTreeWidgetItem* temp = new QTreeWidgetItem(_ComponentRootItem, TreeItemType::ProjectComponentChild); temp->setIcon(0, QIcon(icon)); temp->setText(0, name); temp->setData(0, Qt::UserRole, id); } } void ProjectTreeWithBasicNode::updateGeoComponentTree() { QList GCIDs = _modelDataExtend->getGeoComponentIDList(); if (GCIDs.isEmpty()) return; auto geoData = Geometry::GeometryData::getInstance(); auto materialData = Material::MaterialSingleton::getInstance(); QString name{}; for(int GCID : GCIDs) { auto aGC = geoData->getGeoComponentByID(GCID); if (!aGC) continue; name = aGC->getName(); if (_modelDataExtend->isMaterialSetted(GCID)) { int materialid = _modelDataExtend->getMaterialID(GCID); Material::Material* m = materialData->getMaterialByID(materialid); if (!m) continue; name.append(QString("-[%1]").arg(m->getName())); } QTreeWidgetItem* temp = new QTreeWidgetItem(_ComponentRootItem, TreeItemType::ProjectComponentChild); temp->setIcon(0, QIcon("://QUI/icon/geometry.png")); temp->setText(0, name); temp->setData(0, Qt::UserRole, GCID); } }*/ void ProjectTreeWithBasicNode::updatePropTree() { if (_propertyRootItem == nullptr) return; _propertyRootItem->takeChildren(); const int np = _modelDataExtend->getElePropCount(); for (int i = 0; i < np; ++i) { auto prop = _modelDataExtend->getElePropertyAt(i); QTreeWidgetItem *item = new QTreeWidgetItem(_propertyRootItem, TreeItemType::ProjectElePropertyChild); item->setText(0, prop->getName()); item->setData(0, Qt::UserRole, prop->getID()); } _propertyRootItem->setExpanded(true); } void ProjectTreeWithBasicNode::updateBCSubTree() { if (_boundaryConditionItem == nullptr) return; _boundaryConditionItem->takeChildren(); const int nBC = _modelDataExtend->getBCCount(); for (int i = 0; i < nBC; ++i) { QString icon; BCBase::BCBase *bc = _modelDataExtend->getBCAt(i); if (bc == nullptr) continue; BCBase::BCType ty = bc->getBCType(); QString stype; if (ty == BCBase::UserDef) { stype = ((BCBase::BCUserDef *)bc)->getName(); QString sicon = ((BCBase::BCUserDef *)bc)->getIcon(); icon = qApp->applicationDirPath() + "/../ConfigFiles/Icon/" + sicon; bc->appendProperty("BCType", stype); } else { stype = BCBase::BCTypeToString(ty); icon = BCBase::BCIconByType(ty); } QString cpName = bc->getComponentName(); QTreeWidgetItem *item = new QTreeWidgetItem(_boundaryConditionItem, TreeItemType::ProjectBoundaryCondationChild); QString text = QString("%1 @ %2").arg(stype).arg(cpName); item->setText(0, text); item->setIcon(0, QIcon(icon)); item->setData(0, Qt::UserRole, bc->getComponentID()); } _boundaryConditionItem->setExpanded(true); emit highLightSet(nullptr); } void ProjectTreeWithBasicNode::updateMonitorTree() { _monitorRootItem->takeChildren(); QList curvelist = _modelDataExtend->getMonitorCurves(); // qDebug() << curvelist.size(); for (int i = 0; i < curvelist.size(); ++i) { ConfigOption::PostCurve *c = curvelist.at(i); QString text = c->getDescribe(); QTreeWidgetItem *tempitem = new QTreeWidgetItem(_monitorRootItem, ProjectMonitorChild); tempitem->setText(0, text); tempitem->setIcon(0, QIcon("://QUI/icon/curve.png")); } } void ProjectTreeWithBasicNode::updatePostTree() { _post2DItem->takeChildren(); _postCounterItem->takeChildren(); _postVectorItem->takeChildren(); // QStringList d2v = _modelDataExtend->getPlot2DVariable(); QList d2v = _modelDataExtend->getPlotCurves(); for (int i = 0; i < d2v.size(); ++i) { QTreeWidgetItem *item = new QTreeWidgetItem(_post2DItem, ProJectPost2DGraphChild); QString text = d2v.at(i)->getDescribe(); item->setText(0, text); item->setIcon(0, QIcon("://QUI/icon/curve.png")); } QStringList scalarv = _modelDataExtend->getScalarVariable(); for (int i = 0; i < scalarv.size(); ++i) { QTreeWidgetItem *item = new QTreeWidgetItem(_postCounterItem, ProjectPostCounterChild); QString text = scalarv.at(i); if (text.endsWith("_cell000")) { text.replace("_cell000", " @ Cell"); } else text.append(" @ Node"); item->setIcon(0, QIcon("://QUI/icon/counter.png")); item->setText(0, text); } QStringList vectorv = _modelDataExtend->getVectorVariable(); for (int i = 0; i < vectorv.size(); ++i) { QTreeWidgetItem *item = new QTreeWidgetItem(_postVectorItem, ProjectPostVectorChild); QString text = vectorv.at(i); if (text.endsWith("_cell000")) { text.replace("_cell000", " @ Cell"); } else text.append(" @ Node"); item->setIcon(0, QIcon("://QUI/icon/vector.png")); item->setText(0, text); } _post2DItem->setExpanded(true); _postCounterItem->setExpanded(true); _postVectorItem->setExpanded(true); } void ProjectTreeWithBasicNode::removeCaseComponentByID(int cpID) { bool res = _modelDataExtend->removeComponentByID(cpID); if (!res) return; _modelDataExtend->removeBCByComponentID(cpID); QTreeWidgetItem *item{}; int childCount = _ComponentRootItem->childCount(); for (int i = 0; i < childCount; ++i) { QTreeWidgetItem *tmp = _ComponentRootItem->child(i); if (tmp->data(0, Qt::UserRole).toInt() == cpID) { item = tmp; break; } } if (!item) return; _ComponentRootItem->removeChild(item); QList items; childCount = _boundaryConditionItem->childCount(); for (int i = 0; i < childCount; ++i) { QTreeWidgetItem *item = _boundaryConditionItem->child(i); if (item->data(0, Qt::UserRole).toInt() == cpID) items << item; } for (QTreeWidgetItem *item : items) _boundaryConditionItem->removeChild(item); } void ProjectTreeWithBasicNode::renameCaseComponentByID(int cpID) { auto meshData = MeshData::MeshData::getInstance(); auto geoData = Geometry::GeometryData::getInstance(); DataProperty::DataBase *component{}; component = meshData->getMeshSetByID(cpID); if (!component) component = geoData->getGeoComponentByID(cpID); if (!component) return; QTreeWidgetItem *item{}; QString cpName = component->getName(); int childCount = _ComponentRootItem->childCount(); for (int i = 0; i < childCount; ++i) { item = _ComponentRootItem->child(i); if (item->data(0, Qt::UserRole).toInt() != cpID) continue; QString oldText = item->text(0); if (!oldText.contains("-[")) item->setText(0, cpName); else { int index = oldText.lastIndexOf("-["); QString right = oldText.right(oldText.size() - index); QString newText = cpName + right; item->setText(0, newText); } break; } childCount = _boundaryConditionItem->childCount(); for (int i = 0; i < childCount; ++i) { item = _boundaryConditionItem->child(i); if (item->data(0, Qt::UserRole).toInt() != cpID) continue; QString oldText = item->text(0); int index = oldText.lastIndexOf(" @"); QString left = oldText.left(index + 3); QString newText = left + cpName; item->setText(0, newText); } } const QList &ProjectTreeWithBasicNode::getComponentIDList() { return _modelDataExtend->getComponentIDList(); } void ProjectTreeWithBasicNode::removeItem() { // TreeItemType type = (TreeItemType)_currentItem->type(); if (_currentItem->type() == ProjectComponentChild) { int index = _ComponentRootItem->indexOfChild(_currentItem); if (_data->isComponentUsed(index)) { if (QMessageBox::Yes != QMessageBox::warning(_mainWindow, tr("Warning"), tr("This Set has been used, still remove?"), QMessageBox::Yes, QMessageBox::No)) return; } _modelDataExtend->removeComponentAt(index); updateComponentSubTree(); updateBCSubTree(); } else if (_currentItem->type() == ProjectElePropertyChild) { int index = _propertyRootItem->indexOfChild(_currentItem); _data->removeElePropAt(index); updatePropTree(); } else if (_currentItem->type() == ProjectBoundaryCondationChild) { int index = _boundaryConditionItem->indexOfChild(_currentItem); _modelDataExtend->removeBCAt(index); updateBCSubTree(); } else if (_currentItem->type() == ProjectReportChild) { int index = _reportItem->indexOfChild(_currentItem); RemoveReportDialog dlg(_mainWindow); if (dlg.exec() == QDialog::Accepted) { QString fileName = _modelDataExtend->getReportAt(index); QFile f(fileName); if (f.exists() && dlg.isRemoveCompletely()) f.remove(); _modelDataExtend->removeReportAt(index); updateReportTree(); } } else if (_currentItem->type() == ProJectPost2DGraphChild) { const int index = _post2DItem->indexOfChild(_currentItem); QString name = _currentItem->text(0); qDebug() << name; _modelDataExtend->removePlotCurve(index); updatePostTree(); auto p2d = _modelDataExtend->getPost2DWindow(); if (p2d != nullptr) { p2d->removeCurve(name); } } else if (_currentItem->type() == ProjectPostCounterChild) { const int index = _postCounterItem->indexOfChild(_currentItem); _modelDataExtend->removeScalarVariable(index); updatePostTree(); } else if (_currentItem->type() == ProjectPostVectorChild) { const int index = _postVectorItem->indexOfChild(_currentItem); _modelDataExtend->removeVectorVariable(index); updatePostTree(); } emit disPlayProp(nullptr); } void ProjectTreeWithBasicNode::addEleProperty() { AddPropDialog dlg(_mainWindow, _modelDataExtend); if (QDialog::Accepted == dlg.exec()) updatePropTree(); } void ProjectTreeWithBasicNode::createReport() { // _modelDataExtend->appendReport("D:/test.docx"); updateReportTree(); } void ProjectTreeWithBasicNode::addBC() { AddBCDialog dlg(_mainWindow, _modelDataExtend); dlg.exec(); // if (dlg.exec() == QDialog::Accepted) // updateBCSubTree(); } void ProjectTreeWithBasicNode::singleClicked() { TreeItemType type = (TreeItemType)_currentItem->type(); if (type == ProjectComponentChild) { const int index = _ComponentRootItem->indexOfChild(_currentItem); if (index >= 0) { emit clearAllHighLightSig(); int id = _modelDataExtend->getComponentIDList().at(index); auto ms = MeshData::MeshData::getInstance()->getMeshSetByID(id); if (ms) { emit highLightSet(ms); emit disPlayProp(ms); } else { auto gc = Geometry::GeometryData::getInstance()->getGeoComponentByID(id); if (!gc) return; emit highLightGeoComponent(gc); emit disPlayProp(gc); } } } else if (type == ProjectElePropertyChild) { const int index = _propertyRootItem->indexOfChild(_currentItem); if (index >= 0) { auto prop = _modelDataExtend->getElePropertyAt(index); emit disPlayProp(prop); } } else if (type == ProjectBoundaryCondationChild) { emit clearAllHighLightSig(); const int index = _boundaryConditionItem->indexOfChild(_currentItem); BCBase::BCBase *bc = _modelDataExtend->getBCAt(index); assert(bc != nullptr); emit disPlayProp(bc); DataProperty::ComponentBase *component = bc->getComponent(); if (!component) return; if (component->getComponentType() == DataProperty::ComponentType::MESH) { auto set = dynamic_cast(component); emit highLightSet(set); } else { auto gc = dynamic_cast(component); emit highLightGeoComponent(gc); } } else if (type == ProjectSimulationSetting) { ModelData::SimlutationSettingBase *s = _data->getSimlutationSetting(); emit disPlayProp(s); } else if (type == ProjectSolver) { ModelData::SolverSettingBase *s = _data->getSolverSetting(); emit disPlayProp(s); } else if (type == ProjectMonitorChild) { const int index = _monitorRootItem->indexOfChild(_currentItem); // QList mon = _modelDataExtend->getMonitorList(); emit disPlayProp(_modelDataExtend->getMonitorCurveAt(index)); if (_realTimeWin != nullptr) { QString name = _currentItem->text(0); _realTimeWin->viewRealTimeWindow(name); } } else if (type == ProJectPost2DGraphChild) { const int index = _post2DItem->indexOfChild(_currentItem); ConfigOption::PostCurve *temp = _modelDataExtend->getPlotCurves().at(index); emit disPlayProp(temp); QString text = _currentItem->text(0); viewPlot2D(text); } else if (type == ProjectPostCounterChild) { QString text = _currentItem->text(0); text.remove(" @ Node"); text.replace(" @ Cell", "_cell000"); viewCounter(text); } else if (type == ProjectPostVectorChild) { QString text = _currentItem->text(0); text.remove(" @ Node"); text.replace(" @ Cell", "_cell000"); viewVector(text); } else { emit clearAllHighLightSig(); emit disPlayProp(nullptr); } const int index = _currentItem->data(0, Qt::UserRole + 1).toInt() - 1; if (index >= 0) { ConfigOption::TreeItem *item = _itemList.at(index); const int id = item->getDataID(); DataProperty::DataBase *d = _modelDataExtend->getConfigData(id); emit disPlayProp(d); } ProjectTreeBase::singleClicked(); } void ProjectTreeWithBasicNode::doubleClicked() { if (_treeType == 1) { TreeItemType itemType = (TreeItemType)_currentItem->type(); switch (itemType) { case TreeItemType::ProjectSimulationSettingChild: { // NodeParameterDlg dlg(_treeType, _currentItem->text(0), _mainWindow); break; } } } } void ProjectTreeWithBasicNode::updateReportTree() { if (_reportItem == nullptr) return; _reportItem->takeChildren(); const int nReport = _modelDataExtend->getReportCount(); for (int i = 0; i < nReport; ++i) { QString report = _modelDataExtend->getReportAt(i); QFileInfo file(report); if (!file.exists()) continue; QString text = file.fileName(); QTreeWidgetItem *item = new QTreeWidgetItem(_reportItem, TreeItemType::ProjectReportChild); item->setText(0, text); } _reportItem->setExpanded(true); } void ProjectTreeWithBasicNode::assignProperty() { AssignPropertyDialog dlg(_mainWindow, _modelDataExtend); if (dlg.exec() == QDialog::Accepted) this->updateComponentSubTree(); } void ProjectTreeWithBasicNode::d2PlotContextMenu(QMenu *menu) { ConfigOption::PostConfig *option = ConfigOption::ConfigOption::getInstance()->getPostConfig(); ConfigOption::PostConfigInfo *info = option->getPostConfigInfo(_treeType); if (info == nullptr) return; if (_postMapper != nullptr) { delete _postMapper; _postMapper = nullptr; } _postMapper = new QSignalMapper(this); // QStringList d2Variables = info->get2DVariable(); QList curlist = info->getCurveList(); for (int i = 0; i < curlist.size(); ++i) { QString text = curlist.at(i)->getDescribe(); if (text.isEmpty()) continue; QAction *action = menu->addAction(text); connect(action, SIGNAL(triggered()), _postMapper, SLOT(map())); _postMapper->setMapping(action, text); } connect(_postMapper, SIGNAL(mapped(QString)), this, SLOT(viewPlot2D(QString))); } void ProjectTreeWithBasicNode::counterContextMenu(QMenu *menu) { ConfigOption::PostConfig *option = ConfigOption::ConfigOption::getInstance()->getPostConfig(); ConfigOption::PostConfigInfo *info = option->getPostConfigInfo(_treeType); if (info == nullptr) return; if (_postMapper != nullptr) { delete _postMapper; _postMapper = nullptr; } _postMapper = new QSignalMapper(this); QAction *nodeaction = menu->addAction(tr("Node Scalar")); QAction *cellaction = menu->addAction(tr("Cell Scalar")); _nodeMenu->clear(); _cellMeun->clear(); nodeaction->setMenu(_nodeMenu); cellaction->setMenu(_cellMeun); QStringList scalarVariables = info->getNodeScalarVariable(); // if (scalarVariables.at(0) != "") // { for (int i = 0; i < scalarVariables.size(); ++i) { QString text = scalarVariables.at(i); if (text.isEmpty()) continue; qDebug() << text; QAction *action = _nodeMenu->addAction(text); connect(action, SIGNAL(triggered()), _postMapper, SLOT(map())); _postMapper->setMapping(action, text); } // } scalarVariables = info->getCellScalarVariable(); // if (scalarVariables.at(0) != "") // { for (int i = 0; i < scalarVariables.size(); ++i) { QString text = scalarVariables.at(i); if (text.isEmpty()) continue; QAction *action = _cellMeun->addAction(text); connect(action, SIGNAL(triggered()), _postMapper, SLOT(map())); _postMapper->setMapping(action, text.append("_cell000")); } // } connect(_postMapper, SIGNAL(mapped(QString)), this, SLOT(viewCounter(QString))); } void ProjectTreeWithBasicNode::vectorContextMenu(QMenu *menu) { ConfigOption::PostConfig *option = ConfigOption::ConfigOption::getInstance()->getPostConfig(); ConfigOption::PostConfigInfo *info = option->getPostConfigInfo(_treeType); if (info == nullptr) return; if (_postMapper != nullptr) { delete _postMapper; _postMapper = nullptr; } _postMapper = new QSignalMapper(this); QAction *nodeaction = menu->addAction(tr("Node Vector")); QAction *cellaction = menu->addAction(tr("Cell Vector")); _nodeMenu->clear(); _cellMeun->clear(); nodeaction->setMenu(_nodeMenu); cellaction->setMenu(_cellMeun); QStringList vectorVariables = info->getNodeVectorVariable(); // if (vectorVariables.at(0) != "") // { for (int i = 0; i < vectorVariables.size(); ++i) { QString text = vectorVariables.at(i); if (text.isEmpty()) continue; QAction *action = _nodeMenu->addAction(text); connect(action, SIGNAL(triggered()), _postMapper, SLOT(map())); _postMapper->setMapping(action, text); } // } vectorVariables = info->getCellVectorVariable(); // if (vectorVariables.at(0) != "") // { for (int i = 0; i < vectorVariables.size(); ++i) { QString text = vectorVariables.at(i); if (text.isEmpty()) continue; QAction *action = _cellMeun->addAction(text); connect(action, SIGNAL(triggered()), _postMapper, SLOT(map())); _postMapper->setMapping(action, text.append("_cell000")); } // } connect(_postMapper, SIGNAL(mapped(QString)), this, SLOT(viewVector(QString))); } void ProjectTreeWithBasicNode::closePostWindow(Post::PostWindowBase *w) { auto p2d = _modelDataExtend->getPost2DWindow(); auto p3d = _modelDataExtend->getPost3DWindow(); if (p2d == w) { // _post2DWindow = nullptr; _modelDataExtend->setPost2DWindow(nullptr); _modelDataExtend->clearPlotCurve(); this->updatePostTree(); } if (p3d == w) { // _post3DWindow = nullptr; _modelDataExtend->setPost3DWindow(nullptr); _modelDataExtend->clear3DVariable(); this->updatePostTree(); } } void ProjectTreeWithBasicNode::addComponentRootItemSlot() { if (_ComponentItems.size() == 0) return; _ComponentRootItem->addChildren(_ComponentItems); _ComponentRootItem->setExpanded(true); _ComponentItems.clear(); emit clearAllHighLightSig(); } void ProjectTreeWithBasicNode::viewPlot2D(QString variable) { auto p2d = _modelDataExtend->getPost2DWindow(); if (p2d == nullptr) { // ConfigOption::PostConfig* option = ConfigOption::ConfigOption::getInstance()->getPostConfig(); // ConfigOption::PostConfigInfo* info = option->getPostConfigInfo(_treeType); p2d = new Post::Post2DWindowInterface(_mainWindow, _data->getID()); _modelDataExtend->setPost2DWindow(p2d); // QStringList filenames = info->getPost2DFile(); QStringList filenames = _modelDataExtend->getAbsolutePost2DFiles(); // // for (int i = 0; i < filenames.size(); ++i) // { // QString fileName = filenames.at(i); // // QString file = _data->getPath() + "/Result/" + fileName; // // qDebug() << fileName; // p2d->openfile(fileName); // } } emit openPostWindowSig(p2d); if (_modelDataExtend->isPostCurveExist(variable)) return; ConfigOption::PostConfig *postinfo = ConfigOption::ConfigOption::getInstance()->getPostConfig(); ConfigOption::PostConfigInfo *info = postinfo->getPostConfigInfo(_treeType); ConfigOption::PostCurve *curve = info->getCurveByName(variable); ConfigOption::PostCurve *newcurve = new ConfigOption::PostCurve; QString path = _modelDataExtend->getPath() + "/Result/"; newcurve->copy(curve); p2d->addCurve(curve->getDescribe(), path + curve->getFile(), curve->getXVariable(), curve->getYVariable()); _modelDataExtend->apppendPlotCurve(newcurve); this->updatePostTree(); emit disPlayProp(newcurve); } void ProjectTreeWithBasicNode::viewCounter(QString variable) { int caseid = _modelDataExtend->getID(); QString pycode = QString("Post.viewCounter(%1,\"%2\")").arg(caseid).arg(variable); qDebug() << pycode; Py::PythonAgent::getInstance()->submit(pycode); } void ProjectTreeWithBasicNode::viewCounterPost(QString variable) { auto p3d = _modelDataExtend->getPost3DWindow(); if (p3d == nullptr) { ConfigOption::PostConfig *option = ConfigOption::ConfigOption::getInstance()->getPostConfig(); ConfigOption::PostConfigInfo *info = option->getPostConfigInfo(_treeType); QString fileName = info->getPost3DFile(); QString file = _data->getPath() + "/Result/" + fileName; // if (!isFileExist(file)) return; p3d = new Post::Post3DWindowInterface(_mainWindow, _data->getID()); _modelDataExtend->setPost3DWindow(p3d); p3d->getWindow()->openFile(file); } emit openPostWindowSig(p3d); QStringList variablelist = _modelDataExtend->getScalarVariable(); if (!variablelist.contains(variable)) { _modelDataExtend->appendScalarVariable(variable); this->updatePostTree(); } Post::Post3DWindow *w = p3d->getWindow(); PipelineObject *popobj = w->getCurrentPipelineObj(); w->viewCounter(popobj, variable); w->displayLegendBar(true); emit disPlayProp(nullptr); // Py::PythonAgent::getInstance()->unLock(); } void ProjectTreeWithBasicNode::viewVector(QString variable) { int caseid = _modelDataExtend->getID(); QString pycode = QString("Post.viewVector(%1,\"%2\")").arg(caseid).arg(variable); qDebug() << pycode; Py::PythonAgent::getInstance()->submit(pycode); } void ProjectTreeWithBasicNode::viewVectorPost(QString variable) { auto p3d = _modelDataExtend->getPost3DWindow(); if (p3d == nullptr) { ConfigOption::PostConfig *option = ConfigOption::ConfigOption::getInstance()->getPostConfig(); ConfigOption::PostConfigInfo *info = option->getPostConfigInfo(_treeType); QString fileName = info->getPost3DFile(); QString file = _data->getPath() + "/Result/" + fileName; // if (!isFileExist(file)) return; p3d = new Post::Post3DWindowInterface(_mainWindow, _data->getID()); _modelDataExtend->setPost3DWindow(p3d); p3d->getWindow()->openFile(file); } emit openPostWindowSig(p3d); QStringList variablelist = _modelDataExtend->getVectorVariable(); if (!variablelist.contains(variable)) { _modelDataExtend->appendVectorVariable(variable); this->updatePostTree(); } Post::Post3DWindow *w = p3d->getWindow(); PipelineObject *popobj = w->getCurrentPipelineObj(); w->viewVector(popobj, variable); w->displayLegendBar(true); emit disPlayProp(nullptr); } void ProjectTreeWithBasicNode::viewRealTimeWindow() { QStringList files; //= _modelDataExtend->getMonitorNameList(); if (files.size() > 1) return; for (int i = 0; i < files.size(); ++i) { QString fi = files.at(i); QFile f(fi); if (!f.exists()) { QMessageBox::warning(nullptr, tr("Warning"), tr("File %1 is not exist").arg(fi)); return; } } if (_realTimeWin == nullptr) { _realTimeWin = new Post::RealTimeWindowBase(_mainWindow, _data->getID()); emit openRealTimeWin(_realTimeWin, _data->getID()); } } DataProperty::DataBase *ProjectTreeWithBasicNode::getCurrentItemData() { if (_currentItem == nullptr) return nullptr; if (_currentItem == _simulationSettingItem) return _modelDataExtend->getSimlutationSetting(); if (_currentItem == _solverSettingItem) return _modelDataExtend->getSolverSetting(); const int index = _currentItem->data(0, Qt::UserRole + 1).toInt() - 1; if (index >= 0) { ConfigOption::TreeItem *item = _itemList.at(index); const int id = item->getDataID(); DataProperty::DataBase *d = _modelDataExtend->getConfigData(id); return d; } return nullptr; } /*bool ProjectTreeWithBasicNode::readInForm() { QDesignerResource r(this); QScopedPointer ui(r.readUi(dev)); if (ui.isNull()) { if (errorMessageIn) *errorMessageIn = r.errorString(); return false; } UpdateBlocker ub(this); clearSelection(); m_selection->clearSelectionPool(); m_insertedWidgets.clear(); m_widgets.clear(); // The main container is cleared as otherwise // the names of the newly loaded objects will be unified. clearMainContainer(); m_undoStack.clear(); emit changed(); QWidget *w = r.loadUi(ui.data(), formContainer()); if (w) { setMainContainer(w); emit changed(); } if (errorMessageIn) *errorMessageIn = r.errorString(); return w != nullptr; }*/ void ProjectTreeWithBasicNode::updateGeometrySubTree() { if (_geometryRootItem == nullptr) return; _geometryRootItem->takeChildren(); Geometry::GeometryData *geodata = Geometry::GeometryData::getInstance(); QList geoIDs = _modelDataExtend->getGeometryList(); for (int i = 0; i < geoIDs.size(); ++i) { int id = geoIDs.at(i); Geometry::GeometrySet *set = geodata->getGeometrySetByID(id); if (set == nullptr) continue; QString name = set->getName(); QString icon = "://QUI/icon/geometry.png"; QTreeWidgetItem *temp = new QTreeWidgetItem(_geometryRootItem, TreeItemType::ProjectGeometryChild); temp->setIcon(0, QIcon(icon)); temp->setText(0, name); temp->setData(0, Qt::UserRole, id); } _geometryRootItem->setExpanded(true); } }