X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ExtrusionDlg.cxx;h=ce69ade5e63432a1517365400e29c8c4543f903f;hp=b1e89e0124805e0bdc921e992b6115fee8c8d749;hb=HEAD;hpb=32d14d3084a1357854e927937452545c32fba7eb diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx index b1e89e012..e62812954 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 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 @@ -289,12 +289,12 @@ void SMESHGUI_3TypesSelector::selectionIntoArgument() } else // get indices of selected elements { - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; mySelector->GetIndex(IO,aMapIndex); int nbElements = aMapIndex.Extent(); if ( nbElements > 0 ) { - SMESH::long_array_var ids = new SMESH::long_array; + SMESH::smIdType_array_var ids = new SMESH::smIdType_array; ids->length( nbElements ); for ( int i = 0; i < nbElements; ++i ) aString += QString(" %1").arg( ids[ i ] = aMapIndex( i+1 )); @@ -352,9 +352,9 @@ void SMESHGUI_3TypesSelector::onTextChange( const QString& theNewText ) SMDSAbs_ElementType SMDSType = SMDSAbs_ElementType( iType+1 ); const bool isNode = ( SMDSType == SMDSAbs_Node ); - SMESH::long_array_var ids = new SMESH::long_array; + SMESH::smIdType_array_var ids = new SMESH::smIdType_array; ids->length( aListId.count() ); - TColStd_MapOfInteger newIndices; + SVTK_TVtkIDsMap newIndices; for (int i = 0; i < aListId.count(); i++) { int id = aListId[ i ].toInt(); bool validId = false; @@ -392,7 +392,7 @@ void SMESHGUI_3TypesSelector::onTextChange( const QString& theNewText ) */ //================================================================================ -void SMESHGUI_3TypesSelector::addTmpIdSource( SMESH::long_array_var& ids, int iType, int index ) +void SMESHGUI_3TypesSelector::addTmpIdSource( SMESH::smIdType_array_var& ids, int iType, int index ) { SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); SMESH::SMESH_IDSource_var idSrc = @@ -709,6 +709,8 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule) // Scales ScalesGrp = new QGroupBox(tr("SMESH_SCALES"), GroupArguments); + ScalesGrp->setCheckable(true); + ScalesGrp->setChecked(false); QGridLayout* ScalesGrpLayout = new QGridLayout( ScalesGrp ); ScalesGrpLayout->setSpacing(SPACING); ScalesGrpLayout->setMargin(MARGIN); @@ -730,41 +732,87 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule) ScalesGrpLayout->addWidget(AddScaleButton, 0, 1); ScalesGrpLayout->addWidget(RemoveScaleButton, 2, 1); ScalesGrpLayout->addWidget(ScaleSpin, 0, 2); - ScalesGrpLayout->addWidget(LinearScalesCheck, 4, 0); + ScalesGrpLayout->addWidget(LinearScalesCheck, 4, 0, 1, 3); ScalesGrpLayout->setRowMinimumHeight(1, 10); ScalesGrpLayout->setRowStretch(3, 10); + // Angles + + AnglesGrp = new QGroupBox(tr("SMESH_ANGLES"), GroupArguments); + AnglesGrp->setCheckable(true); + AnglesGrp->setChecked(false); + QGridLayout* AnglesGrpLayout = new QGridLayout( AnglesGrp ); + AnglesGrpLayout->setSpacing(SPACING); AnglesGrpLayout->setMargin(MARGIN); + + AnglesList = new QListWidget( AnglesGrp ); + AnglesList->setSelectionMode(QListWidget::ExtendedSelection); + + AddAngleButton = new QToolButton( AnglesGrp ); + AddAngleButton->setIcon( addImage ); + + RemoveAngleButton = new QToolButton( AnglesGrp ); + RemoveAngleButton->setIcon( removeImage ); + + AngleSpin = new SMESHGUI_SpinBox( AnglesGrp ); + AngleSpin->SetValue(10); + + LinearAnglesCheck = new QCheckBox(tr("LINEAR_ANGLES"), AnglesGrp ); + + AnglesGrpLayout->addWidget(AnglesList, 0, 0, 4, 1); + AnglesGrpLayout->addWidget(AddAngleButton, 0, 1); + AnglesGrpLayout->addWidget(RemoveAngleButton, 2, 1); + AnglesGrpLayout->addWidget(AngleSpin, 0, 2); + AnglesGrpLayout->addWidget(LinearAnglesCheck, 4, 0, 1, 3); + AnglesGrpLayout->setRowMinimumHeight(1, 10); + AnglesGrpLayout->setRowStretch(3, 10); + + // Controls for advanced parameters + QGridLayout* AdvancedGrpLayout = new QGridLayout(); + AdvancedGrpLayout->setSpacing(SPACING); + + // layouting + AdvancedGrpLayout->addWidget(TextLabelDistance, 0, 0); + AdvancedGrpLayout->addWidget(TextLabelDx, 0, 2); + AdvancedGrpLayout->addWidget(SpinBox_Dx, 0, 3); + AdvancedGrpLayout->addWidget(TextLabelDy, 0, 4); + AdvancedGrpLayout->addWidget(SpinBox_Dy, 0, 5); + AdvancedGrpLayout->addWidget(TextLabelDz, 0, 6); + AdvancedGrpLayout->addWidget(SpinBox_Dz, 0, 7); + AdvancedGrpLayout->addWidget(TextLabelVector, 1, 0); + AdvancedGrpLayout->addWidget(SelectVectorButton, 1, 1); + AdvancedGrpLayout->addWidget(TextLabelVx, 1, 2); + AdvancedGrpLayout->addWidget(SpinBox_Vx, 1, 3); + AdvancedGrpLayout->addWidget(TextLabelVy, 1, 4); + AdvancedGrpLayout->addWidget(SpinBox_Vy, 1, 5); + AdvancedGrpLayout->addWidget(TextLabelVz, 1, 6); + AdvancedGrpLayout->addWidget(SpinBox_Vz, 1, 7); + AdvancedGrpLayout->addWidget(TextLabelDist, 2, 0); + AdvancedGrpLayout->addWidget(SpinBox_VDist, 2, 3); + AdvancedGrpLayout->addWidget(TextLabelNbSteps, 3, 0, 1, 3); + AdvancedGrpLayout->addWidget(SpinBox_NbSteps, 3, 3); + AdvancedGrpLayout->addWidget(ByAverageNormalCheck, 4, 0, 1, 4); + AdvancedGrpLayout->addWidget(UseInputElemsOnlyCheck, 4, 4, 1, 4); + + // Controls for advanced parameters + QGroupBox* RbGrp = new QGroupBox(); + QHBoxLayout* RBLayout = new QHBoxLayout(RbGrp); + RBLayout->setSpacing(SPACING); RBLayout->setMargin(MARGIN); + RBLayout->addWidget(ExtrMethod_RBut0); + RBLayout->addWidget(ExtrMethod_RBut1); + RBLayout->addWidget(ExtrMethod_RBut2); + // layouting - GroupArgumentsLayout->addWidget(SelectorWdg, 0, 0, 1, 9); - GroupArgumentsLayout->addWidget(ExtrMethod_RBut0, 1, 0, 1, 3); - GroupArgumentsLayout->addWidget(ExtrMethod_RBut1, 1, 3, 1, 3); - GroupArgumentsLayout->addWidget(ExtrMethod_RBut2, 1, 6, 1, 3); - GroupArgumentsLayout->addWidget(TextLabelDistance, 2, 0); - GroupArgumentsLayout->addWidget(TextLabelDx, 2, 2); - GroupArgumentsLayout->addWidget(SpinBox_Dx, 2, 3); - GroupArgumentsLayout->addWidget(TextLabelDy, 2, 4); - GroupArgumentsLayout->addWidget(SpinBox_Dy, 2, 5); - GroupArgumentsLayout->addWidget(TextLabelDz, 2, 6); - GroupArgumentsLayout->addWidget(SpinBox_Dz, 2, 7); - GroupArgumentsLayout->addWidget(TextLabelVector, 3, 0); - GroupArgumentsLayout->addWidget(SelectVectorButton, 3, 1); - GroupArgumentsLayout->addWidget(TextLabelVx, 3, 2); - GroupArgumentsLayout->addWidget(SpinBox_Vx, 3, 3); - GroupArgumentsLayout->addWidget(TextLabelVy, 3, 4); - GroupArgumentsLayout->addWidget(SpinBox_Vy, 3, 5); - GroupArgumentsLayout->addWidget(TextLabelVz, 3, 6); - GroupArgumentsLayout->addWidget(SpinBox_Vz, 3, 7); - GroupArgumentsLayout->addWidget(TextLabelDist, 4, 0); - GroupArgumentsLayout->addWidget(SpinBox_VDist, 4, 3); - GroupArgumentsLayout->addWidget(TextLabelNbSteps, 5, 0, 1, 3); - GroupArgumentsLayout->addWidget(SpinBox_NbSteps, 5, 3); - GroupArgumentsLayout->addWidget(ByAverageNormalCheck, 6, 0, 1, 4); - GroupArgumentsLayout->addWidget(UseInputElemsOnlyCheck, 6, 4, 1, 4); - GroupArgumentsLayout->addWidget(BasePointGrp, 7, 0, 1, 9); - GroupArgumentsLayout->addWidget(ScalesGrp, 8, 0, 1, 9); - GroupArgumentsLayout->addWidget(myPreviewCheckBox, 9, 0, 1, 8); - GroupArgumentsLayout->addWidget(MakeGroupsCheck, 10,0, 1, 8); - GroupArgumentsLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 10, 0); + GroupArgumentsLayout->addWidget(RbGrp, 0, 0, 1, 4); + GroupArgumentsLayout->addWidget(SelectorWdg, 1, 0, 3, 2); + GroupArgumentsLayout->addLayout(AdvancedGrpLayout, 1, 2, 1, 2); + GroupArgumentsLayout->addWidget(BasePointGrp, 2, 2, 1, 2); + GroupArgumentsLayout->addWidget(ScalesGrp, 3, 2, 1, 1); + GroupArgumentsLayout->addWidget(AnglesGrp, 3, 3, 1, 1); + GroupArgumentsLayout->addWidget(myPreviewCheckBox, 4, 0); + GroupArgumentsLayout->addWidget(MakeGroupsCheck, 4, 1); + GroupArgumentsLayout->setRowStretch(5, 10); + SelectorWdg->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + SelectorWdg->setMinimumWidth(320); /***************************************************************/ GroupButtons = new QGroupBox(this); @@ -810,12 +858,13 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule) BasePoint_YSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); BasePoint_ZSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); ScaleSpin->RangeStepAndValidator (COORD_MIN, COORD_MAX, 1.0, "length_precision"); + AngleSpin->RangeStepAndValidator (-180.0, 180.0, 5.0, "angle_precision"); ExtrMethod_RBut0->setChecked(true); UseInputElemsOnlyCheck->setChecked(true); MakeGroupsCheck->setChecked(true); - mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); + mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector(); mySMESHGUI->SetActiveDialogBox(this); @@ -844,6 +893,8 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule) connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(OnScaleAdded())); connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(OnScaleRemoved())); + connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(OnScaleAdded())); + connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(OnScaleRemoved())); connect(SelectVectorButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectBasePointButton,SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); @@ -871,10 +922,15 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule) connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); connect(LinearScalesCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); + connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); + connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); + connect(LinearAnglesCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); connect(BasePointGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); connect(BasePoint_XSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); connect(BasePoint_YSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); connect(BasePoint_ZSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(ScalesGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); + connect(AnglesGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); //To Connect preview check box connectPreviewControl(); @@ -964,14 +1020,26 @@ bool SMESHGUI_ExtrusionDlg::isValuesValid() //purpose : return 3 scaling parameters //======================================================================= -bool SMESHGUI_ExtrusionDlg::getScaleParams( SMESH::double_array*& scales, - SMESH::double_array*& basePoint ) +void SMESHGUI_ExtrusionDlg::getScaleParams( SMESH::double_array*& scales, + SMESH::double_array*& basePoint, + bool & scalesVariation, + SMESH::double_array*& angles, + bool & anglesVariation ) { scales = new SMESH::double_array; - scales->length( myScalesList.count() ); - for ( int i = 0; i < myScalesList.count(); ++i ) - (*scales)[i] = myScalesList[i]; - + if ( ScalesGrp->isChecked() ) + { + scales->length( myScalesList.count() ); + for ( int i = 0; i < myScalesList.count(); ++i ) + (*scales)[i] = myScalesList[i]; + } + angles = new SMESH::double_array; + if ( AnglesGrp->isChecked() ) + { + angles->length( myAnglesList.count() ); + for ( int i = 0; i < myAnglesList.count(); ++i ) + (*angles)[i] = myAnglesList[i]*M_PI/180.; + } basePoint = new SMESH::double_array; if ( BasePointGrp->isChecked() ) { @@ -981,7 +1049,8 @@ bool SMESHGUI_ExtrusionDlg::getScaleParams( SMESH::double_array*& scales, (*basePoint)[2] = BasePoint_ZSpin->GetValue(); } - return ( scales->length() > 0 && LinearScalesCheck->isChecked() ); + scalesVariation = ( scales->length() > 0 && LinearScalesCheck->isChecked() ); + anglesVariation = ( angles->length() > 0 && LinearAnglesCheck->isChecked() ); } //================================================================================= @@ -1074,6 +1143,7 @@ void SMESHGUI_ExtrusionDlg::ClickOnRadio() BasePointGrp->setEnabled( !ExtrMethod_RBut2->isChecked() ); ScalesGrp ->setEnabled( !ExtrMethod_RBut2->isChecked() ); + AnglesGrp ->setEnabled( !ExtrMethod_RBut2->isChecked() ); CheckIsEnable(); @@ -1126,13 +1196,11 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply() long aNbSteps = (long)SpinBox_NbSteps->value(); aParameters << SpinBox_NbSteps->text(); - SMESH::double_array_var scales = new SMESH::double_array; - scales->length( myScalesList.count() ); for (int i = 0; i < myScalesList.count(); i++) - { - scales[i] = myScalesList[i]; aParameters << ScalesList->item(i)->text(); - } + + for (int i = 0; i < myAnglesList.count(); i++) + aParameters << AnglesList->item(i)->text(); bool meshHadNewTypeBefore = true; int maxSelType = 0; @@ -1170,17 +1238,19 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply() bool byAverageNormal = ByAverageNormalCheck->isChecked(); int dim = (maxSelType == SMESH::FACE) ? 2 : 1; - groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, useInputElemsOnly, - byAverageNormal, makeGroups, dim ); + groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, byAverageNormal, + useInputElemsOnly, makeGroups, dim ); } else { - SMESH::double_array_var scales, basePoint; - bool linVariation = getScaleParams( scales.out(), basePoint.out() ); + SMESH::double_array_var scales, basePoint, angles; + bool scalesVariation, anglesVariation; + getScaleParams( scales.out(), basePoint.out(), scalesVariation, + angles.out(), anglesVariation ); groups = meshEditor->ExtrusionSweepObjects( nodes, edges, faces, - aVector, aNbSteps, - scales, linVariation, basePoint, - makeGroups ); + aVector, aNbSteps, makeGroups, + scales, scalesVariation, basePoint, + angles, anglesVariation ); } } catch (...) { @@ -1206,9 +1276,9 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply() SMESH::Update( actor->getIO(), actor->GetVisibility() ); if ( makeGroups ) mySMESHGUI->updateObjBrowser(true); // new groups may appear - Init(false); + mySelectionMgr->clearSelected(); - SelectorWdg->Clear(); + Init(false); SMESHGUI::Modified(); } @@ -1313,7 +1383,7 @@ void SMESHGUI_ExtrusionDlg::SelectionIntoArgument() if ( SelectVectorButton->isChecked() ) { Handle(SALOME_InteractiveObject) IO = aList.First(); - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; mySelector->GetIndex(IO,aMapIndex); if ( aMapIndex.Extent() != 1 ) return; @@ -1560,20 +1630,22 @@ void SMESHGUI_ExtrusionDlg::onDisplaySimulation( bool toDisplayPreview ) bool byAverageNormal = ByAverageNormalCheck->isChecked(); int dim = (maxSelType == SMESH::FACE) ? 2 : 1; - groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, useInputElemsOnly, - byAverageNormal, makeGroups, dim ); + groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, byAverageNormal, + useInputElemsOnly, makeGroups, dim ); } else { - SMESH::double_array_var scales, basePoint; - bool linVariation = getScaleParams( scales.out(), basePoint.out() ); + SMESH::double_array_var scales, basePoint, angles; + bool scalesVariation, anglesVariation; + getScaleParams( scales.out(), basePoint.out(), scalesVariation, + angles.out(), anglesVariation ); groups = meshEditor->ExtrusionSweepObjects( nodes, edges, faces, - aVector, aNbSteps, - scales, linVariation, basePoint, - makeGroups ); + aVector, aNbSteps, makeGroups, + scales, scalesVariation, basePoint, + angles, anglesVariation ); } SMESH::MeshPreviewStruct_var aMeshPreviewStruct = meshEditor->GetPreviewData(); - mySimulation->SetData(aMeshPreviewStruct._retn()); + mySimulation->SetData(aMeshPreviewStruct); } catch (...) { hidePreview(); @@ -1614,35 +1686,65 @@ void SMESHGUI_ExtrusionDlg::getExtrusionVector(SMESH::DirStruct& aVector) //======================================================================= // function : OnScaleAdded() -// purpose : Called when user adds Scale to the list +// purpose : Called when user adds Scale or Angle to the list //======================================================================= void SMESHGUI_ExtrusionDlg::OnScaleAdded() { - QString msg; - if( !ScaleSpin->isValid( msg, true ) ) { - QString str( tr( "SMESH_INCORRECT_INPUT" ) ); - if ( !msg.isEmpty() ) - str += "\n" + msg; - SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); - return; + if ( sender() == AddScaleButton ) + { + QString msg; + if( !ScaleSpin->isValid( msg, true ) ) { + QString str( tr( "SMESH_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); + return; + } + ScalesList->addItem(ScaleSpin->text()); + myScalesList.append(ScaleSpin->GetValue()); + } + + if ( sender() == AddAngleButton ) + { + QString msg; + if( !AngleSpin->isValid( msg, true ) ) { + QString str( tr( "SMESH_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); + return; + } + AnglesList->addItem(AngleSpin->text()); + myAnglesList.append(AngleSpin->GetValue()); } - ScalesList->addItem(ScaleSpin->text()); - myScalesList.append(ScaleSpin->GetValue()); } //======================================================================= // function : OnScaleRemoved() -// purpose : Called when user removes Scale(s) from the list +// purpose : Called when user removes Scales or Angles from the list //======================================================================= void SMESHGUI_ExtrusionDlg::OnScaleRemoved() { - QList aList = ScalesList->selectedItems(); + QListWidget* widget; + QList* list; + if ( sender() == RemoveScaleButton ) + { + widget = ScalesList; + list = & myScalesList; + } + else + { + widget = AnglesList; + list = & myAnglesList; + } + + QList aList = widget->selectedItems(); QListWidgetItem* anItem; int row = 0; foreach(anItem, aList) { - row = ScalesList->row(anItem); - myScalesList.removeAt(row); + row = widget->row(anItem); + list->removeAt(row); delete anItem; } - ScalesList->setCurrentRow( row, QItemSelectionModel::Select ); + widget->setCurrentRow( row, QItemSelectionModel::Select ); }