X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMeasureGUI%2FMeasureGUI_PropertiesDlg.cxx;h=f4343eac997ae7dcb75721976037fc341e04f0ff;hb=496aa6dc0f02b916609d77d77ae952611ad00a6d;hp=934551b8475de3b19aa57b667d892f0d86b288f9;hpb=c577ca78d7a6e286526662cf54df6de1f4f2f449;p=modules%2Fgeom.git diff --git a/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx b/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx index 934551b84..f4343eac9 100644 --- a/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_PropertiesDlg.cxx @@ -1,72 +1,114 @@ -// GEOM GEOMGUI : GUI for Geometry component +// Copyright (C) 2007-2020 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 -// -// 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 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 -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// 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, 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. +// +// 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 // -// File : MeasureGUI_PropertiesDlg.cxx -// Author : Lucien PIGNOLONI -// Module : GEOM -// $Header$ -using namespace std; +// GEOM GEOMGUI : GUI for Geometry component +// File : MeasureGUI_PropertiesDlg.cxx +// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. +// #include "MeasureGUI_PropertiesDlg.h" +#include "MeasureGUI_Widgets.h" + +#include +#include +#include -#include -#include -#include -#include +#include +#include +#include + +#include + +#define DEFAULT_TOLERANCE_VALUE 1.e-6 //================================================================================= // class : MeasureGUI_PropertiesDlg() // purpose : Constructs a MeasureGUI_PropertiesDlg 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. +// true to construct a modal dialog. //================================================================================= -MeasureGUI_PropertiesDlg::MeasureGUI_PropertiesDlg(QWidget* parent, const char* name, SALOME_Selection* Sel, bool modal, WFlags fl) - :MeasureGUI_Skeleton(parent, name, Sel, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +MeasureGUI_PropertiesDlg::MeasureGUI_PropertiesDlg( GeometryGUI* GUI, QWidget* parent ) + : MeasureGUI_Skeleton(GUI, parent), + myTolerance(0), + myLength(0), + mySurface(0), + myVolume(0) { - QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_DLG_BASICPROPERTIES"))); - QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_SELECT"))); + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( + "GEOM", tr( "ICON_DLG_BASICPROPERTIES" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( + "GEOM", tr( "ICON_SELECT" ) ) ); - setCaption(tr("GEOM_PROPERTIES_TITLE")); + setWindowTitle( tr( "GEOM_PROPERTIES_TITLE" ) ); /***************************************************************/ - GroupConstructors->setTitle(tr("GEOM_PROPERTIES")); - RadioButton1->setPixmap(image0); - - GroupC1 = new MeasureGUI_1Sel3LineEdit_QTD(this, "GroupC1"); - GroupC1->GroupBox1->setTitle(tr("GEOM_PROPERTIES_CONSTR")); - GroupC1->TextLabel1->setText(tr("GEOM_OBJECT")); - GroupC1->TextLabel2->setText(tr("GEOM_LENGTH")); - GroupC1->TextLabel3->setText(tr("GEOM_PROPERTIES_SURFACE")); - GroupC1->TextLabel4->setText(tr("GEOM_PROPERTIES_VOLUME")); - GroupC1->LineEdit2->setReadOnly(TRUE); - GroupC1->LineEdit3->setReadOnly(TRUE); - GroupC1->LineEdit4->setReadOnly(TRUE); - GroupC1->PushButton1->setPixmap(image1); - - Layout1->addWidget(GroupC1, 1, 0); + + mainFrame()->GroupConstructors->setTitle( tr( "GEOM_PROPERTIES" ) ); + mainFrame()->RadioButton1->setIcon( image0 ); + + QGroupBox *aGrpBox = + new QGroupBox(tr("GEOM_PROPERTIES_CONSTR"), centralWidget()); + QLabel *anObjLbl = new QLabel(tr("GEOM_OBJECT"), aGrpBox); + QLabel *aTolLbl = new QLabel(tr("GEOM_TOLERANCE"), aGrpBox); + QLabel *aLenLbl = new QLabel(tr("GEOM_LENGTH"), aGrpBox); + QLabel *aSurfLbl = new QLabel(tr("GEOM_PROPERTIES_SURFACE"), aGrpBox); + QLabel *aVolLbl = new QLabel(tr("GEOM_PROPERTIES_VOLUME"), aGrpBox); + + mySelBtn = new QPushButton(aGrpBox); + mySelBtn->setIcon(image1); + mySelEdit = new QLineEdit(aGrpBox); + mySelEdit->setReadOnly(true); + myTolerance = new SalomeApp_DoubleSpinBox(aGrpBox); + myLength = new QLineEdit(aGrpBox); + mySurface = new QLineEdit(aGrpBox); + myVolume = new QLineEdit(aGrpBox); + myLength->setReadOnly(true); + mySurface->setReadOnly(true); + myVolume->setReadOnly(true); + + QGridLayout* aLayout = new QGridLayout(aGrpBox); + + aLayout->setMargin(9); + aLayout->setSpacing(6); + aLayout->addWidget(anObjLbl, 0, 0); + aLayout->addWidget(aTolLbl, 1, 0); + aLayout->addWidget(aLenLbl, 2, 0); + aLayout->addWidget(aSurfLbl, 3, 0); + aLayout->addWidget(aVolLbl, 4, 0); + aLayout->addWidget(mySelBtn, 0, 1); + aLayout->addWidget(mySelEdit, 0, 2); + aLayout->addWidget(myTolerance, 1, 1, 1, 2); + aLayout->addWidget(myLength, 2, 1, 1, 2); + aLayout->addWidget(mySurface, 3, 1, 1, 2); + aLayout->addWidget(myVolume, 4, 1, 1, 2); + + QVBoxLayout* aDlgLayout = new QVBoxLayout( centralWidget() ); + aDlgLayout->setMargin( 0 ); aDlgLayout->setSpacing( 6 ); + aDlgLayout->addWidget(aGrpBox); + /***************************************************************/ + myHelpFileName = "basic_prop_page.html"; + /* Initialisation */ Init(); } @@ -78,7 +120,6 @@ MeasureGUI_PropertiesDlg::MeasureGUI_PropertiesDlg(QWidget* parent, const char* //================================================================================= MeasureGUI_PropertiesDlg::~MeasureGUI_PropertiesDlg() { - // no need to delete child widgets, Qt does it all for us } @@ -88,171 +129,151 @@ MeasureGUI_PropertiesDlg::~MeasureGUI_PropertiesDlg() //================================================================================= void MeasureGUI_PropertiesDlg::Init() { - /* init variables */ - myEditCurrentArgument = GroupC1->LineEdit1; + mySelEdit->setMinimumSize(100, 0); - /* signals and slots connections */ - connect(GroupC1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(GroupC1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + // Obtain precision from preferences + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); - connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + myTolerance->setPrecision(aPrecision); + // it's necessary to set decimals before the range setting, + // by default Qt rounds boundaries to 2 decimals at setRange + myTolerance->setDecimals(qAbs(aPrecision)); + myTolerance->setRange(0., 1.); + myTolerance->setSingleStep(DEFAULT_TOLERANCE_VALUE); + myTolerance->setValue(DEFAULT_TOLERANCE_VALUE); - /* displays Dialog */ - GroupC1->show(); - this->show(); + MeasureGUI_Skeleton::Init(); - return; + connect(myTolerance, SIGNAL(valueChanged(double)), + this, SLOT(toleranceChanged(double))); } - //================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case +// function : activateSelection +// purpose : //================================================================================= -void MeasureGUI_PropertiesDlg::SelectionIntoArgument() +void MeasureGUI_PropertiesDlg::activateSelection() { - myGeomBase->EraseSimulationShape(); - mySimulationTopoDs.Nullify(); - myEditCurrentArgument->setText(""); - QString aString = ""; + static TColStd_MapOfInteger aTypes; + if ( aTypes.IsEmpty() ) { + aTypes.Add( GEOM_COMPOUND ); + // aTypes.Add( TopAbs_COMPSOLID ); + aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_SHELL ); + aTypes.Add( GEOM_FACE ); + aTypes.Add( GEOM_WIRE ); + aTypes.Add( GEOM_EDGE ); + } - GroupC1->LineEdit2->setText(""); - GroupC1->LineEdit3->setText(""); - GroupC1->LineEdit4->setText(""); + globalSelection( aTypes ); - int nbSel = myGeomBase->GetNameOfSelectedIObjects(mySelection, aString); - if(nbSel != 1) - return; - - /* nbSel == 1 */ - TopoDS_Shape S; - if(!myGeomBase->GetTopoFromSelection(mySelection, S)) - return; + std::list needTypes; + needTypes.push_back( TopAbs_EDGE ), needTypes.push_back( TopAbs_WIRE ), + needTypes.push_back( TopAbs_FACE ), needTypes.push_back( TopAbs_SHELL ), + needTypes.push_back( TopAbs_SOLID ), needTypes.push_back( TopAbs_COMPOUND ); + localSelection( needTypes ); +} - - if(S.IsNull() || S.ShapeType() == TopAbs_VERTEX) - return; +void MeasureGUI_PropertiesDlg::SelectionIntoArgument() +{ + myObj.nullify(); + QList aTypes; + aTypes << TopAbs_EDGE << TopAbs_WIRE << TopAbs_FACE << TopAbs_SHELL + << TopAbs_SOLID << TopAbs_COMPSOLID << TopAbs_COMPOUND; + myObj = getSelected( aTypes ); - GroupC1->LineEdit1->setText(aString); - - /* Try to display of a cone simulation shape to show direction of a linear edge only in OCC viewer */ - if(myGeomBase->CreateArrowForLinearEdge(S, mySimulationTopoDs)) - myGeomBase->DisplaySimulationShape(mySimulationTopoDs); + if (!myObj) { + mySelEdit->setText(""); + processObject(); + erasePreview(); + return; + } - this->CalculateAndDisplayProperties(S); - return; + mySelEdit->setText(GEOMBase::GetName(myObj.get())); + processObject(); + redisplayPreview(); } - //================================================================================= -// function : SetEditCurrentArgument() +// function : isValid // purpose : //================================================================================= -void MeasureGUI_PropertiesDlg::SetEditCurrentArgument() +bool MeasureGUI_PropertiesDlg::isValid(QString& msg) { - QPushButton* send = (QPushButton*)sender(); - - if(send == GroupC1->PushButton1) { - GroupC1->LineEdit1->setFocus(); - myEditCurrentArgument = GroupC1->LineEdit1; - } - - this->SelectionIntoArgument(); - return; + return myTolerance->isValid(msg) && MeasureGUI_Skeleton::isValid(msg); } - //================================================================================= -// function : LineEditReturnPressed() +// function : processObject // purpose : //================================================================================= -void MeasureGUI_PropertiesDlg::LineEditReturnPressed() +void MeasureGUI_PropertiesDlg::processObject() { - QLineEdit* send = (QLineEdit*)sender(); - if(send == GroupC1->LineEdit1) - myEditCurrentArgument = GroupC1->LineEdit1; - else - return; - - MeasureGUI_Skeleton::LineEditReturnPressed(); - return; + double aLength, anArea, aVolume; + + if ( !getParameters( aLength, anArea, aVolume ) ) { + mySelEdit->setText( "" ); + myLength->setText( "" ); + mySurface->setText( "" ); + myVolume->setText( "" ); + } + else { + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + myLength->setText( DlgRef::PrintDoubleValue( aLength, aPrecision ) ); + mySurface->setText( DlgRef::PrintDoubleValue( anArea, aPrecision ) ); + myVolume->setText( DlgRef::PrintDoubleValue( aVolume, aPrecision ) ); + } } - //================================================================================= -// function : ActivateThisDialog() +// function : getParameters // purpose : //================================================================================= -void MeasureGUI_PropertiesDlg::ActivateThisDialog() +bool MeasureGUI_PropertiesDlg::getParameters( double& theLength, + double& theArea, + double& theVolume ) { - MeasureGUI_Skeleton::ActivateThisDialog(); - connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - if(!mySimulationTopoDs.IsNull()) - myGeomBase->DisplaySimulationShape(mySimulationTopoDs); - return; -} + if ( !myObj ) + return false; + else { + GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow( getOperation() ); + try { + anOper->GetBasicProperties( myObj.get(), myTolerance->value(), theLength, theArea, theVolume ); + } + catch( const SALOME::SALOME_Exception& e ) { + SalomeApp_Tools::QtCatchCorbaException( e ); + return false; + } + return anOper->IsDone(); + } +} //================================================================================= -// function : enterEvent() +// function : createOperation // purpose : //================================================================================= -void MeasureGUI_PropertiesDlg::enterEvent(QEvent* e) +SALOME_Prs* MeasureGUI_PropertiesDlg::buildPrs() { - if(GroupConstructors->isEnabled()) - return; - this->ActivateThisDialog(); - return; + SALOME_Prs* prs = 0; + TopoDS_Shape shape; + + if ( GEOMBase::GetShape( myObj.get(), shape, TopAbs_EDGE ) && + getDisplayer()->IsDisplayed( GEOMBase::GetEntry(myObj.get()) ) ) { + shape = GEOMBase::CreateArrowForLinearEdge( shape ); + if ( !shape.IsNull() ) + prs = getDisplayer()->BuildPrs( shape ); + } + return prs; } - //================================================================================= -// function : CalculateAndDisplayProperties() +// function : toleranceChanged // purpose : //================================================================================= -void MeasureGUI_PropertiesDlg::CalculateAndDisplayProperties(const TopoDS_Shape& S) +void MeasureGUI_PropertiesDlg::toleranceChanged(double) { - GroupC1->LineEdit2->setText(""); - GroupC1->LineEdit3->setText(""); - GroupC1->LineEdit4->setText(""); - - if(S.IsNull()) - return; - - Standard_Real result; - GProp_GProps LProps, SProps; - QString resString; - - try { - BRepGProp::LinearProperties(S,LProps); - result = LProps.Mass(); - if(!IsEqual(result, 0.0)) { - resString = tr("%1").arg(result, 12, 'f', 6); - GroupC1->LineEdit2->setText(resString); - } - - BRepGProp::SurfaceProperties(S, SProps); - result = SProps.Mass(); - if(!IsEqual(result, 0.0)) { - resString = tr("%1").arg(result, 12, 'f', 6); - GroupC1->LineEdit3->setText(resString); - } - - result = 0.0; - if(S.ShapeType() < TopAbs_SHELL) { - for(TopExp_Explorer Exp(S,TopAbs_SOLID); Exp.More(); Exp.Next()) { - GProp_GProps VProps; - BRepGProp::VolumeProperties(Exp.Current(), VProps); - result += VProps.Mass(); - } - } - if (!IsEqual(result, 0.0)) { - resString = tr("%1").arg(result, 12, 'f', 6); - GroupC1->LineEdit4->setText(resString); - } - } - catch(Standard_Failure) { - MESSAGE("Catch intercepted in CalculateAndDisplayProperties()"); - } - return; + processObject(); }