X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_MeshOp.cxx;h=10366f210c28e569e26ad3d491c402323a552968;hp=e232e408f20d6a09593c8c86e26d556523eb942a;hb=HEAD;hpb=5dcb2f2b467e63a0e5d37e234b2ba8f8e624f987 diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index e232e408f..50132b41e 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -37,12 +37,14 @@ #include "SMESH_NumberFilter.hxx" #include "SMESH_TypeDefs.hxx" #include "SMESH_TypeFilter.hxx" +#include "SMESH_Gen_i.hxx" #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) // SALOME GEOM includes #include #include +#include #include #include #include @@ -123,6 +125,57 @@ LightApp_Dialog* SMESHGUI_MeshOp::dlg() const return myDlg; } +//================================================================================ +/*! + * \brief Log meshers info +*/ +//================================================================================ +void SMESHGUI_MeshOp::logSmeshParams() +{ + QString mesherType; + int curMeshType = myDlg->currentMeshType(); + switch ( curMeshType ) { + case MT_ANY: + mesherType = "Any"; + break; + case MT_TRIANGULAR: + mesherType = "Triangular"; + break; + case MT_QUADRILATERAL: + mesherType = "Quadrilateral"; + break; + case MT_TETRAHEDRAL: + mesherType = "Tetrahedral"; + break; + case MT_HEXAHEDRAL: + mesherType = "Hexahedral"; + break; + default: + mesherType = ""; + } + + QString aMessage = QString("Mesh type is %1").arg(mesherType); + CAM_Application::logStructuredUserEvent( "Mesh", + "create mesh", + "", + "", + aMessage); + + for ( int dim = 0; dim <= 3; ++dim ) + { + HypothesisData * curAlgo = hypData( dim, Algo, currentHyp( dim, Algo )); + if(curAlgo) + { + aMessage = QString("%1D algorithm is %2").arg(dim).arg(curAlgo->Label); + CAM_Application::logStructuredUserEvent( "Mesh", + "create mesh", + "", + "", + aMessage); + } + } +} + //================================================================================ /*! * \brief Creates or edits mesh @@ -156,7 +209,7 @@ bool SMESHGUI_MeshOp::onApply() if (( myToCreate && !myIsMesh ) || myIsInvalidSubMesh ) aResult = createSubMesh( aMess, anEntryList ); else if ( !myToCreate ) - aResult = editMeshOrSubMesh( aMess ); + aResult = editMeshOrSubMesh( aMess, anEntryList ); if ( aResult ) { SMESHGUI::Modified(); @@ -180,6 +233,7 @@ bool SMESHGUI_MeshOp::onApply() { if ( myToCreate ) setDefaultName(); + //connect(aAction, SIGNAL(triggered(bool)), this, SLOT(logSmeshParams())); } else { @@ -188,6 +242,7 @@ bool SMESHGUI_MeshOp::onApply() SUIT_MessageBox::warning( myDlg, tr( "SMESH_ERROR" ), aMess ); } + logSmeshParams(); myHypoSet = 0; return aResult; @@ -294,8 +349,8 @@ void SMESHGUI_MeshOp::commitOperation() //================================================================================ /*! * \brief Creates selection filter - * \param theId - identifier of current selection widget - * \retval SUIT_SelectionFilter* - pointer to the created filter or null + * \param theId - identifier of current selection widget + * \retval SUIT_SelectionFilter* - pointer to the created filter or null * * Creates selection filter in accordance with identifier of current selection widget */ @@ -321,7 +376,7 @@ SUIT_SelectionFilter* SMESHGUI_MeshOp::createFilter( const int theId ) const //================================================================================ /*! * \brief check if selected shape is a sub-shape of the shape to mesh - * \retval bool - check result + * \retval bool - check result */ //================================================================================ bool SMESHGUI_MeshOp::isSubshapeOk() const @@ -345,61 +400,17 @@ bool SMESHGUI_MeshOp::isSubshapeOk() const QStringList aGEOMs; myDlg->selectedObject(SMESHGUI_MeshDlg::Geom, aGEOMs); - if (aGEOMs.count() > 0) { - GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); - if (geomGen->_is_nil()) return false; - - GEOM::GEOM_IGroupOperations_wrap op = geomGen->GetIGroupOperations(); - if (op->_is_nil()) return false; - - // check all selected shapes - QStringList::const_iterator aSubShapesIter = aGEOMs.begin(); - for ( ; aSubShapesIter != aGEOMs.end(); aSubShapesIter++) { - QString aSubGeomEntry = (*aSubShapesIter); - _PTR(SObject) pSubGeom = SMESH::getStudy()->FindObjectID(aSubGeomEntry.toUtf8().data()); - if (!pSubGeom) return false; - - GEOM::GEOM_Object_var aSubGeomVar = - GEOM::GEOM_Object::_narrow(_CAST(SObject,pSubGeom)->GetObject()); - if (aSubGeomVar->_is_nil()) return false; - - // skl for NPAL14695 - implementation of searching of mainObj - GEOM::GEOM_Object_var mainObj = op->GetMainShape(aSubGeomVar); /* _var not _wrap as - mainObj already exists! */ - while( !mainObj->_is_nil()) { - CORBA::String_var entry1 = mainObj->GetEntry(); - CORBA::String_var entry2 = mainGeom->GetEntry(); - if (std::string( entry1.in() ) == entry2.in() ) - return true; - mainObj = op->GetMainShape(mainObj); - } - if ( aSubGeomVar->GetShapeType() == GEOM::COMPOUND ) - { - // is aSubGeomVar a compound of sub-shapes? - GEOM::GEOM_IShapesOperations_wrap sop = geomGen->GetIShapesOperations(); - if (sop->_is_nil()) return false; - GEOM::ListOfLong_var ids = sop->GetAllSubShapesIDs( aSubGeomVar, - GEOM::SHAPE,/*sorted=*/false); - if ( ids->length() > 0 ) - { - ids->length( 1 ); - GEOM::GEOM_Object_var compSub = geomGen->AddSubShape( aSubGeomVar, ids ); - if ( !compSub->_is_nil() ) - { - GEOM::ListOfGO_var shared = sop->GetSharedShapes( mainGeom, - compSub, - compSub->GetShapeType() ); - geomGen->RemoveObject( compSub ); - compSub->UnRegister(); - if ( shared->length() > 0 ) { - geomGen->RemoveObject( shared[0] ); - shared[0]->UnRegister(); - } - return ( shared->length() > 0 ); - } - } - } - } + // check all selected shapes + for ( QString& aSubGeomEntry : aGEOMs ) + { + _PTR(SObject) pSubGeom = SMESH::getStudy()->FindObjectID( aSubGeomEntry.toUtf8().data() ); + if ( !pSubGeom ) return false; + + GEOM::GEOM_Object_var subGeom = + GEOM::GEOM_Object::_narrow(_CAST(SObject,pSubGeom)->GetObject()); + + if ( SMESH::ContainsSubShape( mainGeom, subGeom, false )) + return true; } return false; @@ -780,7 +791,7 @@ bool SMESHGUI_MeshOp::isCompatibleToGeometry(HypothesisData* theAlgoData, bool isApplicable = false; if ( myGeomEntry == myLastGeomEntry && !myGeomEntry.isEmpty() ) { - THypLabelIsAppMap::const_iterator lab2isApp = myHypMapIsApplicable.find( theAlgoData->Label ); + THypLabelIsAppMap::const_iterator lab2isApp = myHypMapIsApplicable.find( theAlgoData->TypeName ); if ( lab2isApp != myHypMapIsApplicable.end() ) { isApplicable = lab2isApp.value(); return isApplicable; @@ -791,7 +802,7 @@ bool SMESHGUI_MeshOp::isCompatibleToGeometry(HypothesisData* theAlgoData, toCheckIsApplicableToAll = ( myGeom->GetType() == GEOM_GROUP ); isApplicable = SMESH::IsApplicable( theAlgoData->TypeName, myGeom, toCheckIsApplicableToAll ); - myHypMapIsApplicable.insert( theAlgoData->Label, isApplicable ); + myHypMapIsApplicable.insert( theAlgoData->TypeName, isApplicable ); return isApplicable; } @@ -882,7 +893,7 @@ void SMESHGUI_MeshOp::availableHyps( const int theDim, THypDataList& theDataList, HypothesisData* thePrevAlgoData, HypothesisData* theNextAlgoData, - const QString& theMeshType) + const QString& /*theMeshType*/) { theDataList.clear(); theHyps.clear(); @@ -1103,12 +1114,18 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType, initParams.way = isSubMesh ? BY_MESH : BY_GEOM; } - SMESH::SMESH_Hypothesis_var hyp = - SMESHGUI::GetSMESHGen()->GetHypothesisParameterValues( aHypType.toUtf8().data(), - aServerLib.toUtf8().data(), - aMesh, - aGeomVar, - initParams ); + SMESH::SMESH_Hypothesis_var hyp; + if ( initParams.way == BY_AVERAGE_LENGTH ) + hyp = SMESHGUI::GetSMESHGen()->CreateHypothesisByAverageLength( aHypType.toUtf8().data(), + aServerLib.toUtf8().data(), + initParams.averageLength, + initParams.quadDominated ); + else + hyp = SMESHGUI::GetSMESHGen()->GetHypothesisParameterValues( aHypType.toUtf8().data(), + aServerLib.toUtf8().data(), + aMesh, + aGeomVar, + initParams ); if ( hyp->_is_nil() && initParams.way == BY_MESH ) { initParams.way = BY_GEOM; @@ -1328,6 +1345,7 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, initHypCreator( aCreator ); myDlg->setEnabled( false ); + myDlg->hide(); aCreator->create(initParamHyp, aHypName, myDlg, this, SLOT( onHypoCreated( int ) ) ); dialog = true; } @@ -1359,6 +1377,7 @@ void SMESHGUI_MeshOp::onHypoCreated( int result ) int obj = myDlg->getActiveObject(); onActivateObject( obj ); // Issue 0020170. Restore filters myDlg->setEnabled( true ); + myDlg->show(); } _PTR(SComponent) aFather = SMESH::getStudy()->FindComponent("SMESH"); @@ -1415,6 +1434,7 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) removeCustomFilters(); // Issue 0020170 myDlg->setEnabled( false ); + myDlg->hide(); aCreator->edit( aHyp.in(), aHypItem.second, dlg(), this, SLOT( onHypoEdited( int ) ) ); } @@ -1428,11 +1448,12 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) * 1 = accepted */ //================================================================================ -void SMESHGUI_MeshOp::onHypoEdited( int result ) +void SMESHGUI_MeshOp::onHypoEdited( int /*result*/ ) { int obj = myDlg->getActiveObject(); onActivateObject( obj ); // Issue 0020170. Restore filters myDlg->setEnabled( true ); + myDlg->show(); } //================================================================================ @@ -1750,7 +1771,7 @@ void SMESHGUI_MeshOp::createSubMeshOnInternalEdges( SMESH::SMESH_Mesh_ptr theMes for ( size_t i = 0; i < internalEdges.size(); ++i ) intIDSet.insert( shapeIDs.FindIndex( internalEdges[ i ])); - GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); + GEOM::GEOM_Gen_var geomGen = theMainShape->GetGen(); if (geomGen->_is_nil()) return; GEOM::GEOM_Object_var edgeGroup; @@ -1898,7 +1919,7 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) HypothesesSet::SetType setType = aHypoSet->getPreferredHypType(); if ( !aHypoSet->getAlgoAvailable( setType )) { - setType = setType == HypothesesSet::ALT ? HypothesesSet::MAIN : HypothesesSet::ALT; + setType = ( setType == HypothesesSet::ALT ) ? HypothesesSet::MAIN : HypothesesSet::ALT; if ( !aHypoSet->getAlgoAvailable( setType )) return; } @@ -1907,6 +1928,7 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) if ( aHypoSet->toUseCommonSize() && !getAverageSize( myAverageSize )) return; + int maxDim = -1; for ( int isAlgo = 1; isAlgo >= 0; --isAlgo ) for ( aHypoSet->init( isAlgo, setType ); aHypoSet->more(); aHypoSet->next() ) { @@ -1924,6 +1946,7 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) { setCurrentHyp( myDim, Algo, index ); onAlgoSelected( index, myDim ); + maxDim = Max( maxDim, myDim ); } } else @@ -1957,6 +1980,9 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) } } + if ( maxDim > 0 ) + myDlg->setCurrentTab( maxDim ); + return; } @@ -2056,21 +2082,26 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess, QStringList& theEntryList ) { // Create groups on all geom groups - GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); + GEOM::GEOM_Gen_var geomGen = aGeomVar->GetGen(); GEOM::GEOM_IShapesOperations_wrap op = geomGen->GetIShapesOperations(); GEOM::ListOfGO_var geomGroups = op->GetExistingSubObjects( aGeomVar, - /*groupsOnly=*/true ); + /*groupsOnly=*/false ); SMESH::SMESH_GroupOnGeom_var meshGroup; for ( CORBA::ULong iG = 0; iG < geomGroups->length(); ++iG ) { SMESH::ElementType elemType = SMESHGUI_GroupOnShapeOp::ElementType( geomGroups[ iG ] ); if ( elemType == SMESH::ALL ) continue; + if ( elemType == SMESH::ELEM0D ) + elemType = SMESH::NODE; CORBA::String_var name = geomGroups[ iG ]->GetName(); - meshGroup = aMesh->CreateGroupFromGEOM( elemType, name, geomGroups[ iG ]); - if ( elemType != SMESH::NODE ) - meshGroup = aMesh->CreateGroupFromGEOM( SMESH::NODE, name, geomGroups[ iG ]); + + SALOMEDS::SObject_wrap groupSO = SMESH_Gen_i::GetSMESHGen()->ObjectToSObject( geomGroups[iG] ); + if (!groupSO->_is_nil()) + meshGroup = aMesh->CreateGroupFromGEOM( elemType, name, geomGroups[ iG ]); + // if ( elemType != SMESH::NODE ) + // meshGroup = aMesh->CreateGroupFromGEOM( SMESH::NODE, name, geomGroups[ iG ]); } } @@ -2130,11 +2161,11 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess, QStringList& theEntryList else if (aGEOMs.count() > 1) { // create a GEOM group - GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); - if (!geomGen->_is_nil()) { - GEOM::GEOM_IGroupOperations_wrap op = - geomGen->GetIGroupOperations(); - if (!op->_is_nil()) { + GEOM::GEOM_Gen_var geomGen = mainGeom->GetGen(); + if ( !geomGen->_is_nil() ) { + GEOM::GEOM_IGroupOperations_wrap op = geomGen->GetIGroupOperations(); + if ( !op->_is_nil() ) + { // check and add all selected GEOM objects: they must be // a sub-shapes of the main GEOM and must be of one type int iSubSh = 0; @@ -2603,13 +2634,14 @@ int SMESHGUI_MeshOp::find( const SMESH::SMESH_Hypothesis_var& theHyp, //================================================================================ /*! * \brief Edits mesh or sub-mesh - * \param theMess - Output parameter intended for returning error message - * \retval bool - TRUE if mesh is edited successfully, FALSE otherwise + * \param theMess - Output parameter intended for returning error message + * \param theEntryList - List of entries of published objects + * \retval bool - TRUE if mesh is edited successfully, FALSE otherwise * * Assigns new name hypotheses and algorithms to the mesh or sub-mesh */ //================================================================================ -bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) +bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess, QStringList& theEntryList) { theMess = ""; @@ -2654,6 +2686,12 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) if ( !isMesh && !aSubMeshVar->_is_nil() ) aMesh = aSubMeshVar->GetFather(); + _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh.in()); + if (aMeshSO) { + if (aSubMeshVar->_is_nil()) SMESH::SetName(aMeshSO, myDlg->objectText(SMESHGUI_MeshDlg::Obj)); + theEntryList.append(aMeshSO->GetID().c_str()); + } + // Assign new algorithms and hypotheses for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) { @@ -2938,9 +2976,19 @@ void SMESHGUI_MeshOp::updateHypoSets() } currentHypoSet->setAlgoAvailable( sType, isAvailable ); } + if ( currentHypoSet->hasAlgo( HypothesesSet::MAIN ) && + currentHypoSet->hasAlgo( HypothesesSet::ALT )) + { + HypothesesSet::SetType setType = HypothesesSet::getPreferredHypType(); + if ( !currentHypoSet->getAlgoAvailable( setType )) + continue; // not add if a preferred type not available currently + } + if ( currentHypoSet->getAlgoAvailable( HypothesesSet::MAIN ) || currentHypoSet->getAlgoAvailable( HypothesesSet::ALT )) + { aFilteredHypothesesSetsList.append( *inHypoSetName ); + } } myDlg->setHypoSets( aFilteredHypothesesSetsList ); } @@ -2952,7 +3000,7 @@ void SMESHGUI_MeshOp::updateHypoSets() * \param theIndex - Index of current type of mesh */ //================================================================================ -void SMESHGUI_MeshOp::onAlgoSetByMeshType( const int theTabIndex, const int theIndex ) +void SMESHGUI_MeshOp::onAlgoSetByMeshType( const int /*theTabIndex*/, const int /*theIndex*/ ) { setFilteredAlgoData(); }