-// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020 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
// 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
#include "SMESHGUI_CopyMeshDlg.h"
#include "SMESHGUI.h"
+#include "SMESHGUI_FilterDlg.h"
+#include "SMESHGUI_GEOMGenUtils.h"
+#include "SMESHGUI_IdValidator.h"
+#include "SMESHGUI_MeshUtils.h"
+#include "SMESHGUI_Selection.h"
#include "SMESHGUI_SpinBox.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_IdValidator.h"
-#include "SMESHGUI_FilterDlg.h"
#include <SMESH_Actor.h>
#include <SMESH_TypeFilter.hxx>
#include <SMDS_Mesh.hxx>
// SALOME GUI includes
+#include <LightApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <SALOME_ListIO.hxx>
#include <SUIT_Desktop.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_Session.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
-
-#include <LightApp_Application.h>
-#include <LightApp_SelectionMgr.h>
-
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
#include <SVTK_ViewModel.h>
#include <SVTK_ViewWindow.h>
-#include <SALOME_ListIO.hxx>
+#include <SalomeApp_Tools.h>
// SALOME KERNEL includes
+#include <SALOMEDSClient_Study.hxx>
#include <SALOMEDSClient_SObject.hxx>
// OCCT includes
#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
-
//================================================================================
/*!
: QDialog( SMESH::GetDesktop( theModule ) ),
mySMESHGUI( theModule ),
mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
- myFilterDlg(0),
mySelectedObject(SMESH::SMESH_IDSource::_nil()),
+ myFilterDlg(0),
myIsApplyAndClose( false )
{
- QPixmap image (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_COPY_MESH")));
+ QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_COPY_MESH")));
+ QPixmap image2 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_COPY_MESH_WG")));
setModal(false);
setAttribute(Qt::WA_DeleteOnClose, true);
/***************************************************************/
ConstructorsBox = new QGroupBox(tr("SMESH_COPY_MESH_TITLE"), this);
- QButtonGroup* GroupConstructors = new QButtonGroup(this);
+ GroupConstructors = new QButtonGroup(this);
QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout(ConstructorsBox);
ConstructorsBoxLayout->setSpacing(SPACING);
ConstructorsBoxLayout->setMargin(MARGIN);
QRadioButton* RadioButton1= new QRadioButton(ConstructorsBox);
- RadioButton1->setIcon(image);
+ RadioButton1->setIcon(image1);
GroupConstructors->addButton(RadioButton1, 0);
+ QRadioButton* RadioButton2= new QRadioButton(ConstructorsBox);
+ RadioButton2->setIcon(image2);
+ GroupConstructors->addButton(RadioButton2, 1);
ConstructorsBoxLayout->addWidget(RadioButton1);
+ ConstructorsBoxLayout->addWidget(RadioButton2);
RadioButton1->setChecked(true);
- GroupConstructors->addButton(RadioButton1, 0);
/***************************************************************/
GroupArguments = new QGroupBox(tr("SMESH_ARGUMENTS"), this);
// CheckBox for copying groups
myCopyGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
- myCopyGroupsCheck->setChecked(false);
+ myCopyGroupsCheck->setChecked(true);
- // CheckBox for keeping ids
+ // CheckBox for keeping ids ( OBSOLETE )
myKeepIdsCheck = new QCheckBox(tr("SMESH_KEEP_IDS"), GroupArguments);
myKeepIdsCheck->setChecked(true);
+ myKeepIdsCheck->hide();
+
+ // New geometry
+ myGeomLabel = new QLabel( tr("NEW_GEOM"), GroupArguments );
+ myGeomNameEdit = new QLineEdit( GroupArguments );
+ myGeomNameEdit->setReadOnly(true);
+
+ // CheckBox to reuse hypotheses
+ myReuseHypCheck = new QCheckBox(tr("REUSE_HYPOTHESES"), GroupArguments);
+ myReuseHypCheck->setChecked(true);
+
+ // CheckBox to copy mesh elements
+ myCopyElementsCheck = new QCheckBox(tr("COPY_ELEMENTS"), GroupArguments);
+ myCopyElementsCheck->setChecked(true);
// layout
GroupArgumentsLayout->addWidget(myTextLabelElements, 0, 0);
GroupArgumentsLayout->addWidget(myIdSourceCheck, 1, 0, 1, 6);
GroupArgumentsLayout->addWidget(meshNameLabel, 2, 0);
GroupArgumentsLayout->addWidget(myMeshNameEdit, 2, 1, 1, 5);
- GroupArgumentsLayout->addWidget(myCopyGroupsCheck, 3, 0, 1, 6);
- GroupArgumentsLayout->addWidget(myKeepIdsCheck, 4, 0, 1, 6);
+ GroupArgumentsLayout->addWidget(myGeomLabel, 3, 0);
+ GroupArgumentsLayout->addWidget(myGeomNameEdit, 3, 1, 1, 5);
+ GroupArgumentsLayout->addWidget(myCopyGroupsCheck, 4, 0, 1, 6);
+ GroupArgumentsLayout->addWidget(myReuseHypCheck, 5, 0, 1, 6);
+ GroupArgumentsLayout->addWidget(myCopyElementsCheck, 6, 0, 1, 6);
+ // GroupArgumentsLayout->addWidget(myKeepIdsCheck, 7, 0, 1, 6);
+ GroupArgumentsLayout->setRowStretch( 6, 1 );
/***************************************************************/
GroupButtons = new QGroupBox(this);
// Selection filter
myIdSourceFilter = new SMESH_TypeFilter( SMESH::IDSOURCE );
- myHelpFileName = "copy_mesh_page.html";
+ myHelpFileName = "copy_mesh.html";
Init();
this, SLOT (SelectionIntoArgument()));
connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()),/* to close dialog if study change */
this, SLOT (reject()));
+ connect(mySMESHGUI, SIGNAL (SignalActivatedViewManager()),
+ this, SLOT (onOpenView()));
+ connect(mySMESHGUI, SIGNAL (SignalCloseView()),
+ this, SLOT (onCloseView()));
connect(myLineEditElements, SIGNAL(textChanged(const QString&)),
this, SLOT (onTextChange(const QString&)));
connect(myIdSourceCheck, SIGNAL(toggled(bool)),
this, SLOT (onSelectIdSource(bool)));
+ connect(GroupConstructors, SIGNAL(buttonClicked(int)),
+ this, SLOT (onConstructor(int)));
+
SelectionIntoArgument();
}
{
myBusy = false;
- myMeshNameEdit->setText( SMESH::UniqueMeshName("Mesh"));
+ if ( !isWithGeomMode() )
+ myMeshNameEdit->setText( SMESH::UniqueMeshName("Mesh"));
+
if ( ResetControls )
{
myLineEditElements->clear();
- //myElementsId = "";
myNbOkElements = 0;
buttonOk->setEnabled(false);
myMesh = SMESH::SMESH_Mesh::_nil();
myIdSourceCheck->setChecked(true);
- myCopyGroupsCheck->setChecked(false);
- myKeepIdsCheck->setChecked(false);
- onSelectIdSource( myIdSourceCheck->isChecked() );
+ onConstructor( 0 );
+ }
+}
+
+//=======================================================================
+//function : onConstructor
+//purpose : switch operation mode
+//=======================================================================
+
+void SMESHGUI_CopyMeshDlg::onConstructor( int withGeom )
+{
+ myGeomLabel ->setVisible( withGeom );
+ myGeomNameEdit ->setVisible( withGeom );
+ myReuseHypCheck ->setVisible( withGeom );
+ myCopyElementsCheck->setVisible( withGeom );
+ myFilterBtn ->setVisible( !withGeom );
+ myIdSourceCheck ->setVisible( !withGeom );
+
+ if ( !withGeom )
+ myMeshNameEdit->setText( SMESH::UniqueMeshName("Mesh"));
+
+ onSelectIdSource( /*toSelectMesh=*/ myIdSourceCheck->isChecked() || withGeom );
+}
+
+//=======================================================================
+//function : getErrorMsg
+//purpose : Return an error message and entries of invalid smesh object
+//=======================================================================
+
+QString SMESHGUI_CopyMeshDlg::getErrorMsg( SMESH::string_array_var theInvalidEntries,
+ QStringList & theEntriesToBrowse )
+{
+ if ( theInvalidEntries->length() == 0 )
+ return tr("OPERATION_FAILED");
+
+ // theInvalidEntries - SObject's that hold geometry objects whose
+ // counterparts are not found in the newGeometry, followed by SObject's
+ // holding mesh sub-objects that are invalid because they depend on a not found
+ // preceding sub-shape
+
+ QString msg = tr("SUBSHAPES_NOT_FOUND_MSG") + "\n";
+
+ QString objString;
+ for ( CORBA::ULong i = 0; i < theInvalidEntries->length(); ++i )
+ {
+ _PTR(SObject) so = SMESH::getStudy()->FindObjectID( theInvalidEntries[i].in() );
+
+ int objType = SMESHGUI_Selection::type( theInvalidEntries[i].in() );
+ if ( objType < 0 ) // geom object
+ {
+ objString += "\n";
+ if ( so )
+ objString += so->GetName().c_str();
+ else
+ objString += theInvalidEntries[i].in(); // it's something like "FACE #2"
+ }
+ else // smesh object
+ {
+ theEntriesToBrowse.push_back( theInvalidEntries[i].in() );
+
+ objString += "\n ";
+ switch ( objType ) {
+ case SMESH::MESH:
+ objString += tr("SMESH_MESH"); break;
+ case SMESH::HYPOTHESIS:
+ objString += tr("SMESH_HYPOTHESIS"); break;
+ case SMESH::ALGORITHM:
+ objString += tr("SMESH_ALGORITHM"); break;
+ case SMESH::SUBMESH_VERTEX:
+ case SMESH::SUBMESH_EDGE:
+ case SMESH::SUBMESH_FACE:
+ case SMESH::SUBMESH_SOLID:
+ case SMESH::SUBMESH_COMPOUND:
+ case SMESH::SUBMESH:
+ objString += tr("SMESH_SUBMESH"); break;
+ case SMESH::GROUP:
+ objString += tr("SMESH_GROUP"); break;
+ default:;
+ }
+ objString += " \"";
+ if ( so )
+ objString += so->GetName().c_str();
+ objString += "\" (";
+ objString += theInvalidEntries[i].in();
+ objString += ")";
+ }
}
+ if ( !objString.isEmpty() )
+ msg += objString;
+
+ return msg;
}
//=================================================================================
bool SMESHGUI_CopyMeshDlg::ClickOnApply()
{
- if (mySMESHGUI->isActiveStudyLocked())
+ if ( SMESHGUI::isStudyLocked() )
return false;
if( !isValid() )
return false;
QStringList anEntryList;
+ bool toShowObjects = isApplyAndClose();
try
{
SUIT_OverrideCursor aWaitCursor;
- SMESH::SMESH_IDSource_var aPartToCopy;
+
+ SMESH::IDSource_wrap aPartToCopy;
if ( myIdSourceCheck->isChecked())
{
aPartToCopy = mySelectedObject;
+ aPartToCopy->Register();
}
else
{
SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
aPartToCopy = aMeshEditor->MakeIDSource( anElementsId, SMESH::ALL );
}
- QByteArray meshName = myMeshNameEdit->text().toLatin1();
+ QByteArray meshName = myMeshNameEdit->text().toUtf8();
bool toCopyGroups = ( myCopyGroupsCheck->isChecked() );
+ bool toReuseHyps = ( myReuseHypCheck->isChecked() );
+ bool toCopyElems = ( myCopyElementsCheck->isChecked() );
bool toKeepIDs = ( myKeepIdsCheck->isChecked() );
SMESH::SMESH_Gen_var gen = SMESHGUI::GetSMESHGen();
- SMESH::SMESH_Mesh_var newMesh =
- gen->CopyMesh(aPartToCopy, meshName.constData(), toCopyGroups, toKeepIDs);
- if( !newMesh->_is_nil() )
- if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( newMesh ) )
+ SMESH::SMESH_Mesh_var newMesh;
+ if ( isWithGeomMode() )
+ {
+ SMESH::SMESH_Mesh_var srcMesh = mySelectedObject->GetMesh();
+ SMESH::ListOfGroups_var newGroups;
+ SMESH::submesh_array_var newSubmeshes;
+ SMESH::ListOfHypothesis_var newHypotheses;
+ SMESH::string_array_var invalidEntries;
+ CORBA::Boolean ok = gen->CopyMeshWithGeom( srcMesh, myNewGeometry,
+ meshName.constData(),
+ toCopyGroups, toReuseHyps, toCopyElems,
+ newMesh.out(),
+ newGroups.out(),
+ newSubmeshes.out(),
+ newHypotheses.out(),
+ invalidEntries.out() );
+ if ( !ok )
+ {
+ if ( invalidEntries->length() > 0 )
+ toShowObjects = true;
+ SUIT_MessageBox::warning( this,
+ tr("SMESH_WRN_WARNING"),
+ getErrorMsg( invalidEntries, anEntryList ));
+ }
+ }
+ else
+ {
+ newMesh = gen->CopyMesh(aPartToCopy, meshName.constData(), toCopyGroups, toKeepIDs);
+ }
+ if ( !newMesh->_is_nil() )
+ if ( _PTR(SObject) aSObject = SMESH::ObjectToSObject( newMesh ) )
+ {
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
- newMesh->UnRegister();
-#endif
- } catch (...) {
+
+ if ( isWithGeomMode() )
+ SMESH::SetName( aSObject, meshName );
+ }
+ }
+ catch(const SALOME::SALOME_Exception & S_ex)
+ {
+ SalomeApp_Tools::QtCatchCorbaException(S_ex);
+ }
+ catch (...)
+ {
}
mySMESHGUI->updateObjBrowser(true);
if( LightApp_Application* anApp =
dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
- anApp->browseObjects( anEntryList, isApplyAndClose() );
+ anApp->browseObjects( anEntryList, toShowObjects );
Init(false);
- mySelectedObject = SMESH::SMESH_IDSource::_nil();
SelectionIntoArgument();
return true;
QDialog::reject();
}
+//=================================================================================
+// function : onOpenView()
+// purpose :
+//=================================================================================
+void SMESHGUI_CopyMeshDlg::onOpenView()
+{
+ if ( mySelector ) {
+ SMESH::SetPointRepresentation(false);
+ }
+ else {
+ mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector();
+ ActivateThisDialog();
+ }
+}
+
+//=================================================================================
+// function : onCloseView()
+// purpose :
+//=================================================================================
+void SMESHGUI_CopyMeshDlg::onCloseView()
+{
+ DeactivateActiveDialog();
+ mySelector = 0;
+}
+
//=================================================================================
// function : ClickOnHelp()
// purpose :
buttonOk->setEnabled(false);
buttonApply->setEnabled(false);
- // hilight entered elements
+ // highlight entered elements
SMDS_Mesh* aMesh = 0;
if (myActor)
aMesh = myActor->GetObject()->GetMesh();
void SMESHGUI_CopyMeshDlg::SelectionIntoArgument()
{
if (myBusy) return;
+ if (myFilterDlg && myFilterDlg->isVisible()) return; // filter dlg active
+ if (!GroupButtons->isEnabled()) return; // inactive
+
BusyLocker lock( myBusy );
// clear
myActor = 0;
QString aString = "";
- myLineEditElements->setText(aString);
myNbOkElements = 0;
buttonOk->setEnabled(false);
buttonApply->setEnabled(false);
myFilterBtn->setEnabled(false);
- // get selected mesh
+ // get selected mesh or geometry
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();
- mySelectedObject = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO );
- if ( mySelectedObject->_is_nil() )
- return;
- myMesh = SMESH::GetMeshByIO(IO);
- if (myMesh->_is_nil())
- return;
+ SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(IO);
+ GEOM::GEOM_Object_var geom = SMESH::GetGeom(IO);
- myActor = SMESH::FindActorByEntry(IO->getEntry());
- if (!myActor)
- myActor = SMESH::FindActorByObject(myMesh);
+ if ( !mesh->_is_nil() )
+ {
+ myMesh = mesh;
+ myActor = SMESH::FindActorByEntry(IO->getEntry());
+ if (!myActor)
+ myActor = SMESH::FindActorByObject(myMesh);
- if (myIdSourceCheck->isChecked())
+ mySelectedObject = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO );
+ if ( mySelectedObject->_is_nil() )
+ return;
+
+ if ( isWithGeomMode() ) // only mesh selection allowed
+ {
+ myMesh = SMESH::SMESH_Mesh::_narrow( mySelectedObject );
+ if ( myMesh->_is_nil() )
+ {
+ myLineEditElements->setText("");
+ return;
+ }
+ }
+ }
+ else if ( !geom->_is_nil() )
+ {
+ myNewGeometry = geom;
+ }
+ else
+ return;
+
+ if (myIdSourceCheck->isChecked() || isWithGeomMode() )
{
SMESH::GetNameOfSelectedIObjects( mySelectionMgr, aString );
if ( aString.isEmpty() ) aString = " ";
myNbOkElements = aString.size();
myFilterBtn->setEnabled(true);
}
- myLineEditElements->setText( aString );
+
bool ok = !aString.isEmpty();
+ if ( !mesh->_is_nil() )
+ {
+ myLineEditElements->setText( aString );
+ if ( isWithGeomMode() )
+ myMeshNameEdit->setText( aString );
+ }
+ else if ( !geom->_is_nil() )
+ {
+ myGeomNameEdit->setText( aString );
+ }
+
+ if ( ok && isWithGeomMode() )
+ ok = ( !myMesh->_is_nil() && myMesh->HasShapeToMesh() && !myNewGeometry->_is_nil() );
buttonOk->setEnabled(ok);
buttonApply->setEnabled(ok);
//=======================================================================
void SMESHGUI_CopyMeshDlg::onSelectIdSource (bool toSelectMesh)
{
- if (toSelectMesh)
+ if ( isWithGeomMode() )
+ myTextLabelElements->setText(tr("SMESH_MESH"));
+ else if ( toSelectMesh )
myTextLabelElements->setText(tr("OBJECT_NAME"));
else
myTextLabelElements->setText(tr("ELEM_IDS"));
}
mySelectionMgr->clearFilters();
- mySelectionMgr->installFilter(myIdSourceFilter);
+ if ( !isWithGeomMode() )
+ mySelectionMgr->installFilter(myIdSourceFilter);
SMESH::SetPointRepresentation(false);
if (toSelectMesh) {
bool SMESHGUI_CopyMeshDlg::isValid()
{
- if ( myIdSourceCheck->isChecked() )
- return !mySelectedObject->_is_nil();
+ bool ok = false;
+ if ( myIdSourceCheck->isChecked() || isWithGeomMode() )
+ {
+ ok = ( !mySelectedObject->_is_nil() );
+ if ( isWithGeomMode() )
+ ok = ok && ( !myNewGeometry->_is_nil() );
+ }
+ else
+ {
+ ok = ( myNbOkElements > 0 );
+ }
+
+ return ok;
+}
+
+//=======================================================================
+//function : isWithGeomMode
+//purpose : Return true if the mode is "with geometry"
+//=======================================================================
- return myNbOkElements > 0;
+bool SMESHGUI_CopyMeshDlg::isWithGeomMode()
+{
+ return ( GroupConstructors->checkedId() == 1 );
}
//=================================================================================
SelectionIntoArgument();
}
+
//=================================================================================
// function : enterEvent()
// purpose :
//=================================================================================
void SMESHGUI_CopyMeshDlg::enterEvent (QEvent*)
{
- if (!ConstructorsBox->isEnabled())
+ if ( !ConstructorsBox->isEnabled() ) {
+ SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI );
+ if ( aViewWindow && !mySelector ) {
+ mySelector = aViewWindow->GetSelector();
+ }
ActivateThisDialog();
+ }
}
-
//=================================================================================
// function : keyPressEvent()
// purpose :
if ( !myFilterDlg )
myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, SMESH::ALL );
+ QList<int> types;
+ if ( myMesh->NbEdges() ) types << SMESH::EDGE;
+ if ( myMesh->NbFaces() ) types << SMESH::FACE;
+ if ( myMesh->NbVolumes() ) types << SMESH::VOLUME;
+ if ( myMesh->NbBalls() ) types << SMESH::BALL;
+ if ( myMesh->Nb0DElements()) types << SMESH::ELEM0D;
+ if ( types.count() > 1 ) types << SMESH::ALL;
+
+ myFilterDlg->Init( types );
myFilterDlg->SetSelection();
myFilterDlg->SetMesh( myMesh );
myFilterDlg->SetSourceWg( myLineEditElements );