diff --git a/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx b/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx index c77592679..20324bbe0 100644 --- a/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx @@ -524,7 +524,7 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnApply() unsigned int anEntityMode = myActor->GetEntityMode(); myActor->SetEntityMode(SMESH_Actor::eVolumes | anEntityMode); } - ConstructorsClicked( GetConstructorId() ); + //ConstructorsClicked( GetConstructorId() ); busy = false; } } @@ -566,6 +566,7 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnCancel() void SMESHGUI_CreatePolyhedralVolumeDlg::onTextChange(const QString& theNewText) { if ( busy ) return; + if (checkEditLine() == -1) return; busy = true; mySimulation->SetVisibility(false); @@ -700,6 +701,7 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::SelectionIntoArgument() } busy = true; myEditCurrentArgument->setText( aString ); + if (checkEditLine() == -1) {busy = false;return;} busy = false; break; } @@ -715,6 +717,7 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::SelectionIntoArgument() } busy = true; myEditCurrentArgument->setText( aString ); + if (checkEditLine() == -1) {busy = false;return;} busy = false; // OK @@ -727,6 +730,82 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::SelectionIntoArgument() displaySimulation(); } +/*\brief int SMESHGUI_CreatePolyhedralVolumeDlg::checkEditLine() + * Checking of indices in edit line. + * If incorecct indices in edit line warning message appear and myEditCurrentArgument remove last index. + * \retval 1 - if all ok(or no indices in edit line), -1 - if there are incorrect indices. + */ +int SMESHGUI_CreatePolyhedralVolumeDlg::checkEditLine(bool checkLast) +{ + QString aString = ""; + SMDS_Mesh* aMesh = 0; + + if(myMesh->_is_nil()) return 1; + if(!myActor){ + myActor = SMESH::FindActorByObject(myMesh); + if(!myActor) + return 1; + } + + aMesh = myActor->GetObject()->GetMesh(); + + // checking for nodes + if (checkLast && myEditCurrentArgument->text().right(1) != QString(" ") ) return 1; + QStringList aListId = QStringList::split( " ", myEditCurrentArgument->text() ); + for ( int i = 0; i < aListId.count(); i++ ){ + switch (GetConstructorId()){ + case 0:{ // nodes + const SMDS_MeshNode * aNode = aMesh->FindNode( aListId[ i ].toInt() ); + if( !aNode ){ + std::string aWarning; + aWarning = "The incorrect indices of nodes!"; + SUIT_MessageBox::warn1(SMESHGUI::desktop(), + QObject::tr("SMESH_POLYEDRE_CREATE_ERROR"), + QObject::tr(aWarning.c_str()), + QObject::tr("SMESH_BUT_OK")); + + myEditCurrentArgument->clear(); + myEditCurrentArgument->setText( aString ); + return -1; + } + + break; + } + case 1:{ // faces + bool aElemIsOK = true; + const SMDS_MeshElement * aElem = aMesh->FindElement( aListId[ i ].toInt() ); + if (!aElem) + { + aElemIsOK = false; + } + else + { + SMDSAbs_ElementType aType = aMesh->GetElementType( aElem->GetID(),true ); + if (aType != SMDSAbs_Face){ + aElemIsOK = false; + } + } + if (!aElemIsOK){ + std::string aWarning; + aWarning = "The incorrect indices of faces!"; + SUIT_MessageBox::warn1(SMESHGUI::desktop(), + QObject::tr("SMESH_POLYEDRE_CREATE_ERROR"), + QObject::tr(aWarning.c_str()), + QObject::tr("SMESH_BUT_OK")); + + myEditCurrentArgument->clear(); + myEditCurrentArgument->setText( aString ); + return -1; + } + break; + } + } + aString += aListId[ i ] + " "; + } + + return 1; +} + //======================================================================= //function : displaySimulation //purpose : @@ -737,7 +816,11 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::displaySimulation() { SMESH::TPolySimulation::TVTKIds aVTKIds; vtkIdType aType = VTK_CONVEX_POINT_SET ; - if (GetConstructorId() == 0){ + SMDS_Mesh* aMesh = 0; + if ( myActor ){ + aMesh = myActor->GetObject()->GetMesh(); + } + if (GetConstructorId() == 0 && aMesh){ if (!AddButton->isEnabled()){ QListBoxItem* anItem; mySimulation->ResetGrid(true); @@ -745,6 +828,8 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::displaySimulation() QStringList anIds = QStringList::split(" ", anItem->text()); SMESH::TPolySimulation::TVTKIds aVTKIds_faces; for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it){ + const SMDS_MeshNode * aNode = aMesh->FindNode( (*it).toInt() ); + if (!aNode) continue; vtkIdType aId = myActor->GetObject()->GetNodeVTKId( (*it).toInt() ) ; aVTKIds.push_back(aId); aVTKIds_faces.push_back(aId); @@ -770,35 +855,30 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::displaySimulation() aType = VTK_POLYGON; mySimulation->SetPosition(myActor, aType, aVTKIds); } - }else if(GetConstructorId() == 1){ - SMDS_Mesh* aMesh = 0; - if ( myActor ){ - aMesh = myActor->GetObject()->GetMesh(); - } - if ( aMesh ) { - QStringList aListId = QStringList::split( " ", myEditCurrentArgument->text(), false); - for ( int i = 0; i < aListId.count(); i++ ) - { - const SMDS_MeshElement * anElem = aMesh->FindElement( aListId[ i ].toInt() ); - if ( !anElem ) - return; + }else if(GetConstructorId() == 1 && aMesh){ + QStringList aListId = QStringList::split( " ", myEditCurrentArgument->text(), false); + for ( int i = 0; i < aListId.count(); i++ ) + { + const SMDS_MeshElement * anElem = aMesh->FindElement( aListId[ i ].toInt() ); + if ( !anElem ) continue; + SMDSAbs_ElementType aFaceType = aMesh->GetElementType( anElem->GetID(),true ); + if (aFaceType != SMDSAbs_Face) continue; - SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); - SMESH::TPolySimulation::TVTKIds aVTKIds_faces; - while( anIter->more() ) + SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); + SMESH::TPolySimulation::TVTKIds aVTKIds_faces; + while( anIter->more() ) if ( const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next() ){ vtkIdType aId = myActor->GetObject()->GetNodeVTKId( aNode->GetID() ) ; aVTKIds.push_back(aId); aVTKIds_faces.push_back(aId); } - if(!Preview->isChecked()){ - aType = VTK_POLYGON; - mySimulation->SetPosition(myActor, aType, aVTKIds_faces); - } + if(!Preview->isChecked()){ + aType = VTK_POLYGON; + mySimulation->SetPosition(myActor, aType, aVTKIds_faces); } - if(Preview->isChecked()) - mySimulation->SetPosition(myActor, aType, aVTKIds); - } + } + if(Preview->isChecked()) + mySimulation->SetPosition(myActor, aType, aVTKIds); } SMESH::UpdateView(); } @@ -911,9 +991,10 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::onAdd() mySelectionMgr->selectedObjects( selected ); int aNbSel = selected.Extent(); if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return; + + if (this->checkEditLine(false) == -1) return; busy = true; - if ( !(myEditCurrentArgument->text().isEmpty()) ) { myFacesByNodes->insertItem(myEditCurrentArgument->text()); diff --git a/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.h b/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.h index 5070b4471..be9dca196 100644 --- a/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.h +++ b/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.h @@ -76,6 +76,8 @@ private: int GetConstructorId(); void displaySimulation(); + int checkEditLine(bool checkLast=true); /*! Checking for indices, return 1 if all ok, esle -1*/ + SMESHGUI* mySMESHGUI ; /* Current SMESHGUI object */ LightApp_SelectionMgr* mySelectionMgr ; /* User shape selection */ SVTK_Selector* mySelector; diff --git a/src/SMESHGUI/SMESH_msg_en.po b/src/SMESHGUI/SMESH_msg_en.po index 9acdf7ce9..75439de35 100644 --- a/src/SMESHGUI/SMESH_msg_en.po +++ b/src/SMESHGUI/SMESH_msg_en.po @@ -1799,6 +1799,9 @@ msgstr "Faces by nodes" msgid "SMESHGUI_CreatePolyhedralVolumeDlg::SMESH_POLYEDRE_PREVIEW" msgstr "Polyhedron preview" +msgid "SMESHGUI_CreatePolyhedralVolumeDlg::SMESH_POLYEDRE_CREATE_ERROR" +msgstr "Polyhedron creation error." + msgid "SMESH_CREATE_POLYHEDRAL_VOLUME_TITLE" msgstr "Create polyhedral volume"