X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetPoint2d.cpp;h=4add87d9dd6feb2f44507fd05002d2c0ce473aea;hb=977e475670e22bc48846d3719cc8c4d08cfaa7d6;hp=21f885c64ee4dadac4f2aefc45fca1368230f1a2;hpb=f4a151eefd549e40307125cf088652d31d92a01e;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index 21f885c64..4add87d9d 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -6,18 +6,14 @@ #include "PartSet_WidgetPoint2d.h" #include +#include +#include -#include -#include -#include -#include -#include -#include -#include - -#include +#include #include +#include #include +#include #include #include @@ -31,6 +27,9 @@ #include #include +#include +#include + #include #include #include @@ -45,11 +44,19 @@ #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) + ModuleBase_IWorkshop* theWorkshop, + const Config_WidgetAPI* theData, + const std::string& theParentId) + : ModuleBase_ModelWidget(theParent, theData, theParentId), myWorkshop(theWorkshop) { + myLockApplyMgr = new PartSet_LockApplyMgr(theParent, myWorkshop); + + // 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); @@ -57,71 +64,96 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, QGridLayout* aGroupLay = new QGridLayout(myGroupBox); ModuleBase_Tools::adjustMargins(aGroupLay); + aGroupLay->setSpacing(2); aGroupLay->setColumnStretch(1, 1); { QLabel* aLabel = new QLabel(myGroupBox); - aLabel->setText(tr("X")); - aLabel->setPixmap(QPixmap(":pictures/x_point.png")); + aLabel->setText(tr("X ")); aGroupLay->addWidget(aLabel, 0, 0); - myXSpin = new ModuleBase_DoubleSpinBox(myGroupBox); + myXSpin = new ModuleBase_ParamSpinBox(myGroupBox); myXSpin->setMinimum(-DBL_MAX); myXSpin->setMaximum(DBL_MAX); myXSpin->setToolTip(tr("X")); aGroupLay->addWidget(myXSpin, 0, 1); - connect(myXSpin, SIGNAL(valueChanged(double)), this, SLOT(onValuesChanged())); + connect(myXSpin, SIGNAL(valueChanged(const QString&)), this, SLOT(onValuesChanged())); } { QLabel* aLabel = new QLabel(myGroupBox); - aLabel->setText(tr("Y")); - aLabel->setPixmap(QPixmap(":pictures/y_point.png")); + aLabel->setText(tr("Y ")); aGroupLay->addWidget(aLabel, 1, 0); - myYSpin = new ModuleBase_DoubleSpinBox(myGroupBox); + myYSpin = new ModuleBase_ParamSpinBox(myGroupBox); myYSpin->setMinimum(-DBL_MAX); myYSpin->setMaximum(DBL_MAX); myYSpin->setToolTip(tr("Y")); aGroupLay->addWidget(myYSpin, 1, 1); - connect(myYSpin, SIGNAL(valueChanged(double)), this, SLOT(onValuesChanged())); + connect(myYSpin, SIGNAL(valueChanged(const QString&)), this, SLOT(onValuesChanged())); + } + QVBoxLayout* aLayout = new QVBoxLayout(this); + ModuleBase_Tools::zeroMargins(aLayout); + aLayout->addWidget(myGroupBox); + setLayout(aLayout); +} + +bool PartSet_WidgetPoint2D::reset() +{ + bool aDone = false; + if (!isUseReset() || isComputedDefault() || myXSpin->hasVariable() || myYSpin->hasVariable()) { + aDone = false; } + 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(); + aDone = true; + } + return aDone; } PartSet_WidgetPoint2D::~PartSet_WidgetPoint2D() { } -bool PartSet_WidgetPoint2D::setSelection(ModuleBase_ViewerPrs theValue) +bool PartSet_WidgetPoint2D::setSelection(QList& theValues, + const bool theToValidate) { + if (theValues.empty()) + return false; + + ModuleBase_ViewerPrs aValue = theValues.takeFirst(); + 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 @@ -132,12 +164,14 @@ bool PartSet_WidgetPoint2D::storeValue() const PartSet_WidgetPoint2D* that = (PartSet_WidgetPoint2D*) this; bool isBlocked = that->blockSignals(true); bool isImmutable = aPoint->setImmutable(true); -#ifdef _DEBUG - std::string _attr_name = myAttributeID; - double _X = myXSpin->value(); - double _Y = myYSpin->value(); -#endif - aPoint->setValue(myXSpin->value(), myYSpin->value()); + + // if text is not empty then setValue will be ignored + // so we should set the text at first + aPoint->setText(myXSpin->hasVariable() ? myXSpin->text().toStdString() : "", + myYSpin->hasVariable() ? myYSpin->text().toStdString() : ""); + aPoint->setValue(!myXSpin->hasVariable() ? myXSpin->value() : aPoint->x(), + !myYSpin->hasVariable() ? myYSpin->value() : aPoint->y()); + // after movement the solver will call the update event: optimization moveObject(myFeature); aPoint->setImmutable(isImmutable); @@ -146,34 +180,44 @@ bool PartSet_WidgetPoint2D::storeValue() const return true; } -bool PartSet_WidgetPoint2D::restoreValue() +bool PartSet_WidgetPoint2D::restoreValueCustom() { std::shared_ptr aData = myFeature->data(); std::shared_ptr aPoint = std::dynamic_pointer_cast( aData->attribute(attributeID())); - -#ifdef _DEBUG - std::string _attr_name = myAttributeID; - 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); + QString aTextX = QString::fromStdString(aPoint->textX()); + QString aTextY = QString::fromStdString(aPoint->textY()); + + bool isDouble = false; + double aVal = 0; + if (aTextX.isEmpty()) { + ModuleBase_Tools::setSpinValue(myXSpin, aPoint->x()); + } else { + aVal = aTextX.toDouble(&isDouble); + if (isDouble) + ModuleBase_Tools::setSpinValue(myXSpin, aVal); + else + ModuleBase_Tools::setSpinText(myXSpin, aTextX); + } + if (aTextY.isEmpty()) { + ModuleBase_Tools::setSpinValue(myYSpin, aPoint->y()); + } else { + aVal = aTextY.toDouble(&isDouble); + if (isDouble) + ModuleBase_Tools::setSpinValue(myYSpin, aVal); + else + ModuleBase_Tools::setSpinText(myYSpin, aTextY); + } + //if (aTextX.empty() || aTextY.empty()) { + // ModuleBase_Tools::setSpinValue(myXSpin, aPoint->x()); + // ModuleBase_Tools::setSpinValue(myYSpin, aPoint->y()); + //} else { + // ModuleBase_Tools::setSpinText(myXSpin, QString::fromStdString(aTextX)); + // ModuleBase_Tools::setSpinText(myYSpin, QString::fromStdString(aTextY)); + //} return true; } -QWidget* PartSet_WidgetPoint2D::getControl() const -{ - return myGroupBox; -} - QList PartSet_WidgetPoint2D::getControls() const { QList aControls; @@ -183,9 +227,9 @@ QList PartSet_WidgetPoint2D::getControls() const } -void PartSet_WidgetPoint2D::activate() +void PartSet_WidgetPoint2D::activateCustom() { - XGUI_ViewerProxy* aViewer = myWorkshop->viewer(); + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*))); connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), @@ -193,18 +237,23 @@ void PartSet_WidgetPoint2D::activate() QIntList aModes; aModes << TopAbs_VERTEX; - myWorkshop->moduleConnector()->activateSubShapesSelection(aModes); + aModes << TopAbs_EDGE; + myWorkshop->activateSubShapesSelection(aModes); + + myLockApplyMgr->activate(); } void PartSet_WidgetPoint2D::deactivate() { ModuleBase_IViewer* aViewer = myWorkshop->viewer(); - disconnect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), + disconnect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*))); disconnect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMouseRelease(ModuleBase_IViewWindow*, QMouseEvent*))); - myWorkshop->moduleConnector()->deactivateSubShapesSelection(); - myWorkshop->operationMgr()->setLockValidating(false); + + myWorkshop->deactivateSubShapesSelection(); + + myLockApplyMgr->deactivate(); } bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView, @@ -225,48 +274,102 @@ bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView, return false; } +void PartSet_WidgetPoint2D::setConstraintWith(const ObjectPtr& theObject) +{ + // Create point-edge coincedence + FeaturePtr aFeature = mySketch->addFeature(SketchPlugin_ConstraintCoincidence::ID()); + std::shared_ptr aData = aFeature->data(); + + std::shared_ptr aRef1 = std::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_A())); + AttributePtr aThisAttr = feature()->data()->attribute(attributeID()); + std::shared_ptr aThisPoint = + std::dynamic_pointer_cast(aThisAttr); + aRef1->setAttr(aThisPoint); + + std::shared_ptr aRef2 = std::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_B())); + aRef2->setObject(theObject); + + aFeature->execute(); +} void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + // the contex menu release by the right button should not be processed by this widget + if (theEvent->button() != Qt::LeftButton) + return; + + ModuleBase_ISelection* aSelection = myWorkshop->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()) + aObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch); + setConstraintWith(aObject); + emit vertexSelected(); + emit focusOutWidget(this); + return; + } + } + double aX, aY; + bool isProcessed = false; + if (getPoint2d(aView, aShape, aX, aY)) { + PartSet_Tools::setConstraints(mySketch, feature(), attributeID(),aX, aY); + isProcessed = true; + } else if (aShape.ShapeType() == TopAbs_EDGE) { + setConstraintWith(aObject); + isProcessed = true; + } + if (isProcessed) { + // it is important to perform updateObject() in order to the current value is + // processed by Sketch Solver. Test case: line is created from a previous point + // to some distance, but in the area of the highlighting of the point. Constraint + // coincidence is created, after the solver is performed, the distance between the + // points of the line becomes less than the tolerance. Validator of the line returns + // false, the line will be aborted, but sketch stays valid. + updateObject(feature()); + 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(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(); - } + if (!setPoint(aX, anY)) + return; + + /// 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); } @@ -275,8 +378,6 @@ void PartSet_WidgetPoint2D::onMouseMove(ModuleBase_IViewWindow* theWnd, QMouseEv { if (isEditingMode()) return; - myWorkshop->operationMgr()->setLockValidating(true); - myWorkshop->propertyPanel()->setOkEnabled(false); gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); @@ -297,6 +398,6 @@ double PartSet_WidgetPoint2D::y() const void PartSet_WidgetPoint2D::onValuesChanged() { - myWorkshop->operationMgr()->setLockValidating(false); + myLockApplyMgr->valuesChanged(); emit valuesChanged(); }