// Copyright (C) 2007-2010 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. // // 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 : GenerationGUI_PrismDlg.cxx // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. // #include "GenerationGUI_PrismDlg.h" #include #include #include #include #include #include #include // OCCT Includes #include #include #include #include #include #include #include //================================================================================= // class : GenerationGUI_PrismDlg() // purpose : Constructs a GenerationGUI_PrismDlg 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. //================================================================================= GenerationGUI_PrismDlg::GenerationGUI_PrismDlg (GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl) : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl) { SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PRISM"))); QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PRISM_2P"))); QPixmap image3 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PRISM_DXDYDZ"))); setWindowTitle(tr("GEOM_EXTRUSION_TITLE")); /***************************************************************/ mainFrame()->GroupConstructors->setTitle(tr("GEOM_EXTRUSION")); mainFrame()->RadioButton1->setIcon(image0); mainFrame()->RadioButton2->setIcon(image2); mainFrame()->RadioButton3->setIcon(image3); mainFrame()->RadioButton1->setChecked(true); GroupPoints = new DlgRef_2Sel1Spin2Check(centralWidget()); GroupPoints->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV")); GroupPoints->TextLabel1->setText(tr("GEOM_BASE")); GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); GroupPoints->TextLabel3->setText(tr("GEOM_HEIGHT")); GroupPoints->PushButton1->setIcon(image1); GroupPoints->PushButton2->setIcon(image1); GroupPoints->LineEdit1->setReadOnly(true); GroupPoints->LineEdit2->setReadOnly(true); GroupPoints->CheckButton1->setText(tr("GEOM_BOTHWAY")); GroupPoints->CheckButton2->setText(tr("GEOM_REVERSE")); GroupPoints2 = new DlgRef_3Sel1Check(centralWidget()); GroupPoints2->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV_2P")); GroupPoints2->TextLabel1->setText(tr("GEOM_BASE")); GroupPoints2->TextLabel2->setText(tr("GEOM_POINT_I").arg(1)); GroupPoints2->TextLabel3->setText(tr("GEOM_POINT_I").arg(2)); GroupPoints2->PushButton1->setIcon(image1); GroupPoints2->PushButton2->setIcon(image1); GroupPoints2->PushButton3->setIcon(image1); GroupPoints2->CheckButton1->setText(tr("GEOM_BOTHWAY")); GroupPoints3 = new DlgRef_1Sel3Spin1Check(centralWidget()); GroupPoints3->GroupBox1->setTitle(tr("GEOM_EXTRUSION_DXDYDZ")); GroupPoints3->TextLabel1->setText(tr("GEOM_BASE")); GroupPoints3->PushButton1->setIcon(image1); GroupPoints3->TextLabel2->setText(tr("GEOM_DX")); GroupPoints3->TextLabel3->setText(tr("GEOM_DY")); GroupPoints3->TextLabel4->setText(tr("GEOM_DZ")); GroupPoints3->CheckButton1->setText(tr("GEOM_BOTHWAY")); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); layout->addWidget(GroupPoints); layout->addWidget(GroupPoints2); layout->addWidget(GroupPoints3); /***************************************************************/ setHelpFileName("create_extrusion_page.html"); Init(); } //================================================================================= // function : ~GenerationGUI_PrismDlg() // purpose : Destroys the object and frees any allocated resources //================================================================================= GenerationGUI_PrismDlg::~GenerationGUI_PrismDlg() { // no need to delete child widgets, Qt does it all for us } //================================================================================= // function : Init() // purpose : //================================================================================= void GenerationGUI_PrismDlg::Init() { // Get setting of step value from file configuration SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); // min, max, step and decimals for spin boxes & initial values initSpinBox(GroupPoints3->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); initSpinBox(GroupPoints3->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" ); initSpinBox(GroupPoints3->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); GroupPoints3->SpinBox_DX->setValue(0.0); GroupPoints3->SpinBox_DY->setValue(0.0); GroupPoints3->SpinBox_DZ->setValue(0.0); initSpinBox(GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); GroupPoints->SpinBox_DX->setValue(100.0); // init variables myEditCurrentArgument = GroupPoints->LineEdit1; GroupPoints->LineEdit1->setReadOnly(true); GroupPoints->LineEdit2->setReadOnly(true); GroupPoints2->LineEdit1->setReadOnly(true); GroupPoints2->LineEdit2->setReadOnly(true); GroupPoints2->LineEdit3->setReadOnly(true); GroupPoints3->LineEdit1->setReadOnly(true); GroupPoints->LineEdit1->setText(""); GroupPoints->LineEdit2->setText(""); GroupPoints2->LineEdit1->setText(""); GroupPoints2->LineEdit2->setText(""); GroupPoints2->LineEdit3->setText(""); GroupPoints3->LineEdit1->setText(""); myBaseObjects.clear(); myPoint1.nullify(); myPoint2.nullify(); myVec.nullify(); // 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(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); connect(GroupPoints->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(onReverse())); connect(GroupPoints2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints2->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints2->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints2->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); connect(GroupPoints3->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints3->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); connect(GroupPoints3->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); connect(GroupPoints3->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); connect(GroupPoints3->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); initName(tr("GEOM_EXTRUSION")); ConstructorsClicked(0); } //================================================================================= // function : SetDoubleSpinBoxStep() // purpose : Double spin box management //================================================================================= void GenerationGUI_PrismDlg::SetDoubleSpinBoxStep (double step) { GroupPoints->SpinBox_DX->setSingleStep(step); GroupPoints3->SpinBox_DX->setSingleStep(step); GroupPoints3->SpinBox_DY->setSingleStep(step); GroupPoints3->SpinBox_DZ->setSingleStep(step); } //================================================================================= // function : ConstructorsClicked() // purpose : Radio button management //================================================================================= void GenerationGUI_PrismDlg::ConstructorsClicked (int constructorId) { switch (constructorId) { case 0: GroupPoints2->hide(); GroupPoints3->hide(); GroupPoints->show(); GroupPoints->LineEdit2->setText(""); myVec.nullify(); GroupPoints->PushButton1->click(); break; case 1: GroupPoints->hide(); GroupPoints2->show(); GroupPoints3->hide(); GroupPoints2->LineEdit2->setText(""); GroupPoints2->LineEdit3->setText(""); myPoint1.nullify(); myPoint2.nullify(); GroupPoints2->PushButton1->click(); break; case 2: GroupPoints->hide(); GroupPoints2->hide(); GroupPoints3->show(); GroupPoints3->PushButton1->click(); break; default: break; } qApp->processEvents(); updateGeometry(); resize(minimumSizeHint()); SelectionIntoArgument(); displayPreview(); } //================================================================================= // function : ClickOnOk() // purpose : //================================================================================= void GenerationGUI_PrismDlg::ClickOnOk() { if (ClickOnApply()) ClickOnCancel(); } //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= bool GenerationGUI_PrismDlg::ClickOnApply() { if (!onAccept()) return false; initName(); // activate selection and connect selection manager ConstructorsClicked(getConstructorId()); return true; } //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection is changed or on dialog initialization or activation //================================================================================= void GenerationGUI_PrismDlg::SelectionIntoArgument() { erasePreview(); myEditCurrentArgument->setText(""); if ( myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupPoints2->LineEdit1 || myEditCurrentArgument == GroupPoints3->LineEdit1 ) { myBaseObjects.clear(); QList objects = getSelected( TopAbs_SHAPE, -1 ); for ( int i = 0; i < objects.count(); i++ ) { GEOM::shape_type stype = objects[i]->GetMaxShapeType(); if ( stype < GEOM::SHELL || stype > GEOM::VERTEX ) continue; myBaseObjects << objects[i]; } if ( !myBaseObjects.isEmpty() ) { QString aName = myBaseObjects.count() > 1 ? QString( "%1_objects").arg( myBaseObjects.count() ) : GEOMBase::GetName( myBaseObjects[0].get() ); GroupPoints->LineEdit1->setText( aName ); GroupPoints2->LineEdit1->setText( aName ); GroupPoints3->LineEdit1->setText( aName ); } else { GroupPoints->LineEdit1->setText( "" ); GroupPoints2->LineEdit1->setText( "" ); GroupPoints3->LineEdit1->setText( "" ); } } else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) { myVec = getSelected( TopAbs_EDGE ); if ( myVec ) { QString aName = GEOMBase::GetName( myVec.get() ); myEditCurrentArgument->setText( aName ); if ( myBaseObjects.isEmpty() ) GroupPoints->PushButton1->click(); } } if ( myEditCurrentArgument == GroupPoints2->LineEdit2 ) { myPoint1 = getSelected( TopAbs_VERTEX ); if ( myPoint1 ) { QString aName = GEOMBase::GetName( myPoint1.get() ); myEditCurrentArgument->setText( aName ); if ( !myPoint2 ) GroupPoints2->PushButton3->click(); else if ( myBaseObjects.isEmpty() ) GroupPoints2->PushButton1->click(); } } if ( myEditCurrentArgument == GroupPoints2->LineEdit3 ) { myPoint2 = getSelected( TopAbs_VERTEX ); if ( myPoint2 ) { QString aName = GEOMBase::GetName( myPoint2.get() ); myEditCurrentArgument->setText( aName ); if ( myBaseObjects.isEmpty() ) GroupPoints2->PushButton1->click(); else if ( !myPoint1 ) GroupPoints2->PushButton2->click(); } } displayPreview(); } //================================================================================= // function : SetEditCurrentArgument() // purpose : //================================================================================= void GenerationGUI_PrismDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); globalSelection(GEOM_ALLSHAPES); if (send == GroupPoints->PushButton1) { myEditCurrentArgument = GroupPoints->LineEdit1; GroupPoints->PushButton2->setDown(false); GroupPoints->LineEdit2->setEnabled(false); } else if (send == GroupPoints->PushButton2) { myEditCurrentArgument = GroupPoints->LineEdit2; GroupPoints->PushButton1->setDown(false); GroupPoints->LineEdit1->setEnabled(false); localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE); } else if (send == GroupPoints2->PushButton1) { myEditCurrentArgument = GroupPoints2->LineEdit1; GroupPoints2->PushButton2->setDown(false); GroupPoints2->PushButton3->setDown(false); GroupPoints2->LineEdit2->setEnabled(false); GroupPoints2->LineEdit3->setEnabled(false); } else if (send == GroupPoints2->PushButton2) { myEditCurrentArgument = GroupPoints2->LineEdit2; GroupPoints2->PushButton1->setDown(false); GroupPoints2->PushButton3->setDown(false); GroupPoints2->LineEdit1->setEnabled(false); GroupPoints2->LineEdit3->setEnabled(false); localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); } else if (send == GroupPoints2->PushButton3) { myEditCurrentArgument = GroupPoints2->LineEdit3; GroupPoints2->PushButton1->setDown(false); GroupPoints2->PushButton2->setDown(false); GroupPoints2->LineEdit1->setEnabled(false); GroupPoints2->LineEdit2->setEnabled(false); localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); } else if (send == GroupPoints3->PushButton1) { myEditCurrentArgument = GroupPoints3->LineEdit1; } connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); // enable line edit myEditCurrentArgument->setEnabled(true); myEditCurrentArgument->setFocus(); // after setFocus(), because it will be setDown(false) when loses focus send->setDown(true); // seems we need it only to avoid preview disappearing, caused by selection mode change displayPreview(); } //================================================================================= // function : ActivateThisDialog() // purpose : //================================================================================= void GenerationGUI_PrismDlg::ActivateThisDialog() { GEOMBase_Skeleton::ActivateThisDialog(); connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); ConstructorsClicked( getConstructorId() ); } //================================================================================= // function : enterEvent() // purpose : when mouse enter onto the QWidget //================================================================================= void GenerationGUI_PrismDlg::enterEvent (QEvent*) { if (!mainFrame()->GroupConstructors->isEnabled()) ActivateThisDialog(); } //================================================================================= // function : ValueChangedInSpinBox() // purpose : //================================================================================= void GenerationGUI_PrismDlg::ValueChangedInSpinBox() { displayPreview(); } //================================================================================= // function : getHeight() // purpose : //================================================================================= double GenerationGUI_PrismDlg::getHeight() const { return GroupPoints->SpinBox_DX->value(); } //================================================================================= // function : createOperation // purpose : //================================================================================= GEOM::GEOM_IOperations_ptr GenerationGUI_PrismDlg::createOperation() { return getGeomEngine()->GetI3DPrimOperations(getStudyId()); } //================================================================================= // function : isValid // purpose : //================================================================================= bool GenerationGUI_PrismDlg::isValid (QString& msg) { bool ok = false; switch ( getConstructorId() ) { case 0: ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) && !myBaseObjects.isEmpty() && myVec; break; case 1: ok = !myBaseObjects.isEmpty() && myPoint1 && myPoint2; break; case 2: ok = GroupPoints3->SpinBox_DX->isValid( msg, !IsPreview() ) && GroupPoints3->SpinBox_DY->isValid( msg, !IsPreview() ) && GroupPoints3->SpinBox_DZ->isValid( msg, !IsPreview() ) && !myBaseObjects.isEmpty(); break; default: break; } return ok; } //================================================================================= // function : execute // purpose : //================================================================================= bool GenerationGUI_PrismDlg::execute (ObjectList& objects) { QStringList aParameters; GEOM::GEOM_Object_var anObj; GEOM::GEOM_I3DPrimOperations_var anOper = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation()); for (int i = 0; i < myBaseObjects.count(); i++) { switch (getConstructorId()) { case 0: if (!GroupPoints->CheckButton1->isChecked()) anObj = anOper->MakePrismVecH(myBaseObjects[i].get(), myVec.get(), getHeight()); else anObj = anOper->MakePrismVecH2Ways(myBaseObjects[i].get(), myVec.get(), getHeight()); if (!anObj->_is_nil() && !IsPreview()) { aParameters << GroupPoints->SpinBox_DX->text(); anObj->SetParameters(aParameters.join(":").toLatin1().constData()); } break; case 1: if (!GroupPoints2->CheckButton1->isChecked()) anObj = anOper->MakePrismTwoPnt(myBaseObjects[i].get(), myPoint1.get(), myPoint2.get()); else anObj = anOper->MakePrismTwoPnt2Ways(myBaseObjects[i].get(), myPoint1.get(), myPoint2.get()); break; case 2: double dx = GroupPoints3->SpinBox_DX->value(); double dy = GroupPoints3->SpinBox_DY->value(); double dz = GroupPoints3->SpinBox_DZ->value(); if (!GroupPoints3->CheckButton1->isChecked()) anObj = anOper->MakePrismDXDYDZ(myBaseObjects[i].get(), dx, dy, dz); else anObj = anOper->MakePrismDXDYDZ2Ways(myBaseObjects[i].get(), dx, dy, dz); if (!anObj->_is_nil() && !IsPreview()) { aParameters << GroupPoints3->SpinBox_DX->text(); aParameters << GroupPoints3->SpinBox_DY->text(); aParameters << GroupPoints3->SpinBox_DZ->text(); anObj->SetParameters(aParameters.join(":").toLatin1().constData()); } break; } if (!anObj->_is_nil()) objects.push_back(anObj._retn()); } return true; } //================================================================================= // function : onReverse() // purpose : //================================================================================= void GenerationGUI_PrismDlg::onReverse() { double anOldValue = GroupPoints->SpinBox_DX->value(); GroupPoints->SpinBox_DX->setValue(-anOldValue); } //================================================================================= // function : onBothway() // purpose : //================================================================================= void GenerationGUI_PrismDlg::onBothway() { GroupPoints->CheckButton2->setEnabled(!GroupPoints->CheckButton1->isChecked()); displayPreview(); } //================================================================================= // function : addSubshapeToStudy // purpose : virtual method to add new SubObjects if local selection //================================================================================= void GenerationGUI_PrismDlg::addSubshapesToStudy() { switch (getConstructorId()) { case 0: GEOMBase::PublishSubObject( myVec.get() ); break; case 1: GEOMBase::PublishSubObject( myPoint1.get() ); GEOMBase::PublishSubObject( myPoint2.get() ); break; default: break; } } //================================================================================= // function : extractPrefix // purpose : redefined from GEOMBase_Helper class //================================================================================= bool GenerationGUI_PrismDlg::extractPrefix() const { return myBaseObjects.count() > 1; }