X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FBuildGUI%2FBuildGUI_SolidDlg.cxx;h=331f481be0cb2aa1e95b0916a94787ea32e9456f;hb=33989517de8433bf2424a75aeba0b0d906eda520;hp=05b62c1a21a92dfefe78eb5ce80fc4f9d0c15688;hpb=392885c1a8d50369708bbe5e6b44033ed8b8ba51;p=modules%2Fgeom.git diff --git a/src/BuildGUI/BuildGUI_SolidDlg.cxx b/src/BuildGUI/BuildGUI_SolidDlg.cxx index 05b62c1a2..331f481be 100644 --- a/src/BuildGUI/BuildGUI_SolidDlg.cxx +++ b/src/BuildGUI/BuildGUI_SolidDlg.cxx @@ -1,28 +1,29 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 +// 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. +// 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, 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 -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // GEOM GEOMGUI : GUI for Geometry component // File : BuildGUI_SolidDlg.cxx // Author : Damien COQUERET, Open CASCADE S.A.S. -// + #include "BuildGUI_SolidDlg.h" #include @@ -37,9 +38,11 @@ #include #include +#include + //================================================================================= // class : BuildGUI_SolidDlg() -// purpose : Constructs a BuildGUI_SolidDlg which is a child of 'parent', with the +// purpose : Constructs a BuildGUI_SolidDlg which is a child of 'parent', with the // name 'name' and widget flags set to 'f'. // The dialog will by default be modeless, unless you set 'modal' to // TRUE to construct a modal dialog. @@ -47,30 +50,37 @@ BuildGUI_SolidDlg::BuildGUI_SolidDlg( GeometryGUI* theGeometryGUI, QWidget* parent ) : GEOMBase_Skeleton( theGeometryGUI, parent ) { - QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BUILD_SOLID" ) ) ); - QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BUILD_SOLID" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_SOLID_FROM_FACES" ) ) ); setWindowTitle( tr( "GEOM_SOLID_TITLE" ) ); - + /***************************************************************/ mainFrame()->GroupConstructors->setTitle( tr( "GEOM_SOLID" ) ); - mainFrame()->RadioButton1->setIcon( image0 ); - mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); - mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton1->setIcon( image1 ); + mainFrame()->RadioButton2->setIcon( image2 ); mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); GroupSolid = new DlgRef_1Sel1Check( centralWidget() ); - - GroupSolid->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) ); + GroupSolid->GroupBox1->setTitle( tr( "GEOM_SOLID_SHELLS" ) ); GroupSolid->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); GroupSolid->CheckButton1->setText( tr( "GEOM_CREATE_SINGLE_SOLID" ) ); - GroupSolid->PushButton1->setIcon( image1 ); + GroupSolid->PushButton1->setIcon( image0 ); GroupSolid->LineEdit1->setReadOnly( true ); - + + GroupFaces = new DlgRef_1Sel1Check( centralWidget() ); + GroupFaces->GroupBox1->setTitle( tr( "GEOM_SOLID_FACES" ) ); + GroupFaces->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); + GroupFaces->CheckButton1->setText( tr( "GEOM_SOLID_FROM_FACE_OPT" ) ); + GroupFaces->PushButton1->setIcon( image0 ); + GroupFaces->LineEdit1->setReadOnly( true ); + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( GroupSolid ); + layout->addWidget( GroupFaces ); /***************************************************************/ setHelpFileName("create_solid_page.html"); @@ -101,21 +111,33 @@ void BuildGUI_SolidDlg::Init() GroupSolid->LineEdit1->setReadOnly( true ); GroupSolid->CheckButton1->setChecked( true ); - myOkShells = false; + myShells.clear(); - globalSelection( GEOM_SHELL ); + //globalSelection( GEOM_SHELL ); + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_COMPOUNDFILTER ); + QList aSubShapes; + aSubShapes.append( GEOM_SHELL ); + globalSelection( aMap, aSubShapes ); /* signals and slots connections */ connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + connect( GroupSolid->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( GroupFaces->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); connect( GroupSolid->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( EnableNameField( bool ) ) ); connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), - SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); initName( tr( "GEOM_SOLID" ) ); + SelectionIntoArgument(); + + ConstructorsClicked(0); } @@ -125,6 +147,7 @@ void BuildGUI_SolidDlg::Init() //================================================================================= void BuildGUI_SolidDlg::ClickOnOk() { + setIsApplyAndClose( true ); if ( ClickOnApply() ) ClickOnCancel(); } @@ -135,24 +158,49 @@ void BuildGUI_SolidDlg::ClickOnOk() //================================================================================= bool BuildGUI_SolidDlg::ClickOnApply() { - for ( int i = 0, n = myShells.length(); i< n; i++ ) { - if ( !isClosed(i)) { - QString aName = GEOMBase::GetName( myShells[i] ); - SUIT_MessageBox::warning( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_SHAPE_UNCLOSED").arg(aName) , - QObject::tr("BUT_OK") ); - return false; - } - } - if ( !onAccept() ) return false; initName(); + + myEditCurrentArgument->setText(""); + ConstructorsClicked(getConstructorId()); + return true; } +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BuildGUI_SolidDlg::ConstructorsClicked(int constructorId) +{ + switch (constructorId) { + case 0: + { + globalSelection(); + GroupFaces->hide(); + GroupSolid->show(); + myEditCurrentArgument = GroupSolid->LineEdit1; + GroupSolid->LineEdit1->setText(""); + break; + } + case 1: + { + globalSelection(); + GroupSolid->hide(); + GroupFaces->show(); + myEditCurrentArgument = GroupFaces->LineEdit1; + GroupFaces->LineEdit1->setText(""); + break; + } + } + + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); + SelectionIntoArgument(); +} //================================================================================= // function : SelectionIntoArgument() @@ -161,25 +209,19 @@ bool BuildGUI_SolidDlg::ClickOnApply() void BuildGUI_SolidDlg::SelectionIntoArgument() { myEditCurrentArgument->setText( "" ); - QString aString = ""; - - LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); - SALOME_ListIO aSelList; - aSelMgr->selectedObjects(aSelList); - - myOkShells = false; - int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString); - if ( nbSel == 0 ) - return; - if ( nbSel != 1 ) - aString = tr( "%1_objects" ).arg( nbSel ); - - GEOMBase::ConvertListOfIOInListOfGO(aSelList, myShells); - if ( !myShells.length() ) - return; - - myEditCurrentArgument->setText( aString ); - myOkShells = true; + + //myShells = getSelected( TopAbs_SHELL, -1 ); + QList types; + if (myEditCurrentArgument == GroupSolid->LineEdit1) + types << TopAbs_SHELL << TopAbs_COMPOUND; + else if (myEditCurrentArgument == GroupFaces->LineEdit1) + types << TopAbs_FACE << TopAbs_SHELL << TopAbs_COMPOUND; + myShells = getSelected( types, -1 ); + + if ( !myShells.isEmpty() ) { + QString aName = myShells.count() > 1 ? QString( "%1_objects").arg( myShells.count() ) : GEOMBase::GetName( myShells[0].get() ); + myEditCurrentArgument->setText( aName ); + } } //================================================================================= @@ -189,11 +231,25 @@ void BuildGUI_SolidDlg::SelectionIntoArgument() void BuildGUI_SolidDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - if ( send != GroupSolid->PushButton1 ) - return; - - globalSelection( GEOM_SHELL ); - myEditCurrentArgument = GroupSolid->LineEdit1; + + TColStd_MapOfInteger aMap; + QList aSubShapes; + aMap.Add( GEOM_COMPOUNDFILTER ); + + if (send == GroupSolid->PushButton1) { + aMap.Add( GEOM_SHELL ); + aSubShapes.append( GEOM_SHELL ); + globalSelection( aMap, aSubShapes ); + myEditCurrentArgument = GroupSolid->LineEdit1; + } + else if (send == GroupFaces->PushButton1) { + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_FACE ); + aSubShapes.append( GEOM_SHELL ); + aSubShapes.append( GEOM_FACE ); + globalSelection( aMap, aSubShapes ); + myEditCurrentArgument = GroupFaces->LineEdit1; + } myEditCurrentArgument->setFocus(); SelectionIntoArgument(); @@ -207,9 +263,10 @@ void BuildGUI_SolidDlg::SetEditCurrentArgument() void BuildGUI_SolidDlg::ActivateThisDialog() { GEOMBase_Skeleton::ActivateThisDialog(); - connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), - SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - globalSelection( GEOM_SHELL ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked(getConstructorId()); } @@ -230,7 +287,7 @@ void BuildGUI_SolidDlg::enterEvent( QEvent* ) //================================================================================= void BuildGUI_SolidDlg::EnableNameField( bool toEnable ) { - mainFrame()->GroupBoxName->setEnabled( toEnable ); + mainFrame()->GroupBoxName->setEnabled( toEnable ); } //================================================================================= @@ -239,53 +296,68 @@ void BuildGUI_SolidDlg::EnableNameField( bool toEnable ) //================================================================================= GEOM::GEOM_IOperations_ptr BuildGUI_SolidDlg::createOperation() { - return getGeomEngine()->GetIShapesOperations( getStudyId() ); + return getGeomEngine()->GetIShapesOperations(); } //================================================================================= // function : isValid // purpose : //================================================================================= -bool BuildGUI_SolidDlg::isValid( QString& ) +bool BuildGUI_SolidDlg::isValid (QString& msg) { - return myOkShells; + bool ok = !myShells.isEmpty(); + + GEOM::MeasureOpPtr anOp; + anOp.take(myGeomGUI->GetGeomGen()->GetIMeasureOperations()); + if (getConstructorId() == 0 && (!GroupSolid->CheckButton1->isChecked() || myShells.count() == 1)) { + for (int i = 0, n = myShells.count(); i < n && ok; i++) { + CORBA::String_var aRes = anOp->IsGoodForSolid(myShells[i].get()); + if (strlen(aRes.in())) { + msg = QObject::tr(aRes.in()).arg(GEOMBase::GetName(myShells[i].get())); + ok = false; + } + } + } + return ok; } +/* //================================================================================= // function : isClosed // purpose : Check the object 'i' in myShells list is closed or unclosed //================================================================================= -bool BuildGUI_SolidDlg::isClosed(int i) +bool BuildGUI_SolidDlg::isClosed( GEOM::GEOM_Object_ptr shell ) { - GEOM::GEOM_Object_var aShape = myShells[i]; + bool ok = false; + GEOM::GEOM_IKindOfShape::shape_kind aKind; GEOM::ListOfLong_var anInts; GEOM::ListOfDouble_var aDbls; - if (aShape->_is_nil()) { - MESSAGE ("Shape is NULL!!!"); - return false; - } - - GEOM::GEOM_IMeasureOperations_ptr anOp = myGeomGUI->GetGeomGen()->GetIMeasureOperations( getStudyId() ); + if ( !CORBA::is_nil( shell ) ) { + GEOM::MeasureOpPtr anOp; + anOp.take( myGeomGUI->GetGeomGen()->GetIMeasureOperations() ); - // GEOM::GEOM_IMeasureOperations_var anOp = GEOM::GEOM_IMeasureOperations::_narrow( getOperation() ); + // Detect kind of shape and parameters + aKind = anOp->KindOfShape(shell, anInts, aDbls); - // Detect kind of shape and parameters - aKind = anOp->KindOfShape(aShape, anInts, aDbls); - - if ( !anOp->IsDone() ) { - MESSAGE ("KindOfShape Operation is NOT DONE!!!"); - return false; + if ( anOp->IsDone() ) { + if ( anInts[0] == 1 ) + ok = true; + else if ( anInts[0] == 2 ) + ok = false; + } + else { + MESSAGE ("KindOfShape Operation is NOT DONE!!!"); + } } - - if ( anInts[0] == 1 ) - return true; - else if ( anInts[0] == 2 ) - return false; - - return false; + else { + MESSAGE ("Shape is NULL!!!"); + } + + return ok; } +*/ //================================================================================= // function : execute @@ -293,25 +365,53 @@ bool BuildGUI_SolidDlg::isClosed(int i) //================================================================================= bool BuildGUI_SolidDlg::execute( ObjectList& objects ) { - bool toCreateSingleSolid = GroupSolid->CheckButton1->isChecked(); - - if ( toCreateSingleSolid ) { - GEOM::GEOM_Object_var anObj = GEOM::GEOM_IShapesOperations::_narrow( - getOperation() )->MakeSolidShells( myShells ); - - if ( !anObj->_is_nil() ) - objects.push_back( anObj._retn() ); - } - else { - for ( int i = 0, n = myShells.length(); i< n; i++ ) { - GEOM::GEOM_Object_var anObj = GEOM::GEOM_IShapesOperations::_narrow( - getOperation() )->MakeSolidShell( myShells[ i ] ); + GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); + GEOM::GEOM_Object_var anObj; + + switch (getConstructorId()) { + case 0: + { + if ( GroupSolid->CheckButton1->isChecked() ) { + GEOM::ListOfGO_var objlist = new GEOM::ListOfGO(); + objlist->length( myShells.count() ); + for ( int i = 0; i < myShells.count(); i++ ) + objlist[i] = myShells[i].copy(); + + anObj = anOper->MakeSolidShells( objlist.in() ); + + if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); + } + else { + for ( int i = 0, n = myShells.count(); i< n; i++ ){ + anObj = anOper->MakeSolidShell( myShells[ i ].get() ); + + if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); + } + } + break; + } + case 1: + { + GEOM::ListOfGO_var objlist = new GEOM::ListOfGO(); + objlist->length( myShells.count() ); + for ( int i = 0; i < myShells.count(); i++ ) + objlist[i] = myShells[i].copy(); - if ( !anObj->_is_nil() ) - objects.push_back( anObj._retn() ); + anObj = anOper->MakeSolidFromConnectedFaces( objlist.in(), GroupFaces->CheckButton1->isChecked() ); + + if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); + break; } } return true; } +//================================================================================= +// function : getSourceObjects +// purpose : virtual method to get source objects +//================================================================================= +QList BuildGUI_SolidDlg::getSourceObjects() +{ + return myShells; +}