X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FAdvancedGUI%2FAdvancedGUI_SmoothingSurfaceDlg.cxx;h=d696c665e14cafea3f37a9a83ca5085812aa9ef0;hb=25a3dc91508bb59688142bc616b10facc61dfc3d;hp=8a93ce3de2238e9c7bdc2ac231376085e152bf38;hpb=7d880c6a8262b6d670ed70ee2b9ec25c199a46d4;p=modules%2Fgeom.git diff --git a/src/AdvancedGUI/AdvancedGUI_SmoothingSurfaceDlg.cxx b/src/AdvancedGUI/AdvancedGUI_SmoothingSurfaceDlg.cxx index 8a93ce3de..d696c665e 100644 --- a/src/AdvancedGUI/AdvancedGUI_SmoothingSurfaceDlg.cxx +++ b/src/AdvancedGUI/AdvancedGUI_SmoothingSurfaceDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2013-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -19,6 +19,9 @@ #include "AdvancedGUI_SmoothingSurfaceDlg.h" +#include +#include CORBA_SERVER_HEADER(AdvancedGEOM) + #include #include #include @@ -31,8 +34,8 @@ // OCCT Includes #include #include +#include #include -#include #include #include @@ -41,7 +44,10 @@ // Constructor //================================================================================= AdvancedGUI_SmoothingSurfaceDlg::AdvancedGUI_SmoothingSurfaceDlg (GeometryGUI* theGeometryGUI, QWidget* parent) - : GEOMBase_Skeleton(theGeometryGUI, parent, false) + : GEOMBase_Skeleton(theGeometryGUI, parent, false), + myNbMaxSpin(0), + myDegMaxSpin(0), + myDMaxSpin(0) { QPixmap imageOp (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_SMOOTHINGSURFACE_LPOINTS"))); QPixmap imageSel (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -64,6 +70,20 @@ AdvancedGUI_SmoothingSurfaceDlg::AdvancedGUI_SmoothingSurfaceDlg (GeometryGUI* t GroupPoints->PushButton1->setIcon( image1 ); GroupPoints->LineEdit1->setReadOnly( true ); + QLabel *aNbMax = new QLabel(tr("GEOM_SMOOTHINGSURFACE_ARG_NB_MAX")); + QLabel *aDegMax = new QLabel(tr("GEOM_SMOOTHINGSURFACE_ARG_DEG_MAX")); + QLabel *aDMax = new QLabel(tr("GEOM_SMOOTHINGSURFACE_ARG_D_MAX")); + + myNbMaxSpin = new SalomeApp_IntSpinBox(0, 1000, 1, 0, true, true); + myDegMaxSpin = new SalomeApp_IntSpinBox(0, 1000, 1, 0, true, true); + myDMaxSpin = new SalomeApp_DoubleSpinBox; + GroupPoints->gridLayout1->addWidget(aNbMax, 1, 0); + GroupPoints->gridLayout1->addWidget(aDegMax, 2, 0); + GroupPoints->gridLayout1->addWidget(aDMax, 3, 0); + GroupPoints->gridLayout1->addWidget(myNbMaxSpin, 1, 1, 1, 2); + GroupPoints->gridLayout1->addWidget(myDegMaxSpin, 2, 1, 1, 2); + GroupPoints->gridLayout1->addWidget(myDMaxSpin, 3, 1, 1, 2); + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); layout->addWidget(GroupPoints); @@ -89,9 +109,18 @@ AdvancedGUI_SmoothingSurfaceDlg::~AdvancedGUI_SmoothingSurfaceDlg() void AdvancedGUI_SmoothingSurfaceDlg::Init() { // Get setting of step value from file configuration - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); + //SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + + initSpinBox(myDMaxSpin, 0., COORD_MAX, 0.00001, "parametric_precision" ); + + myNbMaxSpin->setValue(2); + myDegMaxSpin->setValue(8); + myDMaxSpin->setValue(0.); + showOnlyPreviewControl(); + + globalSelection(); + localSelection( TopAbs_VERTEX ); //@@ initialize dialog box widgets here @@// // Signal/slot connections @@ -101,9 +130,16 @@ void AdvancedGUI_SmoothingSurfaceDlg::Init() this, SLOT(SetDoubleSpinBoxStep(double))); connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - + connect(myNbMaxSpin, SIGNAL(valueChanged(const QString&)), + this, SLOT(processPreview()) ); + connect(myDegMaxSpin, SIGNAL(valueChanged(const QString&)), + this, SLOT(processPreview()) ); + connect(myDMaxSpin, SIGNAL(valueChanged(const QString&)), + this, SLOT(processPreview()) ); + initName(tr("GEOM_SMOOTHINGSURFACE")); //displayPreview(); + SelectionIntoArgument(); } //================================================================================= @@ -126,7 +162,8 @@ bool AdvancedGUI_SmoothingSurfaceDlg::ClickOnApply() return false; initName(); - + globalSelection(); + localSelection( TopAbs_VERTEX ); return true; } @@ -137,6 +174,8 @@ bool AdvancedGUI_SmoothingSurfaceDlg::ClickOnApply() void AdvancedGUI_SmoothingSurfaceDlg::ActivateThisDialog() { GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection(); + localSelection( TopAbs_VERTEX ); //displayPreview(); } @@ -156,8 +195,7 @@ void AdvancedGUI_SmoothingSurfaceDlg::enterEvent (QEvent*) //================================================================================= GEOM::GEOM_IOperations_ptr AdvancedGUI_SmoothingSurfaceDlg::createOperation() { - //return getGeomEngine()->GetIAdvancedOperations(getStudyId()); - return getGeomEngine()->GetPluginOperations(getStudyId(), "AdvancedEngine"); + return getGeomEngine()->GetPluginOperations("AdvancedEngine"); } //================================================================================= @@ -166,9 +204,14 @@ GEOM::GEOM_IOperations_ptr AdvancedGUI_SmoothingSurfaceDlg::createOperation() //================================================================================= bool AdvancedGUI_SmoothingSurfaceDlg::isValid (QString& msg) { - bool ok = true; + if (myPoints.empty()) { + msg += tr("GEOM_SMOOTHINGSURFACE_NO_POINTS"); + return false; + } - //@@ add custom validation actions here @@// + bool ok = myNbMaxSpin->isValid (msg, !IsPreview()) && + myDegMaxSpin->isValid(msg, !IsPreview()) && + myDMaxSpin->isValid (msg, !IsPreview()); return ok; } @@ -183,7 +226,7 @@ bool AdvancedGUI_SmoothingSurfaceDlg::execute (ObjectList& objects) GEOM::GEOM_Object_var anObj; - GEOM::GEOM_IAdvancedOperations_var anOper = GEOM::GEOM_IAdvancedOperations::_narrow(getOperation()); + GEOM::IAdvancedOperations_var anOper = GEOM::IAdvancedOperations::_narrow(getOperation()); //@@ retrieve input values from the widgets here @@// GEOM::ListOfGO_var points = new GEOM::ListOfGO(); @@ -191,15 +234,18 @@ bool AdvancedGUI_SmoothingSurfaceDlg::execute (ObjectList& objects) for ( int i = 0; i < myPoints.count(); i++ ) points[i] = myPoints[i].copy(); + const int aNbMax = myNbMaxSpin->value(); + const int aDegMax = myDegMaxSpin->value(); + const double aDMax = myDMaxSpin->value(); // call engine function - anObj = anOper->MakeSmoothingSurface(points); + anObj = anOper->MakeSmoothingSurface(points, aNbMax, aDegMax, aDMax); res = !anObj->_is_nil(); if (res && !IsPreview()) { QStringList aParameters; //@@ put stringified input parameters to the string list here to store in the data model for notebook @@// - if ( aParameters.count() > 0 ) anObj->SetParameters(aParameters.join(":").toLatin1().constData()); + if ( aParameters.count() > 0 ) anObj->SetParameters(aParameters.join(":").toUtf8().constData()); } if (res) @@ -208,16 +254,100 @@ bool AdvancedGUI_SmoothingSurfaceDlg::execute (ObjectList& objects) return res; } +//================================================================================= +// function : addSubshapesToStudy +// purpose : virtual method to add new SubObjects if local selection +//================================================================================= +void AdvancedGUI_SmoothingSurfaceDlg::addSubshapesToStudy() +{ + for ( int i = 0; i < myPoints.count(); i++ ) + GEOMBase::PublishSubObject( myPoints[i].get() ); +} + + +//================================================================================= +// function : getSourceObjects +// purpose : virtual method to get source objects +//================================================================================= +QList AdvancedGUI_SmoothingSurfaceDlg::getSourceObjects() +{ + return myPoints; +} + +//================================================================================= +// function : getNbPoints() +// purpose : Returns the number of points in myPoints list. +//================================================================================= +int AdvancedGUI_SmoothingSurfaceDlg::getNbPoints() const +{ + TopTools_IndexedMapOfShape aMap; + + foreach (GEOM::GeomObjPtr anObj, myPoints) { + TopoDS_Shape aShape; + + if(anObj && GEOMBase::GetShape(anObj.get(), aShape) && !aShape.IsNull()) { + if (aShape.ShapeType() == TopAbs_VERTEX) { + aMap.Add(aShape); + } else { + // Compound. + TopExp::MapShapes(aShape, TopAbs_VERTEX, aMap); + } + } + } + + const int aNbPoints = aMap.Extent(); + + return aNbPoints; +} + //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection as changed or other case //================================================================================= void AdvancedGUI_SmoothingSurfaceDlg::SelectionIntoArgument() { - QList points = getSelected( TopAbs_VERTEX, -1 ); + QList aTypes; + + aTypes << TopAbs_VERTEX << TopAbs_COMPOUND; + + QList points = getSelected( aTypes, -1 ); + + // Check the selected compounds if they consist of points only. + foreach (GEOM::GeomObjPtr anObj, points) { + TopoDS_Shape aShape; + + if(anObj && GEOMBase::GetShape(anObj.get(), aShape) && !aShape.IsNull()) { + if (aShape.ShapeType() == TopAbs_COMPOUND) { + // Check if the compound contains vertices only. + TopoDS_Iterator anIter(aShape); + Standard_Boolean isValid = Standard_False; + + for (; anIter.More(); anIter.Next()) { + const TopoDS_Shape &aSubShape = anIter.Value(); + + if (aSubShape.ShapeType() == TopAbs_VERTEX) { + isValid = Standard_True; + } else { + isValid = Standard_False; + break; + } + } + + if (!isValid) { + points.clear(); + break; + } + } + } else { + // NEVERREACHED + points.clear(); + break; + } + } + GEOMBase::Synchronize( myPoints, points ); if ( !myPoints.isEmpty() ) - GroupPoints->LineEdit1->setText( QString::number( myPoints.count() ) + "_" + tr( "GEOM_POINT" ) + tr( "_S_" ) ); + GroupPoints->LineEdit1->setText( QString::number( getNbPoints() ) + "_" + tr( "GEOM_POINT" ) + tr( "_S_" ) ); else GroupPoints->LineEdit1->setText( "" ); processPreview(); @@ -232,5 +362,7 @@ void AdvancedGUI_SmoothingSurfaceDlg::SetEditCurrentArgument() if ( sender() == GroupPoints->PushButton1 ) myEditCurrentArgument = GroupPoints->LineEdit1; myEditCurrentArgument->setFocus(); + globalSelection(); + localSelection( TopAbs_VERTEX ); SelectionIntoArgument(); }