X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ScaleDlg.cxx;h=2248ac60eec32fefcdca45ed4615c8bd62df4e25;hp=074cdea2bd7ed5b3c72422f639cbf714ee2172dd;hb=5482b99d07dd144fd5be299e722f39a81de3b5be;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce diff --git a/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx b/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx index 074cdea2b..2248ac60e 100644 --- a/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -51,6 +51,7 @@ #include // SALOME KERNEL includes +#include #include // OCCT includes @@ -98,19 +99,14 @@ private: #define SPACING 6 #define MARGIN 11 -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - //================================================================================= // class : SMESHGUI_ScaleDlg() // purpose : //================================================================================= SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) : - SMESHGUI_PreviewDlg( theModule ), + SMESHGUI_MultiPreviewDlg( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myFilterDlg(0), - mySelectedObject(SMESH::SMESH_IDSource::_nil()) + myFilterDlg(0) { QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_MESH_SCALE"))); QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_SCALE_ALONG_AXES"))); @@ -312,7 +308,10 @@ SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) : connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(reject())); + connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject())); + connect(mySMESHGUI, SIGNAL(SignalActivatedViewManager()), this, SLOT(onOpenView())); + connect(mySMESHGUI, SIGNAL(SignalCloseView()), this, SLOT(onCloseView())); + connect(LineEditElements, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); connect(CheckBoxMesh, SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool))); connect(ActionGroup, SIGNAL(buttonClicked(int)), SLOT(onActionClicked(int))); @@ -353,6 +352,9 @@ SMESHGUI_ScaleDlg::~SMESHGUI_ScaleDlg() void SMESHGUI_ScaleDlg::Init (bool ResetControls) { myBusy = false; + myObjects.clear(); + myObjectsNames.clear(); + myMeshes.clear(); myEditCurrentArgument = 0; LineEditElements->clear(); @@ -363,7 +365,6 @@ void SMESHGUI_ScaleDlg::Init (bool ResetControls) buttonApply->setEnabled(false); myActor = 0; - myMesh = SMESH::SMESH_Mesh::_nil(); if (ResetControls) { SpinBox1_1->SetValue(0.0); @@ -426,6 +427,8 @@ void SMESHGUI_ScaleDlg::ConstructorsClicked (int constructorId) connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); QApplication::instance()->processEvents(); + myEditCurrentArgument->hide(); + myEditCurrentArgument->show(); updateGeometry(); resize(100,100); } @@ -474,43 +477,78 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() QStringList anEntryList; try { SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - - myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); - - SMESH::SMESH_IDSource_var obj; - if ( CheckBoxMesh->isChecked() ) - obj = mySelectedObject; - else - obj = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); - + switch ( actionButton ) { case MOVE_ELEMS_BUTTON: - aMeshEditor->Scale(obj, aPoint, aScaleFact, false); + if ( CheckBoxMesh->isChecked() ) + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters( aParameters.join( ":" ).toLatin1().constData() ); + aMeshEditor->Scale(myObjects[i], aPoint, aScaleFact, false); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); + myMeshes[0]->SetParameters( aParameters.join( ":" ).toLatin1().constData() ); + aMeshEditor->Scale( src, aPoint, aScaleFact, false); + } break; case COPY_ELEMS_BUTTON: - if ( makeGroups ) - SMESH::ListOfGroups_var groups = - aMeshEditor->ScaleMakeGroups(obj, aPoint, aScaleFact); - else - aMeshEditor->Scale(obj, aPoint, aScaleFact, true); + if ( makeGroups ) { + SMESH::ListOfGroups_var groups; + if(CheckBoxMesh->isChecked()) + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + groups = aMeshEditor->ScaleMakeGroups(myObjects[i], aPoint, aScaleFact); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + groups = aMeshEditor->ScaleMakeGroups( src, aPoint, aScaleFact); + } + } + else { + if(CheckBoxMesh->isChecked()) { + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + aMeshEditor->Scale(myObjects[i], aPoint, aScaleFact, true); + } + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + aMeshEditor->Scale( src, aPoint, aScaleFact, true); + } + } break; case MAKE_MESH_BUTTON: { - SMESH::SMESH_Mesh_var mesh = - aMeshEditor->ScaleMakeMesh(obj, aPoint, aScaleFact, makeGroups, - LineEditNewMesh->text().toLatin1().data()); - if (!mesh->_is_nil()) { + SMESH::SMESH_Mesh_var mesh; + if (CheckBoxMesh->isChecked()) { + for ( int i = 0; i < myObjects.count(); i++ ) { + QString aName = SMESH::UniqueMeshName( LineEditNewMesh->text().replace( "*", myObjectsNames[i] ) ); + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + mesh = aMeshEditor->ScaleMakeMesh(myObjects[i], aPoint, aScaleFact, makeGroups, + aName.toLatin1().data()); + if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) + anEntryList.append( aSObject->GetID().c_str() ); + } + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); + mesh = aMeshEditor->ScaleMakeMesh( src, aPoint, aScaleFact, makeGroups, + LineEditNewMesh->text().toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif } break; } @@ -518,7 +556,11 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() } catch (...) { } - SMESH::UpdateView(); + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH_Actor* actor = SMESH::FindActorByObject( myObjects[i] ); + if ( actor ) SMESH::Update( actor->getIO(), true ); + } + if ( ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) || actionButton == MAKE_MESH_BUTTON ) { mySMESHGUI->updateObjBrowser(true); // new groups may appear @@ -528,7 +570,6 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() } Init(false); ConstructorsClicked(GetConstructorId()); - mySelectedObject = SMESH::SMESH_IDSource::_nil(); SelectionIntoArgument(); SMESHGUI::Modified(); @@ -567,6 +608,31 @@ void SMESHGUI_ScaleDlg::reject() QDialog::reject(); } +//================================================================================= +// function : onOpenView() +// purpose : +//================================================================================= +void SMESHGUI_ScaleDlg::onOpenView() +{ + if ( mySelector ) { + SMESH::SetPointRepresentation(false); + } + else { + mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector(); + ActivateThisDialog(); + } +} + +//================================================================================= +// function : onCloseView() +// purpose : +//================================================================================= +void SMESHGUI_ScaleDlg::onCloseView() +{ + DeactivateActiveDialog(); + mySelector = 0; +} + //================================================================================= // function : ClickOnHelp() // purpose : @@ -649,10 +715,13 @@ void SMESHGUI_ScaleDlg::onTextChange (const QString& theNewText) void SMESHGUI_ScaleDlg::SelectionIntoArgument() { if (myBusy) return; + if (myFilterDlg && myFilterDlg->isVisible()) return; // filter dlg active + BusyLocker lock( myBusy ); // clear myActor = 0; QString aString = ""; + onDisplaySimulation(false); if (myEditCurrentArgument == (QWidget*)LineEditElements) { LineEditElements->setText(aString); @@ -666,30 +735,53 @@ void SMESHGUI_ScaleDlg::SelectionIntoArgument() // get selected mesh SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); + mySelectionMgr->selectedObjects(aList); int nbSel = aList.Extent(); - if (nbSel != 1) - return; - - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::GetMeshByIO(IO); - if (myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByObject(myMesh); - if (!myActor) - myActor = SMESH::FindActorByEntry(IO->getEntry()); - if (!myActor && !CheckBoxMesh->isChecked()) + if (nbSel < 1) return; int aNbUnits = 0; - if (myEditCurrentArgument == (QWidget*)LineEditElements) { + if (myEditCurrentArgument == (QWidget*)LineEditElements) + { myElementsId = ""; + myObjects.clear(); + myObjectsNames.clear(); + myMeshes.clear(); + + for ( SALOME_ListIteratorOfListIO it( aList ); it.More(); it.Next() ) + { + Handle(SALOME_InteractiveObject) IO = it.Value(); + SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO( IO ); + if ( aMesh->_is_nil() ) + return; + + myActor = SMESH::FindActorByObject( aMesh ); + if ( !myActor ) + myActor = SMESH::FindActorByEntry( IO->getEntry() ); + // if ( !myActor && !CheckBoxMesh->isChecked() ) -- elems can be selected by Filter + // return; + + SMESH::SMESH_IDSource_var idSrc = SMESH::IObjectToInterface( IO ); + if ( _PTR(SObject) obj = SMESH::FindSObject( idSrc )) + { + std::string name = obj->GetName(); + if ( !name.empty() ) + { + myObjects << idSrc; + myObjectsNames << name.c_str(); + myMeshes << aMesh; + } + } + } // MakeGroups is available if there are groups and "Copy" - if ( myMesh->NbGroups() == 0 ) { + int aNbGroups = 0; + for ( int i = 0; i < myMeshes.count(); i++ ) + aNbGroups += myMeshes[i]->NbGroups(); + + if ( aNbGroups == 0 ) { MakeGroupsCheck->setChecked(false); MakeGroupsCheck->setEnabled(false); } @@ -698,67 +790,33 @@ void SMESHGUI_ScaleDlg::SelectionIntoArgument() } if (CheckBoxMesh->isChecked()) { - SMESH::GetNameOfSelectedIObjects( mySelectionMgr, aString ); - - if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //MESH, SUBMESH, OR GROUP - mySelectedObject = SMESH::IObjectToInterface(IO); - } - else + if (myMeshes.isEmpty()) return; - // get IDs from mesh - /* - SMDS_Mesh* aSMDSMesh = myActor->GetObject()->GetMesh(); - if (!aSMDSMesh) - return; - - for (int i = aSMDSMesh->MinElementID(); i <= aSMDSMesh->MaxElementID(); i++) { - const SMDS_MeshElement * e = aSMDSMesh->FindElement(i); - if (e) { - myElementsId += QString(" %1").arg(i); - aNbUnits++; - } - } - } else if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //SUBMESH - // get submesh - SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(IO); - - // get IDs from submesh - SMESH::long_array_var anElementsIds = new SMESH::long_array; - anElementsIds = aSubMesh->GetElementsId(); - for (int i = 0; i < anElementsIds->length(); i++) { - myElementsId += QString(" %1").arg(anElementsIds[i]); - } - aNbUnits = anElementsIds->length(); - } else { // GROUP - // get smesh group - SMESH::SMESH_GroupBase_var aGroup = - SMESH::IObjectToInterface(IO); - if (aGroup->_is_nil()) - return; - - // get IDs from smesh group - SMESH::long_array_var anElementsIds = new SMESH::long_array; - anElementsIds = aGroup->GetListOfID(); - for (int i = 0; i < anElementsIds->length(); i++) { - myElementsId += QString(" %1").arg(anElementsIds[i]); - } - aNbUnits = anElementsIds->length(); - } - */ - } else { - aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString); + SMESH::GetNameOfSelectedIObjects( mySelectionMgr, aString ); + } + else { + aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aList.First(), aString); myElementsId = aString; if (aNbUnits < 1) return; } myNbOkElements = true; - } else { + + } + else // set coordinates by a picked node + { + Handle(SALOME_InteractiveObject) IO = aList.First(); + + SMESH_Actor* anActor = SMESH::FindActorByEntry( IO->getEntry() ); + if (!anActor) + return; + aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString); if (aNbUnits != 1) return; - SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh(); + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); if (!aMesh) return; @@ -877,8 +935,13 @@ void SMESHGUI_ScaleDlg::ActivateThisDialog() //================================================================================= void SMESHGUI_ScaleDlg::enterEvent (QEvent*) { - if (!ConstructorsBox->isEnabled()) + if (!ConstructorsBox->isEnabled()) { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ); + if ( aViewWindow && !mySelector) { + mySelector = aViewWindow->GetSelector(); + } ActivateThisDialog(); + } } //======================================================================= @@ -926,6 +989,10 @@ void SMESHGUI_ScaleDlg::onSelectMesh (bool toSelectMesh) void SMESHGUI_ScaleDlg::onActionClicked(int button) { + int aNbGroups = 0; + for ( int i = 0; i < myMeshes.count(); i++ ) + aNbGroups += myMeshes[i]->NbGroups(); + switch ( button ) { case MOVE_ELEMS_BUTTON: MakeGroupsCheck->setEnabled(false); @@ -934,18 +1001,12 @@ void SMESHGUI_ScaleDlg::onActionClicked(int button) case COPY_ELEMS_BUTTON: LineEditNewMesh->setEnabled(false); MakeGroupsCheck->setText( tr("SMESH_MAKE_GROUPS")); - if ( myMesh->_is_nil() || myMesh->NbGroups() > 0) - MakeGroupsCheck->setEnabled(true); - else - MakeGroupsCheck->setEnabled(false); + MakeGroupsCheck->setEnabled( myMeshes.isEmpty() || aNbGroups > 0 ); break; case MAKE_MESH_BUTTON: LineEditNewMesh->setEnabled(true); MakeGroupsCheck->setText( tr("SMESH_COPY_GROUPS")); - if ( myMesh->_is_nil() || myMesh->NbGroups() > 0) - MakeGroupsCheck->setEnabled(true); - else - MakeGroupsCheck->setEnabled(false); + MakeGroupsCheck->setEnabled( myMeshes.isEmpty() || aNbGroups > 0 ); break; } setNewMeshName(); @@ -960,13 +1021,13 @@ void SMESHGUI_ScaleDlg::onActionClicked(int button) void SMESHGUI_ScaleDlg::setNewMeshName() { LineEditNewMesh->setText(""); - if ( LineEditNewMesh->isEnabled() && !myMesh->_is_nil() ) { + if ( LineEditNewMesh->isEnabled() && !myMeshes.isEmpty() ) { QString name; if ( CheckBoxMesh->isChecked() ) { - name = LineEditElements->text(); + name = myObjects.count() > 1 ? "*" : LineEditElements->text(); } else { - _PTR(SObject) meshSO = SMESH::FindSObject( myMesh ); + _PTR(SObject) meshSO = SMESH::FindSObject( myMeshes[0] ); name = meshSO->GetName().c_str(); } if ( !name.isEmpty() ) @@ -1005,22 +1066,48 @@ void SMESHGUI_ScaleDlg::keyPressEvent( QKeyEvent* e ) //================================================================================= void SMESHGUI_ScaleDlg::setFilters() { - if(myMesh->_is_nil()) { - SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); - return; + if ( myMeshes.isEmpty() ) { + SUIT_MessageBox::critical(this, tr("SMESH_ERROR"), tr("NO_MESH_SELECTED")); + return; } - if ( !myFilterDlg ) + if ( !myFilterDlg ) { myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, SMESH::ALL ); + connect(myFilterDlg, SIGNAL(Accepted()), SLOT(onFilterAccepted())); + } + + QList types; + if ( myMeshes[0]->NbEdges() ) types << SMESH::EDGE; + if ( myMeshes[0]->NbFaces() ) types << SMESH::FACE; + if ( myMeshes[0]->NbVolumes() ) types << SMESH::VOLUME; + if ( myMeshes[0]->NbBalls() ) types << SMESH::BALL; + if ( myMeshes[0]->Nb0DElements()) types << SMESH::ELEM0D; + if ( types.count() > 1 ) types << SMESH::ALL; + myFilterDlg->Init( types ); myFilterDlg->SetSelection(); - myFilterDlg->SetMesh( myMesh ); + myFilterDlg->SetMesh( myMeshes[0] ); myFilterDlg->SetSourceWg( LineEditElements ); myFilterDlg->show(); } +//======================================================================= +// name : onFilterAccepted() +// Purpose : SLOT. Called when Filter dlg closed with OK button. +// Activate [Apply] if no Actor is available +//======================================================================= +void SMESHGUI_ScaleDlg::onFilterAccepted() +{ + if ( myMeshes.length() > 0 && !buttonOk->isEnabled() ) + { + myElementsId = LineEditElements->text(); + QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts); + myNbOkElements = aListElementsId.count(); + buttonOk->setEnabled ( myNbOkElements ); + buttonApply->setEnabled( myNbOkElements ); + } +} + //================================================================================= // function : isValid // purpose : @@ -1072,17 +1159,21 @@ void SMESHGUI_ScaleDlg::onDisplaySimulation( bool toDisplayPreview ) { bool copy = ( ActionGroup->checkedId() == COPY_ELEMS_BUTTON || ActionGroup->checkedId() == MAKE_MESH_BUTTON ); SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); - SMESH::SMESH_IDSource_var obj; - if ( CheckBoxMesh->isChecked() ) - obj = mySelectedObject; - else - obj = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); - aMeshEditor->Scale(obj, aPoint, aScaleFact, copy); - - SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); - mySimulation->SetData(aMeshPreviewStruct._retn()); + QList aMeshPreviewStruct; + if(CheckBoxMesh->isChecked()) + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditPreviewer(); + aMeshEditor->Scale(myObjects[i], aPoint, aScaleFact, copy); + aMeshPreviewStruct << aMeshEditor->GetPreviewData(); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditPreviewer(); + SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); + aMeshEditor->Scale( src, aPoint, aScaleFact, copy); + aMeshPreviewStruct << aMeshEditor->GetPreviewData(); + } + setSimulationPreview(aMeshPreviewStruct); } catch (...) { hidePreview(); }