mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-01-24 03:30:32 +05:00
361 lines
13 KiB
C++
361 lines
13 KiB
C++
|
// Copyright (C) 2007-2014 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
|
||
|
//
|
||
|
// 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
|
||
|
//
|
||
|
|
||
|
// GEOM GEOMGUI : GUI for Geometry component
|
||
|
// File : TransformationGUI_ProjectionOnCylDlg.cxx
|
||
|
// Author : Sergey KHROMOV, Open CASCADE S.A.S.
|
||
|
|
||
|
#include "TransformationGUI_ProjectionOnCylDlg.h"
|
||
|
|
||
|
#include <GeometryGUI.h>
|
||
|
#include <GEOMBase.h>
|
||
|
#include <GEOMImpl_Types.hxx>
|
||
|
|
||
|
#include <SUIT_Session.h>
|
||
|
#include <SUIT_ResourceMgr.h>
|
||
|
#include <SalomeApp_Application.h>
|
||
|
#include <SalomeApp_DoubleSpinBox.h>
|
||
|
#include <LightApp_SelectionMgr.h>
|
||
|
|
||
|
#include <QCheckBox>
|
||
|
#include <QGridLayout>
|
||
|
#include <QGroupBox>
|
||
|
#include <QLineEdit>
|
||
|
#include <QPushButton>
|
||
|
#include <QRadioButton>
|
||
|
|
||
|
#include <TColStd_MapOfInteger.hxx>
|
||
|
|
||
|
//=================================================================================
|
||
|
// class : TransformationGUI_ProjectionOnCylDlg()
|
||
|
// purpose : Constructs a TransformationGUI_ProjectionOnCylDlg 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.
|
||
|
//=================================================================================
|
||
|
TransformationGUI_ProjectionOnCylDlg::TransformationGUI_ProjectionOnCylDlg
|
||
|
(GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl)
|
||
|
: GEOMBase_Skeleton (theGeometryGUI, parent, modal, fl),
|
||
|
myObjectName (0),
|
||
|
mySelButton (0),
|
||
|
myRadiusSpin (0),
|
||
|
myStartAngleSpin (0),
|
||
|
myUseAngleLen (0),
|
||
|
myAngleLenSpin (0)
|
||
|
{
|
||
|
SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr();
|
||
|
QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICO_DLG_PROJ_ON_CYL")));
|
||
|
QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
|
||
|
|
||
|
setWindowTitle(tr("GEOM_PROJ_ON_CYL_TITLE"));
|
||
|
|
||
|
/***************************************************************/
|
||
|
mainFrame()->GroupConstructors->setTitle(tr("GEOM_PROJECTION_TITLE"));
|
||
|
mainFrame()->RadioButton1->setIcon(image0);
|
||
|
mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
|
||
|
mainFrame()->RadioButton2->close();
|
||
|
mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
|
||
|
mainFrame()->RadioButton3->close();
|
||
|
|
||
|
QGroupBox *aGrpParams =
|
||
|
new QGroupBox(tr("GEOM_ARGUMENTS"), centralWidget());
|
||
|
QGridLayout *aParamsLayout = new QGridLayout(aGrpParams);
|
||
|
QLabel *anObjLbl = new QLabel(tr("GEOM_OBJECT"), aGrpParams);
|
||
|
QLabel *aRadiusLbl = new QLabel(tr("GEOM_RADIUS"), aGrpParams);
|
||
|
QLabel *aStartAngleLbl =
|
||
|
new QLabel(tr("GEOM_PROJ_ON_CYL_START_ANGLE"), aGrpParams);
|
||
|
QLabel *anAngleLenLbl =
|
||
|
new QLabel(tr("GEOM_PROJ_ON_CYL_LENGTH_ANGLE"), aGrpParams);
|
||
|
|
||
|
myObjectName = new QLineEdit(aGrpParams);
|
||
|
mySelButton = new QPushButton(aGrpParams);
|
||
|
myRadiusSpin = new SalomeApp_DoubleSpinBox(aGrpParams);
|
||
|
myStartAngleSpin = new SalomeApp_DoubleSpinBox(aGrpParams);
|
||
|
myUseAngleLen = new QCheckBox(aGrpParams);
|
||
|
myAngleLenSpin = new SalomeApp_DoubleSpinBox(aGrpParams);
|
||
|
|
||
|
myObjectName->setReadOnly(true);
|
||
|
mySelButton->setIcon(image1);
|
||
|
mySelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||
|
myUseAngleLen->setChecked(false);
|
||
|
|
||
|
aParamsLayout->setMargin(9);
|
||
|
aParamsLayout->setSpacing(6);
|
||
|
aParamsLayout->addWidget(anObjLbl, 0, 1);
|
||
|
aParamsLayout->addWidget(mySelButton, 0, 2);
|
||
|
aParamsLayout->addWidget(myObjectName, 0, 3);
|
||
|
aParamsLayout->addWidget(aRadiusLbl, 1, 1);
|
||
|
aParamsLayout->addWidget(myRadiusSpin, 1, 2, 1, 2);
|
||
|
aParamsLayout->addWidget(aStartAngleLbl, 2, 1);
|
||
|
aParamsLayout->addWidget(myStartAngleSpin, 2, 2, 1, 2);
|
||
|
aParamsLayout->addWidget(myUseAngleLen, 3, 0);
|
||
|
aParamsLayout->addWidget(anAngleLenLbl, 3, 1);
|
||
|
aParamsLayout->addWidget(myAngleLenSpin, 3, 2, 1, 2);
|
||
|
|
||
|
QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
|
||
|
layout->setMargin( 0 ); layout->setSpacing( 6 );
|
||
|
layout->addWidget( aGrpParams );
|
||
|
|
||
|
/***************************************************************/
|
||
|
|
||
|
setHelpFileName("projection_on_cylinder_operation_page.html");
|
||
|
|
||
|
Init();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : ~TransformationGUI_ProjectionOnCylDlg()
|
||
|
// purpose : Destroys the object and frees any allocated resources
|
||
|
//=================================================================================
|
||
|
TransformationGUI_ProjectionOnCylDlg::~TransformationGUI_ProjectionOnCylDlg()
|
||
|
{
|
||
|
// no need to delete child widgets, Qt does it all for us
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : Init()
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::Init()
|
||
|
{
|
||
|
showOnlyPreviewControl();
|
||
|
|
||
|
SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
|
||
|
double aStep = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100);
|
||
|
double aSpecificStep = 5;
|
||
|
double aRadius = 100.0;
|
||
|
double aStartAngle = 0.;
|
||
|
double anAngleLen = 360.;
|
||
|
|
||
|
initSpinBox(myRadiusSpin, 0.00001, COORD_MAX, aStep, "length_precision");
|
||
|
initSpinBox(myStartAngleSpin, -180., 180., aSpecificStep, "angle_precision");
|
||
|
initSpinBox(myAngleLenSpin, 0.00001, COORD_MAX, aSpecificStep, "angle_precision");
|
||
|
|
||
|
myRadiusSpin->setValue(aRadius);
|
||
|
myStartAngleSpin->setValue(aStartAngle);
|
||
|
myAngleLenSpin->setValue(anAngleLen);
|
||
|
|
||
|
myObjectName->setText("");
|
||
|
myUseAngleLen->setChecked(true);
|
||
|
|
||
|
// signals and slots connections
|
||
|
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
|
||
|
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
|
||
|
|
||
|
connect(mySelButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||
|
connect(myRadiusSpin, SIGNAL(valueChanged(double)), this, SLOT(processPreview()));
|
||
|
connect(myStartAngleSpin, SIGNAL(valueChanged(double)), this, SLOT(processPreview()));
|
||
|
connect(myAngleLenSpin, SIGNAL(valueChanged(double)), this, SLOT(processPreview()));
|
||
|
connect(myUseAngleLen, SIGNAL(clicked()), this, SLOT(SetUseLengthAngle()));
|
||
|
|
||
|
connect(myGeomGUI->getApp()->selectionMgr(),SIGNAL(currentSelectionChanged()),
|
||
|
this, SLOT(SelectionIntoArgument()));
|
||
|
|
||
|
initName(tr("GEOM_PROJECTION_NAME"));
|
||
|
|
||
|
buttonOk()->setEnabled(false);
|
||
|
buttonApply()->setEnabled(false);
|
||
|
|
||
|
activateSelection();
|
||
|
SelectionIntoArgument();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : ClickOnOk()
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::ClickOnOk()
|
||
|
{
|
||
|
setIsApplyAndClose( true );
|
||
|
if (ClickOnApply())
|
||
|
ClickOnCancel();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : ClickOnApply()
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
bool TransformationGUI_ProjectionOnCylDlg::ClickOnApply()
|
||
|
{
|
||
|
if ( !onAccept() )
|
||
|
return false;
|
||
|
|
||
|
initName();
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : SelectionIntoArgument()
|
||
|
// purpose : Called when selection is changed or on dialog initialization or activation
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::SelectionIntoArgument()
|
||
|
{
|
||
|
erasePreview();
|
||
|
myObj = GEOM::GEOM_Object::_nil();
|
||
|
|
||
|
LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
|
||
|
SALOME_ListIO aSelList;
|
||
|
aSelMgr->selectedObjects(aSelList);
|
||
|
|
||
|
if (aSelList.Extent() == 1) {
|
||
|
// Single object is selected.
|
||
|
GEOM::GEOM_Object_var aSelectedObject =
|
||
|
GEOMBase::ConvertIOinGEOMObject( aSelList.First() );
|
||
|
|
||
|
if (aSelectedObject->_is_nil()) {
|
||
|
// Null object.
|
||
|
myObjectName->setText("");
|
||
|
buttonOk()->setEnabled(false);
|
||
|
buttonApply()->setEnabled(false);
|
||
|
} else {
|
||
|
// Not Null object.
|
||
|
myObj = aSelectedObject;
|
||
|
myObjectName->setText(GEOMBase::GetName(myObj));
|
||
|
buttonOk()->setEnabled(true);
|
||
|
buttonApply()->setEnabled(true);
|
||
|
}
|
||
|
} else {
|
||
|
// Not a single object is selected.
|
||
|
myObjectName->setText("");
|
||
|
buttonOk()->setEnabled(false);
|
||
|
buttonApply()->setEnabled(false);
|
||
|
}
|
||
|
|
||
|
processPreview();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : SetEditCurrentArgument()
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::SetEditCurrentArgument()
|
||
|
{
|
||
|
myObjectName->setFocus();
|
||
|
myEditCurrentArgument = myObjectName;
|
||
|
SelectionIntoArgument();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : SetUseLengthAngle()
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::SetUseLengthAngle()
|
||
|
{
|
||
|
myAngleLenSpin->setEnabled(myUseAngleLen->isChecked());
|
||
|
processPreview();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : activateSelection
|
||
|
// purpose : activate selection of wires or faces
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::activateSelection()
|
||
|
{
|
||
|
TColStd_MapOfInteger aMap;
|
||
|
|
||
|
aMap.Add(GEOM_WIRE);
|
||
|
aMap.Add(GEOM_FACE);
|
||
|
globalSelection(aMap);
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : ActivateThisDialog()
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::ActivateThisDialog()
|
||
|
{
|
||
|
GEOMBase_Skeleton::ActivateThisDialog();
|
||
|
connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
|
||
|
this, SLOT( SelectionIntoArgument() ) );
|
||
|
|
||
|
activateSelection();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : enterEvent()
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
void TransformationGUI_ProjectionOnCylDlg::enterEvent (QEvent*)
|
||
|
{
|
||
|
if (!mainFrame()->GroupConstructors->isEnabled())
|
||
|
ActivateThisDialog();
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : createOperation
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
GEOM::GEOM_IOperations_ptr TransformationGUI_ProjectionOnCylDlg::createOperation()
|
||
|
{
|
||
|
return getGeomEngine()->GetITransformOperations(getStudyId());
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : isValid
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
bool TransformationGUI_ProjectionOnCylDlg::isValid (QString &msg)
|
||
|
{
|
||
|
bool isOk = false;
|
||
|
|
||
|
if (!myObj->_is_nil() &&
|
||
|
myRadiusSpin->isValid(msg, !IsPreview()) &&
|
||
|
myStartAngleSpin->isValid(msg, !IsPreview())) {
|
||
|
if (myUseAngleLen->isChecked()) {
|
||
|
// Check length angle spin.
|
||
|
isOk = myAngleLenSpin->isValid(msg, !IsPreview());
|
||
|
} else {
|
||
|
// Don't check length angle spin.
|
||
|
isOk = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return isOk;
|
||
|
}
|
||
|
|
||
|
//=================================================================================
|
||
|
// function : execute
|
||
|
// purpose :
|
||
|
//=================================================================================
|
||
|
bool TransformationGUI_ProjectionOnCylDlg::execute (ObjectList& objects)
|
||
|
{
|
||
|
GEOM::GEOM_ITransformOperations_var anOper =
|
||
|
GEOM::GEOM_ITransformOperations::_narrow(getOperation());
|
||
|
|
||
|
double aRadius = myRadiusSpin->value();
|
||
|
double aStartAngle = myStartAngleSpin->value()*M_PI/180.;
|
||
|
double aLengthAngle = -1.;
|
||
|
|
||
|
if (myUseAngleLen->isChecked()) {
|
||
|
aLengthAngle = myAngleLenSpin->value()*M_PI/180.;
|
||
|
}
|
||
|
|
||
|
GEOM::GEOM_Object_var anObj = anOper->MakeProjectionOnCylinder
|
||
|
(myObj, aRadius, aStartAngle, aLengthAngle);
|
||
|
|
||
|
if (!anObj->_is_nil()) {
|
||
|
objects.push_back(anObj._retn());
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|