X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetPoint2d.cpp;h=e48dc8b0ebc7cc52418008e1ef723fed84b17ecd;hb=840655e90a46754f2dd37aac6b888ec32eec69d3;hp=10f6de95fd65dc663d5e28d6d00fcbcab2f4ebed;hpb=fc1a9c802c59a0e853dc43125362e513b6f6358f;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index 10f6de95f..e48dc8b0e 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -6,17 +6,14 @@ #include "PartSet_WidgetPoint2d.h" #include +#include +#include -#include -#include -#include -#include -#include -#include - -#include +#include #include +#include #include +#include #include #include @@ -31,6 +28,7 @@ #include #include +#include #include #include @@ -50,10 +48,13 @@ 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); @@ -70,13 +71,13 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, aLabel->setPixmap(QPixmap(":pictures/x_point.png")); 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); @@ -84,13 +85,13 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, aLabel->setPixmap(QPixmap(":pictures/y_point.png")); 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); @@ -98,12 +99,11 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, setLayout(aLayout); } -void PartSet_WidgetPoint2D::reset() +bool PartSet_WidgetPoint2D::reset() { - if (isComputedDefault()) { - //return; - if (myFeature->compute(myAttributeID)) - restoreValue(); + bool aDone = false; + if (!isUseReset() || isComputedDefault() || myXSpin->hasVariable() || myYSpin->hasVariable()) { + aDone = false; } else { bool isOk; @@ -113,18 +113,26 @@ void PartSet_WidgetPoint2D::reset() 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)) { isDone = setPoint(aX, aY); @@ -157,12 +165,13 @@ bool PartSet_WidgetPoint2D::storeValueCustom() 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 (myXSpin->hasVariable() || myYSpin->hasVariable()) { + aPoint->setText(myXSpin->text().toStdString(), myYSpin->text().toStdString()); + } else { + aPoint->setValue(myXSpin->value(), myYSpin->value()); + aPoint->setText("", ""); + } // after movement the solver will call the update event: optimization moveObject(myFeature); aPoint->setImmutable(isImmutable); @@ -176,15 +185,36 @@ bool PartSet_WidgetPoint2D::restoreValue() 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 - - ModuleBase_Tools::setSpinValue(myXSpin, aPoint->x()); - ModuleBase_Tools::setSpinValue(myYSpin, aPoint->y()); + 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; } @@ -199,7 +229,7 @@ QList PartSet_WidgetPoint2D::getControls() const 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*)), @@ -207,20 +237,23 @@ void PartSet_WidgetPoint2D::activateCustom() QIntList aModes; aModes << TopAbs_VERTEX; - if (isEditingMode()) - aModes << TopAbs_EDGE; - 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, @@ -241,6 +274,25 @@ 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) { @@ -248,7 +300,7 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous if (theEvent->button() != Qt::LeftButton) return; - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + 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; @@ -265,17 +317,24 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous if ((!aSPFeature) && (!aShape.IsNull())) { ResultPtr aFixedObject = PartSet_Tools::findFixedObjectByExternal(aShape, aObject, mySketch); if (!aFixedObject.get()) - aFixedObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch); + aObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch); + setConstraintWith(aObject); + emit vertexSelected(); + emit focusOutWidget(this); + return; } } 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; + } else if (aShape.ShapeType() == TopAbs_EDGE) { + setConstraintWith(aObject); + emit vertexSelected(); + emit focusOutWidget(this); + return; } } // End of Bug dependent fragment @@ -310,11 +369,6 @@ void PartSet_WidgetPoint2D::onMouseMove(ModuleBase_IViewWindow* theWnd, QMouseEv { if (isEditingMode()) return; - myWorkshop->operationMgr()->setLockValidating(true); - // 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()); @@ -335,6 +389,6 @@ double PartSet_WidgetPoint2D::y() const void PartSet_WidgetPoint2D::onValuesChanged() { - myWorkshop->operationMgr()->setLockValidating(false); + myLockApplyMgr->valuesChanged(); emit valuesChanged(); }