X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI.cxx;h=17c51c068309f19047c6a579c36e6c5b3295e4e3;hb=db4fd22d08c1c2f80e854c94f0cc86fa3e052cf8;hp=47f42b997031a8aca65ef8023b627deedec0e508;hpb=88b3dbe23b236bd1746405155ae33a76aaf59ecd;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 47f42b997..17c51c068 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -116,6 +116,8 @@ #include +#include + #include #include #include @@ -162,6 +164,7 @@ #include #include #include +#include // OCCT includes #include @@ -174,6 +177,10 @@ //Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx #define WITHGENERICOBJ +// Below macro, when uncommented, switches on simplified (more performant) algorithm +// of auto-color picking up +#define SIMPLE_AUTOCOLOR + //namespace{ // Declarations //============================================================= @@ -271,7 +278,7 @@ { // UNV format aMeshes->length( 1 ); - aMeshes[0] = theComponentMesh->CreateMeshesFromUNV( filename.toLatin1().constData() ); + aMeshes[0] = theComponentMesh->CreateMeshesFromUNV( filename.toUtf8().constData() ); if ( aMeshes[0]->_is_nil() ) errors.append( QString( "%1 :\n\t%2" ).arg( filename ). arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) ); @@ -281,7 +288,7 @@ { // MED format SMESH::DriverMED_ReadStatus res; - aMeshes = theComponentMesh->CreateMeshesFromMED( filename.toLatin1().constData(), res ); + aMeshes = theComponentMesh->CreateMeshesFromMED( filename.toUtf8().constData(), res ); if ( res != SMESH::DRS_OK ) { errors.append( QString( "%1 :\n\t%2" ).arg( filename ). arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) ); @@ -292,7 +299,7 @@ { // STL format aMeshes->length( 1 ); - aMeshes[0] = theComponentMesh->CreateMeshesFromSTL( filename.toLatin1().constData() ); + aMeshes[0] = theComponentMesh->CreateMeshesFromSTL( filename.toUtf8().constData() ); if ( aMeshes[0]->_is_nil() ) { errors.append( QString( "%1 :\n\t%2" ).arg( filename ). arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) ); @@ -303,7 +310,7 @@ { // CGNS format SMESH::DriverMED_ReadStatus res; - aMeshes = theComponentMesh->CreateMeshesFromCGNS( filename.toLatin1().constData(), res ); + aMeshes = theComponentMesh->CreateMeshesFromCGNS( filename.toUtf8().constData(), res ); if ( res != SMESH::DRS_OK ) { errors.append( QString( "%1 :\n\t%2" ).arg( filename ). arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) ); @@ -314,7 +321,7 @@ { // SAUV format SMESH::DriverMED_ReadStatus res; - aMeshes = theComponentMesh->CreateMeshesFromSAUV( filename.toLatin1().constData(), res ); + aMeshes = theComponentMesh->CreateMeshesFromSAUV( filename.toUtf8().constData(), res ); if ( res != SMESH::DRS_OK ) { errors.append( QString( "%1 :\n\t%2" ).arg( filename ). arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) ); @@ -326,7 +333,7 @@ // GMF format SMESH::ComputeError_var res; aMeshes->length( 1 ); - aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toLatin1().constData(), + aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toUtf8().constData(), toCreateGroups, res.out() ); if ( res->code != SMESH::DRS_OK ) { @@ -356,11 +363,6 @@ SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() ); anEntryList.append( aMeshSO->GetID().c_str() ); - - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - aMeshes[i]->UnRegister(); } else { isEmpty = true; @@ -487,20 +489,6 @@ if ( isDAT ) { format = "DAT"; - notSupportedElemTypes.push_back( SMESH::Entity_Quad_Quadrangle ); - notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Quadrangle ); - notSupportedElemTypes.push_back( SMESH::Entity_Polygon ); - notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon ); - notSupportedElemTypes.push_back( SMESH::Entity_Tetra ); - notSupportedElemTypes.push_back( SMESH::Entity_Quad_Tetra ); - notSupportedElemTypes.push_back( SMESH::Entity_Pyramid ); - notSupportedElemTypes.push_back( SMESH::Entity_Quad_Pyramid ); - notSupportedElemTypes.push_back( SMESH::Entity_Quad_Hexa ); - notSupportedElemTypes.push_back( SMESH::Entity_TriQuad_Hexa ); - notSupportedElemTypes.push_back( SMESH::Entity_Penta ); - notSupportedElemTypes.push_back( SMESH::Entity_Quad_Penta ); - notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism ); - notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra ); notSupportedElemTypes.push_back( SMESH::Entity_0D ); notSupportedElemTypes.push_back( SMESH::Entity_Ball ); } @@ -528,11 +516,13 @@ { format = "CGNS"; notSupportedElemTypes.push_back( SMESH::Entity_Ball ); + notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Triangle ); } else if ( isSAUV ) { format = "SAUV"; notSupportedElemTypes.push_back( SMESH::Entity_Ball ); + notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Triangle ); notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Quadrangle ); notSupportedElemTypes.push_back( SMESH::Entity_TriQuad_Hexa ); notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism ); @@ -562,10 +552,11 @@ if ( !presentNotSupported.empty() ) { QString typeNames; - const char* typeMsg[SMESH::Entity_Last] = { "SMESH_NODES", - "SMESH_ELEMS0D","SMESH_EDGES","SMESH_QUADRATIC_EDGES","SMESH_TRIANGLES", - "SMESH_QUADRATIC_TRIANGLES","SMESH_QUADRANGLES","SMESH_QUADRATIC_QUADRANGLES", - "SMESH_BIQUADRATIC_QUADRANGLES","SMESH_POLYGONS","SMESH_QUADRATIC_POLYGONS", + const char* typeMsg[SMESH::Entity_Last] = { + "SMESH_NODES", "SMESH_ELEMS0D","SMESH_EDGES","SMESH_QUADRATIC_EDGES", + "SMESH_TRIANGLES", "SMESH_QUADRATIC_TRIANGLES", "SMESH_BIQUADRATIC_TRIANGLES", + "SMESH_QUADRANGLES","SMESH_QUADRATIC_QUADRANGLES", "SMESH_BIQUADRATIC_QUADRANGLES", + "SMESH_POLYGONS","SMESH_QUADRATIC_POLYGONS", "SMESH_TETRAHEDRA","SMESH_QUADRATIC_TETRAHEDRONS","SMESH_PYRAMIDS", "SMESH_QUADRATIC_PYRAMIDS","SMESH_HEXAHEDRA","SMESH_QUADRATIC_HEXAHEDRONS", "SMESH_TRIQUADRATIC_HEXAHEDRONS","SMESH_PENTAHEDRA","SMESH_QUADRATIC_PENTAHEDRONS", @@ -598,6 +589,7 @@ if ( resMgr ) toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false ); bool toOverwrite = true; + bool toFindOutDim = true; QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH"); QString anInitialPath = ""; @@ -619,32 +611,6 @@ anInitialPath + QString("/") + aMeshName, aFilter, aTitle, false); } - // else if ( isGMF )// Export to GMF - // { - // SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg - // ( SMESHGUI::desktop(), false, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true ); - // QStringList filters; - // filters << QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" - // << QObject::tr( "GMF_BINARY_FILES_FILTER" ) + " (*.meshb)"; - // fd->setWindowTitle( aTitle ); - // fd->setNameFilters( filters ); - - // if ( !aMeshOrGroup->_is_equivalent( aMesh )) - // toCreateGroups = false; - // else - // toCreateGroups = ( aMesh->NbGroups() > 0 ); - - // fd->SetChecked( true ); - // if ( !anInitialPath.isEmpty() ) - // fd->setDirectory( anInitialPath ); - // fd->selectFile(aMeshName); - - // if ( fd->exec() ) - // aFilename = fd->selectedFile(); - // toCreateGroups = fd->IsChecked(); - - // delete fd; - // } else if ( isCGNS )// Export to CGNS { SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true ); @@ -712,13 +678,16 @@ if (it.value() == SMESH::MED_V2_2) aDefaultFilter = it.key(); } + QStringList checkBoxes; + checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM"); - SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg - ( SMESHGUI::desktop(), false, QObject::tr("SMESH_AUTO_GROUPS"), true, true ); + SalomeApp_CheckFileDlg* fd = + new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true ); fd->setWindowTitle( aTitle ); fd->setNameFilters( filters ); fd->selectNameFilter(aDefaultFilter); - fd->SetChecked(toCreateGroups); + fd->SetChecked(0,toCreateGroups); + fd->SetChecked(1,toFindOutDim); if ( !anInitialPath.isEmpty() ) fd->setDirectory( anInitialPath ); fd->selectFile(aMeshName); @@ -760,7 +729,7 @@ if( !toOverwrite ) { // can't append to an existing using other format SMESH::MED_VERSION aVersion = SMESH::MED_V2_1; - bool isVersionOk = SMESHGUI::GetSMESHGen()->GetMEDVersion( aFilename.toLatin1().constData(), aVersion ); + bool isVersionOk = SMESHGUI::GetSMESHGen()->GetMEDVersion( aFilename.toUtf8().constData(), aVersion ); if( !isVersionOk || aVersion != aFormat ) { int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), @@ -774,7 +743,7 @@ } QStringList aMeshNamesCollisionList; - SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toLatin1().constData() ); + SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toUtf8().constData() ); for( int i = 0, n = aMeshNames->length(); i < n; i++ ) { QString anExistingMeshName( aMeshNames[ i ] ); for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) { @@ -801,7 +770,8 @@ } } } - toCreateGroups = fd->IsChecked(); + toCreateGroups = fd->IsChecked(0); + toFindOutDim = fd->IsChecked(1); delete fd; } else @@ -839,11 +809,11 @@ SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first; SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh(); if ( aMeshOrGroup->_is_equivalent( aMeshItem )) - aMeshItem->ExportToMEDX( aFilename.toLatin1().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0 ); + aMeshItem->ExportToMEDX( aFilename.toUtf8().data(), toCreateGroups, + aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim ); else - aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0 ); + aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups, + aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim ); } } else if ( isSAUV ) @@ -852,29 +822,29 @@ { SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first ); if( !aMeshItem->_is_nil() ) - aMeshItem->ExportSAUV( aFilename.toLatin1().data(), toCreateGroups ); + aMeshItem->ExportSAUV( aFilename.toUtf8().data(), toCreateGroups ); } } else if ( isDAT ) { if ( aMeshOrGroup->_is_equivalent( aMesh )) - aMesh->ExportDAT( aFilename.toLatin1().data() ); + aMesh->ExportDAT( aFilename.toUtf8().data() ); else - aMesh->ExportPartToDAT( aMeshOrGroup, aFilename.toLatin1().data() ); + aMesh->ExportPartToDAT( aMeshOrGroup, aFilename.toUtf8().data() ); } else if ( isUNV ) { if ( aMeshOrGroup->_is_equivalent( aMesh )) - aMesh->ExportUNV( aFilename.toLatin1().data() ); + aMesh->ExportUNV( aFilename.toUtf8().data() ); else - aMesh->ExportPartToUNV( aMeshOrGroup, aFilename.toLatin1().data() ); + aMesh->ExportPartToUNV( aMeshOrGroup, aFilename.toUtf8().data() ); } else if ( isSTL ) { if ( aMeshOrGroup->_is_equivalent( aMesh )) - aMesh->ExportSTL( aFilename.toLatin1().data(), aIsASCII_STL ); + aMesh->ExportSTL( aFilename.toUtf8().data(), aIsASCII_STL ); else - aMesh->ExportPartToSTL( aMeshOrGroup, aFilename.toLatin1().data(), aIsASCII_STL ); + aMesh->ExportPartToSTL( aMeshOrGroup, aFilename.toUtf8().data(), aIsASCII_STL ); } else if ( isCGNS ) { @@ -884,14 +854,14 @@ SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first; SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh(); aMeshItem->ExportCGNS( aMeshOrGroup, - aFilename.toLatin1().data(), + aFilename.toUtf8().data(), toOverwrite && aMeshIndex == 0 ); } } else if ( isGMF ) { toCreateGroups = true; - aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups ); + aMesh->ExportGMF( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups ); } } catch (const SALOME::SALOME_Exception& S_ex){ @@ -955,7 +925,8 @@ } } - void AutoColor(){ + void AutoColor() + { SALOME_ListIO selected; SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); if( !app ) @@ -978,13 +949,26 @@ if( aMainObject->_is_nil() ) return; + SUIT_OverrideCursor wc; + aMainObject->SetAutoColor( true ); // mesh groups are re-colored here + QList aReservedColors; + SMESH::ListOfGroups aListOfGroups = *aMainObject->GetGroups(); for( int i = 0, n = aListOfGroups.length(); i < n; i++ ) { SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i]; - SALOMEDS::Color aColor = aGroupObject->GetColor(); + //SALOMEDS::Color aColor = aGroupObject->GetColor(); + +#ifdef SIMPLE_AUTOCOLOR // simplified algorithm for auto-colors + SALOMEDS::Color aColor = SMESHGUI::getPredefinedUniqueColor(); +#else // old algorithm for auto-colors + SALOMEDS::Color aColor = SMESHGUI::getUniqueColor( aReservedColors ); + aReservedColors.append( aColor ); +#endif // SIMPLE_AUTOCOLOR + aGroupObject->SetColor( aColor ); + _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject); if (aGroupSObject) { QColor c; @@ -1014,6 +998,22 @@ SMESH::RepaintCurrentView(); } + void OverallMeshQuality() { + SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); + LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); + SALOME_ListIO selected; + if( aSel ) + aSel->selectedObjects( selected ); + + if ( selected.IsEmpty() ) return; + SALOME_ListIteratorOfListIO It( selected ); + for ( ; It.More(); It.Next() ) { + SMESHGUI_CtrlInfoDlg* ctrlDlg = new SMESHGUI_CtrlInfoDlg( SMESHGUI::desktop() ); + ctrlDlg->showInfo( It.Value() ); + ctrlDlg->show(); + } + } + QString functorToString( SMESH::Controls::FunctorPtr f ) { QString type = QObject::tr( "UNKNOWN_CONTROL" ); @@ -1223,6 +1223,25 @@ } } + void sortChildren(){ + LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); + SALOME_ListIO selected; + if( aSel ) { + aSel->selectedObjects( selected ); + + if(selected.Extent()){ + Handle(SALOME_InteractiveObject) anIObject = selected.First(); + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry()); + if (aSObj) { + if ( aStudy->GetUseCaseBuilder()->SortChildren( aSObj, true/*AscendingOrder*/ ) ) { + SMESHGUI::GetSMESHGUI()->updateObjBrowser(); + } + } + } + } + } + void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap) { SALOME_ListIO selected; @@ -1256,7 +1275,7 @@ return; } case 1132: { - vtkFloatingPointType color[3]; + double color[3]; QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor; QColor orientationColor, outlineColor, volumeColor; int deltaF = 0, deltaV = 0; @@ -1264,8 +1283,8 @@ int ballSize = 1; int edgeWidth = 1; int outlineWidth = 1; - vtkFloatingPointType shrinkCoef = 0.0; - vtkFloatingPointType orientationScale = 0.0; + double shrinkCoef = 0.0; + double orientationScale = 0.0; bool orientation3d = false; VTK::MarkerType markerType = VTK::MT_NONE; VTK::MarkerScale markerScale = VTK::MS_NONE; @@ -1772,7 +1791,7 @@ aSO = aRefSObject; // Delete main Object instead of reference listSO.push_back( aSO ); - std::list< _PTR(SObject) >::iterator itSO = listSO.begin(); + std::list< _PTR(SObject) >::iterator itSO = --listSO.end(); for ( ; itSO != listSO.end(); ++itSO ) { _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO ); for (it->InitEx(false); it->More(); it->Next()) @@ -1800,6 +1819,15 @@ } } + // Call mesh->Clear() to prevent loading mesh from file caused by hypotheses removal + for( It.Initialize( selected ); It.More(); It.Next()) // loop on selected IO's + { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface< SMESH::SMESH_Mesh >( IObject ); + if ( !mesh->_is_nil() ) + mesh->Clear(); + } + // Treat SO's in the list starting from the back aStudyBuilder->NewCommand(); // There is a transaction for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO ) @@ -1808,24 +1836,9 @@ if ( !SO ) continue; std::string anEntry = SO->GetID(); - /** Erase graphical object **/ + /** Erase graphical object and remove all its data **/ if(SO->FindAttribute(anAttr, "AttributeIOR")) { SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true); - // ViewManagerList aViewMenegers = anApp->viewManagers(); - // ViewManagerList::const_iterator it = aViewMenegers.begin(); - // for( ; it != aViewMenegers.end(); it++) { - // SUIT_ViewManager* vm = *it; - // int nbSf = vm ? vm->getViewsCount() : 0; - // if(vm) { - // QVector aViews = vm->getViews(); - // for(int i = 0; i < nbSf; i++){ - // SUIT_ViewWindow *sf = aViews[i]; - // if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){ - // SMESH::RemoveActor(sf,anActor); - // } - // } - // } - // } } /** Remove an object from data structures **/ SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO )); @@ -1969,6 +1982,93 @@ bool SMESHGUI::automaticUpdate(unsigned int requestedSize, bool* limitExceeded) return autoUpdate && !exceeded; } +//============================================================================= +/*! + * + */ +//============================================================================= +bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh, + int* entities, bool* limitExceeded, int* hidden ) +{ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + if ( !resMgr ) + return false; + + bool autoUpdate = resMgr->booleanValue( "SMESH", "auto_update", false ); + long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 ); + bool incrementalLimit = resMgr->booleanValue( "SMESH", "incremental_limit", false ); + + long requestedSize = theMesh->NbElements(); + + *entities = SMESH_Actor::eAllEntity; + *hidden = 0; + + bool exceeded = updateLimit > 0 && requestedSize > updateLimit; + + if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded; + + if ( incrementalLimit ) { + long nbOdElems = theMesh->Nb0DElements(); + long nbEdges = theMesh->NbEdges(); + long nbFaces = theMesh->NbFaces(); + long nbVolumes = theMesh->NbVolumes(); + long nbBalls = theMesh->NbBalls(); + long total = 0; + + if ( nbOdElems > 0 ) { + if ( total + nbOdElems > updateLimit ) { + *entities = *entities & ~SMESH_Actor::e0DElements; + *hidden = *hidden | SMESH_Actor::e0DElements; + } + else + exceeded = false; + } + total += nbOdElems; + + if ( nbEdges > 0 ) { + if ( total + nbEdges > updateLimit ) { + *entities = *entities & ~SMESH_Actor::eEdges; + *hidden = *hidden | SMESH_Actor::eEdges; + } + else + exceeded = false; + } + total += nbEdges; + + if ( nbFaces > 0 ) { + if ( total + nbFaces > updateLimit ) { + *entities = *entities & ~SMESH_Actor::eFaces; + *hidden = *hidden | SMESH_Actor::eFaces; + } + else + exceeded = false; + } + total += nbFaces; + + if ( nbVolumes > 0 ) { + if ( total + nbVolumes > updateLimit ) { + *entities = *entities & ~SMESH_Actor::eVolumes; + *hidden = *hidden | SMESH_Actor::eVolumes; + } + else + exceeded = false; + } + total += nbVolumes; + + if ( nbBalls > 0 ) { + if ( total + nbBalls > updateLimit ) { + *entities = *entities & ~SMESH_Actor::eBallElem; + *hidden = *hidden | SMESH_Actor::eBallElem; + } + else + exceeded = false; + } + total += nbBalls; + } + + return autoUpdate && !exceeded; +} + //============================================================================= /*! * @@ -2374,6 +2474,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case 214: // UPDATE { if(checkLock(aStudy)) break; + SUIT_OverrideCursor wc; try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; @@ -2425,10 +2526,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if (vtkwnd) { SALOME_ListIteratorOfListIO It( to_process ); for ( ; It.More(); It.Next()) { - MESSAGE("---"); + MESSAGE("---"); Handle(SALOME_InteractiveObject) IOS = It.Value(); if (IOS->hasEntry()) { - MESSAGE("---"); + MESSAGE("---"); if (!SMESH::UpdateView(anAction, IOS->getEntry())) { SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); break; // PAL16774 (Crash after display of many groups) @@ -2444,7 +2545,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) // PAL13338 + PAL15161 --> if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy)) { - MESSAGE("anAction = SMESH::eDisplayOnly"); + MESSAGE("anAction = SMESH::eDisplayOnly"); SMESH::UpdateView(); SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); } @@ -3048,6 +3149,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case 4035: // QUADRATIC TRIANGLE case 4036: // QUADRATIC QUADRANGLE case 4136: // BIQUADRATIC QUADRANGLE + case 4137: // BIQUADRATIC TRIANGLE case 4037: // QUADRATIC TETRAHEDRON case 4038: // QUADRATIC PYRAMID case 4039: // QUADRATIC PENTAHEDRON @@ -3060,24 +3162,16 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SMDSAbs_EntityType type = SMDSEntity_Last; switch (theCommandID) { - case 4034: - type = SMDSEntity_Quad_Edge; break; - case 4035: - type = SMDSEntity_Quad_Triangle; break; - case 4036: - type = SMDSEntity_Quad_Quadrangle; break; - case 4136: - type = SMDSEntity_BiQuad_Quadrangle; break; - case 4037: - type = SMDSEntity_Quad_Tetra; break; - case 4038: - type = SMDSEntity_Quad_Pyramid; break; - case 4039: - type = SMDSEntity_Quad_Penta; break; - case 4040: - type = SMDSEntity_Quad_Hexa; break; - case 4140: - type = SMDSEntity_TriQuad_Hexa; break; + case 4034: type = SMDSEntity_Quad_Edge; break; + case 4035: type = SMDSEntity_Quad_Triangle; break; + case 4036: type = SMDSEntity_Quad_Quadrangle; break; + case 4136: type = SMDSEntity_BiQuad_Quadrangle; break; + case 4137: type = SMDSEntity_BiQuad_Triangle; break; + case 4037: type = SMDSEntity_Quad_Tetra; break; + case 4038: type = SMDSEntity_Quad_Pyramid; break; + case 4039: type = SMDSEntity_Quad_Penta; break; + case 4040: type = SMDSEntity_Quad_Hexa; break; + case 4140: type = SMDSEntity_TriQuad_Hexa; break; default: break; } if ( type != SMDSEntity_Last ) @@ -3174,6 +3268,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SUIT_MessageBox::No ) == SUIT_MessageBox::Yes; if( confirm ) { try { + SUIT_OverrideCursor wc; SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); int removed = aMeshEditor->RemoveOrphanNodes(); SUIT_MessageBox::information(SMESHGUI::desktop(), @@ -3393,6 +3488,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject ); SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aObject ); if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) { + SUIT_OverrideCursor wc; ::Control( theCommandID ); break; } @@ -3409,8 +3505,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) tr( "NOT_A_VTK_VIEWER" ) ); } break; + case 6032: + OverallMeshQuality(); + break; case 9010: { + SUIT_OverrideCursor wc; LightApp_SelectionMgr* mgr = selectionMgr(); SALOME_ListIO selected; mgr->selectedObjects( selected ); @@ -3427,6 +3527,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } case 9011: { + SUIT_OverrideCursor wc; LightApp_SelectionMgr* mgr = selectionMgr(); SALOME_ListIO selected; mgr->selectedObjects( selected ); @@ -3442,13 +3543,29 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } case 501: case 502: + case 503: + case 504: + case 505: { - int page = theCommandID == 501 ? SMESHGUI_MeasureDlg::MinDistance : SMESHGUI_MeasureDlg::BoundingBox; + int page = SMESHGUI_MeasureDlg::MinDistance; + if ( theCommandID == 502 ) + page = SMESHGUI_MeasureDlg::BoundingBox; + else if ( theCommandID == 503 ) + page = SMESHGUI_MeasureDlg::Length; + else if ( theCommandID == 504 ) + page = SMESHGUI_MeasureDlg::Area; + else if ( theCommandID == 505 ) + page = SMESHGUI_MeasureDlg::Volume; + EmitSignalDeactivateDialog(); SMESHGUI_MeasureDlg* dlg = new SMESHGUI_MeasureDlg( SMESHGUI::desktop(), page ); dlg->show(); break; } + case 41: + ::sortChildren(); + break; + } anApp->updateActions(); //SRN: To update a Save button in the toolbar @@ -3636,6 +3753,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 6029, "EQUAL_EDGE", "ICON_EQUAL_EDGE", 0, true ); createSMESHAction( 6030, "EQUAL_FACE", "ICON_EQUAL_FACE", 0, true ); createSMESHAction( 6031, "EQUAL_VOLUME", "ICON_EQUAL_VOLUME", 0, true ); + createSMESHAction( 6032, "OVERALL_MESH_QUALITY" ); createSMESHAction( 6003, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true ); createSMESHAction( 6004, "CONNECTION", "ICON_CONNECTION", 0, true ); createSMESHAction( 6005, "FREE_NODE", "ICON_FREE_NODE", 0, true ); @@ -3666,6 +3784,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 4035, "QUADRATIC_TRIANGLE", "ICON_DLG_QUADRATIC_TRIANGLE" ); createSMESHAction( 4036, "QUADRATIC_QUADRANGLE", "ICON_DLG_QUADRATIC_QUADRANGLE" ); createSMESHAction( 4136, "BIQUADRATIC_QUADRANGLE", "ICON_DLG_BIQUADRATIC_QUADRANGLE" ); + createSMESHAction( 4137, "BIQUADRATIC_TRIANGLE", "ICON_DLG_BIQUADRATIC_TRIANGLE" ); createSMESHAction( 4037, "QUADRATIC_TETRAHEDRON", "ICON_DLG_QUADRATIC_TETRAHEDRON" ); createSMESHAction( 4038, "QUADRATIC_PYRAMID", "ICON_DLG_QUADRATIC_PYRAMID" ); createSMESHAction( 4039, "QUADRATIC_PENTAHEDRON", "ICON_DLG_QUADRATIC_PENTAHEDRON" ); @@ -3739,11 +3858,16 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 501, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" ); createSMESHAction( 502, "MEASURE_BND_BOX", "ICON_MEASURE_BND_BOX" ); + createSMESHAction( 503, "MEASURE_LENGTH", "ICON_MEASURE_LENGTH" ); + createSMESHAction( 504, "MEASURE_AREA", "ICON_MEASURE_AREA" ); + createSMESHAction( 505, "MEASURE_VOLUME", "ICON_MEASURE_VOLUME" ); createSMESHAction( 300, "HIDE" ); createSMESHAction( 301, "SHOW" ); createSMESHAction( 302, "DISPLAY_ONLY" ); + createSMESHAction( 41, "SORT_CHILD_ITEMS" ); + // ----- create menu -------------- int fileId = createMenu( tr( "MEN_FILE" ), -1, 1 ), editId = createMenu( tr( "MEN_EDIT" ), -1, 3 ), @@ -3765,7 +3889,8 @@ void SMESHGUI::initialize( CAM_Application* app ) addId = createMenu( tr( "MEN_ADD" ), modifyId, 402 ), removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ), renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ), - transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 ); + transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 ), + basicPropId = createMenu( tr( "MEN_BASIC_PROPERTIES" ), measureId, -1, 10 ); //createMenu( 111, importId, -1 ); createMenu( 112, importId, -1 ); @@ -3846,6 +3971,8 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( 6024, volumeId, -1 ); createMenu( 6026, volumeId, -1 ); createMenu( 6031, volumeId, -1 ); + createMenu( separator(), ctrlId, -1 ); + createMenu( 6032, ctrlId, -1 ); createMenu( 4000, addId, -1 ); createMenu( 4009, addId, -1 ); @@ -3864,6 +3991,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( separator(), addId, -1 ); createMenu( 4034, addId, -1 ); createMenu( 4035, addId, -1 ); + createMenu( 4137, addId, -1 ); createMenu( 4036, addId, -1 ); createMenu( 4136, addId, -1 ); createMenu( 4037, addId, -1 ); @@ -3910,6 +4038,9 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( 501, measureId, -1 ); createMenu( 502, measureId, -1 ); + createMenu( 503, basicPropId, -1 ); + createMenu( 504, basicPropId, -1 ); + createMenu( 505, basicPropId, -1 ); createMenu( 214, viewId, -1 ); // ----- create toolbars -------------- @@ -3990,6 +4121,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( separator(), addRemTb ); createTool( 4034, addRemTb ); createTool( 4035, addRemTb ); + createTool( 4137, addRemTb ); createTool( 4036, addRemTb ); createTool( 4136, addRemTb ); createTool( 4037, addRemTb ); @@ -4088,6 +4220,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createPopupItem( 214, OB, mesh_part ); // UPDATE createPopupItem( 900, OB, mesh_part ); // ADV_INFO createPopupItem( 904, OB, mesh_group ); // FIND_ELEM + createPopupItem( 6032, OB, mesh_part ); // CTRL_INFO popupMgr()->insert( separator(), -1, 0 ); createPopupItem( 801, OB, mesh ); // CREATE_GROUP createPopupItem( 806, OB, mesh ); // CREATE_GEO_GROUP @@ -4129,6 +4262,7 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), -1, 0 ); createPopupItem( 214, View, mesh_part ); // UPDATE createPopupItem( 900, View, mesh_part ); // ADV_INFO + createPopupItem( 6032,View, mesh_part ); // CTRL_INFO createPopupItem( 904, View, mesh ); // FIND_ELEM popupMgr()->insert( separator(), -1, 0 ); @@ -4373,7 +4507,7 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert ( action( 6031 ), aSubId, -1 ); // EQUAL_VOLUME popupMgr()->setRule( action( 6031 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6031 ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule ); - + popupMgr()->insert( separator(), anId, -1 ); popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP @@ -4420,6 +4554,10 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), -1, -1 ); + popupMgr()->insert( action( 41 ), -1, -1 ); + popupMgr()->setRule( action( 41 ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule ); + popupMgr()->insert( separator(), -1, -1 ); + connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ), this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) ); @@ -4467,18 +4605,17 @@ bool SMESHGUI::activateModule( SUIT_Study* study ) // import Python module that manages SMESH plugins (need to be here because SalomePyQt API uses active module) PyGILState_STATE gstate = PyGILState_Ensure(); - PyObject* pluginsmanager=PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager"); - if(pluginsmanager==NULL) + PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager"); + if ( !pluginsmanager ) { PyErr_Print(); - else - { - PyObject* result=PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toStdString().c_str(),tr("SMESH_PLUGINS_OTHER").toStdString().c_str()); - if(result==NULL) - PyErr_Print(); - Py_XDECREF(result); - } + } + else { + PyObjWrapper result = PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toStdString().c_str(),tr("SMESH_PLUGINS_OTHER").toStdString().c_str()); + if ( !result ) + PyErr_Print(); + } PyGILState_Release(gstate); - // end of GEOM plugins loading + // end of SMESH plugins loading // Reset actions accelerator keys //action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT @@ -4660,11 +4797,13 @@ void SMESHGUI::createPreferences() int genTab = addPreference( tr( "PREF_TAB_GENERAL" ) ); int autoUpdate = addPreference( tr( "PREF_AUTO_UPDATE" ), genTab, LightApp_Preferences::Auto, "SMESH", "auto_update" ); + setPreferenceProperty( autoUpdate, "columns", 2 ); int lim = addPreference( tr( "PREF_UPDATE_LIMIT" ), autoUpdate, LightApp_Preferences::IntSpin, "SMESH", "update_limit" ); setPreferenceProperty( lim, "min", 0 ); setPreferenceProperty( lim, "max", 100000000 ); setPreferenceProperty( lim, "step", 1000 ); setPreferenceProperty( lim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) ); + addPreference( tr( "PREF_INCREMENTAL_LIMIT" ), autoUpdate, LightApp_Preferences::Bool, "SMESH", "incremental_limit" ); int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab ); setPreferenceProperty( qaGroup, "columns", 2 ); @@ -4717,7 +4856,7 @@ void SMESHGUI::createPreferences() int exportgroup = addPreference( tr( "PREF_GROUP_EXPORT" ), genTab ); setPreferenceProperty( exportgroup, "columns", 2 ); addPreference( tr( "PREF_AUTO_GROUPS" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "auto_groups" ); - addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" ); + //addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" ); int computeGroup = addPreference( tr( "PREF_GROUP_COMPUTE" ), genTab ); setPreferenceProperty( computeGroup, "columns", 2 ); @@ -4749,10 +4888,16 @@ void SMESHGUI::createPreferences() setPreferenceProperty( nodesLim, "max", 10000000 ); setPreferenceProperty( nodesLim, "step", 10000 ); setPreferenceProperty( nodesLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) ); + int ctrlLim = addPreference( tr( "PREF_CTRL_LIMIT" ), infoGroup, LightApp_Preferences::IntSpin, "SMESH", "info_controls_limit" ); + setPreferenceProperty( ctrlLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) ); + setPreferenceProperty( ctrlLim, "min", 0 ); + setPreferenceProperty( ctrlLim, "max", 10000000 ); + setPreferenceProperty( ctrlLim, "step", 1000 ); addPreference( tr( "PREF_ELEM_INFO_GRP_DETAILS" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "elem_info_grp_details" ); addPreference( tr( "PREF_DUMP_BASE_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_base" ); addPreference( tr( "PREF_DUMP_ELEM_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_elem" ); addPreference( tr( "PREF_DUMP_ADD_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_add" ); + addPreference( tr( "PREF_DUMP_CTRL_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_ctrl" ); int segGroup = addPreference( tr( "PREF_GROUP_SEGMENT_LENGTH" ), genTab ); setPreferenceProperty( segGroup, "columns", 2 ); @@ -4849,6 +4994,7 @@ void SMESHGUI::createPreferences() addPreference( tr( "PREF_BALL_COLOR" ), elemGroup, LightApp_Preferences::Color, "SMESH", "ball_elem_color" ); addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" ); addPreference( tr( "PREF_WIREFRAME" ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" ); + addPreference( tr( "PREF_PREVIEW_COLOR" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "preview_color" ); int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab ); @@ -5456,7 +5602,7 @@ void SMESHGUI::storeVisualParameters (int savePoint) ip->setParameter(entry, param, modeStr.toLatin1().data()); // Colors - vtkFloatingPointType r, g, b; + double r, g, b; int delta; aSmeshActor->GetSufaceColor(r, g, b, delta); @@ -5595,8 +5741,8 @@ void SMESHGUI::storeVisualParameters (int savePoint) typedef struct { int Id; vtkIdType Orientation; - vtkFloatingPointType Distance; - vtkFloatingPointType Angle[2]; + double Distance; + double Angle[2]; } TPlaneData; typedef std::list TPlaneDataList; typedef std::map TPlaneDataMap; @@ -6171,7 +6317,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) if (val != "Off") { SMESH::Orientation anOrientation = (SMESH::Orientation)vals[0].toInt(); double aDistance = vals[1].toFloat(); - vtkFloatingPointType anAngle[2]; + double anAngle[2]; anAngle[0] = vals[2].toFloat(); anAngle[1] = vals[3].toFloat(); @@ -6535,3 +6681,33 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) { } return false; } + + +SALOMEDS::Color SMESHGUI::getPredefinedUniqueColor() +{ + static QList colors; + + if ( colors.isEmpty() ) { + + for (int s = 0; s < 2 ; s++) + { + for (int v = 100; v >= 40; v = v - 20) + { + for (int h = 0; h < 359 ; h = h + 60) + { + colors.append(QColor::fromHsv(h, 255 - s * 127, v * 255 / 100)); + } + } + } + } + static int currentColor = 0; + + SALOMEDS::Color color; + color.R = (double)colors[currentColor].red() / 255.0; + color.G = (double)colors[currentColor].green() / 255.0; + color.B = (double)colors[currentColor].blue() / 255.0; + + currentColor = (currentColor+1) % colors.count(); + + return color; +}