X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetPoint2d.cpp;h=8c7d1031b4d2a7c05410e47a27883d1bc65b8aaa;hb=32208dedf0b2b5bd50b5b86c464f37a8e0eb07d0;hp=4cfede1e2ad6482a0d45742304ebdf88b88d9e63;hpb=b9a4919649b3cd5ba06f64a290b5db18bb07f491;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index 4cfede1e2..8c7d1031b 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -62,7 +63,7 @@ const double MaxCoordinate = 1e12; static QStringList MyFeaturesForCoincedence; -PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, +PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData) : ModuleBase_ModelWidget(theParent, theData), myWorkshop(theWorkshop), @@ -90,33 +91,34 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, aGroupLay->setColumnStretch(1, 1); { QLabel* aLabel = new QLabel(myGroupBox); - aLabel->setText(tr("X ")); - aGroupLay->addWidget(aLabel, 0, 0); - - myXSpin = new ModuleBase_ParamSpinBox(myGroupBox); - myXSpin->setAcceptVariables(aAcceptVariables); - myXSpin->setMinimum(-DBL_MAX); - myXSpin->setMaximum(DBL_MAX); - myXSpin->setToolTip(tr("X")); + + myXSpin = new ModuleBase_LabelValue(myGroupBox, tr("X")); + //ModuleBase_ParamSpinBox(myGroupBox); + //myXSpin->setAcceptVariables(aAcceptVariables); + //myXSpin->setMinimum(-DBL_MAX); + //myXSpin->setMaximum(DBL_MAX); + //myXSpin->setToolTip(tr("X")); aGroupLay->addWidget(myXSpin, 0, 1); - connect(myXSpin, SIGNAL(valueChanged(const QString&)), this, SIGNAL(valuesModified())); - myXSpin->setValueEnabled(isValueEnabled()); + //connect(myXSpin, SIGNAL(textChanged(const QString&)), this, SIGNAL(valuesModified())); + //myXSpin->setValueEnabled(isValueEnabled()); } { - QLabel* aLabel = new QLabel(myGroupBox); - aLabel->setText(tr("Y ")); - aGroupLay->addWidget(aLabel, 1, 0); - - myYSpin = new ModuleBase_ParamSpinBox(myGroupBox); - myYSpin->setAcceptVariables(aAcceptVariables); - myYSpin->setMinimum(-DBL_MAX); - myYSpin->setMaximum(DBL_MAX); - myYSpin->setToolTip(tr("Y")); + //QLabel* aLabel = new QLabel(myGroupBox); + //aLabel->setText(tr("Y ")); + //aGroupLay->addWidget(aLabel, 1, 0); + + myYSpin = new ModuleBase_LabelValue(myGroupBox, tr("Y")); + //ModuleBase_ParamSpinBox(myGroupBox); + //myYSpin = new ModuleBase_ParamSpinBox(myGroupBox); + //myYSpin->setAcceptVariables(aAcceptVariables); + //myYSpin->setMinimum(-DBL_MAX); + //myYSpin->setMaximum(DBL_MAX); + //myYSpin->setToolTip(tr("Y")); aGroupLay->addWidget(myYSpin, 1, 1); - connect(myYSpin, SIGNAL(valueChanged(const QString&)), this, SIGNAL(valuesModified())); - myYSpin->setValueEnabled(isValueEnabled()); + //connect(myYSpin, SIGNAL(textChanged(const QString&)), this, SIGNAL(valuesModified())); + //myYSpin->setValueEnabled(isValueEnabled()); } QVBoxLayout* aLayout = new QVBoxLayout(this); ModuleBase_Tools::zeroMargins(aLayout); @@ -131,21 +133,12 @@ bool PartSet_WidgetPoint2D::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr bool aValid = true; PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); - if (aModule->sketchReentranceMgr()->isInternalEditActive()) + if (aModule->sketchReentranceMgr()->isInternalEditActive()) return true; /// when internal edit is started a new feature is created. I has not results, AIS - // workaround for feature, where there is no results - //if (myFeature->getKind() == "SketchRectangle") - // return true; - /// the selection is not possible if the current feature has no presentation for the current /// attribute not in AIS not in results. If so, no object in current feature where make /// coincidence, so selection is not necessary - std::shared_ptr aData = myFeature->data(); - std::shared_ptr aPointAttr = std::dynamic_pointer_cast( - aData->attribute(attributeID())); - std::shared_ptr aPoint = aPointAttr->pnt(); - bool aFoundPoint = false; GeomShapePtr anAISShape; GeomPresentablePtr aPrs = std::dynamic_pointer_cast(myFeature); @@ -161,6 +154,10 @@ bool PartSet_WidgetPoint2D::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr return true; /// analysis of AIS + std::shared_ptr aData = myFeature->data(); + std::shared_ptr aPointAttr = std::dynamic_pointer_cast( + aData->attribute(attributeID())); + std::shared_ptr aPoint = aPointAttr->pnt(); if (anAISShape.get()) aFoundPoint = shapeContainsPoint(anAISShape, aPoint, mySketch); @@ -179,7 +176,8 @@ bool PartSet_WidgetPoint2D::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr bool PartSet_WidgetPoint2D::resetCustom() { bool aDone = false; - if (!isUseReset() || isComputedDefault() || myXSpin->hasVariable() || myYSpin->hasVariable()) { + if (!isUseReset() || isComputedDefault() + /*|| myXSpin->hasVariable() || myYSpin->hasVariable()*/) { aDone = false; } else { @@ -194,8 +192,11 @@ bool PartSet_WidgetPoint2D::resetCustom() 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); + myXSpin->setValue(isOk ? aDefValue : 0.0); + myYSpin->setValue(isOk ? aDefValue : 0.0); + + //ModuleBase_Tools::setSpinValue(myXSpin, isOk ? aDefValue : 0.0); + //ModuleBase_Tools::setSpinValue(myYSpin, isOk ? aDefValue : 0.0); storeValueCustom(); aDone = true; } @@ -225,30 +226,12 @@ bool PartSet_WidgetPoint2D::setSelection(QList& theValu PartSet_Tools::setConstraints(mySketch, feature(), attributeID(), aX, aY); } } - else if (canBeActivatedByMove()) { - if (feature()->getKind() == SketchPlugin_Line::ID()) { - FeaturePtr aFeature = std::dynamic_pointer_cast(aValue->object()); - // Initialize new line with first point equal to end of previous - if (aFeature.get()) { - std::shared_ptr aData = aFeature->data(); - std::shared_ptr aPoint = - std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Line::END_ID())); - if (aPoint) { - setPoint(aPoint->x(), aPoint->y()); - PartSet_Tools::setConstraints(mySketch, feature(), attributeID(), aPoint->x(), - aPoint->y()); - isDone = true; - } - } - } - } return isDone; } void PartSet_WidgetPoint2D::selectContent() { - myXSpin->selectAll(); + // myXSpin->selectAll(); } bool PartSet_WidgetPoint2D::setPoint(double theX, double theY) @@ -258,8 +241,11 @@ bool PartSet_WidgetPoint2D::setPoint(double theX, double theY) if (fabs(theY) >= MaxCoordinate) return false; - ModuleBase_Tools::setSpinValue(myXSpin, theX); - ModuleBase_Tools::setSpinValue(myYSpin, theY); + myXSpin->setValue(theX); + myYSpin->setValue(theY); + + //ModuleBase_Tools::setSpinValue(myXSpin, theX); + //ModuleBase_Tools::setSpinValue(myYSpin, theY); storeValue(); return true; @@ -279,10 +265,11 @@ bool PartSet_WidgetPoint2D::storeValueCustom() // 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()); + //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()); + aPoint->setValue(myXSpin->value(), myYSpin->value()); // after movement the solver will call the update event: optimization moveObject(myFeature); @@ -297,44 +284,19 @@ bool PartSet_WidgetPoint2D::restoreValueCustom() std::shared_ptr aData = myFeature->data(); std::shared_ptr aPoint = std::dynamic_pointer_cast( aData->attribute(attributeID())); - 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)); - //} + double aValueX = aPoint->isInitialized() ? aPoint->x() : 0.; + double aValueY = aPoint->isInitialized() ? aPoint->y() : 0.; + myXSpin->setValue(aValueX); + myYSpin->setValue(aValueY); + return true; } void PartSet_WidgetPoint2D::storeCurentValue() { // do not use cash if a variable is used - if (myXSpin->hasVariable() || myYSpin->hasVariable()) - return; + //if (myXSpin->hasVariable() || myYSpin->hasVariable()) + // return; myValueIsCashed = true; myIsFeatureVisibleInCash = XGUI_Displayer::isVisible( @@ -352,8 +314,10 @@ bool PartSet_WidgetPoint2D::restoreCurentValue() myValueIsCashed = false; myIsFeatureVisibleInCash = true; - ModuleBase_Tools::setSpinValue(myXSpin, myXValueInCash); - ModuleBase_Tools::setSpinValue(myYSpin, myYValueInCash); + myXSpin->setValue(myXValueInCash); + myYSpin->setValue(myYValueInCash); + //ModuleBase_Tools::setSpinValue(myXSpin, myXValueInCash); + //ModuleBase_Tools::setSpinValue(myYSpin, myYValueInCash); // store value to the model storeValueCustom(); @@ -378,12 +342,6 @@ QList PartSet_WidgetPoint2D::getControls() const void PartSet_WidgetPoint2D::activateCustom() { - 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*)), - this, SLOT(onMouseRelease(ModuleBase_IViewWindow*, QMouseEvent*))); - QIntList aModes; aModes << TopAbs_VERTEX; aModes << TopAbs_EDGE; @@ -396,14 +354,8 @@ void PartSet_WidgetPoint2D::activateCustom() } } -bool PartSet_WidgetPoint2D::canBeActivatedByMove() +void PartSet_WidgetPoint2D::setHighlighted(bool isHighlighted) { - bool aCanBeActivated = false; - if (feature()->getKind() == SketchPlugin_Line::ID() && - attributeID() == SketchPlugin_Line::START_ID()) - aCanBeActivated = true; - - return aCanBeActivated; } void PartSet_WidgetPoint2D::deactivate() @@ -417,17 +369,11 @@ void PartSet_WidgetPoint2D::deactivate() storeValue(); ModuleBase_ModelWidget::deactivate(); - ModuleBase_IViewer* aViewer = myWorkshop->viewer(); - 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->deactivateSubShapesSelection(); } -bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView, - const TopoDS_Shape& theShape, +bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView, + const TopoDS_Shape& theShape, double& theX, double& theY) const { if (!theShape.IsNull()) { @@ -484,19 +430,24 @@ bool PartSet_WidgetPoint2D::setConstraintWith(const ObjectPtr& theObject) return true; } -void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMouseEvent* theEvent) { // 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(); + Handle(V3d_View) aView = theWindow->v3dView(); QList aList = aSelection->getSelected(ModuleBase_ISelection::Viewer); - ModuleBase_ViewerPrsPtr aFirstValue = aList.size() > 0 ? aList.first() : ModuleBase_ViewerPrsPtr(); + ModuleBase_ViewerPrsPtr aFirstValue = + aList.size() > 0 ? aList.first() : ModuleBase_ViewerPrsPtr(); + if (!aFirstValue.get() && myPreSelected.get()) { + aFirstValue = myPreSelected; + } // if we have selection and use it - if (aFirstValue.get() && isValidSelectionCustom(aFirstValue)) { + if (aFirstValue.get() && isValidSelectionCustom(aFirstValue) && + aFirstValue->shape().get()) { /// Trihedron Axis may be selected, but shape is empty GeomShapePtr aGeomShape = aFirstValue->shape(); TopoDS_Shape aShape = aGeomShape->impl(); ObjectPtr aObject = aFirstValue->object(); @@ -527,7 +478,8 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous bool anOrphanPoint = aShape.ShapeType() == TopAbs_VERTEX || isOrphanPoint(aSelectedFeature, mySketch, aX, aY); if (anExternal) { - anOrphanPoint = true; // we should not stop reentrant operation on external objects because + // we should not stop reentrant operation on external objects because + anOrphanPoint = true; // they are not participate in the contour creation excepting external vertices if (aShape.ShapeType() == TopAbs_VERTEX) { FeaturePtr aFixedFeature = ModelAPI_Feature::feature(aFixedObject); @@ -535,11 +487,22 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous anOrphanPoint = isOrphanPoint(aFixedFeature, mySketch, aX, aY); } } + else { + // point is taken from mouse event and set in attribute. + // It should be done before setting + // coinident constraint to the external line. If a point is created, it should be + // in the mouse clicked point + gp_Pnt aPoint = + PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView()); + double aX, anY; + PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, anY); + setPoint(aX, anY); + } } if (aFixedObject.get()) setConstraintWith(aFixedObject); - // fignal updated should be flushed in order to visualize possible created external objects - // e.g. selection of trihedron axis when input end arc point + // fignal updated should be flushed in order to visualize possible created + // external objects e.g. selection of trihedron axis when input end arc point updateObject(feature()); if (!anOrphanPoint) @@ -568,15 +531,17 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous PartSet_Tools::setConstraints(mySketch, feature(), attributeID(), aX, aY); } else if (aShape.ShapeType() == TopAbs_EDGE) { - if (!setConstraintWith(aObject)) { - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); - PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY); - setPoint(aX, aY); - } + // point is taken from mouse event and set in attribute. It should be done before setting + // coinident constraint to the external line. If a point is created, it should be in + // the mouse clicked point + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView()); + PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY); + setPoint(aX, aY); + setConstraintWith(aObject); setValueState(Stored); // in case of edge selection, Apply state should also be updated isAuxiliaryFeature = PartSet_Tools::isAuxiliarySketchEntity(aObject); } - // it is important to perform updateObject() in order to the current value is + // 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 @@ -592,7 +557,7 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous // End of Bug dependent fragment else { // A case when point is taken from mouse event - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView()); double aX, anY; PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, anY); @@ -607,7 +572,7 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous //aIgnore.append(feature()); //double aTolerance = aView->Convert(7); - //std::shared_ptr aAttrPnt = + //std::shared_ptr aAttrPnt = // PartSet_Tools::findAttributePoint(mySketch, aX, anY, aTolerance, aIgnore); //if (aAttrPnt.get() != NULL) { // aFeaturePoint->setValue(aAttrPnt->pnt()); @@ -619,19 +584,26 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous } } +void PartSet_WidgetPoint2D::setPreSelection( + const std::shared_ptr& thePreSelected) +{ + myPreSelected = thePreSelected; +} -void PartSet_WidgetPoint2D::onMouseMove(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +void PartSet_WidgetPoint2D::mouseMoved(ModuleBase_IViewWindow* theWindow, QMouseEvent* theEvent) { - if (isEditingMode()) + PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); + + if (isEditingMode() || aModule->sketchReentranceMgr()->isInternalEditStarted()) return; - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView()); double aX, anY; - PartSet_Tools::convertTo2D(aPoint, mySketch, theWnd->v3dView(), aX, anY); + PartSet_Tools::convertTo2D(aPoint, mySketch, theWindow->v3dView(), aX, anY); if (myState != ModifiedInViewer) storeCurentValue(); - // we need to block the value state change + // we need to block the value state change bool isBlocked = blockValueState(true); setPoint(aX, anY); blockValueState(isBlocked); @@ -659,7 +631,7 @@ bool PartSet_WidgetPoint2D::isFeatureContainsPoint(const FeaturePtr& theFeature, AttributePtr aWidgetAttribute = myFeature->attribute(attributeID()); - std::shared_ptr aPnt2d = + std::shared_ptr aPnt2d = std::shared_ptr(new GeomAPI_Pnt2d(theX, theY)); std::list anAttributes = myFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); @@ -687,7 +659,8 @@ void PartSet_WidgetPoint2D::initializeValueByActivate() bool PartSet_WidgetPoint2D::processEnter() { - bool isModified = getValueState() == ModifiedInPP; + return false; + /*bool isModified = getValueState() == ModifiedInPP; if (isModified) { bool isXModified = myXSpin->hasFocus(); emit valuesChanged(); @@ -696,7 +669,7 @@ bool PartSet_WidgetPoint2D::processEnter() else myYSpin->selectAll(); } - return isModified; + return isModified;*/ } bool PartSet_WidgetPoint2D::useSelectedShapes() const