-// Copyright (C) 2007-2012 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
// 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.h"
#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_MeshUtils.h"
#include "SMESHGUI_VTKUtils.h"
#include <SMESH_TypeFilter.hxx>
#include <SVTK_ViewWindow.h>
#include <SALOME_ListIO.hxx>
-#include <SALOME_ListIteratorOfListIO.hxx>
// Qt includes
#include <QApplication>
#include <QKeyEvent>
#include <utilities.h>
+#include <SALOMEDSClient_SObject.hxx>
// IDL includes
#include <SALOMEconfig.h>
SUIT_ResourceMgr* aResMgr = SMESH::GetResourceMgr( mySMESHGUI );
QPixmap iconWithoutElem (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_DUPLICATE_NODES")));
QPixmap iconWithElem (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_DUPLICATE_NODES_WITH_ELEM")));
+ QPixmap iconElemOnly (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_DUPLICATE_ELEM_ONLY")));
+ QPixmap iconGrpBoundary (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_DUPLICATE_GROUP_BOUNDARY")));
QPixmap iconSelect (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT")));
// Main layout
aRadioButton1->setIcon(iconWithoutElem);
QRadioButton* aRadioButton2 = new QRadioButton(aConstructorsBox);
aRadioButton2->setIcon(iconWithElem);
+ QRadioButton* aRadioButton3 = new QRadioButton(aConstructorsBox);
+ aRadioButton3->setIcon(iconElemOnly);
+ QRadioButton* aRadioButton4 = new QRadioButton(aConstructorsBox);
+ aRadioButton4->setIcon(iconGrpBoundary);
aConstructorsBoxLayout->addWidget(aRadioButton1);
aConstructorsBoxLayout->addWidget(aRadioButton2);
+ aConstructorsBoxLayout->addWidget(aRadioButton3);
+ aConstructorsBoxLayout->addWidget(aRadioButton4);
myGroupConstructors->addButton(aRadioButton1, 0);
myGroupConstructors->addButton(aRadioButton2, 1);
+ myGroupConstructors->addButton(aRadioButton3, 2);
+ myGroupConstructors->addButton(aRadioButton4, 3);
// Arguments
myGroupArguments = new QGroupBox(this);
mySelectButton3->setIcon(iconSelect);
myLineEdit3 = new QLineEdit(myGroupArguments);
myLineEdit3->setReadOnly(true);
-
- myCheckBoxNewElemGroup = new QCheckBox(tr("CONSTRUCT_NEW_GROUP_ELEMENTS"), myGroupArguments);
- myCheckBoxNewNodeGroup = new QCheckBox(tr("CONSTRUCT_NEW_GROUP_NODES"), myGroupArguments);
-
- aGroupArgumentsLayout->addWidget(myTextLabel1, 0, 0);
- aGroupArgumentsLayout->addWidget(mySelectButton1, 0, 1);
- aGroupArgumentsLayout->addWidget(myLineEdit1, 0, 2);
- aGroupArgumentsLayout->addWidget(myTextLabel2, 1, 0);
- aGroupArgumentsLayout->addWidget(mySelectButton2, 1, 1);
- aGroupArgumentsLayout->addWidget(myLineEdit2, 1, 2);
- aGroupArgumentsLayout->addWidget(myTextLabel3, 2, 0);
- aGroupArgumentsLayout->addWidget(mySelectButton3, 2, 1);
- aGroupArgumentsLayout->addWidget(myLineEdit3, 2, 2);
- aGroupArgumentsLayout->addWidget(myCheckBoxNewElemGroup, 3, 0);
- aGroupArgumentsLayout->addWidget(myCheckBoxNewNodeGroup, 4, 0);
+ myGenerateButton3 = new QPushButton(tr("GENERATE_GROUPS"), myGroupArguments);
+
+ myCheckBox1 = new QCheckBox(tr("CONSTRUCT_NEW_GROUP_ELEMENTS"), myGroupArguments);
+ myCheckBox2 = new QCheckBox(tr("CONSTRUCT_NEW_GROUP_NODES"), myGroupArguments);
+
+ aGroupArgumentsLayout->addWidget(myTextLabel1, 0, 0);
+ aGroupArgumentsLayout->addWidget(mySelectButton1, 0, 1);
+ aGroupArgumentsLayout->addWidget(myLineEdit1, 0, 2, 1, 2);
+ aGroupArgumentsLayout->addWidget(myTextLabel2, 1, 0);
+ aGroupArgumentsLayout->addWidget(mySelectButton2, 1, 1);
+ aGroupArgumentsLayout->addWidget(myLineEdit2, 1, 2, 1, 2);
+ aGroupArgumentsLayout->addWidget(myTextLabel3, 2, 0);
+ aGroupArgumentsLayout->addWidget(mySelectButton3, 2, 1);
+ aGroupArgumentsLayout->addWidget(myLineEdit3, 2, 2);
+ aGroupArgumentsLayout->addWidget(myGenerateButton3,2, 3);
+ aGroupArgumentsLayout->addWidget(myCheckBox1, 3, 0);
+ aGroupArgumentsLayout->addWidget(myCheckBox2, 4, 0);
aGroupArgumentsLayout->setRowStretch(5, 1);
// Buttons
aMainLayout->addWidget(myGroupArguments);
aMainLayout->addWidget(aGroupButtons);
+ myCheckBox1->setChecked(true);
+ myCheckBox2->setChecked(true);
+
// Initialize the dialog
Init();
connect(mySelectButton1, SIGNAL (clicked()), this, SLOT(onEditCurrentArgument()));
connect(mySelectButton2, SIGNAL (clicked()), this, SLOT(onEditCurrentArgument()));
connect(mySelectButton3, SIGNAL (clicked()), this, SLOT(onEditCurrentArgument()));
+ connect(myGenerateButton3, SIGNAL (clicked()), this, SLOT(onGenerate()));
+
+ connect(myCheckBox2, SIGNAL(stateChanged(int)), SLOT(updateButtons()));
connect(myButtonOk, SIGNAL(clicked()), this, SLOT(onOk()));
connect(myButtonClose, SIGNAL(clicked()), this, SLOT(reject()));
void SMESHGUI_DuplicateNodesDlg::Init()
{
mySMESHGUI->SetActiveDialogBox((QDialog*)this);
- myCheckBoxNewElemGroup->setChecked(true);
- myCheckBoxNewNodeGroup->setChecked(true);
// Set initial parameters
myBusy = false;
// Set text to the group of arguments and to the first two labels
myGroupArguments->setTitle(tr("DUPLICATION_WITHOUT_ELEMS"));
myTextLabel1->setText(tr("GROUP_NODES_TO_DUPLICATE"));
- myTextLabel2->setText(tr("GROUP_NODES_TO_REPLACE"));
+ myTextLabel3->setText(tr("GROUP_NODES_TO_REPLACE"));
- myCheckBoxNewElemGroup->hide();
- myCheckBoxNewNodeGroup->show();
-
- // Hide the third field
- myTextLabel3->hide();
- mySelectButton3->hide();
- myLineEdit3->hide();
+ myCheckBox1->hide();
+ myCheckBox2->show();
+ myCheckBox2->setText( tr("CONSTRUCT_NEW_GROUP_NODES"));
+ // Hide the 2nd field
+ myTextLabel2 ->hide();
+ mySelectButton2 ->hide();
+ myLineEdit2 ->hide();
+ myTextLabel3 ->show();
+ mySelectButton3 ->show();
+ myLineEdit3 ->show();
+ myGenerateButton3->show();
+
break;
}
case 1:
myTextLabel2->setText(tr("GROUP_NODES_NOT_DUPLICATE"));
myTextLabel3->setText(tr("GROUP_ELEMS_TO_REPLACE"));
- myCheckBoxNewElemGroup->show();
- myCheckBoxNewNodeGroup->show();
+ myCheckBox1->show();
+ myCheckBox2->show();
+ myCheckBox1->setText( tr("CONSTRUCT_NEW_GROUP_ELEMENTS"));
+ myCheckBox2->setText( tr("CONSTRUCT_NEW_GROUP_NODES"));
+
+ // Show the 2nd field
+ myTextLabel2 ->show();
+ mySelectButton2 ->show();
+ myLineEdit2 ->show();
+ myTextLabel3 ->show();
+ mySelectButton3 ->show();
+ myLineEdit3 ->show();
+ myGenerateButton3->show();
- // Show the third field
- myTextLabel3->show();
- mySelectButton3->show();
- myLineEdit3->show();
+ break;
+ }
+ case 2:
+ {
+ // Set text to the group of arguments and to all the labels
+ myGroupArguments->setTitle(tr("DUPLICATION_ONLY_ELEMS"));
+ myTextLabel1->setText(tr("GROUP_ELEMS_TO_DUPLICATE"));
+
+ myCheckBox1->show();
+ myCheckBox1->setText( tr("CONSTRUCT_NEW_GROUP_ELEMENTS"));
+ myCheckBox2->hide();
+
+ // Hide the second and the third field
+ myTextLabel2 ->hide();
+ mySelectButton2 ->hide();
+ myLineEdit2 ->hide();
+ myTextLabel3 ->hide();
+ mySelectButton3 ->hide();
+ myLineEdit3 ->hide();
+ myGenerateButton3->hide();
+
+ break;
+ }
+ case 3:
+ {
+ // Set text to the group of arguments and to all the labels
+ myGroupArguments->setTitle(tr("DUPLICATION_GROUP_BOUNDARY"));
+ myTextLabel1->setText(tr("GROUP_VOLUME_GROUPS"));
+
+ myCheckBox1->show();
+ myCheckBox2->show();
+ myCheckBox1->setText( tr("CREATE_JOINT_ELEMENTS"));
+ myCheckBox2->setText( tr("ON_ALL_BOUNDARIES"));
+
+ // Hide the second and the third field
+ myTextLabel2 ->hide();
+ mySelectButton2 ->hide();
+ myLineEdit2 ->hide();
+ myTextLabel3 ->hide();
+ mySelectButton3 ->hide();
+ myLineEdit3 ->hide();
+ myGenerateButton3->hide();
break;
}
}
-
+ myGroupArguments->hide();
+ myGroupArguments->show();
+ this->resize(this->sizeHint().width(), this->minimumSizeHint().height());
// Process selection
onSelectionChanged();
}
*/
bool SMESHGUI_DuplicateNodesDlg::onApply()
{
- if ( mySMESHGUI->isActiveStudyLocked() || !isValid() )
+ if ( SMESHGUI::isStudyLocked() || !isValid() )
return false;
BusyLocker lock( myBusy );
- bool toCreateElemGroup = myCheckBoxNewElemGroup->isChecked();
- bool toCreateNodeGroup = myCheckBoxNewNodeGroup->isChecked();
- int operationMode = myGroupConstructors->checkedId();
+ bool toCreateElemGroup = myCheckBox1->isChecked();
+ bool toCreateNodeGroup = myCheckBox2->isChecked();
+ int operationMode = myGroupConstructors->checkedId();
// Apply changes
bool result = false;
SUIT_OverrideCursor aWaitCursor;
+ QStringList anEntryList;
try {
- SMESH::SMESH_Mesh_var aMesh = myGroups1[0]->GetMesh();
+ SMESH::SMESH_Mesh_var aMesh = myGroups1[0]->GetMesh();
SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
- if ( operationMode == 0 ) {
+ switch ( operationMode ) {
+ case 0:
+ {
SMESH::ListOfGroups_var g1 = new SMESH::ListOfGroups();
g1->length( myGroups1.count() );
for ( int i = 0; i < myGroups1.count(); i++ )
g1[i] = myGroups1[i];
SMESH::ListOfGroups_var g2 = new SMESH::ListOfGroups();
- g2->length( myGroups2.count() );
- for ( int i = 0; i < myGroups2.count(); i++ )
- g2[i] = myGroups2[i];
+ g2->length( myGroups3.count() );
+ for ( int i = 0; i < myGroups3.count(); i++ )
+ g2[i] = myGroups3[i];
if ( toCreateNodeGroup ) {
SMESH::SMESH_GroupBase_var aNewGroup =
else {
result = aMeshEditor->DoubleNodeGroups( g1.in(), g2.in() );
}
+ break;
}
- else {
+ case 1:
+ {
SMESH::ListOfGroups_var g1 = new SMESH::ListOfGroups();
g1->length( myGroups1.count() );
for ( int i = 0; i < myGroups1.count(); i++ )
else {
result = aMeshEditor->DoubleNodeElemGroups( g1.in(), g2.in(), g3.in() );
}
+ break;
+ }
+ case 2:
+ {
+ result = true;
+ QString groupName;
+ if ( toCreateElemGroup )
+ groupName = SMESH::UniqueName("DoubleElements");
+ for ( int i = 0; i < myGroups1.count(); i++ )
+ {
+ SMESH::SMESH_Group_var group =
+ aMeshEditor->DoubleElements( myGroups1[i], groupName.toUtf8().data() );
+ if ( group->_is_nil() )
+ {
+ if ( toCreateElemGroup )
+ result = false;
+ }
+ else
+ {
+ if ( _PTR(SObject) so = SMESH::FindSObject( group ))
+ anEntryList.append( so->GetID().c_str() );
+ }
+ }
+ break;
+ }
+ case 3:
+ {
+ bool createJointElems = myCheckBox1->isChecked();
+ bool onAllBoundaries = myCheckBox2->isChecked();
+
+ SMESH::ListOfGroups_var g1 = new SMESH::ListOfGroups();
+ g1->length( myGroups1.count() );
+ for ( int i = 0; i < myGroups1.count(); i++ )
+ g1[i] = myGroups1[i];
+
+ result = aMeshEditor->DoubleNodesOnGroupBoundaries( g1.in(), createJointElems, onAllBoundaries );
+
+ break;
}
+ } // switch( operationMode )
}
catch (const SALOME::SALOME_Exception& S_ex) {
SalomeApp_Tools::QtCatchCorbaException(S_ex);
}
catch ( const std::exception& exc ) {
- INFOS( "Follow exception was cought:\n\t" << exc.what() );
- }
- catch (...){
- INFOS( "Unknown exception was cought !!!" );
+ INFOS( "Follow exception was caught:\n\t" << exc.what() );
+ }
+ catch (...) {
+ INFOS( "Unknown exception was caught !!!" );
}
if (!result) {
SMESHGUI::Modified();
mySMESHGUI->updateObjBrowser(true);
+ if ( !anEntryList.isEmpty())
+ if( LightApp_Application* anApp =
+ dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ))
+ anApp->browseObjects( anEntryList, true, false );
+
// Reinitialize the dialog
Init();
-
+
return true;
}
// check group of proper type is selected
if ( ok ) {
SMESH::ElementType aGroupType = aGroup->GetType();
- if ( operationMode == 0 ) {
+ switch ( operationMode ) {
+ case 0:
ok = ( myCurrentLineEdit == myLineEdit1 && aGroupType == SMESH::NODE ) ||
( myCurrentLineEdit == myLineEdit2 && aGroupType != SMESH::NODE );
- }
- else {
+ break;
+ case 1:
ok = ( myCurrentLineEdit == myLineEdit1 && ( aGroupType == SMESH::EDGE ||
aGroupType == SMESH::FACE ) ) ||
( myCurrentLineEdit == myLineEdit2 && aGroupType == SMESH::NODE ) ||
( myCurrentLineEdit == myLineEdit3 && aGroupType != SMESH::NODE );
+ break;
+ case 2:
+ ok = ( aGroupType != SMESH::NODE );
+ break;
+ case 3:
+ ok = ( aGroupType == SMESH::VOLUME ||
+ aGroupType == SMESH::FACE );
+ break;
}
}
if ( ok ) aGroups << aGroup;
else if ( myCurrentLineEdit == myLineEdit3 ) myGroups3.clear();
myCurrentLineEdit->clear();
}
-
// Enable/disable "Apply and Close" and "Apply" buttons
+ updateButtons();
+}
+
+/*!
+ * \brief Enable/disable "Apply and Close" and "Apply" buttons
+ */
+void SMESHGUI_DuplicateNodesDlg::updateButtons()
+{
bool isDataValid = isValid();
myButtonOk->setEnabled( isDataValid );
myButtonApply->setEnabled( isDataValid );
+
+ int operationMode = myGroupConstructors->checkedId();
+ myGenerateButton3->setEnabled( operationMode <= 1 && !myGroups1.empty() );
}
/*!
/*!
\brief Check if the input data is valid.
- \return \c true id the data is valid
+ \return \c true if the data is valid
*/
bool SMESHGUI_DuplicateNodesDlg::isValid()
{
- return myGroupConstructors->checkedId() == 1 ?
- ( !myGroups1.isEmpty() && !myGroups3.isEmpty() ) :
- ( !myGroups1.isEmpty() );
+ switch( myGroupConstructors->checkedId() )
+ {
+ case 1: return ( !myGroups1.isEmpty() && !myGroups3.isEmpty() );
+ case 3: return ( myGroups1.count() > ( myCheckBox2->isChecked() ? 0 : 1 ));
+ default: return !myGroups1.isEmpty();
+ }
+ return false;
}
-
/*!
- \brief SLOT called when dialog shoud be deativated.
+ \brief SLOT called when dialog should be deactivated.
*/
void SMESHGUI_DuplicateNodesDlg::onDeactivate()
{
}
}
+/*!
+ \brief SLOT called when Generate button is clicked
+*/
+void SMESHGUI_DuplicateNodesDlg::onGenerate()
+{
+ if ( SMESHGUI::isStudyLocked() )
+ return;
+
+ SUIT_OverrideCursor aWaitCursor;
+ BusyLocker lock( myBusy );
+
+ try {
+ SMESH::SMESH_Mesh_var aMesh = myGroups1[0]->GetMesh();
+ SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
+
+ SMESH::ListOfGroups_var g1 = new SMESH::ListOfGroups();
+ g1->length( myGroups1.count() );
+ for ( int i = 0; i < myGroups1.count(); i++ )
+ g1[i] = myGroups1[i];
+ SMESH::ListOfGroups_var g2 = new SMESH::ListOfGroups();
+ g2->length( myGroups2.count() );
+ for ( int i = 0; i < myGroups2.count(); i++ )
+ g2[i] = myGroups2[i];
+
+ SMESH::ListOfGroups_var newGroups =
+ aMeshEditor->AffectedElemGroupsInRegion( g1, g2, GEOM::GEOM_Object::_nil() );
+
+ QString text;
+ switch ( newGroups->length() ) {
+ case 0: break;
+ case 1: text = SMESH::toQStr( newGroups[0]->GetName() ); break;
+ default: text = tr( "SMESH_OBJECTS_SELECTED" ).arg( newGroups->length() );
+ }
+ myLineEdit3->setText( text );
+
+ myGroups3.clear();
+ for ( CORBA::ULong i = 0; i < newGroups->length(); ++i )
+ myGroups3 << SMESH::SMESH_GroupBase::_duplicate( newGroups[i] );
+ }
+ catch (const SALOME::SALOME_Exception& S_ex) {
+ SalomeApp_Tools::QtCatchCorbaException(S_ex);
+ }
+ catch ( const std::exception& exc ) {
+ INFOS( "Follow exception was caught:\n\t" << exc.what() );
+ }
+ catch (...) {
+ INFOS( "Unknown exception was caught !!!" );
+ }
+
+ mySMESHGUI->updateObjBrowser(true);
+ updateButtons();
+}
+
/*!
\brief Receive dialog enter events.
Activates the dialog when the mouse cursor enters.