X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI.cxx;h=493b734bb144759ea436447652610fc438a5af65;hp=ee7675db7a088e19a7b2496feef8d6eb4166c03d;hb=8f57b2cfd33d6d41539b00f3665f184266c297be;hpb=c979ba741c97173589b9dc3860bd2c049072f392 diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index ee7675db7..493b734bb 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 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 @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -44,6 +44,7 @@ #include "SMESHGUI_DuplicateNodesDlg.h" #include "SMESHGUI_ExtrusionAlongPathDlg.h" #include "SMESHGUI_ExtrusionDlg.h" +#include "SMESHGUI_FieldSelectorWdg.h" #include "SMESHGUI_FileInfoDlg.h" #include "SMESHGUI_FileValidator.h" #include "SMESHGUI_FilterDlg.h" @@ -116,6 +117,8 @@ #include +#include + #include #include #include @@ -179,7 +182,8 @@ // of auto-color picking up #define SIMPLE_AUTOCOLOR -//namespace{ +namespace +{ // Declarations //============================================================= void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh, @@ -193,9 +197,13 @@ void Control( int theCommandID ); - // Definitions - //============================================================= + //================================================================================ + /*! + * \brief Reads meshes from file + */ + //================================================================================ + void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh, int theCommandID ) { @@ -276,7 +284,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" ) ) ); @@ -286,7 +294,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() ) ) ); @@ -297,7 +305,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" ) ) ); @@ -308,7 +316,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() ) ) ); @@ -319,7 +327,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() ) ) ); @@ -331,7 +339,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 ) { @@ -594,6 +602,8 @@ if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) anInitialPath = QDir::currentPath(); + QList< QPair< GEOM::ListOfFields_var, QString > > aFieldList; + // Get a file name to write in and additional otions if ( isUNV || isDAT || isGMF ) // Export w/o options { @@ -679,13 +689,18 @@ QStringList checkBoxes; checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM"); + SMESHGUI_FieldSelectorWdg* fieldSelWdg = new SMESHGUI_FieldSelectorWdg(); + QList< QWidget* > wdgList; + if ( fieldSelWdg->GetAllFeilds( aMeshList, aFieldList )) + wdgList.append( fieldSelWdg ); + SalomeApp_CheckFileDlg* fd = - new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true ); + new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList ); fd->setWindowTitle( aTitle ); fd->setNameFilters( filters ); - fd->selectNameFilter(aDefaultFilter); - fd->SetChecked(0,toCreateGroups); - fd->SetChecked(1,toFindOutDim); + fd->selectNameFilter( aDefaultFilter ); + fd->SetChecked( toCreateGroups, 0 ); + fd->SetChecked( toFindOutDim, 1 ); if ( !anInitialPath.isEmpty() ) fd->setDirectory( anInitialPath ); fd->selectFile(aMeshName); @@ -727,7 +742,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"), @@ -741,7 +756,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++ ) { @@ -770,6 +785,9 @@ } toCreateGroups = fd->IsChecked(0); toFindOutDim = fd->IsChecked(1); + fieldSelWdg->GetSelectedFeilds(); + if ( !fieldSelWdg->parent() ) + delete fieldSelWdg; delete fd; } else @@ -806,12 +824,16 @@ { 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, + const GEOM::ListOfFields& fields = aFieldList[ aMeshIndex ].first.in(); + const QString& geoAssFields = aFieldList[ aMeshIndex ].second; + const bool hasFields = ( fields.length() || !geoAssFields.isEmpty() ); + if ( !hasFields && aMeshOrGroup->_is_equivalent( aMeshItem )) + aMeshItem->ExportToMEDX( aFilename.toUtf8().data(), toCreateGroups, aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim ); else - aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim ); + aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups, + aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim, + fields, geoAssFields.toLatin1().data() ); } } else if ( isSAUV ) @@ -820,29 +842,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 ) { @@ -852,14 +874,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){ @@ -958,7 +980,7 @@ { SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i]; //SALOMEDS::Color aColor = aGroupObject->GetColor(); - + #ifdef SIMPLE_AUTOCOLOR // simplified algorithm for auto-colors SALOMEDS::Color aColor = SMESHGUI::getPredefinedUniqueColor(); #else // old algorithm for auto-colors @@ -1002,7 +1024,7 @@ SALOME_ListIO selected; if( aSel ) aSel->selectedObjects( selected ); - + if ( selected.IsEmpty() ) return; SALOME_ListIteratorOfListIO It( selected ); for ( ; It.More(); It.Next() ) { @@ -1226,7 +1248,7 @@ SALOME_ListIO selected; if( aSel ) { aSel->selectedObjects( selected ); - + if(selected.Extent()){ Handle(SALOME_InteractiveObject) anIObject = selected.First(); _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); @@ -1279,6 +1301,7 @@ int deltaF = 0, deltaV = 0; int elem0dSize = 1; int ballSize = 1; + double ballScale = 1.0; int edgeWidth = 1; int outlineWidth = 1; double shrinkCoef = 0.0; @@ -1323,6 +1346,7 @@ anActor->GetBallColor( color[0], color[1], color[2] ); ballColor.setRgbF( color[0], color[1], color[2] ); ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1 + ballScale = qMax( (double)anActor->GetBallScale(), 1e-2 ); // minimum allowed scale is 1e-2 // outlines: color anActor->GetOutlineColor( color[0], color[1], color[2] ); outlineColor.setRgbF( color[0], color[1], color[2] ); @@ -1379,6 +1403,7 @@ // balls: color, size dlg.setBallColor( ballColor ); dlg.setBallSize( ballSize ); + dlg.setBallScale( ballScale ); // orientation: color, scale, 3d flag dlg.setOrientationColor( orientationColor ); dlg.setOrientationSize( int( orientationScale * 100. ) ); @@ -1405,6 +1430,7 @@ elem0dSize = dlg.elem0dSize(); ballColor = dlg.ballColor(); ballSize = dlg.ballSize(); + ballScale = dlg.ballScale(); orientationColor = dlg.orientationColor(); orientationScale = dlg.orientationSize() / 100.; orientation3d = dlg.orientation3d(); @@ -1448,6 +1474,7 @@ // balls: color, size anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() ); anActor->SetBallSize( ballSize ); + anActor->SetBallScale( ballScale ); // orientation: color, scale, 3d flag anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() ); anActor->SetFacesOrientationScale( orientationScale ); @@ -1696,190 +1723,190 @@ QString RefType = CheckTypeObject(selected.First()); SALOME_ListIteratorOfListIO It(selected); for ( ; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - QString Type = CheckTypeObject(IObject); - if (Type.compare(RefType) != 0) - return "Heterogeneous Selection"; - } + { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + QString Type = CheckTypeObject(IObject); + if (Type.compare(RefType) != 0) + return "Heterogeneous Selection"; + } return RefType; } +} //namespace - void SMESHGUI::OnEditDelete() - { - // VSR 17/11/04: check if all objects selected belong to SMESH component --> start - LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr(); - SALOME_ListIO selected; aSel->selectedObjects( selected, QString::null, false ); +void SMESHGUI::OnEditDelete() +{ + // VSR 17/11/04: check if all objects selected belong to SMESH component --> start + LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr(); + SALOME_ListIO selected; aSel->selectedObjects( selected, QString::null, false ); - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder(); - _PTR(GenericAttribute) anAttr; - _PTR(AttributeIOR) anIOR; - - int objectCount = 0; - QString aNameList; - QString aParentComponent = QString::null; - Handle(SALOME_InteractiveObject) anIO; - for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() ) - { - anIO = anIt.Value(); - QString cur = anIO->getComponentDataType(); - _PTR(SObject) aSO = aStudy->FindObjectID(anIO->getEntry()); - if (aSO) { - // check if object is reference - _PTR(SObject) aRefSObj; - aNameList.append("\n - "); - if ( aSO->ReferencedObject( aRefSObj ) ) { - QString aRefName = QString::fromStdString ( aRefSObj->GetName() ); - aNameList.append( aRefName ); - cur = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() ); - } - else - aNameList.append(anIO->getName()); - objectCount++; - } + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder(); + _PTR(GenericAttribute) anAttr; + _PTR(AttributeIOR) anIOR; - if( aParentComponent.isNull() ) - aParentComponent = cur; - else if( !aParentComponent.isEmpty() && aParentComponent!=cur ) - aParentComponent = ""; + int objectCount = 0; + QString aNameList; + QString aParentComponent = QString::null; + Handle(SALOME_InteractiveObject) anIO; + for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() ) + { + anIO = anIt.Value(); + QString cur = anIO->getComponentDataType(); + _PTR(SObject) aSO = aStudy->FindObjectID(anIO->getEntry()); + if (aSO) { + // check if object is reference + _PTR(SObject) aRefSObj; + aNameList.append("\n - "); + if ( aSO->ReferencedObject( aRefSObj ) ) { + QString aRefName = QString::fromStdString ( aRefSObj->GetName() ); + aNameList.append( aRefName ); + cur = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() ); + } + else + aNameList.append(anIO->getName()); + objectCount++; } - if ( objectCount == 0 ) - return; // No Valid Objects Selected + if( aParentComponent.isNull() ) + aParentComponent = cur; + else if( !aParentComponent.isEmpty() && aParentComponent!=cur ) + aParentComponent = ""; + } - if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() ) { - SUIT_MessageBox::warning( SMESHGUI::desktop(), - QObject::tr("ERR_ERROR"), - QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) ); - return; - } - // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish - if (SUIT_MessageBox::warning - (SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ), - SUIT_MessageBox::Yes | SUIT_MessageBox::No, - SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes) - return; + if ( objectCount == 0 ) + return; // No Valid Objects Selected - SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() ) { + SUIT_MessageBox::warning( SMESHGUI::desktop(), + QObject::tr("ERR_ERROR"), + QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) ); + return; + } + // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish + if (SUIT_MessageBox::warning + (SMESHGUI::desktop(), + QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ), + SUIT_MessageBox::Yes | SUIT_MessageBox::No, + SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes) + return; - // Put the whole hierarchy of sub-objects of the selected SO's into a list and - // then treat them all starting from the deepest objects (at list back) - std::list< _PTR(SObject) > listSO; - SALOME_ListIteratorOfListIO It(selected); - for( ; It.More(); It.Next()) // loop on selected IO's - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if(IObject->hasEntry()) { - _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry()); - - // disable removal of "SMESH" component object - if(aSO->FindAttribute(anAttr, "AttributeIOR")){ - anIOR = anAttr; - if ( engineIOR() == anIOR->Value().c_str() ) - continue; - } - //Check the referenced object - _PTR(SObject) aRefSObject; - if ( aSO && aSO->ReferencedObject( aRefSObject ) ) - aSO = aRefSObject; // Delete main Object instead of reference - - listSO.push_back( aSO ); - 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()) - listSO.push_back( it->Value() ); - } + SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + + // Put the whole hierarchy of sub-objects of the selected SO's into a list and + // then treat them all starting from the deepest objects (at list back) + std::list< _PTR(SObject) > listSO; + SALOME_ListIteratorOfListIO It(selected); + for( ; It.More(); It.Next()) // loop on selected IO's + { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + if(IObject->hasEntry()) { + _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry()); + + // disable removal of "SMESH" component object + if(aSO->FindAttribute(anAttr, "AttributeIOR")){ + anIOR = anAttr; + if ( engineIOR() == anIOR->Value().c_str() ) + continue; + } + //Check the referenced object + _PTR(SObject) aRefSObject; + if ( aSO && aSO->ReferencedObject( aRefSObject ) ) + aSO = aRefSObject; // Delete main Object instead of reference + + listSO.push_back( aSO ); + 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()) + listSO.push_back( it->Value() ); } } - // Check if none of objects to delete is referred from outside - std::list< _PTR(SObject) >::reverse_iterator ritSO; - for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO ) - { - _PTR(SObject) SO = *ritSO; - if ( !SO ) continue; - std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO ); - for (size_t i = 0; i < aReferences.size(); i++) { - _PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent(); - std::string type = aComponent->ComponentDataType(); - if ( type != "SMESH" ) - { - SUIT_MessageBox::warning( anApp->desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("DEP_OBJECT") ); - return; // outside SMESH, there is an object depending on a SMESH object - } + } + // Check if none of objects to delete is referred from outside + std::list< _PTR(SObject) >::reverse_iterator ritSO; + for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO ) + { + _PTR(SObject) SO = *ritSO; + if ( !SO ) continue; + std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO ); + for (size_t i = 0; i < aReferences.size(); i++) { + _PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent(); + std::string type = aComponent->ComponentDataType(); + if ( type != "SMESH" ) + { + SUIT_MessageBox::warning( anApp->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("DEP_OBJECT") ); + return; // outside SMESH, there is an object depending on a SMESH object } } + } - // 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(); - } + // 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 ) - { - _PTR(SObject) SO = *ritSO; - if ( !SO ) continue; - std::string anEntry = SO->GetID(); + // Treat SO's in the list starting from the back + aStudyBuilder->NewCommand(); // There is a transaction + for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO ) + { + _PTR(SObject) SO = *ritSO; + if ( !SO ) continue; + std::string anEntry = SO->GetID(); - /** Erase graphical object and remove all its data **/ - if(SO->FindAttribute(anAttr, "AttributeIOR")) { - SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true); - } - /** Remove an object from data structures **/ - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO )); - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO )); - if ( !aGroup->_is_nil() ) { // DELETE GROUP - SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh(); - aMesh->RemoveGroup( aGroup ); - } - else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - aMesh->RemoveSubMesh( aSubMesh ); + /** Erase graphical object and remove all its data **/ + if(SO->FindAttribute(anAttr, "AttributeIOR")) { + SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true); + } + /** Remove an object from data structures **/ + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO )); + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO )); + if ( !aGroup->_is_nil() ) { // DELETE GROUP + SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh(); + aMesh->RemoveGroup( aGroup ); + } + else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH + SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); + aMesh->RemoveSubMesh( aSubMesh ); - _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh); - if (aMeshSO) - SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0); + _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh); + if (aMeshSO) + SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0); + } + else { + Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject + ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() ); + QString objType = CheckTypeObject(IObject); + if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS + SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject); + aStudyBuilder->RemoveObjectWithChildren( SO ); } - else { - Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject - ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() ); - QString objType = CheckTypeObject(IObject); - if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS - SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject); - aStudyBuilder->RemoveObjectWithChildren( SO ); - } - else {// default action: remove SObject from the study - // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH - //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy); - //op->start(); - aStudyBuilder->RemoveObjectWithChildren( SO ); - //op->finish(); - } + else {// default action: remove SObject from the study + // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH + //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy); + //op->start(); + aStudyBuilder->RemoveObjectWithChildren( SO ); + //op->finish(); } - } /* listSO back loop */ + } + } /* listSO back loop */ - aStudyBuilder->CommitCommand(); + aStudyBuilder->CommitCommand(); - /* Clear any previous selection */ - SALOME_ListIO l1; - aSel->setSelectedObjects( l1 ); + /* Clear any previous selection */ + SALOME_ListIO l1; + aSel->setSelectedObjects( l1 ); - SMESHGUI::GetSMESHGUI()->updateObjBrowser(); - } -//} namespace + SMESHGUI::GetSMESHGUI()->updateObjBrowser(); +} extern "C" { SMESHGUI_EXPORT CAM_Module* createModule() @@ -1985,8 +2012,8 @@ bool SMESHGUI::automaticUpdate(unsigned int requestedSize, bool* limitExceeded) * */ //============================================================================= -bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh, - int* entities, bool* limitExceeded ) +bool SMESHGUI::automaticUpdate( SMESH::SMESH_IDSource_ptr theMesh, + int* entities, bool* limitExceeded, int* hidden, long* nbElements ) { SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); if ( !resMgr ) @@ -1996,63 +2023,84 @@ bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh, long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 ); bool incrementalLimit = resMgr->booleanValue( "SMESH", "incremental_limit", false ); - long requestedSize = theMesh->NbElements(); - + SMESH::long_array_var info = theMesh->GetMeshInfo(); + long nbOdElems = info[SMDSEntity_0D]; + long nbEdges = info[SMDSEntity_Edge] + info[SMDSEntity_Quad_Edge]; + long nbFaces = info[SMDSEntity_Triangle] + info[SMDSEntity_Quad_Triangle] + info[SMDSEntity_BiQuad_Triangle] + + info[SMDSEntity_Quadrangle] + info[SMDSEntity_Quad_Quadrangle] + info[SMDSEntity_BiQuad_Quadrangle] + + info[SMDSEntity_Polygon]; + long nbVolumes = info[SMDSEntity_Tetra] + info[SMDSEntity_Quad_Tetra] + + info[SMDSEntity_Hexa] + info[SMDSEntity_Quad_Hexa] + info[SMDSEntity_TriQuad_Hexa] + + info[SMDSEntity_Pyramid] + info[SMDSEntity_Quad_Pyramid] + + info[SMDSEntity_Penta] + info[SMDSEntity_Quad_Penta] + + info[SMDSEntity_Polyhedra] + + info[SMDSEntity_Hexagonal_Prism]; + long nbBalls = info[SMDSEntity_Ball]; + + long requestedSize = nbOdElems + nbBalls + nbEdges + nbFaces + nbVolumes; + *nbElements = requestedSize; + *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 ) + 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 ) + 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 ) + 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 ) + 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 ) + if ( total + nbBalls > updateLimit ) { *entities = *entities & ~SMESH_Actor::eBallElem; + *hidden = *hidden | SMESH_Actor::eBallElem; + } else exceeded = false; } total += nbBalls; } - + return autoUpdate && !exceeded; } @@ -2655,7 +2703,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) else if ( theCommandID == 410 ) aDlg = new SMESHGUI_UnionOfTrianglesDlg(this); else if ( theCommandID == 419 ) - aDlg = new SMESHGUI_CuttingIntoTetraDlg(this); + aDlg = new SMESHGUI_SplitVolumesDlg(this); else aDlg = new SMESHGUI_CuttingOfQuadsDlg(this); @@ -3492,7 +3540,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) tr( "NOT_A_VTK_VIEWER" ) ); } break; - case 6032: + case 6032: OverallMeshQuality(); break; case 9010: @@ -3530,8 +3578,20 @@ 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(); @@ -3833,6 +3893,9 @@ 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" ); @@ -3861,7 +3924,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 ); @@ -4009,14 +4073,27 @@ 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 -------------- - int meshTb = createTool( tr( "TB_MESH" ) ), - ctrlTb = createTool( tr( "TB_CTRL" ) ), - addRemTb = createTool( tr( "TB_ADD_REMOVE" ) ), - modifyTb = createTool( tr( "TB_MODIFY" ) ), - dispModeTb = createTool( tr( "TB_DISP_MODE" ) ); + int meshTb = createTool( tr( "TB_MESH" ) ), + info = createTool( tr( "TB_INFO" ) ), + groupTb = createTool( tr( "TB_GROUP" ) ), + ctrl0dTb = createTool( tr( "TB_CTRL0D" ) ), + ctrl1dTb = createTool( tr( "TB_CTRL1D" ) ), + ctrl2dTb = createTool( tr( "TB_CTRL2D" ) ), + ctrl3dTb = createTool( tr( "TB_CTRL3D" ) ), + addElemTb = createTool( tr( "TB_ADD" ) ), + addNonElemTb = createTool( tr( "TB_ADDNON" ) ), + remTb = createTool( tr( "TB_REM" ) ), + renumbTb = createTool( tr( "TB_RENUMBER" ) ), + transformTb = createTool( tr( "TB_TRANSFORM" ) ), + modifyTb = createTool( tr( "TB_MODIFY" ) ), + measuremTb = createTool( tr( "TB_MEASUREM" ) ), + dispModeTb = createTool( tr( "TB_DISP_MODE" ) ); createTool( 702, meshTb ); createTool( 703, meshTb ); @@ -4028,93 +4105,90 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( 711, meshTb ); createTool( 712, meshTb ); createTool( 713, meshTb ); - createTool( separator(), meshTb ); - createTool( 801, meshTb ); - createTool( 806, meshTb ); - createTool( 802, meshTb ); - createTool( 803, meshTb ); - //createTool( 815, meshTb ); - createTool( separator(), meshTb ); - createTool( 900, meshTb ); + + createTool( 801, groupTb ); + createTool( 806, groupTb ); + createTool( 802, groupTb ); + createTool( 803, groupTb ); + + createTool( 900, info ); //createTool( 902, meshTb ); //createTool( 903, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command) - createTool( 904, meshTb ); - createTool( separator(), meshTb ); - - createTool( 6005, ctrlTb ); - createTool( 6028, ctrlTb ); - createTool( separator(), ctrlTb ); - createTool( 6002, ctrlTb ); - createTool( 6003, ctrlTb ); - createTool( 6001, ctrlTb ); - createTool( 6004, ctrlTb ); - createTool( 6029, ctrlTb ); - createTool( separator(), ctrlTb ); - createTool( 6021, ctrlTb ); - createTool( 6025, ctrlTb ); - createTool( 6027, ctrlTb ); - createTool( 6018, ctrlTb ); - createTool( 6019, ctrlTb ); - createTool( 6011, ctrlTb ); - createTool( 6012, ctrlTb ); - createTool( 6013, ctrlTb ); - createTool( 6014, ctrlTb ); - createTool( 6015, ctrlTb ); - createTool( 6016, ctrlTb ); - createTool( 6022, ctrlTb ); - createTool( 6030, ctrlTb ); - createTool( separator(), ctrlTb ); - createTool( 6017, ctrlTb ); - createTool( 6009, ctrlTb ); - createTool( 6023, ctrlTb ); - createTool( 6024, ctrlTb ); - createTool( 6026, ctrlTb ); - createTool( 6031, ctrlTb ); - createTool( separator(), ctrlTb ); - - createTool( 4000, addRemTb ); - createTool( 4009, addRemTb ); - createTool( 4070, addRemTb ); - createTool( 4008, addRemTb ); - createTool( 4010, addRemTb ); - createTool( 4021, addRemTb ); - createTool( 4022, addRemTb ); - createTool( 4023, addRemTb ); - createTool( 4031, addRemTb ); - createTool( 4032, addRemTb ); - createTool( 4133, addRemTb ); - createTool( 4134, addRemTb ); - createTool( 4135, addRemTb ); - createTool( 4033, addRemTb ); - createTool( separator(), addRemTb ); - createTool( 4034, addRemTb ); - createTool( 4035, addRemTb ); - createTool( 4137, addRemTb ); - createTool( 4036, addRemTb ); - createTool( 4136, addRemTb ); - createTool( 4037, addRemTb ); - createTool( 4038, addRemTb ); - createTool( 4039, addRemTb ); - createTool( 4040, addRemTb ); - createTool( 4140, addRemTb ); - createTool( separator(), addRemTb ); - createTool( 4041, addRemTb ); - createTool( 4042, addRemTb ); - createTool( 4044, addRemTb ); - createTool( 4043, addRemTb ); - createTool( separator(), addRemTb ); - createTool( 4051, addRemTb ); - createTool( 4052, addRemTb ); - createTool( separator(), addRemTb ); - createTool( 4061, addRemTb ); - createTool( 4062, addRemTb ); - createTool( 4063, addRemTb ); - createTool( 4068, addRemTb ); - createTool( 4064, addRemTb ); - createTool( 4065, addRemTb ); - createTool( 4066, addRemTb ); - createTool( 4069, addRemTb ); - createTool( separator(), addRemTb ); + createTool( 904, info ); + + createTool( 6005, ctrl0dTb ); + createTool( 6028, ctrl0dTb ); + + createTool( 6002, ctrl1dTb ); + createTool( 6003, ctrl1dTb ); + createTool( 6001, ctrl1dTb ); + createTool( 6004, ctrl1dTb ); + createTool( 6029, ctrl1dTb ); + + createTool( 6021, ctrl2dTb ); + createTool( 6025, ctrl2dTb ); + createTool( 6027, ctrl2dTb ); + createTool( 6018, ctrl2dTb ); + createTool( 6019, ctrl2dTb ); + createTool( 6011, ctrl2dTb ); + createTool( 6012, ctrl2dTb ); + createTool( 6013, ctrl2dTb ); + createTool( 6014, ctrl2dTb ); + createTool( 6015, ctrl2dTb ); + createTool( 6016, ctrl2dTb ); + createTool( 6022, ctrl2dTb ); + createTool( 6030, ctrl2dTb ); + + createTool( 6017, ctrl3dTb ); + createTool( 6009, ctrl3dTb ); + createTool( 6023, ctrl3dTb ); + createTool( 6024, ctrl3dTb ); + createTool( 6026, ctrl3dTb ); + createTool( 6031, ctrl3dTb ); + + createTool( 4000, addElemTb ); + createTool( 4009, addElemTb ); + createTool( 4070, addElemTb ); + createTool( 4008, addElemTb ); + createTool( 4010, addElemTb ); + createTool( 4021, addElemTb ); + createTool( 4022, addElemTb ); + createTool( 4023, addElemTb ); + createTool( 4031, addElemTb ); + createTool( 4032, addElemTb ); + createTool( 4133, addElemTb ); + createTool( 4134, addElemTb ); + createTool( 4135, addElemTb ); + createTool( 4033, addElemTb ); + + createTool( 4034, addNonElemTb ); + createTool( 4035, addNonElemTb ); + createTool( 4137, addNonElemTb ); + createTool( 4036, addNonElemTb ); + createTool( 4136, addNonElemTb ); + createTool( 4037, addNonElemTb ); + createTool( 4038, addNonElemTb ); + createTool( 4039, addNonElemTb ); + createTool( 4040, addNonElemTb ); + createTool( 4140, addNonElemTb ); + + createTool( 4041, remTb ); + createTool( 4042, remTb ); + createTool( 4044, remTb ); + createTool( 4043, remTb ); + + createTool( 4051, renumbTb ); + createTool( 4052, renumbTb ); + + + createTool( 4061, transformTb ); + createTool( 4062, transformTb ); + createTool( 4063, transformTb ); + createTool( 4068, transformTb ); + createTool( 4064, transformTb ); + createTool( 4065, transformTb ); + createTool( 4066, transformTb ); + createTool( 4069, transformTb ); createTool( 4067,modifyTb ); createTool( 407, modifyTb ); @@ -4132,6 +4206,8 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( 417, modifyTb ); createTool( 418, modifyTb ); + createTool( 501, measuremTb ); + createTool( 214, dispModeTb ); QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality(); @@ -4475,7 +4551,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 @@ -4573,18 +4649,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 @@ -4680,7 +4755,7 @@ void SMESHGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& ti _PTR(Study) study = appStudy->studyDS(); _PTR(SObject) obj = study->FindObjectID( io->getEntry() ); if ( obj ) { - QString aName = QString( obj->GetName().c_str() ); + QString aName = QString( QString::fromUtf8(obj->GetName().c_str()) ); while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup aName.remove( (aName.length() - 1), 1 ); title = aName; @@ -4696,6 +4771,7 @@ LightApp_Selection* SMESHGUI::createSelection() const void SMESHGUI::windows( QMap& aMap ) const { aMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea ); + aMap.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea ); aMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea ); } @@ -4963,6 +5039,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 ); @@ -4975,6 +5052,8 @@ void SMESHGUI::createPreferences() LightApp_Preferences::IntSpin, "SMESH", "elem0d_size"); int ballSize = addPreference(tr("PREF_BALL_SIZE"), elemGroup, LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size"); + double ballScale = addPreference(tr("PREF_BALL_SCALE"), elemGroup, + LightApp_Preferences::DblSpin, "SMESH", "ball_elem_scale"); int elemW = addPreference(tr("PREF_WIDTH"), elemGroup, LightApp_Preferences::IntSpin, "SMESH", "element_width"); int outW = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup, @@ -4988,6 +5067,10 @@ void SMESHGUI::createPreferences() setPreferenceProperty( ballSize, "min", 1 ); setPreferenceProperty( ballSize, "max", 10 ); + setPreferenceProperty( ballScale, "min", 1e-2 ); + setPreferenceProperty( ballScale, "max", 1e7 ); + setPreferenceProperty( ballScale, "step", 0.5 ); + setPreferenceProperty( elemW, "min", 1 ); setPreferenceProperty( elemW, "max", 5 ); @@ -5492,13 +5575,34 @@ void SMESHGUI::storeVisualParameters (int savePoint) aPropertyName += gSeparator; aPropertyName += QString::number( anId ); - QString aPropertyValue = QString::number( (int)aPlane->GetOrientation() ).toLatin1().constData(); + QString aPropertyValue = QString::number( (int)aPlane->PlaneMode ).toLatin1().constData(); aPropertyValue += gDigitsSep; - aPropertyValue += QString::number( aPlane->GetDistance() ).toLatin1().constData(); + aPropertyValue += QString::number( aPlane->IsOpenGLClipping ).toLatin1().constData(); aPropertyValue += gDigitsSep; - aPropertyValue += QString::number( aPlane->myAngle[0] ).toLatin1().constData(); - aPropertyValue += gDigitsSep; - aPropertyValue += QString::number( aPlane->myAngle[1] ).toLatin1().constData(); + if ( aPlane->PlaneMode == SMESH::Absolute ) { + aPropertyValue += QString::number( aPlane->myAbsoluteOrientation ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->X ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->Y ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->Z ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->Dx ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->Dy ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->Dz ).toLatin1().constData(); + } + else if ( aPlane->PlaneMode == SMESH::Relative ) { + aPropertyValue += QString::number( (int)aPlane->myRelativeOrientation ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->GetDistance() ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->myAngle[0] ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->myAngle[1] ).toLatin1().constData(); + } ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() ); } @@ -5639,6 +5743,7 @@ void SMESHGUI::storeVisualParameters (int savePoint) sizeStr << QString::number((int)aSmeshActor->Get0DSize()); sizeStr << "ball"; sizeStr << QString::number((int)aSmeshActor->GetBallSize()); + sizeStr << QString::number((double)aSmeshActor->GetBallScale()); sizeStr << "shrink"; sizeStr << QString::number(aSmeshActor->GetShrinkFactor()); sizeStr << "orientation"; @@ -5708,9 +5813,13 @@ void SMESHGUI::storeVisualParameters (int savePoint) // data structures for clipping planes processing typedef struct { int Id; - vtkIdType Orientation; + int Mode; + bool isOpenGLClipping; + vtkIdType RelativeOrientation; double Distance; double Angle[2]; + int AbsoluteOrientation; + double X, Y, Z, Dx, Dy, Dz; } TPlaneData; typedef std::list TPlaneDataList; typedef std::map TPlaneDataMap; @@ -5827,31 +5936,80 @@ void SMESHGUI::restoreVisualParameters (int savePoint) continue; QStringList aPropertyValueList = aPropertyValue.split( gDigitsSep, QString::SkipEmptyParts ); - if( aPropertyValueList.size() != 4 ) + if( aPropertyValueList.size() != 6 && aPropertyValueList.size() != 9 ) continue; TPlaneData aPlaneData; aPlaneData.Id = aClippingPlaneId; ok = false; - aPlaneData.Orientation = aPropertyValueList[0].toInt( &ok ); + aPlaneData.Mode = aPropertyValueList[0].toInt( &ok ); if( !ok ) continue; - + ok = false; - aPlaneData.Distance = aPropertyValueList[1].toDouble( &ok ); + aPlaneData.isOpenGLClipping = aPropertyValueList[1].toInt( &ok ); if( !ok ) continue; - ok = false; - aPlaneData.Angle[0] = aPropertyValueList[2].toDouble( &ok ); - if( !ok ) - continue; + if ( (SMESH::Mode)aPlaneData.Mode == SMESH::Absolute ) + { + ok = false; + aPlaneData.AbsoluteOrientation = aPropertyValueList[2].toInt( &ok ); + if( !ok ) + continue; - ok = false; - aPlaneData.Angle[1] = aPropertyValueList[3].toDouble( &ok ); - if( !ok ) - continue; + ok = false; + aPlaneData.X = aPropertyValueList[3].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Y = aPropertyValueList[4].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Z = aPropertyValueList[5].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Dx = aPropertyValueList[6].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Dy = aPropertyValueList[7].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Dz = aPropertyValueList[8].toDouble( &ok ); + if( !ok ) + continue; + } + else if ( (SMESH::Mode)aPlaneData.Mode == SMESH::Relative ) { + ok = false; + aPlaneData.RelativeOrientation = aPropertyValueList[2].toInt( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Distance = aPropertyValueList[3].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Angle[0] = aPropertyValueList[4].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Angle[1] = aPropertyValueList[5].toDouble( &ok ); + if( !ok ) + continue; + } TPlaneDataList& aPlaneDataList = aPlaneDataMap[ aViewId ]; aPlaneDataList.push_back( aPlaneData ); @@ -6170,6 +6328,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) int outlineWidth = -1; int elem0dSize = -1; int ballSize = -1; + double ballScale = -1.0; double shrinkSize = -1; double orientationSize = -1; bool orientation3d = false; @@ -6197,11 +6356,16 @@ void SMESHGUI::restoreVisualParameters (int savePoint) i++; } else if ( type == "ball" ) { - // ball size is given as single integer value - if ( i+1 >= sizes.count() ) break; // format error - int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error - ballSize = v; - i++; + // balls are specified by two values: size:scale, where + // - size - is a integer value specifying size + // - scale - is a double value specifying scale factor + if ( i+1 >= sizes.count() ) break; // format error + int v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= sizes.count() ) break; // format error + double v2 = sizes[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + ballSize = v1; + ballScale = v2; + i += 2; } else if ( type == "shrink" ) { // shrink factor is given as single floating point value @@ -6237,6 +6401,9 @@ void SMESHGUI::restoreVisualParameters (int savePoint) // ball size if ( ballSize > 0 ) aSmeshActor->SetBallSize( ballSize ); + // ball scale + if ( ballScale > 0.0 ) + aSmeshActor->SetBallScale( ballScale ); // shrink factor if ( shrinkSize > 0 ) aSmeshActor->SetShrinkFactor( shrinkSize ); @@ -6274,21 +6441,18 @@ void SMESHGUI::restoreVisualParameters (int savePoint) // Clipping else if (paramNameStr.startsWith("ClippingPlane")) { QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts); - // old format - val looks like "Off" or "0:0.5:0:0" (orientation, distance, two angles) + // old format - val looks like "Off" or "1:0:0:0.5:0:0" + // (mode(relative), is OpenGL clipping plane, orientation, distance, two angles) + // or "0:1:1:10.5:1.0:1.0:15.0:10.0:10.0" + // (mode(absolute), is OpenGL clipping plane, orientation, base point(x, y, z), direction (dx, dy, dz)) // new format - val looks like "Off" or "0" (plane id) // (note: in new format "Off" value is used only for consistency, // so it is processed together with values in old format) - bool anIsOldFormat = ( vals.count() == 4 || val == "Off" ); + bool anIsOldFormat = ( vals.count() == 6 || vals.count() == 9 || val == "Off" ); if( anIsOldFormat ) { if (paramNameStr == "ClippingPlane1" || val == "Off") aSmeshActor->RemoveAllClippingPlanes(); if (val != "Off") { - SMESH::Orientation anOrientation = (SMESH::Orientation)vals[0].toInt(); - double aDistance = vals[1].toFloat(); - double anAngle[2]; - anAngle[0] = vals[2].toFloat(); - anAngle[1] = vals[3].toFloat(); - QList lst; getApp()->viewManagers(viewerTypStr, lst); // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager @@ -6300,13 +6464,35 @@ void SMESHGUI::restoreVisualParameters (int savePoint) SMESH::TActorList anActorList; anActorList.push_back( aSmeshActor ); - SMESH::OrientedPlane* aPlane = - SMESHGUI_ClippingDlg::AddPlane(anActorList, vtkView, anOrientation, aDistance, anAngle); + SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New( vtkView ); + aPlane->myViewWindow = vtkView; + SMESH::Mode aMode = ( SMESH::Mode )vals[0].toInt(); + aPlane->PlaneMode = aMode; + bool isOpenGLClipping = ( bool )vals[1].toInt(); + aPlane->IsOpenGLClipping = isOpenGLClipping; + if ( aMode == SMESH::Absolute ) { + aPlane->myAbsoluteOrientation = vals[2].toInt(); + aPlane->X = vals[3].toFloat(); + aPlane->Y = vals[4].toFloat(); + aPlane->Z = vals[5].toFloat(); + aPlane->Dx = vals[6].toFloat(); + aPlane->Dy = vals[7].toFloat(); + aPlane->Dz = vals[8].toFloat(); + } + else if ( aMode == SMESH::Relative ) { + aPlane->myRelativeOrientation = (SMESH::Orientation)vals[2].toInt(); + aPlane->myDistance = vals[3].toFloat(); + aPlane->myAngle[0] = vals[4].toFloat(); + aPlane->myAngle[1] = vals[5].toFloat(); + } + if( aPlane ) { - SMESH::ClippingPlaneInfo aClippingPlaneInfo; - aClippingPlaneInfo.Plane = aPlane; - aClippingPlaneInfo.ActorList = anActorList; - aClippingPlaneInfoList.push_back( aClippingPlaneInfo ); + if ( SMESHGUI_ClippingDlg::AddPlane( anActorList, aPlane ) ) { + SMESH::ClippingPlaneInfo aClippingPlaneInfo; + aClippingPlaneInfo.Plane = aPlane; + aClippingPlaneInfo.ActorList = anActorList; + aClippingPlaneInfoList.push_back( aClippingPlaneInfo ); + } } } } @@ -6427,23 +6613,40 @@ void SMESHGUI::restoreVisualParameters (int savePoint) for( ; anIter4 != aPlaneDataList.end(); anIter4++ ) { const TPlaneData& aPlaneData = *anIter4; if( aPlaneData.Id == aPlaneId ) { - SMESH::OrientedPlane* aPlane = - SMESHGUI_ClippingDlg::AddPlane( anActorList, - aViewWindow, - (SMESH::Orientation)aPlaneData.Orientation, - aPlaneData.Distance, - aPlaneData.Angle ); + SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New( aViewWindow ); + aPlane->myViewWindow = aViewWindow; + aPlane->PlaneMode = (SMESH::Mode)aPlaneData.Mode; + aPlane->IsOpenGLClipping = aPlaneData.isOpenGLClipping; + if ( aPlane->PlaneMode == SMESH::Absolute ) { + aPlane->myAbsoluteOrientation = aPlaneData.AbsoluteOrientation; + aPlane->X = aPlaneData.X; + aPlane->Y = aPlaneData.Y; + aPlane->Z = aPlaneData.Z; + aPlane->Dx = aPlaneData.Dx; + aPlane->Dy = aPlaneData.Dy; + aPlane->Dz = aPlaneData.Dz; + } + else if ( aPlane->PlaneMode == SMESH::Relative ) { + aPlane->myRelativeOrientation = (SMESH::Orientation)aPlaneData.RelativeOrientation; + aPlane->myDistance = aPlaneData.Distance; + aPlane->myAngle[0] = aPlaneData.Angle[0]; + aPlane->myAngle[1] = aPlaneData.Angle[1]; + } if( aPlane ) { - SMESH::ClippingPlaneInfo aClippingPlaneInfo; - aClippingPlaneInfo.Plane = aPlane; - aClippingPlaneInfo.ActorList = anActorList; - aClippingPlaneInfoList.push_back( aClippingPlaneInfo ); + if ( SMESHGUI_ClippingDlg::AddPlane( anActorList, aPlane ) ) { + SMESH::ClippingPlaneInfo aClippingPlaneInfo; + aClippingPlaneInfo.Plane = aPlane; + aClippingPlaneInfo.ActorList = anActorList; + aClippingPlaneInfoList.push_back( aClippingPlaneInfo ); + } } break; } } + } } + // update all VTK views QList lst; @@ -6452,6 +6655,14 @@ void SMESHGUI::restoreVisualParameters (int savePoint) SUIT_ViewModel* vmodel = (*it)->getViewModel(); if (vmodel && vmodel->getType() == SVTK_Viewer::Type()) { SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView(); + // set OpenGL clipping planes + VTK::ActorCollectionCopy aCopy( vtkView->getRenderer()->GetActors() ); + vtkActorCollection* anAllActors = aCopy.GetActors(); + anAllActors->InitTraversal(); + while( vtkActor* aVTKActor = anAllActors->GetNextActor() ) + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) + anActor->SetOpenGLClippingPlane(); + vtkView->getRenderer()->ResetCameraClippingRange(); vtkView->Repaint(); } @@ -6524,7 +6735,7 @@ void SMESHGUI::message( const QString& msg ) _PTR(SObject) obj = study->FindObjectID( entry.toLatin1().constData() ); QString name; if ( obj ) - name = obj->GetName().c_str(); + name = QString::fromUtf8(obj->GetName().c_str()); if ( name.isEmpty() ) return; @@ -6650,7 +6861,6 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) { return false; } - SALOMEDS::Color SMESHGUI::getPredefinedUniqueColor() { static QList colors;