X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_WidgetPoint2d.cpp;h=8782a90acd49dfcecd4be4b191d7e037bf019a00;hb=ac6c4b849218e6f1a45c0a21e46c5fda401c38f0;hp=36b897e5f2f8d003ffb802a1bb6135ba99fdc4dd;hpb=87b6a30a3afb8fb32e7e43ade8d9c947d9eb1684;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index 36b897e5f..8782a90ac 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -76,6 +77,7 @@ #include #include #include +#include #include #include @@ -242,7 +244,7 @@ bool PartSet_WidgetPoint2D::setSelectionCustom(const ModuleBase_ViewerPrsPtr& th GeomShapePtr aShape = theValue->shape(); if (aShape.get() && !aShape->isNull()) { Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - double aX, aY; + double aX = 0, aY = 0; const TopoDS_Shape& aTDShape = aShape->impl(); if (getPoint2d(aView, aTDShape, aX, aY)) { fillRefAttribute(aX, aY, theValue); @@ -305,7 +307,7 @@ bool PartSet_WidgetPoint2D::setSelection(QList& theValu GeomShapePtr aShape = aValue->shape(); if (aShape.get() && !aShape->isNull()) { Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - double aX, aY; + double aX = 0, aY = 0; const TopoDS_Shape& aTDShape = aShape->impl(); if (getPoint2d(aView, aTDShape, aX, aY)) { isDone = setPoint(aX, aY); @@ -356,10 +358,24 @@ bool PartSet_WidgetPoint2D::storeValueCustom() // 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); + if (myFeature->isMacro()) { + // Moving points of macro-features has been processed directly (without solver) + aPoint->setValue(myXSpin->value(), myYSpin->value()); + updateObject(myFeature); + + } else { + if (!aPoint->isInitialized()) + aPoint->setValue(0., 0.); + + std::shared_ptr aMessage( + new ModelAPI_ObjectMovedMessage(this)); + aMessage->setMovedAttribute(aPoint); + aMessage->setOriginalPosition(aPoint->pnt()); + aMessage->setCurrentPosition(myXSpin->value(), myYSpin->value()); + Events_Loop::loop()->send(aMessage); + } + aPoint->setImmutable(isImmutable); that->blockSignals(isBlocked); @@ -426,14 +442,17 @@ QList PartSet_WidgetPoint2D::getControls() const return aControls; } +//******************************************************************** +void PartSet_WidgetPoint2D::selectionModes(int& theModuleSelectionModes, QIntList& theModes) +{ + theModuleSelectionModes = -1; + theModes << TopAbs_VERTEX; + theModes << TopAbs_EDGE; +} +//******************************************************************** void PartSet_WidgetPoint2D::activateCustom() { - QIntList aModes; - aModes << TopAbs_VERTEX; - aModes << TopAbs_EDGE; - myWorkshop->activateSubShapesSelection(aModes); - if (!isEditingMode()) { FeaturePtr aFeature = feature(); if (aFeature.get() && aFeature->getKind() == SketchPlugin_Point::ID()) @@ -456,7 +475,6 @@ void PartSet_WidgetPoint2D::deactivate() storeValue(); ModuleBase_ModelWidget::deactivate(); - myWorkshop->deactivateSubShapesSelection(); } bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView, @@ -578,6 +596,7 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo if (!aFirstValue.get() && myPreSelected.get()) { aFirstValue = myPreSelected; } + // if we have selection and use it if (aFirstValue.get() && isValidSelectionCustom(aFirstValue) && aFirstValue->shape().get()) { /// Trihedron Axis may be selected, but shape is empty @@ -601,11 +620,15 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo else { anExternal = true; if (!aFixedObject.get()) - aFixedObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch); + { + FeaturePtr aCreatedFeature; + aFixedObject = PartSet_Tools::createFixedObjectByExternal(aGeomShape, aObject, mySketch, + false, aCreatedFeature); + } } } if (anExternal) { - double aX, aY; + double aX = 0, aY = 0; if (getPoint2d(aView, aShape, aX, aY) && isFeatureContainsPoint(myFeature, aX, aY)) { // do not create a constraint to the point, which already used by the feature // if the feature contains the point, focus is not switched @@ -652,7 +675,7 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo } } if (!anExternal) { - double aX, aY; + double aX = 0, aY = 0; bool isProcessed = false; if (getPoint2d(aView, aShape, aX, aY) && isFeatureContainsPoint(myFeature, aX, aY)) { // when the point is selected, the coordinates of the point should be set into the attribute @@ -693,15 +716,47 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo } } } - // End of Bug dependent fragment + // The selection could be a center of an external circular object + else if (aFirstValue.get() && (!aFirstValue->interactive().IsNull())) { + Handle(PartSet_CenterPrs) aAIS = + Handle(PartSet_CenterPrs)::DownCast(aFirstValue->interactive()); + if (!aAIS.IsNull()) { + gp_Pnt aPntComp = aAIS->Component()->Pnt(); + GeomVertexPtr aVertPtr(new GeomAPI_Vertex(aPntComp.X(), aPntComp.Y(), aPntComp.Z())); + TopoDS_Shape aShape = aVertPtr->impl(); + + ResultPtr aFixedObject = + PartSet_Tools::findFixedObjectByExternal(aShape, aAIS->object(), mySketch); + if (!aFixedObject.get()) + { + FeaturePtr aCreatedFeature; + aFixedObject = PartSet_Tools::createFixedByExternalCenter(aAIS->object(), aAIS->edge(), + aAIS->centerType(), mySketch, false, aCreatedFeature); + } + if (aFixedObject.get()) + setConstraintToObject(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 + updateObject(feature()); + + double aX = 0, aY = 0; + if (getPoint2d(aView, aShape, aX, aY)) { + // do not create a constraint to the point, which already used by the feature + // if the feature contains the point, focus is not switched + setPoint(aX, aY); + } + emit vertexSelected(); // it stops the reentrant operation + emit focusOutWidget(this); + } + } else { // A case when point is taken from mouse event gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView()); - double aX, anY; - PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, anY); + double aX = 0, aY = 0; + PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY); // if the feature contains the point, focus is not switched - if (!setPoint(aX, anY) || isFeatureContainsPoint(myFeature, aX, anY)) + if (!setPoint(aX, aY) || isFeatureContainsPoint(myFeature, aX, aY)) return; emit focusOutWidget(this); @@ -734,13 +789,13 @@ void PartSet_WidgetPoint2D::mouseMoved(ModuleBase_IViewWindow* theWindow, QMouse gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView()); - double aX, anY; - PartSet_Tools::convertTo2D(aPoint, mySketch, theWindow->v3dView(), aX, anY); + double aX = 0, aY = 0; + PartSet_Tools::convertTo2D(aPoint, mySketch, theWindow->v3dView(), aX, aY); if (myState != ModifiedInViewer) storeCurentValue(); // we need to block the value state change bool isBlocked = blockValueState(true); - setPoint(aX, anY); + setPoint(aX, aY); blockValueState(isBlocked); setValueState(ModifiedInViewer); }