X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetPoint2d.cpp;h=b49330a6b905764efd807fd9a6abda7320be0325;hb=01d6bb2a163b2c89e86444bc8b4f1a24a58e4c2a;hp=6af2c509460438b634cfaac77d02a5bf1c908bf5;hpb=f15b088eb4ce09ba9740bd614398c8048916a17c;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index 6af2c5094..b49330a6b 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -31,6 +30,8 @@ #include #include +#include + #include #include #include @@ -45,11 +46,16 @@ #include #include +const double MaxCoordinate = 1e12; + + PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, const Config_WidgetAPI* theData, const std::string& theParentId) : ModuleBase_ModelWidget(theParent, theData, theParentId) { + // the control should accept the focus, so the boolen flag is corrected to be true + myIsObligatory = true; //myOptionParam = theData->getProperty(PREVIOUS_FEATURE_PARAM); QString aPageName = QString::fromStdString(theData->getProperty(CONTAINER_PAGE_NAME)); myGroupBox = new QGroupBox(aPageName, theParent); @@ -86,42 +92,66 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, connect(myYSpin, SIGNAL(valueChanged(double)), this, SLOT(onValuesChanged())); } + QVBoxLayout* aLayout = new QVBoxLayout(this); + ModuleBase_Tools::zeroMargins(aLayout); + aLayout->addWidget(myGroupBox); + setLayout(aLayout); +} + +void PartSet_WidgetPoint2D::reset() +{ + if (isComputedDefault()) { + //return; + if (myFeature->compute(myAttributeID)) + restoreValue(); + } + else { + bool isOk; + double aDefValue = QString::fromStdString(getDefaultValue()).toDouble(&isOk); + // it is important to block the spin box control in order to do not through out the + // locking of the validating state. + ModuleBase_Tools::setSpinValue(myXSpin, isOk ? aDefValue : 0.0); + ModuleBase_Tools::setSpinValue(myYSpin, isOk ? aDefValue : 0.0); + storeValueCustom(); + } } PartSet_WidgetPoint2D::~PartSet_WidgetPoint2D() { } -bool PartSet_WidgetPoint2D::setSelection(ModuleBase_ViewerPrs theValue) +bool PartSet_WidgetPoint2D::setSelection(const QList& theValues, int& thePosition) { + if (thePosition < 0 || thePosition >= theValues.size()) + return false; + ModuleBase_ViewerPrs aValue = theValues[thePosition]; + thePosition++; + Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); bool isDone = false; - TopoDS_Shape aShape = theValue.shape(); + TopoDS_Shape aShape = aValue.shape(); double aX, aY; if (getPoint2d(aView, aShape, aX, aY)) { - setPoint(aX, aY); - isDone = true; + isDone = setPoint(aX, aY); } return isDone; } -void PartSet_WidgetPoint2D::setPoint(double theX, double theY) +bool PartSet_WidgetPoint2D::setPoint(double theX, double theY) { + if (fabs(theX) >= MaxCoordinate) + return false; + if (fabs(theY) >= MaxCoordinate) + return false; - bool isBlocked = this->blockSignals(true); - myXSpin->blockSignals(true); - myXSpin->setValue(theX); - myXSpin->blockSignals(false); - - myYSpin->blockSignals(true); - myYSpin->setValue(theY); - myYSpin->blockSignals(false); - this->blockSignals(isBlocked); + ModuleBase_Tools::setSpinValue(myXSpin, theX); + ModuleBase_Tools::setSpinValue(myYSpin, theY); - emit valuesChanged(); + storeValue(); + return true; } -bool PartSet_WidgetPoint2D::storeValue() const +bool PartSet_WidgetPoint2D::storeValueCustom() const { std::shared_ptr aData = myFeature->data(); if (!aData) // can be on abort of sketcher element @@ -157,21 +187,10 @@ bool PartSet_WidgetPoint2D::restoreValue() double _X = aPoint->x(); double _Y = aPoint->y(); #endif - bool isBlocked = this->blockSignals(true); - myXSpin->blockSignals(true); - myXSpin->setValue(aPoint->x()); - myXSpin->blockSignals(false); - - myYSpin->blockSignals(true); - myYSpin->setValue(aPoint->y()); - myYSpin->blockSignals(false); - this->blockSignals(isBlocked); - return true; -} -QWidget* PartSet_WidgetPoint2D::getControl() const -{ - return myGroupBox; + ModuleBase_Tools::setSpinValue(myXSpin, aPoint->x()); + ModuleBase_Tools::setSpinValue(myYSpin, aPoint->y()); + return true; } QList PartSet_WidgetPoint2D::getControls() const @@ -183,7 +202,7 @@ QList PartSet_WidgetPoint2D::getControls() const } -void PartSet_WidgetPoint2D::activate() +void PartSet_WidgetPoint2D::activateCustom() { XGUI_ViewerProxy* aViewer = myWorkshop->viewer(); connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), @@ -193,6 +212,8 @@ void PartSet_WidgetPoint2D::activate() QIntList aModes; aModes << TopAbs_VERTEX; + if (isEditingMode()) + aModes << TopAbs_EDGE; myWorkshop->moduleConnector()->activateSubShapesSelection(aModes); } @@ -228,45 +249,64 @@ bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView, void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { + // the contex menu release by the right button should not be processed by this widget + if (theEvent->button() != Qt::LeftButton) + return; + XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + Handle(V3d_View) aView = theWnd->v3dView(); // TODO: This fragment doesn't work because bug in OCC Viewer. It can be used after fixing. - //NCollection_List aShapes; - //std::list aObjects; - //aSelection->selectedShapes(aShapes, aObjects); - //if (aShapes.Extent() > 0) { - // TopoDS_Shape aShape = aShapes.First(); - // double aX, aY; - // if (getPoint2d(theWnd->v3dView(), aShape, aX, aY)) { - // setPoint(aX, aY); - - // PartSet_Tools::setConstraints(mySketch, feature(), attributeID(),aX, aY); - // emit vertexSelected(aObjects.front(), aShape); - // emit focusOutWidget(this); - // return; - // } - //} + NCollection_List aShapes; + std::list aObjects; + aSelection->selectedShapes(aShapes, aObjects); + // if we have selection + if (aShapes.Extent() > 0) { + TopoDS_Shape aShape = aShapes.First(); + ObjectPtr aObject = aObjects.front(); + FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aObject); + if (aSelectedFeature.get() != NULL) { + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aSelectedFeature); + if ((!aSPFeature) && (!aShape.IsNull())) { + ResultPtr aFixedObject = PartSet_Tools::findFixedObjectByExternal(aShape, aObject, mySketch); + if (!aFixedObject.get()) + aFixedObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch); + } + } + double aX, aY; + if (getPoint2d(aView, aShape, aX, aY)) { + setPoint(aX, aY); + + PartSet_Tools::setConstraints(mySketch, feature(), attributeID(),aX, aY); + emit vertexSelected(); + emit focusOutWidget(this); + return; + } + } // End of Bug dependent fragment // A case when point is taken from mouse event gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); double aX, anY; - Handle(V3d_View) aView = theWnd->v3dView(); PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, anY); - //setPoint(aX, anY); - - std::shared_ptr aFeaturePoint = std::dynamic_pointer_cast< - GeomDataAPI_Point2D>(feature()->data()->attribute(attributeID())); - QList aIgnore; - aIgnore.append(feature()); - - double aTolerance = aView->Convert(4); - std::shared_ptr aAttrPnt = - PartSet_Tools::findAttributePoint(mySketch, aX, anY, aTolerance, aIgnore); - if (aAttrPnt.get() != NULL) { + if (!setPoint(aX, anY)) + return; - PartSet_Tools::createConstraint(mySketch, aAttrPnt, aFeaturePoint); - emit vertexSelected(); - } + /// Start alternative code + //std::shared_ptr aFeaturePoint = std::dynamic_pointer_cast< + // GeomDataAPI_Point2D>(feature()->data()->attribute(attributeID())); + //QList aIgnore; + //aIgnore.append(feature()); + + //double aTolerance = aView->Convert(7); + //std::shared_ptr aAttrPnt = + // PartSet_Tools::findAttributePoint(mySketch, aX, anY, aTolerance, aIgnore); + //if (aAttrPnt.get() != NULL) { + // aFeaturePoint->setValue(aAttrPnt->pnt()); + // PartSet_Tools::createConstraint(mySketch, aAttrPnt, aFeaturePoint); + // emit vertexSelected(); + //} + /// End alternative code emit focusOutWidget(this); } @@ -276,7 +316,10 @@ void PartSet_WidgetPoint2D::onMouseMove(ModuleBase_IViewWindow* theWnd, QMouseEv if (isEditingMode()) return; myWorkshop->operationMgr()->setLockValidating(true); - myWorkshop->propertyPanel()->setOkEnabled(false); + // the Ok button should be disabled in the property panel by moving the mouse point in the viewer + // this leads that the user does not try to click Ok and it avoids an incorrect situation that the + // line is moved to the cursor to the Ok button + myWorkshop->operationMgr()->setApplyEnabled(false); gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView());