X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FBasicGUI%2FBasicGUI_WorkingPlaneDlg.cxx;h=4e445b352da6c9125603b68f7a20197f0a946191;hb=c1d63ef1f803d255b61ee99fb618bf471add07f4;hp=064ea93a70b64c654a09b95853f1abda05f9758b;hpb=e180c20f73ffa96c2d039106f2a2a868c8bc0df1;p=modules%2Fgeom.git diff --git a/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx index 064ea93a7..4e445b352 100644 --- a/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx +++ b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx @@ -1,58 +1,56 @@ -// GEOM GEOMGUI : GUI for Geometry component +// Copyright (C) 2007-2023 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// -// -// File : BasicGUI_WorkingPlaneDlg.cxx -// Author : Lucien PIGNOLONI -// Module : GEOM +// GEOM GEOMGUI : GUI for Geometry component +// File : BasicGUI_WorkingPlaneDlg.cxx +// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. +// #include "BasicGUI_WorkingPlaneDlg.h" -#include "GEOMBase.h" +#include +#include +#include -#include "SUIT_Desktop.h" -#include "SUIT_Session.h" -#include "SalomeApp_Application.h" -#include "LightApp_SelectionMgr.h" +#include +#include +#include +#include -#include -#include -#include -#include +// OCCT Includes +#include #include #include #include -#include #include #include -#include -#include +#include +#include +#include +#include -#include "GEOMImpl_Types.hxx" +// QT Includes +#include -#include -#include - -using namespace std; +#include //================================================================================= // class : BasicGUI_WorkingPlaneDlg() @@ -61,51 +59,68 @@ using namespace std; // The dialog will by default be modeless, unless you set 'modal' to // TRUE to construct a modal dialog. //================================================================================= -BasicGUI_WorkingPlaneDlg::BasicGUI_WorkingPlaneDlg(GeometryGUI* theGeometryGUI, QWidget* parent, - const char* name, bool modal, WFlags fl) - :GEOMBase_Skeleton(theGeometryGUI, parent, name, modal, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +BasicGUI_WorkingPlaneDlg::BasicGUI_WorkingPlaneDlg( GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl ) + : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl ) { - QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); - QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_WPLANE_FACE"))); - QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_WPLANE_VECTOR"))); - QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_WPLANE_ORIGIN"))); + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_WPLANE_FACE" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_WPLANE_VECTOR" ) ) ); + QPixmap image3( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_WPLANE_ORIGIN" ) ) ); - setCaption(tr("GEOM_WPLANE_TITLE")); + setWindowTitle( tr( "GEOM_WPLANE_TITLE" ) ); /***************************************************************/ - GroupConstructors->setTitle(tr("GEOM_WPLANE")); - RadioButton1->setPixmap(image1); - RadioButton2->setPixmap(image2); - RadioButton3->setPixmap(image3); - - Group1 = new DlgRef_1Sel_QTD(this, "Group1"); - Group1->GroupBox1->setTitle(tr("GEOM_WPLANE_FACE")); - Group1->TextLabel1->setText(tr("GEOM_SELECTION")); - Group1->PushButton1->setPixmap(image0); + mainFrame()->GroupConstructors->setTitle( tr( "GEOM_WPLANE" ) ); + mainFrame()->RadioButton1->setIcon( image1 ); + mainFrame()->RadioButton2->setIcon( image2 ); + mainFrame()->RadioButton3->setIcon( image3 ); + + Group1 = new DlgRef_1Sel( centralWidget() ); + + Group1->GroupBox1->setTitle( tr( "GEOM_WPLANE_FACE" ) ); + Group1->TextLabel1->setText( tr( "GEOM_SELECTION" ) ); + Group1->PushButton1->setIcon( image0 ); Group1->LineEdit1->setReadOnly( true ); - Group2 = new DlgRef_2Sel_QTD(this, "Group2"); - Group2->GroupBox1->setTitle(tr("GEOM_WPLANE_VECTOR")); - Group2->TextLabel1->setText(tr("GEOM_WPLANE_VX")); - Group2->TextLabel2->setText(tr("GEOM_WPLANE_VZ")); - Group2->PushButton1->setPixmap(image0); - Group2->PushButton2->setPixmap(image0); + Group2 = new DlgRef_2Sel( centralWidget() ); + + Group2->GroupBox1->setTitle( tr( "GEOM_WPLANE_VECTOR" ) ); + Group2->TextLabel1->setText( tr( "GEOM_WPLANE_VX" ) ); + Group2->TextLabel2->setText( tr( "GEOM_WPLANE_VZ" ) ); + Group2->PushButton1->setIcon( image0 ); + Group2->PushButton2->setIcon( image0 ); Group2->LineEdit1->setReadOnly( true ); Group2->LineEdit2->setReadOnly( true ); + Group2->PushButton1->setDown( true ); + Group2->LineEdit1->setEnabled( true ); + Group2->LineEdit2->setEnabled( false ); - Group3 = new DlgRef_3Check_QTD(this, "Group3"); - Group3->GroupBox1->setTitle(tr("GEOM_WPLANE_ORIGIN")); - Group3->RadioButton1->setText(tr("GEOM_WPLANE_OXY")); - Group3->RadioButton2->setText(tr("GEOM_WPLANE_OYZ")); - Group3->RadioButton3->setText(tr("GEOM_WPLANE_OZX")); + Group3 = new DlgRef_3Check( centralWidget() ); + + Group3->GroupBox1->setTitle( tr( "GEOM_WPLANE_ORIGIN" ) ); + Group3->RadioButton1->setText( tr( "GEOM_WPLANE_OXY" ) ); + Group3->RadioButton2->setText( tr( "GEOM_WPLANE_OYZ" ) ); + Group3->RadioButton3->setText( tr( "GEOM_WPLANE_OZX" ) ); - Layout1->addWidget(Group1, 1, 0); - Layout1->addWidget(Group2, 1, 0); - Layout1->addWidget(Group3, 1, 0); /***************************************************************/ + QGroupBox* aReverseGroupBox = new QGroupBox( centralWidget() ); + QHBoxLayout* aReverseGroupBoxLayout = new QHBoxLayout( aReverseGroupBox ); + aReverseGroupBoxLayout->setMargin( 9 ); + aReverseGroupBoxLayout->setSpacing( 6 ); + + myReverseCB = new QCheckBox( aReverseGroupBox ); + myReverseCB->setText( tr( "GEOM_REVERSE_PLANE" ) ); + aReverseGroupBoxLayout->addWidget( myReverseCB ); - setHelpFileName("working_plane.htm"); + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); + layout->setMargin( 0 ); layout->setSpacing( 6 ); + layout->addWidget( Group1 ); + layout->addWidget( Group2 ); + layout->addWidget( Group3 ); + layout->addWidget( aReverseGroupBox ); + + setHelpFileName( "create_wplane_page.html" ); Init(); } @@ -130,7 +145,7 @@ void BasicGUI_WorkingPlaneDlg::Init() // myGeomGUI->SetState( 0 ); - myFace = GEOM::GEOM_Object::_nil(); + myFace = GEOM::GEOM_Object::_nil(); myVectX = GEOM::GEOM_Object::_nil(); myVectZ = GEOM::GEOM_Object::_nil(); @@ -140,100 +155,107 @@ void BasicGUI_WorkingPlaneDlg::Init() globalSelection( GEOM_PLANE ); /* signals and slots connections */ - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int))); + connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); + connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ); + + connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); - connect(Group1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(Group1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect( Group1->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( Group1->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( Group2->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( Group2->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( Group2->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( Group2->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect(Group2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(Group2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(Group2->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(Group2->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect( Group3->GroupBox1, SIGNAL( clicked( int ) ), this, SLOT( GroupClicked( int ) ) ); - connect(Group3->GroupBox1, SIGNAL(clicked(int)), this, SLOT(GroupClicked(int))); + connect( myReverseCB, SIGNAL( clicked() ), this, SLOT( onReverse() ) ); - connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), - SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); initName( tr( "GEOM_WPLANE" ) ); - ConstructorsClicked(0); + + setConstructorId( 2 ); // simplest constructor + ConstructorsClicked( 2 ); } //================================================================================= // function : ConstructorsClicked() // purpose : Radio button management //================================================================================= -void BasicGUI_WorkingPlaneDlg::ConstructorsClicked(int constructorId) +void BasicGUI_WorkingPlaneDlg::ConstructorsClicked( int constructorId ) { - disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); - // myGeomGUI->SetState( 0 ); + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); - switch (constructorId) + disconnect( aSelMgr, 0, this, 0 ); + + switch ( constructorId ) { + case 0: { - case 0: - { - globalSelection( GEOM_PLANE ); - - Group2->hide(); - Group3->hide(); - resize(0, 0); - Group1->show(); - - myEditCurrentArgument = Group1->LineEdit1; - Group1->LineEdit1->setText(""); - myFace = GEOM::GEOM_Object::_nil(); - - connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), - SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - break; - } - case 1: - { - globalSelection( GEOM_LINE ); - - Group1->hide(); - Group3->hide(); - resize(0, 0); - Group2->show(); - - myEditCurrentArgument = Group2->LineEdit1; - Group2->LineEdit1->setText(""); - Group2->LineEdit2->setText(""); - myVectX = GEOM::GEOM_Object::_nil(); - myVectZ = GEOM::GEOM_Object::_nil(); + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_PLANE ); + aMap.Add( GEOM_MARKER ); + globalSelection( aMap ); + Group2->hide(); + Group3->hide(); + Group1->show(); + Group1->PushButton1->setDown(true); + myEditCurrentArgument = Group1->LineEdit1; + Group1->LineEdit1->setText( "" ); + myFace = GEOM::GEOM_Object::_nil(); - connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), - SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - break; - } - case 2: - { - Group1->hide(); - Group2->hide(); - resize(0, 0); - Group3->show(); - - Group3->RadioButton1->setChecked(true); - aOriginType = 1; - break; - } + connect( aSelMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + break; + } + case 1: + { + globalSelection( GEOM_LINE ); + Group1->hide(); + Group3->hide(); + Group2->show(); + myEditCurrentArgument = Group2->LineEdit1; + Group2->LineEdit1->setText( "" ); + Group2->LineEdit2->setText( "" ); + Group2->PushButton1->setDown( true ); + Group2->PushButton2->setDown( false ); + Group2->LineEdit1->setEnabled( true ); + Group2->LineEdit2->setEnabled( false ); + myVectX = GEOM::GEOM_Object::_nil(); + myVectZ = GEOM::GEOM_Object::_nil(); + + connect( aSelMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + break; + } + case 2: + { + Group1->hide(); + Group2->hide(); + Group3->show(); + Group3->RadioButton1->setChecked( true ); + aOriginType = 1; + break; } - displayPreview(); + } + + qApp->processEvents(); + updateGeometry(); + resize( minimumSizeHint() ); + + updateWPlane(); } //================================================================================= // function : GroupClicked() // purpose : Radio button management //================================================================================= -void BasicGUI_WorkingPlaneDlg::GroupClicked(int groupId) +void BasicGUI_WorkingPlaneDlg::GroupClicked( int groupId ) { aOriginType = groupId; + updateWPlane(); } //================================================================================= @@ -242,6 +264,7 @@ void BasicGUI_WorkingPlaneDlg::GroupClicked(int groupId) //================================================================================= void BasicGUI_WorkingPlaneDlg::ClickOnOk() { + setIsApplyAndClose( true ); if ( ClickOnApply() ) ClickOnCancel(); } @@ -252,91 +275,15 @@ void BasicGUI_WorkingPlaneDlg::ClickOnOk() //================================================================================= bool BasicGUI_WorkingPlaneDlg::ClickOnApply() { - buttonApply->setFocus(); - myGeomGUI->application()->putInfo(tr("")); - const int id = getConstructorId(); + buttonApply()->setFocus(); + myGeomGUI->application()->putInfo( "" ); - if (id == 0) { - if ( !CORBA::is_nil( myFace ) ) { - TopoDS_Face aPlaneShape; - if ( GEOMBase::GetShape( myFace, aPlaneShape, TopAbs_FACE ) ) { - Handle(Geom_Surface) aGS = BRep_Tool::Surface( TopoDS::Face( aPlaneShape ) ); - if ( !aGS.IsNull() && aGS->IsKind( STANDARD_TYPE( Geom_Plane ) ) ) { - Handle(Geom_Plane) aGPlane = Handle(Geom_Plane)::DownCast( aGS ); - gp_Pln aPln = aGPlane->Pln(); - - myWPlane = aPln.Position(); - myGeomGUI->SetWorkingPlane(myWPlane); - myGeomGUI->ActiveWorkingPlane(); - return true; - } - } - } - } else if (id == 1) { - if ( CORBA::is_nil( myVectX ) || CORBA::is_nil( myVectZ ) ) { - showError( "Two vectors have to be selected" ); - return false; - } - - TopoDS_Edge aVectX, aVectZ; - TopoDS_Vertex V1, V2; - gp_Vec aVX, aVZ; - if (GEOMBase::GetShape( myVectX, aVectX, TopAbs_EDGE ) && - GEOMBase::GetShape( myVectZ, aVectZ, TopAbs_EDGE )) { - TopExp::Vertices(aVectZ, V1, V2, Standard_True); - if (!V1.IsNull() && !V2.IsNull()) - aVZ = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); - else { - showError( "Bad OZ vector" ); - return false; - } - - TopExp::Vertices(aVectX, V1, V2, Standard_True); - if (!V1.IsNull() && !V2.IsNull()) - aVX = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); - else { - showError( "Bad OX vector" ); - return false; - } - - gp_Dir aDirZ = gp_Dir(aVZ.X(), aVZ.Y(), aVZ.Z()); - gp_Dir aDirX = gp_Dir(aVX.X(), aVX.Y(), aVX.Z()); - - if (aDirX.IsParallel(aDirZ, Precision::Confusion())) { - showError( "Parallel vectors selected" ); - return false; - } - - myWPlane = gp_Ax3(BRep_Tool::Pnt(V1), aDirZ, aDirX); - - myGeomGUI->SetWorkingPlane(myWPlane); - myGeomGUI->ActiveWorkingPlane(); - return true; - } - } else if (id == 2) { - gp_Pnt P1 = gp_Pnt(0., 0., 0.); - gp_Dir aDirZ, aDirX; - - if (aOriginType == 1) { - aDirZ = gp_Dir(0., 0., 1.); - aDirX = gp_Dir(1., 0., 0.); - } - else if (aOriginType == 2) { - aDirZ = gp_Dir(1., 0., 0.); - aDirX = gp_Dir(0., 1., 0.); - } - else if (aOriginType == 0) { - aDirZ = gp_Dir(0., 1., 0.); - aDirX = gp_Dir(0., 0., 1.); - } - - myWPlane = gp_Ax3(P1, aDirZ, aDirX); - - myGeomGUI->SetWorkingPlane(myWPlane); + if ( updateWPlane( false ) ) { + myGeomGUI->SetWorkingPlane( myWPlane ); myGeomGUI->ActiveWorkingPlane(); - return true; } - return false; + + return true; } //================================================================================= @@ -345,16 +292,21 @@ bool BasicGUI_WorkingPlaneDlg::ClickOnApply() //================================================================================= void BasicGUI_WorkingPlaneDlg::SelectionIntoArgument() { - myEditCurrentArgument->setText(""); + myEditCurrentArgument->setText( "" ); + QString aName; + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); const int id = getConstructorId(); - if ( IObjectCount() != 1 ) { - if(id == 0) + if (aSelList.Extent() != 1) { + if ( id == 0 ) myFace = GEOM::GEOM_Object::_nil(); - else if(id == 1) { - if (myEditCurrentArgument == Group2->LineEdit1) + else if ( id == 1 ) { + if ( myEditCurrentArgument == Group2->LineEdit1 ) myVectX = GEOM::GEOM_Object::_nil(); - else if (myEditCurrentArgument == Group2->LineEdit2) + else if ( myEditCurrentArgument == Group2->LineEdit2 ) myVectZ = GEOM::GEOM_Object::_nil(); } return; @@ -362,19 +314,58 @@ void BasicGUI_WorkingPlaneDlg::SelectionIntoArgument() // nbSel == 1 Standard_Boolean aRes = Standard_False; - GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), aRes); + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes); - if(!aRes || CORBA::is_nil( aSelectedObject )) + if ( !aRes || CORBA::is_nil( aSelectedObject ) ) return; - if(myEditCurrentArgument == Group1->LineEdit1) + aName = GEOMBase::GetName(aSelectedObject); + + if ( myEditCurrentArgument == Group1->LineEdit1 ) myFace = aSelectedObject; - else if(myEditCurrentArgument == Group2->LineEdit1) + else if ( myEditCurrentArgument == Group2->LineEdit1 || + myEditCurrentArgument == Group2->LineEdit2 ) { + if ( aRes && !aSelectedObject->_is_nil() ) { + TopoDS_Shape aShape; + if ( GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_SHAPE ) && !aShape.IsNull() ) { + TColStd_IndexedMapOfInteger aMap; + aSelMgr->GetIndexes(aSelList.First(), aMap); + if ( aMap.Extent() == 1 ) { + int anIndex = aMap( 1 ); + aName = aName + ":edge_" + QString::number( anIndex ); + + GEOM::GEOM_IShapesOperations_var aShapesOp = + getGeomEngine()->GetIShapesOperations(); + if ( myEditCurrentArgument == Group2->LineEdit1 ) + myVectX = aShapesOp->GetSubShape( aSelectedObject, anIndex ); + else + myVectZ = aShapesOp->GetSubShape( aSelectedObject, anIndex ); + } + else { + if ( aShape.ShapeType() != TopAbs_EDGE ) { + aSelectedObject = GEOM::GEOM_Object::_nil(); + aName = ""; + } + } + aSelMgr->clearSelected(); + } + } + } + + myEditCurrentArgument->setText( aName ); + + if ( myEditCurrentArgument == Group2->LineEdit1 ) { myVectX = aSelectedObject; - else if(myEditCurrentArgument == Group2->LineEdit2) + if ( !myVectX->_is_nil() && myVectZ->_is_nil() ) + Group2->PushButton2->click(); + } + else { myVectZ = aSelectedObject; + if ( !myVectZ->_is_nil() && myVectX->_is_nil() ) + Group2->PushButton1->click(); + } - myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + updateWPlane(); } @@ -386,21 +377,33 @@ void BasicGUI_WorkingPlaneDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - if(send == Group1->PushButton1) { + if ( send == Group1->PushButton1 ) { myEditCurrentArgument = Group1->LineEdit1; globalSelection( GEOM_PLANE ); } - else if(send == Group2->PushButton1) { + else if ( send == Group2->PushButton1 ) { myEditCurrentArgument = Group2->LineEdit1; + GEOM::GEOM_Object_var anObj; + // localSelection( anObj, TopAbs_EDGE ); globalSelection( GEOM_LINE ); + Group2->PushButton2->setDown( false ); + Group2->LineEdit1->setEnabled( true ); + Group2->LineEdit2->setEnabled( false ); } - else if(send == Group2->PushButton2) { + else if ( send == Group2->PushButton2 ) { myEditCurrentArgument = Group2->LineEdit2; + GEOM::GEOM_Object_var anObj; + // localSelection( anObj, TopAbs_EDGE ); globalSelection( GEOM_LINE ); + Group2->PushButton1->setDown( false ); + Group2->LineEdit1->setEnabled( false ); + Group2->LineEdit2->setEnabled( true ); } myEditCurrentArgument->setFocus(); - SelectionIntoArgument(); + // SelectionIntoArgument(); + send->setDown(true); + displayPreview(true); } @@ -411,13 +414,23 @@ void BasicGUI_WorkingPlaneDlg::SetEditCurrentArgument() void BasicGUI_WorkingPlaneDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); - if(send == Group1->LineEdit1 || send == Group2->LineEdit1 || send == Group2->LineEdit2) { + if ( send == Group1->LineEdit1 || send == Group2->LineEdit1 || send == Group2->LineEdit2 ) { myEditCurrentArgument = send; GEOMBase_Skeleton::LineEditReturnPressed(); } } +//================================================================================= +// function : onReverse() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::onReverse() +{ + updateWPlane(); +} + + //================================================================================= // function : ActivateThisDialog() // purpose : @@ -425,8 +438,8 @@ void BasicGUI_WorkingPlaneDlg::LineEditReturnPressed() void BasicGUI_WorkingPlaneDlg::ActivateThisDialog( ) { GEOMBase_Skeleton::ActivateThisDialog(); - connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), - SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication( ) ) )->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); ConstructorsClicked( getConstructorId() ); } @@ -442,30 +455,140 @@ void BasicGUI_WorkingPlaneDlg::DeactivateActiveDialog() GEOMBase_Skeleton::DeactivateActiveDialog(); } -//======================================================================= -// function : ClickOnCancel() -// purpose : -//======================================================================= -void BasicGUI_WorkingPlaneDlg::ClickOnCancel() -{ - GEOMBase_Skeleton::ClickOnCancel(); -} - //================================================================================= // function : enterEvent() // purpose : //================================================================================= -void BasicGUI_WorkingPlaneDlg::enterEvent(QEvent* e) +void BasicGUI_WorkingPlaneDlg::enterEvent( QEvent* ) { - if ( !GroupConstructors->isEnabled() ) + if ( !mainFrame()->GroupConstructors->isEnabled() ) ActivateThisDialog(); } //================================================================================= -// function : closeEvent +// function : updateWPlane // purpose : //================================================================================= -void BasicGUI_WorkingPlaneDlg::closeEvent( QCloseEvent* e ) +bool BasicGUI_WorkingPlaneDlg::updateWPlane( const bool showPreview ) { - GEOMBase_Skeleton::closeEvent( e ); + erasePreview(); + + const int id = getConstructorId(); + + if ( id == 0 ) { // by planar face selection + if ( CORBA::is_nil( myFace ) ) { + if ( !showPreview ) + showError( "Face has to be selected" ); + return false; + } + + // PAL12781: set center of WPL to face's center of mass + // like it is done for LCS creation + CORBA::Double Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz; + Ox = Oy = Oz = Zx = Zy = Xy = Xz = 0.; + Zz = Xx = 1.; + + GEOM::GEOM_IMeasureOperations_ptr aMeasureOp = + myGeomGUI->GetGeomGen()->GetIMeasureOperations(); + aMeasureOp->GetPosition( myFace, Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz); + + if ( aMeasureOp->IsDone() ) { + gp_Pnt aPnt ( Ox, Oy, Oz ); + gp_Dir aDirN ( Zx, Zy, Zz ); + gp_Dir aDirX ( Xx, Xy, Xz ); + myWPlane = gp_Ax3( aPnt, aDirN, aDirX ); + } + else { + if ( !showPreview ) + showError( "Wrong shape selected (has to be a planar face)" ); + return false; + } + } + else if ( id == 1 ) { // by two vectors (Ox & Oz) + if ( CORBA::is_nil( myVectX ) || CORBA::is_nil( myVectZ ) ) { + if ( !showPreview ) + showError( "Two vectors have to be selected" ); + return false; + } + + TopoDS_Edge aVectX, aVectZ; + TopoDS_Vertex VX1, VX2, VZ1, VZ2; + gp_Vec aVX, aVZ; + + if ( !GEOMBase::GetShape( myVectX, aVectX, TopAbs_EDGE ) || + !GEOMBase::GetShape( myVectZ, aVectZ, TopAbs_EDGE ) ) { + if ( !showPreview ) + showError( "Wrong shape selected (two vectors(edges) have to be selected)" ); + return false; + } + + TopExp::Vertices( aVectX, VX1, VX2, Standard_True ); + TopExp::Vertices( aVectZ, VZ1, VZ2, Standard_True ); + + if ( VX1.IsNull() || VX2.IsNull() ) { + if ( !showPreview ) + showError( "Bad OX vector" ); + return false; + } + if ( VZ1.IsNull() || VZ2.IsNull() ) { + if ( !showPreview ) + showError( "Bad OZ vector" ); + return false; + } + + aVX = gp_Vec( BRep_Tool::Pnt( VX1 ), BRep_Tool::Pnt( VX2 ) ); + aVZ = gp_Vec( BRep_Tool::Pnt( VZ1 ), BRep_Tool::Pnt( VZ2 ) ); + + if ( aVX.Magnitude() < Precision::Confusion() ) { + if ( !showPreview ) + showError( "Bad OX vector" ); + return false; + } + if ( aVZ.Magnitude() < Precision::Confusion() ) { + if ( !showPreview ) + showError( "Bad OZ vector" ); + return false; + } + + gp_Dir aDirX = gp_Dir( aVX.X(), aVX.Y(), aVX.Z() ); + gp_Dir aDirZ = gp_Dir( aVZ.X(), aVZ.Y(), aVZ.Z() ); + + if ( aDirX.IsParallel( aDirZ, Precision::Angular() ) ) { + if ( !showPreview ) + showError( "Parallel vectors selected" ); + return false; + } + + myWPlane = gp_Ax3( BRep_Tool::Pnt( VX1 ), aDirZ, aDirX ); + + } + else if ( id == 2 ) { // by selection from standard (OXY or OYZ, or OZX) + gp_Ax2 anAx2; + + if ( aOriginType == 1 ) anAx2 = gp::XOY(); + else if ( aOriginType == 2 ) anAx2 = gp::YOZ(); + else if ( aOriginType == 0 ) anAx2 = gp::ZOX(); + + myWPlane = gp_Ax3( anAx2 ); + + } + else { + return false; + } + + if ( myReverseCB->isChecked() ) { + myWPlane.YReverse(); + myWPlane.ZReverse(); + } + + if ( showPreview ) { + GEOM::GEOM_IBasicOperations_var aBasicOp = getGeomEngine()->GetIBasicOperations(); + GEOM::GEOM_Object_var anObj = aBasicOp->MakeMarker + ( myWPlane.Location().X(), myWPlane.Location().Y(), myWPlane.Location().Z(), + myWPlane.XDirection().X(), myWPlane.XDirection().Y(), myWPlane.XDirection().Z(), + myWPlane.YDirection().X(), myWPlane.YDirection().Y(), myWPlane.YDirection().Z() ); + displayPreview( anObj ); + } + + return true; }