X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI.cxx;h=ba08d51011a880d5e2c693412a918a8823586cb7;hp=3f2b887710b780ff979c506ae21d02af75eb1050;hb=6472eab132825fec572beda8276947593f85ffa1;hpb=264eeb2edd6977ccf2d2bd88cbb210353f63f7c9 diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 3f2b88771..ba08d5101 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2019 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 @@ -40,20 +40,26 @@ #include "SMESHGUI_CopyMeshDlg.h" #include "SMESHGUI_CreatePolyhedralVolumeDlg.h" #include "SMESHGUI_DeleteGroupDlg.h" +#include "SMESHGUI_DisplayEntitiesDlg.h" #include "SMESHGUI_Displayer.h" #include "SMESHGUI_DuplicateNodesDlg.h" #include "SMESHGUI_ExtrusionAlongPathDlg.h" #include "SMESHGUI_ExtrusionDlg.h" +#include "SMESHGUI_FaceGroupsSeparatedByEdgesDlg.h" #include "SMESHGUI_FieldSelectorWdg.h" #include "SMESHGUI_FileInfoDlg.h" #include "SMESHGUI_FileValidator.h" #include "SMESHGUI_FilterDlg.h" #include "SMESHGUI_FilterLibraryDlg.h" +#include "SMESHGUI_FilterUtils.h" #include "SMESHGUI_FindElemByPointDlg.h" +#include "SMESHGUI_GEOMGenUtils.h" #include "SMESHGUI_GroupDlg.h" #include "SMESHGUI_GroupOnShapeDlg.h" #include "SMESHGUI_GroupOpDlg.h" +#include "SMESHGUI_GroupUtils.h" #include "SMESHGUI_Hypotheses.h" +#include "SMESHGUI_HypothesesUtils.h" #include "SMESHGUI_Make2DFrom3DOp.h" #include "SMESHGUI_MakeNodeAtPointDlg.h" #include "SMESHGUI_Measurements.h" @@ -62,9 +68,12 @@ #include "SMESHGUI_MeshOp.h" #include "SMESHGUI_MeshOrderOp.h" #include "SMESHGUI_MeshPatternDlg.h" +#include "SMESHGUI_MeshUtils.h" #include "SMESHGUI_MultiEditDlg.h" #include "SMESHGUI_NodesDlg.h" +#include "SMESHGUI_OffsetDlg.h" #include "SMESHGUI_Operations.h" +#include "SMESHGUI_PatternUtils.h" #include "SMESHGUI_Preferences_ScalarBarDlg.h" #include "SMESHGUI_PropertiesDlg.h" #include "SMESHGUI_RemoveElementsDlg.h" @@ -78,18 +87,11 @@ #include "SMESHGUI_SewingDlg.h" #include "SMESHGUI_SingleEditDlg.h" #include "SMESHGUI_SmoothingDlg.h" +#include "SMESHGUI_SpinBox.h" +#include "SMESHGUI_SplitBiQuad.h" #include "SMESHGUI_SymmetryDlg.h" #include "SMESHGUI_TranslationDlg.h" #include "SMESHGUI_TransparencyDlg.h" -#include "SMESHGUI_DisplayEntitiesDlg.h" -#include "SMESHGUI_SplitBiQuad.h" - -#include "SMESHGUI_FilterUtils.h" -#include "SMESHGUI_GEOMGenUtils.h" -#include "SMESHGUI_GroupUtils.h" -#include "SMESHGUI_HypothesesUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_PatternUtils.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_VTKUtils.h" @@ -100,38 +102,34 @@ #include "SMESH_ActorUtils.h" #include "SMESH_Client.hxx" #include "SMESH_ScalarBarActor.h" +#include #include "SMESH_TypeFilter.hxx" // SALOME GUI includes -#include -#include -#include -#include -#include - #include #include #include #include #include - -#include -#include -#include - -#include - +#include +#include +#include #include #include #include #include #include #include - -#include -#include - -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifndef DISABLE_PLOT2DVIEWER #include @@ -143,17 +141,18 @@ #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes) #include CORBA_CLIENT_HEADER(SMESH_MeshEditor) #include CORBA_CLIENT_HEADER(SMESH_Measurements) +#include CORBA_CLIENT_HEADER(SMESH_Mesh) // Qt includes // #define INCLUDE_MENUITEM_DEF // VSR commented ???????? #include +#include +#include +#include +#include #include #include -#include #include -#include -#include -#include // BOOST includes #include @@ -173,6 +172,7 @@ #include #include #include "utilities.h" +#include // OCCT includes #include @@ -238,8 +238,8 @@ namespace } else if ( theCommandID == SMESHOp::OpImportSAUV || theCommandID == SMESHOp::OpPopupImportSAUV ) { - filter.append( QObject::tr( "SAUV files (*.sauv*)" ) ); - filter.append( QObject::tr( "All files (*)" ) ); + filter.append( QObject::tr( "SAUV_FILES_FILTER" ) + " (*.sauv *.sauve)" ); + filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" ); } else if ( theCommandID == SMESHOp::OpImportGMF || theCommandID == SMESHOp::OpPopupImportGMF ) { @@ -489,17 +489,11 @@ namespace QDialogButtonBox* btnbox = msgBox.findChild(); lt->addWidget(&dontShowCheckBox, lt->rowCount(), lt->columnCount()-1, lt->rowCount(), lt->columnCount()); lt->addWidget(btnbox, lt->rowCount(), 0, lt->rowCount(), lt->columnCount()); - if(msgBox.exec() == QMessageBox::Ok) - { - if(dontShowCheckBox.checkState() == Qt::Checked) - { - if ( resMgr ) - resMgr->setValue( "SMESH", "show_warning", false); - } - aCheckWarn = false; - } - else + if ( msgBox.exec() != QMessageBox::Ok ) return; + + if ( dontShowCheckBox.checkState() == Qt::Checked && resMgr ) + resMgr->setValue( "SMESH", "show_warning", false); } QString aMeshName = anIObject->getName(); @@ -548,7 +542,7 @@ namespace } } } - + // Warn the user about presence of not supported elements QString format; std::vector< SMESH::EntityType > notSupportedElemTypes, presentNotSupported; @@ -603,6 +597,7 @@ namespace notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon ); notSupportedElemTypes.push_back( SMESH::Entity_Quad_Pyramid ); notSupportedElemTypes.push_back( SMESH::Entity_Quad_Penta ); + notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Penta ); notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism ); notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra ); notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polyhedra ); @@ -626,6 +621,7 @@ namespace "SMESH_TETRAHEDRA","SMESH_QUADRATIC_TETRAHEDRONS","SMESH_PYRAMIDS", "SMESH_QUADRATIC_PYRAMIDS","SMESH_HEXAHEDRA","SMESH_QUADRATIC_HEXAHEDRONS", "SMESH_TRIQUADRATIC_HEXAHEDRONS","SMESH_PENTAHEDRA","SMESH_QUADRATIC_PENTAHEDRONS", + "SMESH_BIQUADRATIC_PENTAHEDRONS", "SMESH_OCTAHEDRA","SMESH_POLYEDRONS","SMESH_QUADRATIC_POLYEDRONS","SMESH_BALLS" }; // is typeMsg complete? (compilation failure mains that enum SMDSAbs_EntityType changed) @@ -650,8 +646,10 @@ namespace // Get parameters of export operation - QString aFilename; - SMESH::MED_VERSION aFormat = SMESH::MED_V2_2; + QString aFilename; + int aFormat =-1; // for MED version used for write + bool isOkToWrite = true; // to check MED file version compatibility before adding a mesh in an existing file + // Init the parameters with the default values bool aIsASCII_STL = true; bool toCreateGroups = false; @@ -659,6 +657,7 @@ namespace toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false ); bool toOverwrite = true; bool toFindOutDim = true; + double zTol = resMgr ? resMgr->doubleValue( "SMESH", "med_ztolerance", 0. ) : 0.; QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH"); QString anInitialPath = ""; @@ -667,7 +666,7 @@ namespace QList< QPair< GEOM::ListOfFields_var, QString > > aFieldList; - // Get a file name to write in and additional otions + // Get a file name to write in and additional options if ( isUNV || isDAT || isGMF ) // Export w/o options { if ( isUNV ) @@ -684,7 +683,14 @@ namespace } else if ( isCGNS )// Export to CGNS { - SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true ); + const char* theByTypeResource = "cgns_group_elems_by_type"; + toCreateGroups = SMESHGUI::resourceMgr()->booleanValue( "SMESH", theByTypeResource, false ); + + QStringList checkBoxes; + checkBoxes << QObject::tr("CGNS_EXPORT_ELEMS_BY_TYPE"); + + SalomeApp_CheckFileDlg* fd = + new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true ); fd->setWindowTitle( aTitle ); fd->setNameFilter( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" ); if ( !anInitialPath.isEmpty() ) @@ -692,10 +698,13 @@ namespace fd->selectFile(aMeshName); SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd ); fd->setValidator( fv ); + fd->SetChecked( toCreateGroups, 0 ); if ( fd->exec() ) aFilename = fd->selectedFile(); - toOverwrite = fv->isOverwrite(); + toOverwrite = fv->isOverwrite(aFilename); + toCreateGroups = fd->IsChecked(0); + SMESHGUI::resourceMgr()->setValue("SMESH", theByTypeResource, toCreateGroups ); delete fd; } @@ -728,25 +737,32 @@ namespace } else if ( isMED || isSAUV ) // Export to MED or SAUV { - QMap aFilterMap; - //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2)); + int defaultVersion = 0; + QMap aFilterMap; if ( isMED ) { - QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2)); - //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 ); - aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 ); + //filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)"; + //QString vmed (aMesh->GetVersionString(-1, 2)); + SMESH::long_array_var mvok = aMesh->GetMEDVersionsCompatibleForAppend(); + if ( mvok->length() > 0) + defaultVersion = mvok[0]; // the current version to set the default filter on it + for ( CORBA::ULong i = 0; i < mvok->length(); ++i ) + { + QString vs = (char*)( SMESH_Comment( mvok[i]/10 ) << "." << mvok[i]%10 ); + MESSAGE("MED version: " << vs.toStdString()); + aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vs ) + " (*.med)", mvok[i]); + } } else { // isSAUV - aFilterMap.insert("All files (*)", SMESH::MED_V2_1 ); - aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 ); - aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 ); + aFilterMap.insert("All files (*)", -1 ); + aFilterMap.insert("SAUV files (*.sauv)", defaultVersion ); // 0 = default filter (defaultVersion) + aFilterMap.insert("SAUV files (*.sauve)", -1 ); } - QStringList filters; - QString aDefaultFilter; - QMap::const_iterator it = aFilterMap.begin(); + QMap::const_iterator it = aFilterMap.begin(); + QString aDefaultFilter = it.key(); for ( ; it != aFilterMap.end(); ++it ) { filters.push_back( it.key() ); - if (it.value() == SMESH::MED_V2_2) + if (it.value() == defaultVersion) // explicit default for MED = current MED version aDefaultFilter = it.key(); } QStringList checkBoxes; @@ -754,9 +770,23 @@ namespace SMESHGUI_FieldSelectorWdg* fieldSelWdg = new SMESHGUI_FieldSelectorWdg(); QList< QWidget* > wdgList; - if ( fieldSelWdg->GetAllFeilds( aMeshList, aFieldList )) + if ( fieldSelWdg->GetAllFields( aMeshList, aFieldList )) wdgList.append( fieldSelWdg ); + QWidget* zTolWdg = new QWidget(); + QCheckBox* zTolCheck = new QCheckBox( QObject::tr( "SMESH_ZTOLERANCE" ), zTolWdg ); + SMESHGUI_SpinBox* zTolSpin = new SMESHGUI_SpinBox( zTolWdg ); + QHBoxLayout* zTolLayout = new QHBoxLayout( zTolWdg ); + zTolLayout->addWidget( zTolCheck ); + zTolLayout->addWidget( zTolSpin ); + zTolLayout->setMargin( 0 ); + zTolSpin->RangeStepAndValidator( 0, 1e+100, 1., "length_precision" ); + zTolSpin->setValue( zTol ); + QObject::connect( zTolCheck, SIGNAL( toggled(bool)), zTolSpin, SLOT( setEnabled(bool))); + zTolCheck->setChecked( resMgr->booleanValue( "SMESH", "enable_ztolerance", false )); + zTolSpin ->setEnabled( zTolCheck->isChecked() ); + wdgList.append( zTolWdg ); + SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList ); fd->setWindowTitle( aTitle ); @@ -767,8 +797,8 @@ namespace if ( !anInitialPath.isEmpty() ) fd->setDirectory( anInitialPath ); fd->selectFile(aMeshName); - - + + QListView *lview = fd->findChild("listView"); if( lview ) { lview->setMinimumHeight(200); @@ -782,7 +812,10 @@ namespace fd->setValidator( fv ); bool is_ok = false; - while (!is_ok) { + while (!is_ok) + { + //MESSAGE("******* Loop on file dialog ***********"); + isOkToWrite =true; if ( fd->exec() ) aFilename = fd->selectedFile(); else { @@ -790,44 +823,33 @@ namespace break; } aFormat = aFilterMap[fd->selectedNameFilter()]; - toOverwrite = fv->isOverwrite(); + //MESSAGE("selected version: " << aFormat << " file: " << aFilename.toUtf8().constData()); + toOverwrite = fv->isOverwrite(aFilename); + //MESSAGE("toOverwrite:" << toOverwrite); is_ok = true; if ( !aFilename.isEmpty() ) { - // med-2.1 does not support poly elements - if ( aFormat==SMESH::MED_V2_1 ) - for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) { - SMESH::SMESH_IDSource_var aMeshItem = (*aMeshIter).first; - SMESH::long_array_var nbElems = aMeshItem->GetMeshInfo(); - if ( nbElems[ SMESH::Entity_Polygon ] + nbElems[ SMESH::Entity_Quad_Polygon ] + - nbElems[ SMESH::Entity_Polyhedra ] + nbElems[ SMESH::Entity_Quad_Polyhedra ]) - { - int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_EXPORT_MED_V2_1").arg((*aMeshIter).second), - QObject::tr("SMESH_BUT_YES"), - QObject::tr("SMESH_BUT_NO"), 0, 1); - if (aRet != 0) { - is_ok = false; - break; - } - } - } 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.toUtf8().constData(), aVersion ); - if( !isVersionOk || aVersion != aFormat ) { + // append is only possible if the existing file format is compatible + bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckWriteCompatibility( aFilename.toUtf8().constData() ); + MESSAGE("Append check, isVersionOk:" << isVersionOk); + if ( !isVersionOk ) { int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), QObject::tr("SMESH_EXPORT_MED_VERSION_COLLISION").arg(aFilename), QObject::tr("SMESH_BUT_YES"), QObject::tr("SMESH_BUT_NO"), 0, 1); if (aRet == 0) + { toOverwrite = true; + //MESSAGE("incompatible MED file version for add, overwrite accepted"); + } else + { + isOkToWrite = false; is_ok = false; + //MESSAGE("incompatible MED file version for add, overwrite refused"); + } } - QStringList aMeshNamesCollisionList; SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toUtf8().constData() ); for( int i = 0, n = aMeshNames->length(); i < n; i++ ) { @@ -841,6 +863,7 @@ namespace } } if( !aMeshNamesCollisionList.isEmpty() ) { + isOkToWrite = false; QString aMeshNamesCollisionString = aMeshNamesCollisionList.join( ", " ); int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), @@ -848,8 +871,11 @@ namespace QObject::tr("SMESH_BUT_YES"), QObject::tr("SMESH_BUT_NO"), QObject::tr("SMESH_BUT_CANCEL"), 0, 2); - if (aRet == 0) + MESSAGE("answer collision name " << aRet); + if (aRet == 0) { toOverwrite = true; + isOkToWrite = true; + } else if (aRet == 2) is_ok = false; } @@ -858,9 +884,14 @@ namespace } toCreateGroups = fd->IsChecked(0); toFindOutDim = fd->IsChecked(1); - fieldSelWdg->GetSelectedFeilds(); + zTol = zTolCheck->isChecked() ? zTolSpin->value() : -1; + fieldSelWdg->GetSelectedFields(); + if ( resMgr ) resMgr->setValue( "SMESH", "enable_ztolerance", zTolCheck->isChecked() ); + if ( !fieldSelWdg->parent() ) delete fieldSelWdg; + if ( !zTolWdg->parent() ) + delete zTolWdg; delete fd; } else @@ -879,19 +910,20 @@ namespace try { // Renumbering is not needed since SMDS redesign in V6.2.0 (Nov 2010) -// bool Renumber = false; -// // PAL 14172 : Check of we have to renumber or not from the preferences before export -// if (resMgr) -// Renumber= resMgr->booleanValue("renumbering"); -// if (Renumber){ -// SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); + // bool Renumber = false; + // // PAL 14172 : Check of we have to renumber or not from the preferences before export + // if (resMgr) + // Renumber= resMgr->booleanValue("renumbering"); + // if (Renumber){ + // SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); // aMeshEditor->RenumberNodes(); // aMeshEditor->RenumberElements(); // if ( SMESHGUI::automaticUpdate() ) // SMESH::UpdateView(); // } - if ( isMED ) + if ( isMED && isOkToWrite) { + MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData()); aMeshIter = aMeshList.begin(); for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ ) { @@ -900,13 +932,14 @@ namespace 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 ); + if ( !hasFields && aMeshOrGroup->_is_equivalent( aMeshItem ) && zTol < 0 ) + aMeshItem->ExportMED( aFilename.toUtf8().data(), toCreateGroups, aFormat, + toOverwrite && aMeshIndex == 0, toFindOutDim ); else - aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim, - fields, geoAssFields.toLatin1().data() ); + aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), + toCreateGroups, aFormat, + toOverwrite && aMeshIndex == 0, toFindOutDim, + fields, geoAssFields.toLatin1().data(), zTol ); } } else if ( isSAUV ) @@ -948,7 +981,8 @@ namespace SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh(); aMeshItem->ExportCGNS( aMeshOrGroup, aFilename.toUtf8().data(), - toOverwrite && aMeshIndex == 0 ); + toOverwrite && aMeshIndex == 0, + toCreateGroups ); } } else if ( isGMF ) @@ -961,7 +995,7 @@ namespace wc.suspend(); SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_EXPORT_FAILED")); + QObject::tr("SMESH_EXPORT_FAILED") + SalomeApp_Tools::ExceptionToString(S_ex)); wc.resume(); } } @@ -1125,6 +1159,8 @@ namespace type = QObject::tr( "LENGTH_EDGES" ); else if ( dynamic_cast< SMESH::Controls::Length2D* >( f.get() ) ) type = QObject::tr( "LENGTH2D_EDGES" ); + else if ( dynamic_cast< SMESH::Controls::Deflection2D* >( f.get() ) ) + type = QObject::tr( "DEFLECTION2D_FACES" ); else if ( dynamic_cast< SMESH::Controls::MultiConnection* >( f.get() ) ) type = QObject::tr( "MULTI_BORDERS" ); else if ( dynamic_cast< SMESH::Controls::MultiConnection2D* >( f.get() ) ) @@ -1347,6 +1383,108 @@ namespace } } + // Break link with Shaper model + void breakShaperLink() + { + 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::getStudy(); + std::string aEntry = anIObject->getEntry(); + _PTR(SObject) aSObj = aStudy->FindObjectID(aEntry); + if (aSObj) { + std::string aName = aSObj->GetName(); + QMessageBox::StandardButton aRes = SUIT_MessageBox::warning(SMESHGUI::desktop(), + QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("MSG_BREAK_SHAPER_LINK").arg(aName.c_str()), + SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No); + if (aRes == SUIT_MessageBox::Yes) { + SUIT_DataOwnerPtrList aList; + aSel->selected(aList, "ObjectBrowser", true); + SUIT_DataOwner* aOwn = aList.first(); + LightApp_DataOwner* sowner = dynamic_cast(aOwn); + QString aREntry = sowner->entry(); + + static GEOM::GEOM_Gen_var geomGen; + if (CORBA::is_nil(geomGen)) { + SalomeApp_Application* app = dynamic_cast + (SUIT_Session::session()->activeApplication()); + if (app) { + SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA(app->namingService()); + Engines::EngineComponent_var comp = + ls->FindOrLoad_Component("FactoryServer", "SHAPERSTUDY"); + geomGen = GEOM::GEOM_Gen::_narrow(comp); + } + } + if (!CORBA::is_nil(geomGen)) + { + geomGen->BreakLink(aREntry.toStdString().c_str()); + SMESHGUI::GetSMESHGUI()->updateObjBrowser(); + + // remove actors whose objects are removed by BreakLink() + QList wndList = SMESHGUI::desktop()->windows(); + SUIT_ViewWindow* wnd; + foreach(wnd, wndList) + SMESH::UpdateActorsAfterUpdateStudy(wnd); + } + } + } + } + } + } + + //================================================================================ + /*! + * \brief Return true if a mesh icon == ICON_SMESH_TREE_GEOM_MODIF + * which means that the mesh can't be modified. It should be either re-computed + * or breakShaperLink()'ed. Warn the user about it. + */ + //================================================================================ + + bool warnOnGeomModif() + { + SALOME_ListIO selected; + if ( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() ) + aSel->selectedObjects(selected,"",/*convertReferences=*/false); + + SALOME_ListIteratorOfListIO It( selected ); + for ( ; It.More(); It.Next() ) + { + Handle(SALOME_InteractiveObject) io = It.Value(); + if ( !io->hasEntry() ) continue; + _PTR(SObject) so = SMESH::getStudy()->FindObjectID( io->getEntry() ); + SMESH::SMESH_Mesh_var mesh; + while ( mesh->_is_nil() && so ) + { + CORBA::Object_var obj = SMESH::SObjectToObject( so ); + SMESH::SMESH_IDSource_var isrc = SMESH::SMESH_IDSource::_narrow( obj ); + if ( isrc->_is_nil() ) + so = so->GetFather(); + else + mesh = isrc->GetMesh(); + } + if ( mesh->_is_nil() ) continue; + so = SMESH::FindSObject( mesh ); + if ( !so ) continue; + _PTR(GenericAttribute) attr; + so->FindAttribute( attr, "AttributePixMap" ); + _PTR(AttributePixMap) pixmap = attr; + if ( !pixmap ) continue; + + if ( pixmap->GetPixMap() == "ICON_SMESH_TREE_GEOM_MODIF" ) + { + SUIT_MessageBox::warning(SMESHGUI::desktop(), + QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("MSG_WARN_ON_GEOM_MODIF")); + return true; + } + } + return false; + } + void SetDisplayMode(int theCommandID, VTK::MarkerMap& theMarkerMap) { SALOME_ListIO selected; @@ -1461,7 +1599,7 @@ namespace presentEntities = presentEntities | SMESH_Actor::e0DElements; if ( !(presentEntities & SMESH_Actor::eBallElem) && anActor->GetObject()->GetNbEntities( SMDSAbs_Ball ) ) presentEntities = presentEntities | SMESH_Actor::eBallElem; - + // as we know that all types of elements are present, we can exit the loop if ( presentEntities == SMESH_Actor::eAllEntity ) break; @@ -1499,7 +1637,7 @@ namespace dlg.setShrinkCoef( int( shrinkCoef * 100. ) ); // hide unused controls dlg.showControls( presentEntities, hasNodes ); - + if ( dlg.exec() ) { nodeColor = dlg.nodeColor(); markerType = dlg.nodeMarkerType(); @@ -1533,7 +1671,7 @@ namespace if ( !IObject->hasEntry() ) continue; SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() ); if ( !anActor ) continue; - + // nodes: color, marker anActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() ); if ( markerType != VTK::MT_USER ) { @@ -1578,17 +1716,17 @@ namespace aColor = nodeColor; break; case SMESH::EDGE: aColor = edgeColor; break; - case SMESH::FACE: + case SMESH::FACE: aColor = faceColor; break; case SMESH::VOLUME: aColor = volumeColor; break; - case SMESH::ELEM0D: + case SMESH::ELEM0D: aColor = elem0dColor; break; - case SMESH::BALL: + case SMESH::BALL: aColor = ballColor; break; default: break; } - + if ( aColor.isValid() ) { SALOMEDS::Color aGroupColor; aGroupColor.R = aColor.redF(); @@ -1657,6 +1795,7 @@ namespace ActionControl.Bind( SMESHOp::OpBareBorderFace, SMESH_Actor::eBareBorderFace ); ActionControl.Bind( SMESHOp::OpOverConstrainedFace, SMESH_Actor::eOverConstrainedFace ); ActionControl.Bind( SMESHOp::OpLength2D, SMESH_Actor::eLength2D ); + ActionControl.Bind( SMESHOp::OpDeflection2D, SMESH_Actor::eDeflection2D ); ActionControl.Bind( SMESHOp::OpConnection2D, SMESH_Actor::eMultiConnection2D ); ActionControl.Bind( SMESHOp::OpArea, SMESH_Actor::eArea ); ActionControl.Bind( SMESHOp::OpTaper, SMESH_Actor::eTaper ); @@ -1673,7 +1812,9 @@ namespace ActionControl.Bind( SMESHOp::OpOverConstrainedVolume, SMESH_Actor::eOverConstrainedVolume ); ActionControl.Bind( SMESHOp::OpEqualVolume, SMESH_Actor::eCoincidentElems3D ); - return theReversed ? ActionControl.Find2( theID ) : ActionControl.Find1( theID ); + if ( theReversed ) + return ActionControl.IsBound2( theID ) ? ActionControl.Find2( theID ) : 0; + return ActionControl.IsBound1( theID ) ? ActionControl.Find1( theID ) : 0; } void Control( int theCommandID ) @@ -1712,7 +1853,7 @@ namespace int anEntitiesCount = anActor->GetNumberControlEntities(); if (anEntitiesCount >= 0) functorName = functorName + ": " + QString::number(anEntitiesCount); - anActor->GetScalarBarActor()->SetTitle( functorName.toLatin1().constData() ); + anActor->GetScalarBarActor()->SetTitle( functorName.toUtf8().constData() ); SMESH::RepaintCurrentView(); #ifndef DISABLE_PLOT2DVIEWER if ( anActor->GetPlot2Histogram() ) { @@ -1810,7 +1951,7 @@ namespace v = qMax( uint(0), qMin ( v, size-1 ) ); return v; } - + } //namespace void SMESHGUI::OnEditDelete() @@ -1824,34 +1965,43 @@ void SMESHGUI::OnEditDelete() _PTR(GenericAttribute) anAttr; _PTR(AttributeIOR) anIOR; + const int objectCountLimit = 30; // PAL23599 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()); + Handle(SALOME_InteractiveObject) anIO = anIt.Value(); + if ( anIO.IsNull() ) continue; + + QString father = "unknown", name; + + _PTR(SObject) aSO = aStudy->FindObjectID( anIO->getEntry() ); if (aSO) { + father = QString::fromStdString( aSO->GetFatherComponent()->ComponentDataType() ); // 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() ); + name = QString::fromStdString ( aRefSObj->GetName() ); + father = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() ); } else - aNameList.append(anIO->getName()); + name = anIO->getName(); objectCount++; } + if ( objectCount < objectCountLimit ) { // avoid occupying the whole screen + aNameList.append("\n - "); + aNameList.append( name ); + } if( aParentComponent.isNull() ) - aParentComponent = cur; - else if( !aParentComponent.isEmpty() && aParentComponent!=cur ) + aParentComponent = father; + else if( !aParentComponent.isEmpty() && aParentComponent!=father ) aParentComponent = ""; } + if ( objectCount >= objectCountLimit ) + aNameList.append("\n - ..."); if ( objectCount == 0 ) return; // No Valid Objects Selected @@ -1873,8 +2023,8 @@ void SMESHGUI::OnEditDelete() 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) + // Put one level of sub-objects of the selected SO's into a list + // in order to get objects inside folders like "Assigned Algorithms" std::list< _PTR(SObject) > listSO; SALOME_ListIteratorOfListIO It(selected); for( ; It.More(); It.Next()) // loop on selected IO's @@ -1895,43 +2045,47 @@ void SMESHGUI::OnEditDelete() 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() ); - } + + _PTR(ChildIterator) it = aStudy->NewChildIterator( aSO ); + 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; + std::vector< _PTR(SObject) > subSO; 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 + + int nbChildren = SO->GetLastChildTag(); + subSO.clear(); + subSO.reserve( 1 + nbChildren ); + subSO.push_back( SO ); + if ( nbChildren > 0 ) + { + _PTR(ChildIterator) it = aStudy->NewChildIterator( SO ); + for ( it->InitEx( true ); it->More(); it->Next() ) + subSO.push_back( it->Value() ); + } + for ( size_t i = 0; i < subSO.size(); ++i ) + { + std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( subSO[i] ); + for ( size_t j = 0; j < aReferences.size(); j++ ) { + _PTR(SComponent) aComponent = aReferences[j]->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(); - } - // Treat SO's in the list starting from the back aStudyBuilder->NewCommand(); // There is a transaction for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO ) @@ -1941,7 +2095,7 @@ void SMESHGUI::OnEditDelete() std::string anEntry = SO->GetID(); /** Erase graphical object and remove all its data **/ - if(SO->FindAttribute(anAttr, "AttributeIOR")) { + if ( SO->FindAttribute( anAttr, "AttributeIOR" )) { SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true); } /** Remove an object from data structures **/ @@ -1954,10 +2108,6 @@ void SMESHGUI::OnEditDelete() 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); } else { Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject @@ -2104,20 +2254,20 @@ bool SMESHGUI::automaticUpdate( SMESH::SMESH_IDSource_ptr theMesh, 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] + + 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] + info[SMDSEntity_Quad_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] + + 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_BiQuad_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; @@ -2498,6 +2648,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) #ifndef DISABLE_PLOT2DVIEWER SMESH::ProcessIn2DViewers(anActor,SMESH::RemoveFrom2dViewer); #endif + anActor->UpdateFilter(); } } } @@ -2605,9 +2756,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if(isStudyLocked()) break; SUIT_OverrideCursor wc; try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif SMESH::UpdateView(); } catch (std::bad_alloc) { // PAL16774 (Crash after display of many groups) @@ -2686,6 +2835,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) else aSel->setSelectedObjects( to_process ); + if ( vtkwnd && vtkwnd->GetRenderer() && !isStudyLocked() && + ( theCommandID==SMESHOp::OpShow || theCommandID==SMESHOp::OpShowOnly ) ) + vtkwnd->GetRenderer()->AdjustActors(); + break; } @@ -2704,16 +2857,19 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case SMESHOp::OpCreateMesh: - case SMESHOp::OpCreateSubMesh: case SMESHOp::OpEditMeshOrSubMesh: case SMESHOp::OpEditMesh: case SMESHOp::OpEditSubMesh: + case SMESHOp::OpMeshOrder: + case SMESHOp::OpCreateSubMesh: + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified + + case SMESHOp::OpCreateMesh: case SMESHOp::OpCompute: case SMESHOp::OpComputeSubMesh: case SMESHOp::OpPreCompute: case SMESHOp::OpEvaluate: - case SMESHOp::OpMeshOrder: startOperation( theCommandID ); break; case SMESHOp::OpCopyMesh: @@ -2742,6 +2898,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( isStudyLocked() ) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified /*Standard_Boolean aRes; SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface(IObject); @@ -2772,6 +2930,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( isStudyLocked() ) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified EmitSignalDeactivateDialog(); SMESHGUI_MultiEditDlg* aDlg = NULL; @@ -2790,6 +2950,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpSmoothing: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_SmoothingDlg( this ) )->show(); @@ -2802,6 +2964,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpExtrusion: { if (isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if (vtkwnd) { EmitSignalDeactivateDialog(); ( new SMESHGUI_ExtrusionDlg ( this ) )->show(); @@ -2813,6 +2977,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpExtrusionAlongAPath: { if (isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if (vtkwnd) { EmitSignalDeactivateDialog(); ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show(); @@ -2824,6 +2990,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpRevolution: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_RevolutionDlg( this ) )->show(); @@ -2837,6 +3005,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( isStudyLocked() ) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); @@ -2853,6 +3023,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpReorientFaces: case SMESHOp::OpCreateGeometryGroup: { + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified startOperation( theCommandID ); break; } @@ -2865,6 +3037,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified EmitSignalDeactivateDialog(); SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil(); @@ -2892,6 +3066,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified EmitSignalDeactivateDialog(); LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); @@ -2969,6 +3145,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified EmitSignalDeactivateDialog(); LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); @@ -3066,6 +3244,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( isStudyLocked() ) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified EmitSignalDeactivateDialog(); @@ -3086,6 +3266,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( isStudyLocked() ) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified EmitSignalDeactivateDialog(); SMESHGUI_GroupOpDlg* aDlg = new SMESHGUI_DimGroupDlg( this ); @@ -3094,6 +3276,20 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } + case SMESHOp::OpFaceGroupsByEdges: // Create face groups separated by sharp edges + { + if ( isStudyLocked() ) + break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified + + EmitSignalDeactivateDialog(); + SMESHGUI_FaceGroupsSeparatedByEdgesDlg* aDlg = new SMESHGUI_FaceGroupsSeparatedByEdgesDlg( this ); + aDlg->show(); + + break; + } + case SMESHOp::OpDeleteGroup: // Delete groups with their contents { if ( !vtkwnd ) @@ -3125,7 +3321,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SALOME_ListIteratorOfListIO It( selected ); for ( ; It.More(); It.Next() ) { SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page ); - dlg->showInfo( It.Value() ); + dlg->showInfo( It.Value() ); dlg->show(); } } @@ -3145,6 +3341,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpEditHypothesis: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; @@ -3190,6 +3388,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpUnassign: // REMOVE HYPOTHESIS / ALGORITHMS { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified SUIT_OverrideCursor wc; LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); @@ -3221,6 +3421,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpHexagonalPrism: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); SMDSAbs_EntityType type = SMDSEntity_Edge; @@ -3247,6 +3449,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpPolyhedron: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show(); @@ -3265,10 +3469,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpQuadraticTetrahedron: case SMESHOp::OpQuadraticPyramid: case SMESHOp::OpQuadraticPentahedron: + case SMESHOp::OpBiQuadraticPentahedron: case SMESHOp::OpQuadraticHexahedron: case SMESHOp::OpTriQuadraticHexahedron: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); SMDSAbs_EntityType type = SMDSEntity_Last; @@ -3283,6 +3490,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpQuadraticTetrahedron: type = SMDSEntity_Quad_Tetra; break; case SMESHOp::OpQuadraticPyramid: type = SMDSEntity_Quad_Pyramid; break; case SMESHOp::OpQuadraticPentahedron: type = SMDSEntity_Quad_Penta; break; + case SMESHOp::OpBiQuadraticPentahedron: type = SMDSEntity_BiQuad_Penta; break; case SMESHOp::OpQuadraticHexahedron: type = SMDSEntity_Quad_Hexa; break; case SMESHOp::OpTriQuadraticHexahedron: type = SMDSEntity_TriQuad_Hexa; break; default: break; @@ -3299,6 +3507,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpRemoveNodes: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_RemoveNodesDlg( this ) )->show(); @@ -3312,6 +3522,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpRemoveElements: // REMOVES ELEMENTS { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_RemoveElementsDlg( this ) )->show(); @@ -3326,6 +3538,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpClearMesh: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified SALOME_ListIO selected; if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() ) @@ -3343,7 +3557,6 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( aMesh->NbNodes() == 0 ) // imported mesh is not empty SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true); _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh); - SMESH::ModifiedMesh( aMeshSObj, false, true); // hide groups and submeshes _PTR(ChildIterator) anIter = SMESH::getStudy()->NewChildIterator( aMeshSObj ); @@ -3366,6 +3579,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpRemoveOrphanNodes: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified SALOME_ListIO selected; if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() ) aSel->selectedObjects( selected ); @@ -3405,6 +3620,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpRenumberingNodes: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_RenumberingDlg( this, 0 ) )->show(); @@ -3419,6 +3636,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpRenumberingElements: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_RenumberingDlg( this, 1 ) )->show(); @@ -3433,6 +3652,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpTranslation: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_TranslationDlg( this ) )->show(); @@ -3446,6 +3667,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpRotation: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_RotationDlg( this ) )->show(); @@ -3459,6 +3682,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpSymmetry: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if(vtkwnd) { EmitSignalDeactivateDialog(); ( new SMESHGUI_SymmetryDlg( this ) )->show(); @@ -3472,6 +3697,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpScale: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_ScaleDlg( this ) )->show(); @@ -3483,9 +3710,27 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } + case SMESHOp::OpOffset: + { + if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified + if ( vtkwnd ) { + EmitSignalDeactivateDialog(); + ( new SMESHGUI_OffsetDlg( this ) )->show(); + } + else { + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + } + break; + } + case SMESHOp::OpSewing: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if(vtkwnd) { EmitSignalDeactivateDialog(); ( new SMESHGUI_SewingDlg( this ) )->show(); @@ -3499,6 +3744,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpMergeNodes: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if(vtkwnd) { EmitSignalDeactivateDialog(); ( new SMESHGUI_MergeDlg( this, 0 ) )->show(); @@ -3512,6 +3759,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpMergeElements: { if (isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if (vtkwnd) { EmitSignalDeactivateDialog(); ( new SMESHGUI_MergeDlg( this, 1 ) )->show(); @@ -3523,12 +3772,16 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } case SMESHOp::OpMoveNode: // MAKE MESH PASS THROUGH POINT + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified startOperation( SMESHOp::OpMoveNode ); break; case SMESHOp::OpDuplicateNodes: { if(isStudyLocked()) break; + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified if ( vtkwnd ) { EmitSignalDeactivateDialog(); ( new SMESHGUI_DuplicateNodesDlg( this ) )->show(); @@ -3541,6 +3794,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } case SMESHOp::OpElem0DOnElemNodes: // 0D_ON_ALL_NODES + if ( warnOnGeomModif() ) + break; // action forbiden as geometry modified startOperation( SMESHOp::OpElem0DOnElemNodes ); break; @@ -3574,6 +3829,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpBareBorderFace: case SMESHOp::OpOverConstrainedFace: case SMESHOp::OpLength2D: + case SMESHOp::OpDeflection2D: case SMESHOp::OpConnection2D: case SMESHOp::OpArea: case SMESHOp::OpTaper: @@ -3651,6 +3907,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpPropertiesVolume: case SMESHOp::OpMinimumDistance: case SMESHOp::OpBoundingBox: + case SMESHOp::OpAngle: { int page = SMESHGUI_MeasureDlg::MinDistance; if ( theCommandID == SMESHOp::OpBoundingBox ) @@ -3661,6 +3918,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) page = SMESHGUI_MeasureDlg::Area; else if ( theCommandID == SMESHOp::OpPropertiesVolume ) page = SMESHGUI_MeasureDlg::Volume; + else if ( theCommandID == SMESHOp::OpAngle ) + page = SMESHGUI_MeasureDlg::Angle; EmitSignalDeactivateDialog(); SMESHGUI_MeasureDlg* dlg = new SMESHGUI_MeasureDlg( SMESHGUI::desktop(), page ); @@ -3670,6 +3929,9 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpSortChild: ::sortChildren(); break; + case SMESHOp::OpBreakLink: + ::breakShaperLink(); + break; } @@ -3762,7 +4024,7 @@ void SMESHGUI::createPopupItem( const int id, popupMgr()->insert( action( id ), pId, 0 ); QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality(); - QString dc = "selcount"; // VSR : insetad of QtxPopupSelection::defSelCountParam() + QString dc = "selcount"; // VSR : instead of QtxPopupSelection::defSelCountParam() QString rule = "(%1) and (%2) and (%3)"; rule = rule.arg( QString( "%1>0" ).arg( dc ) ); if( clients.isEmpty() ) @@ -3855,6 +4117,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpIntersectGroups, "INT_GROUP", "ICON_INTERSECT" ); createSMESHAction( SMESHOp::OpCutGroups, "CUT_GROUP", "ICON_CUT" ); createSMESHAction( SMESHOp::OpGroupUnderlyingElem, "UNDERLYING_ELEMS", "ICON_UNDERLYING_ELEMS" ); + createSMESHAction( SMESHOp::OpFaceGroupsByEdges, "FACE_GROUPS_BY_EDGES", "ICON_FACE_GROUPS_BY_EDGES" ); createSMESHAction( SMESHOp::OpAddElemGroupPopup, "ADD_TO_GROUP" ); createSMESHAction( SMESHOp::OpRemoveElemGroupPopup, "REMOVE_FROM_GROUP" ); createSMESHAction( SMESHOp::OpDeleteGroup, "DEL_GROUP", "ICON_DEL_GROUP" ); @@ -3875,6 +4138,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpBareBorderFace, "BARE_BORDER_FACE", "ICON_BARE_BORDER_FACE", 0, true ); createSMESHAction( SMESHOp::OpOverConstrainedFace, "OVER_CONSTRAINED_FACE", "ICON_OVER_CONSTRAINED_FACE", 0, true ); createSMESHAction( SMESHOp::OpLength2D, "LENGTH_2D", "ICON_LENGTH_2D", 0, true ); + createSMESHAction( SMESHOp::OpDeflection2D, "DEFLECTION_2D", "ICON_DEFLECTION_2D", 0, true ); createSMESHAction( SMESHOp::OpConnection2D, "CONNECTION_2D", "ICON_CONNECTION_2D", 0, true ); createSMESHAction( SMESHOp::OpArea, "AREA", "ICON_AREA", 0, true ); createSMESHAction( SMESHOp::OpTaper, "TAPER", "ICON_TAPER", 0, true ); @@ -3915,6 +4179,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpQuadraticTetrahedron, "QUADRATIC_TETRAHEDRON", "ICON_DLG_QUADRATIC_TETRAHEDRON" ); createSMESHAction( SMESHOp::OpQuadraticPyramid, "QUADRATIC_PYRAMID", "ICON_DLG_QUADRATIC_PYRAMID" ); createSMESHAction( SMESHOp::OpQuadraticPentahedron, "QUADRATIC_PENTAHEDRON", "ICON_DLG_QUADRATIC_PENTAHEDRON" ); + createSMESHAction( SMESHOp::OpBiQuadraticPentahedron, "BIQUADRATIC_PENTAHEDRON", "ICON_DLG_BIQUADRATIC_PENTAHEDRON" ); createSMESHAction( SMESHOp::OpQuadraticHexahedron, "QUADRATIC_HEXAHEDRON", "ICON_DLG_QUADRATIC_HEXAHEDRON" ); createSMESHAction( SMESHOp::OpTriQuadraticHexahedron, "TRIQUADRATIC_HEXAHEDRON", "ICON_DLG_TRIQUADRATIC_HEXAHEDRON" ); @@ -3930,6 +4195,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpRotation, "ROT", "ICON_DLG_MESH_ROTATION" ); createSMESHAction( SMESHOp::OpSymmetry, "SYM", "ICON_SMESH_SYMMETRY_PLANE" ); createSMESHAction( SMESHOp::OpScale, "SCALE", "ICON_DLG_MESH_SCALE" ); + createSMESHAction( SMESHOp::OpOffset, "OFFSET", "ICON_DLG_MESH_OFFSET" ); createSMESHAction( SMESHOp::OpSewing, "SEW", "ICON_SMESH_SEWING_FREEBORDERS" ); createSMESHAction( SMESHOp::OpMergeNodes, "MERGE", "ICON_SMESH_MERGE_NODES" ); createSMESHAction( SMESHOp::OpMergeElements, "MERGE_ELEMENTS", "ICON_DLG_MERGE_ELEMENTS" ); @@ -3991,6 +4257,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpPropertiesLength, "MEASURE_LENGTH", "ICON_MEASURE_LENGTH" ); createSMESHAction( SMESHOp::OpPropertiesArea, "MEASURE_AREA", "ICON_MEASURE_AREA" ); createSMESHAction( SMESHOp::OpPropertiesVolume, "MEASURE_VOLUME", "ICON_MEASURE_VOLUME" ); + createSMESHAction( SMESHOp::OpAngle, "MEASURE_ANGLE", "ICON_MEASURE_ANGLE" ); createSMESHAction( SMESHOp::OpHide, "HIDE", "ICON_HIDE" ); createSMESHAction( SMESHOp::OpShow, "SHOW", "ICON_SHOW" ); @@ -3998,11 +4265,14 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpSortChild, "SORT_CHILD_ITEMS" ); + createSMESHAction( SMESHOp::OpBreakLink, "BREAK_SHAPER_LINK" ); + QList aCtrlActions; aCtrlActions << SMESHOp::OpFreeNode << SMESHOp::OpEqualNode << SMESHOp::OpNodeConnectivityNb // node controls << SMESHOp::OpFreeEdge << SMESHOp::OpFreeBorder << SMESHOp::OpLength << SMESHOp::OpConnection << SMESHOp::OpEqualEdge // edge controls + << SMESHOp::OpDeflection2D << SMESHOp::OpFreeFace << SMESHOp::OpLength2D << SMESHOp::OpConnection2D << SMESHOp::OpArea << SMESHOp::OpTaper << SMESHOp::OpAspectRatio << SMESHOp::OpMinimumAngle << SMESHOp::OpWarpingAngle << SMESHOp::OpSkew @@ -4088,6 +4358,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpCutGroups, meshId, -1 ); createMenu( separator(), meshId, -1 ); createMenu( SMESHOp::OpGroupUnderlyingElem, meshId, -1 ); + createMenu( SMESHOp::OpFaceGroupsByEdges, meshId, -1 ); createMenu( separator(), meshId, -1 ); createMenu( SMESHOp::OpMeshInformation, meshId, -1 ); //createMenu( SMESHOp::OpStdInfo, meshId, -1 ); @@ -4116,6 +4387,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpSkew, faceId, -1 ); createMenu( SMESHOp::OpMaxElementLength2D, faceId, -1 ); createMenu( SMESHOp::OpEqualFace, faceId, -1 ); + createMenu( SMESHOp::OpDeflection2D, faceId, -1 ); createMenu( SMESHOp::OpAspectRatio3D, volumeId, -1 ); createMenu( SMESHOp::OpVolume, volumeId, -1 ); createMenu( SMESHOp::OpMaxElementLength3D, volumeId, -1 ); @@ -4151,6 +4423,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpQuadraticTetrahedron, addId, -1 ); createMenu( SMESHOp::OpQuadraticPyramid, addId, -1 ); createMenu( SMESHOp::OpQuadraticPentahedron, addId, -1 ); + createMenu( SMESHOp::OpBiQuadraticPentahedron, addId, -1 ); createMenu( SMESHOp::OpQuadraticHexahedron, addId, -1 ); createMenu( SMESHOp::OpTriQuadraticHexahedron, addId, -1 ); @@ -4165,34 +4438,36 @@ void SMESHGUI::initialize( CAM_Application* app ) //createMenu( SMESHOp::OpRenumberingNodes, renumId, -1 ); //createMenu( SMESHOp::OpRenumberingElements, renumId, -1 ); + createMenu( SMESHOp::OpMergeNodes, transfId, -1 ); + createMenu( SMESHOp::OpMergeElements, transfId, -1 ); createMenu( SMESHOp::OpTranslation, transfId, -1 ); createMenu( SMESHOp::OpRotation, transfId, -1 ); createMenu( SMESHOp::OpSymmetry, transfId, -1 ); createMenu( SMESHOp::OpScale, transfId, -1 ); + createMenu( SMESHOp::OpOffset, transfId, -1 ); createMenu( SMESHOp::OpSewing, transfId, -1 ); - createMenu( SMESHOp::OpMergeNodes, transfId, -1 ); - createMenu( SMESHOp::OpMergeElements, transfId, -1 ); createMenu( SMESHOp::OpDuplicateNodes, transfId, -1 ); + createMenu( SMESHOp::OpConvertMeshToQuadratic, modifyId, -1 ); + createMenu( SMESHOp::OpCreateBoundaryElements, modifyId, -1 ); + createMenu( SMESHOp::OpExtrusion, modifyId, -1 ); + createMenu( SMESHOp::OpExtrusionAlongAPath, modifyId, -1 ); + createMenu( SMESHOp::OpRevolution, modifyId, -1 ); + createMenu( SMESHOp::OpOrientation, modifyId, -1 ); + createMenu( SMESHOp::OpReorientFaces, modifyId, -1 ); createMenu( SMESHOp::OpMoveNode, modifyId, -1 ); createMenu( SMESHOp::OpDiagonalInversion, modifyId, -1 ); createMenu( SMESHOp::OpUnionOfTwoTriangle, modifyId, -1 ); - createMenu( SMESHOp::OpOrientation, modifyId, -1 ); - createMenu( SMESHOp::OpReorientFaces, modifyId, -1 ); createMenu( SMESHOp::OpUnionOfTriangles, modifyId, -1 ); createMenu( SMESHOp::OpCuttingOfQuadrangles, modifyId, -1 ); createMenu( SMESHOp::OpSplitVolumes, modifyId, -1 ); createMenu( SMESHOp::OpSplitBiQuadratic, modifyId, -1 ); createMenu( SMESHOp::OpSmoothing, modifyId, -1 ); - createMenu( SMESHOp::OpExtrusion, modifyId, -1 ); - createMenu( SMESHOp::OpExtrusionAlongAPath , modifyId, -1 ); - createMenu( SMESHOp::OpRevolution, modifyId, -1 ); createMenu( SMESHOp::OpPatternMapping, modifyId, -1 ); - createMenu( SMESHOp::OpConvertMeshToQuadratic, modifyId, -1 ); - createMenu( SMESHOp::OpCreateBoundaryElements, modifyId, -1 ); createMenu( SMESHOp::OpMinimumDistance, measureId, -1 ); createMenu( SMESHOp::OpBoundingBox, measureId, -1 ); + createMenu( SMESHOp::OpAngle, measureId, -1 ); createMenu( SMESHOp::OpPropertiesLength, basicPropId, -1 ); createMenu( SMESHOp::OpPropertiesArea, basicPropId, -1 ); createMenu( SMESHOp::OpPropertiesVolume, basicPropId, -1 ); @@ -4214,8 +4489,8 @@ void SMESHGUI::initialize( CAM_Application* app ) addElemTb = createTool( tr( "TB_ADD" ), QString( "SMESHAddElementToolbar" ) ), addNonElemTb = createTool( tr( "TB_ADDNON" ), QString( "SMESHAddElementToolbar" ) ), remTb = createTool( tr( "TB_REM" ), QString( "SMESHRemoveToolbar" ) ), - //renumbTb = createTool( tr( "TB_RENUMBER" ), QString( "SMESHRenumberingToolbar" ) ), - transformTb = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ), + //renumbTb = createTool( tr( "TB_RENUMBER" ), QString( "SMESHRenumberingToolbar" ) ), + transformTb = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ), modifyTb = createTool( tr( "TB_MODIFY" ), QString( "SMESHModificationToolbar" ) ), measuremTb = createTool( tr( "TB_MEASUREM" ), QString( "SMESHMeasurementsToolbar" ) ), dispModeTb = createTool( tr( "TB_DISP_MODE" ), QString( "SMESHDisplayModeToolbar" ) ); @@ -4264,6 +4539,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpSkew, ctrl2dTb ); createTool( SMESHOp::OpMaxElementLength2D, ctrl2dTb ); createTool( SMESHOp::OpEqualFace, ctrl2dTb ); + createTool( SMESHOp::OpDeflection2D, ctrl2dTb ); createTool( SMESHOp::OpAspectRatio3D, ctrl3dTb ); createTool( SMESHOp::OpVolume, ctrl3dTb ); @@ -4296,6 +4572,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpQuadraticTetrahedron, addNonElemTb ); createTool( SMESHOp::OpQuadraticPyramid, addNonElemTb ); createTool( SMESHOp::OpQuadraticPentahedron, addNonElemTb ); + createTool( SMESHOp::OpBiQuadraticPentahedron, addNonElemTb ); createTool( SMESHOp::OpQuadraticHexahedron, addNonElemTb ); createTool( SMESHOp::OpTriQuadraticHexahedron, addNonElemTb ); @@ -4307,31 +4584,32 @@ void SMESHGUI::initialize( CAM_Application* app ) //createTool( SMESHOp::OpRenumberingNodes, renumbTb ); //createTool( SMESHOp::OpRenumberingElements, renumbTb ); + createTool( SMESHOp::OpMergeNodes, transformTb ); + createTool( SMESHOp::OpMergeElements, transformTb ); createTool( SMESHOp::OpTranslation, transformTb ); createTool( SMESHOp::OpRotation, transformTb ); createTool( SMESHOp::OpSymmetry, transformTb ); createTool( SMESHOp::OpScale, transformTb ); + createTool( SMESHOp::OpOffset, transformTb ); createTool( SMESHOp::OpSewing, transformTb ); - createTool( SMESHOp::OpMergeNodes, transformTb ); - createTool( SMESHOp::OpMergeElements, transformTb ); createTool( SMESHOp::OpDuplicateNodes, transformTb ); + createTool( SMESHOp::OpConvertMeshToQuadratic, modifyTb ); + createTool( SMESHOp::OpCreateBoundaryElements, modifyTb ); + createTool( SMESHOp::OpExtrusion, modifyTb ); + createTool( SMESHOp::OpExtrusionAlongAPath, modifyTb ); + createTool( SMESHOp::OpRevolution, modifyTb ); + createTool( SMESHOp::OpOrientation, modifyTb ); + createTool( SMESHOp::OpReorientFaces, modifyTb ); createTool( SMESHOp::OpMoveNode, modifyTb ); createTool( SMESHOp::OpDiagonalInversion, modifyTb ); createTool( SMESHOp::OpUnionOfTwoTriangle, modifyTb ); - createTool( SMESHOp::OpOrientation, modifyTb ); - createTool( SMESHOp::OpReorientFaces, modifyTb ); createTool( SMESHOp::OpUnionOfTriangles, modifyTb ); createTool( SMESHOp::OpCuttingOfQuadrangles, modifyTb ); createTool( SMESHOp::OpSplitVolumes, modifyTb ); createTool( SMESHOp::OpSplitBiQuadratic, modifyTb ); createTool( SMESHOp::OpSmoothing, modifyTb ); - createTool( SMESHOp::OpExtrusion, modifyTb ); - createTool( SMESHOp::OpExtrusionAlongAPath, modifyTb ); - createTool( SMESHOp::OpRevolution, modifyTb ); createTool( SMESHOp::OpPatternMapping, modifyTb ); - createTool( SMESHOp::OpConvertMeshToQuadratic, modifyTb ); - createTool( SMESHOp::OpCreateBoundaryElements, modifyTb ); createTool( SMESHOp::OpMinimumDistance, measuremTb ); @@ -4674,10 +4952,15 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert ( action( SMESHOp::OpOverConstrainedFace ), aSubId, -1 ); popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), "controlMode = 'eOverConstrainedFace'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert ( action( SMESHOp::OpEqualFace ), aSubId, -1 ); popupMgr()->setRule( action( SMESHOp::OpEqualFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( SMESHOp::OpEqualFace ), "controlMode = 'eCoincidentElems2D'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert ( action( SMESHOp::OpDeflection2D ), aSubId, -1 ); + popupMgr()->setRule( action( SMESHOp::OpDeflection2D ), aMeshInVtkHasFaces + " && hasGeomReference", QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( SMESHOp::OpDeflection2D ), "controlMode = 'eDeflection2D'", QtxPopupMgr::ToggleRule ); + aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS popupMgr()->insert ( action( SMESHOp::OpAspectRatio3D ), aSubId, -1 ); @@ -4757,6 +5040,9 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->setRule( action( SMESHOp::OpSortChild ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule ); popupMgr()->insert( separator(), -1, -1 ); + popupMgr()->insert( action( SMESHOp::OpBreakLink), -1, -1 ); + popupMgr()->setRule( action( SMESHOp::OpBreakLink), "$component={'SHAPERSTUDY'} and client='ObjectBrowser' and canBreakLink", QtxPopupMgr::VisibleRule ); + connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ), this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) ); @@ -4830,7 +5116,14 @@ bool SMESHGUI::activateModule( SUIT_Study* study ) QList wndList = aDesk->windows(); SUIT_ViewWindow* wnd; foreach ( wnd, wndList ) + { connectView( wnd ); + + // remove actors whose objects are removed in GetSMESHGen()->UpdateStudy() + SMESH::UpdateActorsAfterUpdateStudy(wnd); + + wnd->update(); + } } Py_XDECREF(pluginsmanager); @@ -4896,9 +5189,9 @@ 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( SMESH::fromUtf8(obj->GetName()) ); - while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup - aName.remove( (aName.length() - 1), 1 ); + QString aName = SMESH::fromUtf8( obj->GetName()); + while ( !aName.isEmpty() && aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup + aName.remove(( aName.length() - 1 ), 1 ); title = aName; } } @@ -4996,6 +5289,9 @@ void SMESHGUI::createPreferences() int dispgroup = addPreference( tr( "PREF_DISPLAY_MODE_GROUP" ), genTab ); setPreferenceProperty( dispgroup, "columns", 2 ); + + addPreference( tr( "PREF_FITALL_ON_DISPLAYONLY" ), dispgroup, LightApp_Preferences::Bool, "SMESH", "fitall_on_displayonly" ); + int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), dispgroup, LightApp_Preferences::Selector, "SMESH", "display_mode" ); QStringList modes; modes.append( tr("MEN_WIRE") ); @@ -5040,11 +5336,21 @@ void SMESHGUI::createPreferences() setPreferenceProperty( doubleNodesTol, "max", 1000000.0 ); setPreferenceProperty( doubleNodesTol, "step", 0.0000001 ); + /* + int cinc = addPreference(tr("PREF_CONTROLS_INCREMENT"), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_increment"); + setPreferenceProperty( cinc, "min", 0 ); + setPreferenceProperty( cinc, "max", 5 ); + */ 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_SHOW_WARN" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "show_warning" ); + int zTol = addPreference( tr( "PREF_ZTOLERANCE" ), exportgroup, LightApp_Preferences::DblSpin, "SMESH", "med_ztolerance" ); + setPreferenceProperty( zTol, "precision", 10 ); + setPreferenceProperty( zTol, "min", 0.0000000001 ); + setPreferenceProperty( zTol, "max", 1000000.0 ); + setPreferenceProperty( zTol, "step", 1. ); //addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" ); int computeGroup = addPreference( tr( "PREF_GROUP_COMPUTE" ), genTab ); @@ -5098,6 +5404,7 @@ void SMESHGUI::createPreferences() "SMESH", "nb_segments_per_edge" ); setPreferenceProperty( nbSeg, "min", 1 ); setPreferenceProperty( nbSeg, "max", 10000000 ); + addPreference( tr( "PREF_USE_MESHGEMS_HYPOSET" ), segGroup, LightApp_Preferences::Bool, "SMESH", "use-meshgems-hypo-sets" ); int loadGroup = addPreference( tr( "SMESH_PREF_MESH_LOADING" ), genTab ); addPreference( tr( "PREF_FORGET_MESH_AT_HYP_MODIF" ), loadGroup, LightApp_Preferences::Bool, @@ -5233,7 +5540,7 @@ void SMESHGUI::createPreferences() int numGroup = addPreference( tr( "PREF_GROUP_NUMBERING" ), meshTab ); setPreferenceProperty( numGroup, "columns", 2 ); - + addPreference( tr( "PREF_NUMBERING_NODE" ), numGroup, LightApp_Preferences::Color, "SMESH", "numbering_node_color" ); addVtkFontPref( tr( "PREF_NUMBERING_FONT" ), numGroup, "numbering_node_font", true ); @@ -5273,6 +5580,10 @@ void SMESHGUI::createPreferences() addPreference( tr( "PREF_ELEMENTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_element" ); addPreference( tr( "PREF_OBJECTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_object" ); + int sinc = addPreference(tr("PREF_SELECTION_INCREMENT"), selTab, LightApp_Preferences::IntSpin, "SMESH", "selection_increment"); + setPreferenceProperty( sinc, "min", 0 ); + setPreferenceProperty( sinc, "max", 5 ); + // Scalar Bar tab ------------------------------------------------------------------------ int sbarTab = addPreference( tr( "SMESH_SCALARBAR" ) ); int fontGr = addPreference( tr( "SMESH_FONT_SCALARBAR" ), sbarTab ); @@ -5367,12 +5678,13 @@ void SMESHGUI::preferencesChanged( const QString& sect, const QString& name ) std::string aWarning; SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this); - if ( name== "selection_object_color" || - name=="selection_element_color" || - name== "highlight_color" || - name=="selection_precision_node" || - name=="selection_precision_element" || - name=="selection_precision_object" ) + if ( name == "selection_object_color" || + name == "selection_element_color" || + name == "highlight_color" || + name == "selection_precision_node" || + name == "selection_precision_element" || + name == "selection_precision_object" || + name == "selection_increment") { SMESH::UpdateSelectionProp( this ); } @@ -5654,7 +5966,7 @@ const char* gPathSep = "|"; // character used to separate paths * \brief Store visual parameters * * This method is called just before the study document is saved. - * Store visual parameters in AttributeParameter attribue(s) + * Store visual parameters in AttributeParameter attribute(s) */ void SMESHGUI::storeVisualParameters (int savePoint) { @@ -6006,7 +6318,7 @@ typedef std::map TPlaneInfoMap; * \brief Restore visual parameters * * This method is called after the study document is opened. - * Restore visual parameters from AttributeParameter attribue(s) + * Restore visual parameters from AttributeParameter attribute(s) */ void SMESHGUI::restoreVisualParameters (int savePoint) { @@ -6120,7 +6432,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) aPlaneData.Mode = aPropertyValueList[0].toInt( &ok ); if( !ok ) continue; - + ok = false; aPlaneData.isOpenGLClipping = aPropertyValueList[1].toInt( &ok ); if( !ok ) @@ -6201,7 +6513,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) // Check that the entry corresponds to a real object in the Study // as the object may be deleted or modified after the visual state is saved. - _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data()); + _PTR(SObject) so = studyDS->FindObjectID(entry.toUtf8().data()); if (!so) continue; //Skip the not existent entry std::vector paramNames = ip->getAllParameterNames( *entIt ); @@ -6268,7 +6580,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac); if (aGeomAc->hasIO()) { Handle(SALOME_InteractiveObject) io = aGeomAc->getIO(); - if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) { + if (io->hasEntry() && strcmp(io->getEntry(), entry.toUtf8().data()) == 0) { isFound = true; vtkActors.Bind(viewIndex, aGeomAc); } @@ -6620,9 +6932,9 @@ 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 "1:0:0:0.5:0:0" + // 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" + // 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, @@ -6822,10 +7134,10 @@ void SMESHGUI::restoreVisualParameters (int savePoint) break; } } - + } } - + // update all VTK views QList lst; @@ -6841,7 +7153,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) while( vtkActor* aVTKActor = anAllActors->GetNextActor() ) if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) anActor->SetOpenGLClippingPlane(); - + vtkView->getRenderer()->ResetCameraClippingRange(); vtkView->Repaint(); } @@ -6954,13 +7266,13 @@ void SMESHGUI::message( const QString& msg ) // get study _PTR(Study) study = dynamic_cast( application()->activeStudy() )->studyDS(); // get mesh name - _PTR(SObject) obj = study->FindObjectID( entry.toLatin1().constData() ); + _PTR(SObject) obj = study->FindObjectID( entry.toUtf8().constData() ); QString name; if ( obj ) name = SMESH::fromUtf8(obj->GetName()); if ( name.isEmpty() ) return; - + if ( data.last() == "stop" ) application()->putInfo( tr( "MESH_LOADING_MSG_FINISHED" ).arg( name ) ); else @@ -7001,7 +7313,7 @@ bool SMESHGUI::renameAllowed( const QString& entry) const { return false; SalomeApp_DataObject* obj = dynamic_cast(appStudy->findObjectByEntry(entry)); - + if(!obj) return false; @@ -7031,17 +7343,17 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) { SalomeApp_Application* anApp = dynamic_cast( application() ); if( !anApp ) return false; - + SalomeApp_Study* appStudy = dynamic_cast( anApp->activeStudy() ); if(!appStudy) return false; - + _PTR(Study) aStudy = appStudy->studyDS(); - + if(!aStudy) return false; - + bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked(); if ( aLocked ) { SUIT_MessageBox::warning ( anApp->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") ); @@ -7063,7 +7375,7 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) { aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX || aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM) { if ( !name.isEmpty() ) { - SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qPrintable(name) ); + SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qUtf8Printable(name) ); // update name of group object and its actor Handle(SALOME_InteractiveObject) IObject = @@ -7071,9 +7383,9 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) { SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface(IObject); if( !aGroupObject->_is_nil() ) { - aGroupObject->SetName( qPrintable(name) ); + aGroupObject->SetName( qUtf8Printable(name) ); if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( qPrintable(entry) ) ) - anActor->setName( qPrintable(name) ); + anActor->setName( qUtf8Printable(name) ); } return true; }