X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI.cxx;h=c697a08ceb5512b6cc03aa84212d084c37d67923;hp=99aa9608c63e6f87fdd1e38b8854f1b5c6352baa;hb=cc85955178440fffe36eef234d759e3c3590248f;hpb=c58add1af5c5f2bb0c9ae42b3ff1e8169bfa7281 diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 99aa9608c..c697a08ce 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -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" @@ -74,23 +83,15 @@ #include "SMESHGUI_RevolutionDlg.h" #include "SMESHGUI_RotationDlg.h" #include "SMESHGUI_ScaleDlg.h" -#include "SMESHGUI_OffsetDlg.h" #include "SMESHGUI_Selection.h" #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" @@ -101,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 @@ -149,13 +146,13 @@ // Qt includes // #define INCLUDE_MENUITEM_DEF // VSR commented ???????? #include +#include +#include +#include +#include #include #include -#include #include -#include -#include -#include // BOOST includes #include @@ -491,17 +488,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(); @@ -550,7 +541,7 @@ namespace } } } - + // Warn the user about presence of not supported elements QString format; std::vector< SMESH::EntityType > notSupportedElemTypes, presentNotSupported; @@ -655,7 +646,7 @@ namespace // Get parameters of export operation QString aFilename; - int aFormat =-1; // for MED minor versions + 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 @@ -665,6 +656,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 = ""; @@ -673,7 +665,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 ) @@ -744,38 +736,32 @@ namespace } else if ( isMED || isSAUV ) // Export to MED or SAUV { + int defaultVersion = 0; QMap aFilterMap; if ( isMED ) { //filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)"; - QString vmed (aMesh->GetVersionString(-1, 2)); - //MESSAGE("MED version: " << vmed.toStdString()); - int minor = vmed.split(".").last().toInt(); - //MESSAGE("MED version minor: "<< minor); - //minor +=3; // TODO remove: test multiple minor - aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vmed ) + " (*.med)", minor ); - for (int ii=0; iiGetVersionString(ii, 2); - //std::ostringstream vss; // TODO remove: test multiple minor - //vss << "4."; // TODO remove: test multiple minor - //vss << ii; // TODO remove: test multiple minor - //vs = vss.str().c_str(); // TODO remove: test multiple minor - //MESSAGE("MED version: " << vs.toStdString()); - aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vs ) + " (*.med)", ii); - } + //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 (*)", -1 ); - aFilterMap.insert("SAUV files (*.sauv)", -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(); + QString aDefaultFilter = it.key(); for ( ; it != aFilterMap.end(); ++it ) { filters.push_back( it.key() ); - if (it.key() == 0) + if (it.value() == defaultVersion) // explicit default for MED = current MED version aDefaultFilter = it.key(); } QStringList checkBoxes; @@ -786,17 +772,32 @@ namespace 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 ); fd->setNameFilters( filters ); + fd->selectNameFilter( aDefaultFilter ); fd->SetChecked( toCreateGroups, 0 ); fd->SetChecked( toFindOutDim, 1 ); if ( !anInitialPath.isEmpty() ) fd->setDirectory( anInitialPath ); fd->selectFile(aMeshName); - - + + QListView *lview = fd->findChild("listView"); if( lview ) { lview->setMinimumHeight(200); @@ -810,7 +811,8 @@ namespace fd->setValidator( fv ); bool is_ok = false; - while (!is_ok) { + while (!is_ok) + { //MESSAGE("******* Loop on file dialog ***********"); isOkToWrite =true; if ( fd->exec() ) @@ -820,13 +822,15 @@ namespace break; } aFormat = aFilterMap[fd->selectedNameFilter()]; - //MESSAGE("selected minor: " << aFormat << " file: " << aFilename.toUtf8().constData()); + //MESSAGE("selected version: " << aFormat << " file: " << aFilename.toUtf8().constData()); toOverwrite = fv->isOverwrite(aFilename); + //MESSAGE("toOverwrite:" << toOverwrite); is_ok = true; if ( !aFilename.isEmpty() ) { if( !toOverwrite ) { - // can't append to an existing using other format + // 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"), @@ -834,16 +838,16 @@ namespace 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"); - } + { + 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"); - } + { + 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() ); @@ -857,7 +861,7 @@ namespace } } } - if( !aMeshNamesCollisionList.isEmpty() ) { + if( !aMeshNamesCollisionList.isEmpty() ) { isOkToWrite = false; QString aMeshNamesCollisionString = aMeshNamesCollisionList.join( ", " ); int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), @@ -866,8 +870,8 @@ namespace QObject::tr("SMESH_BUT_YES"), QObject::tr("SMESH_BUT_NO"), QObject::tr("SMESH_BUT_CANCEL"), 0, 2); - //MESSAGE("answer collision name " << aRet); - if (aRet == 0) { + MESSAGE("answer collision name " << aRet); + if (aRet == 0) { toOverwrite = true; isOkToWrite = true; } @@ -877,12 +881,16 @@ namespace } } } - //MESSAGE(" ****** end of file dialog loop") toCreateGroups = fd->IsChecked(0); toFindOutDim = fd->IsChecked(1); + 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 @@ -901,12 +909,12 @@ 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() ) @@ -914,7 +922,7 @@ namespace // } if ( isMED && isOkToWrite) { - //MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData()); + MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData()); aMeshIter = aMeshList.begin(); for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ ) { @@ -923,13 +931,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 )) + 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, + aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), + toCreateGroups, aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim, - fields, geoAssFields.toLatin1().data() ); + fields, geoAssFields.toLatin1().data(), zTol ); } } else if ( isSAUV ) @@ -985,7 +994,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(); } } @@ -1487,7 +1496,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; @@ -1525,7 +1534,7 @@ namespace dlg.setShrinkCoef( int( shrinkCoef * 100. ) ); // hide unused controls dlg.showControls( presentEntities, hasNodes ); - + if ( dlg.exec() ) { nodeColor = dlg.nodeColor(); markerType = dlg.nodeMarkerType(); @@ -1559,7 +1568,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 ) { @@ -1604,17 +1613,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(); @@ -1839,7 +1848,7 @@ namespace v = qMax( uint(0), qMin ( v, size-1 ) ); return v; } - + } //namespace void SMESHGUI::OnEditDelete() @@ -1853,6 +1862,7 @@ void SMESHGUI::OnEditDelete() _PTR(GenericAttribute) anAttr; _PTR(AttributeIOR) anIOR; + const int objectCountLimit = 30; // PAL23599 int objectCount = 0; QString aNameList; QString aParentComponent = QString::null; @@ -1862,29 +1872,33 @@ void SMESHGUI::OnEditDelete() Handle(SALOME_InteractiveObject) anIO = anIt.Value(); if ( anIO.IsNull() ) continue; - QString father = "unknown"; + 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 ); + 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 = father; else if( !aParentComponent.isEmpty() && aParentComponent!=father ) aParentComponent = ""; } + if ( objectCount >= objectCountLimit ) + aNameList.append("\n - ..."); if ( objectCount == 0 ) return; // No Valid Objects Selected @@ -2133,20 +2147,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] + + 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_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; @@ -2527,6 +2541,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) #ifndef DISABLE_PLOT2DVIEWER SMESH::ProcessIn2DViewers(anActor,SMESH::RemoveFrom2dViewer); #endif + anActor->UpdateFilter(); } } } @@ -2713,6 +2728,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; } @@ -3121,6 +3140,18 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } + case SMESHOp::OpFaceGroupsByEdges: // Create face groups separated by sharp edges + { + if ( isStudyLocked() ) + break; + + EmitSignalDeactivateDialog(); + SMESHGUI_FaceGroupsSeparatedByEdgesDlg* aDlg = new SMESHGUI_FaceGroupsSeparatedByEdgesDlg( this ); + aDlg->show(); + + break; + } + case SMESHOp::OpDeleteGroup: // Delete groups with their contents { if ( !vtkwnd ) @@ -3152,7 +3183,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(); } } @@ -3694,6 +3725,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 ) @@ -3704,6 +3736,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 ); @@ -3898,6 +3932,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" ); @@ -4037,6 +4072,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" ); @@ -4135,6 +4171,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 ); @@ -4243,6 +4280,7 @@ void SMESHGUI::initialize( CAM_Application* app ) 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 ); @@ -4264,8 +4302,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" ) ); @@ -4954,9 +4992,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; } } @@ -5054,6 +5092,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") ); @@ -5098,11 +5139,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 ); @@ -5291,7 +5342,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 ); @@ -5331,6 +5382,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 ); @@ -5425,12 +5480,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 ); } @@ -5712,7 +5768,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) { @@ -6064,7 +6120,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) { @@ -6178,7 +6234,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 ) @@ -6259,7 +6315,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 ); @@ -6326,7 +6382,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); } @@ -6678,9 +6734,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, @@ -6880,10 +6936,10 @@ void SMESHGUI::restoreVisualParameters (int savePoint) break; } } - + } } - + // update all VTK views QList lst; @@ -6899,7 +6955,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(); } @@ -7012,13 +7068,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 @@ -7059,7 +7115,7 @@ bool SMESHGUI::renameAllowed( const QString& entry) const { return false; SalomeApp_DataObject* obj = dynamic_cast(appStudy->findObjectByEntry(entry)); - + if(!obj) return false; @@ -7089,17 +7145,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") ); @@ -7121,7 +7177,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 = @@ -7129,9 +7185,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; }