Fix for Bug IPAL10464:

SMESH: Add Polyhedron
This commit is contained in:
enk 2006-02-27 08:53:17 +00:00
parent fe4a33ed2e
commit 2ec6cc8c59
3 changed files with 111 additions and 25 deletions

View File

@ -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());

View File

@ -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;

View File

@ -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"