X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetPoint2d.cpp;h=5793a383d78fb862242f28ef7751432e163e8909;hb=031179ada6681b874314c450eeda806f9f8abd28;hp=66a67efc418a917d2d4085aa1e9ad7452db47f02;hpb=c3ae28ba30027cc4a6a757ef623f40adaae96ead;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index 66a67efc4..5793a383d 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -64,13 +64,15 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, << SketchPlugin_Circle::ID().c_str(); } - // the control should accept the focus, so the boolen flag is corrected to be true + // the control should accept the focus, so the boolean 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); myGroupBox->setFlat(false); + bool aAcceptVariables = theData->getBooleanAttribute(DOUBLE_WDG_ACCEPT_EXPRESSIONS, true); + QGridLayout* aGroupLay = new QGridLayout(myGroupBox); ModuleBase_Tools::adjustMargins(aGroupLay); aGroupLay->setSpacing(2); @@ -81,6 +83,7 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, 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")); @@ -94,6 +97,7 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, 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")); @@ -133,21 +137,46 @@ PartSet_WidgetPoint2D::~PartSet_WidgetPoint2D() bool PartSet_WidgetPoint2D::setSelection(QList& theValues, const bool theToValidate) { + bool isDone = false; if (theValues.empty()) - return false; + return isDone; ModuleBase_ViewerPrs aValue = theValues.takeFirst(); - - Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - bool isDone = false; TopoDS_Shape aShape = aValue.shape(); - double aX, aY; - if (getPoint2d(aView, aShape, aX, aY)) { - isDone = setPoint(aX, aY); + if (!aShape.IsNull()) { + Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); + double aX, aY; + if (getPoint2d(aView, aShape, aX, aY)) { + isDone = setPoint(aX, aY); + 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(); +} + bool PartSet_WidgetPoint2D::setPoint(double theX, double theY) { if (fabs(theX) >= MaxCoordinate) @@ -248,10 +277,34 @@ void PartSet_WidgetPoint2D::activateCustom() aModes << TopAbs_VERTEX; aModes << TopAbs_EDGE; myWorkshop->activateSubShapesSelection(aModes); + + if (!isEditingMode()) { + FeaturePtr aFeature = feature(); + if (aFeature.get() && aFeature->getKind() == SketchPlugin_Point::ID()) + storeValue(); + } +} + +bool PartSet_WidgetPoint2D::canBeActivatedByMove() +{ + bool aCanBeActivated = false; + if (feature()->getKind() == SketchPlugin_Line::ID() && + attributeID() == SketchPlugin_Line::START_ID()) + aCanBeActivated = true; + + return aCanBeActivated; } void PartSet_WidgetPoint2D::deactivate() { + // the value of the control should be stored to model if it was not + // initialized yet. It is important when we leave this control by Tab key. + // It should not be performed by the widget activation as the preview + // is visualized with default value. Line point is moved to origin. + AttributePtr anAttribute = myFeature->data()->attribute(attributeID()); + if (anAttribute && !anAttribute->isInitialized()) + storeValue(); + ModuleBase_ModelWidget::deactivate(); ModuleBase_IViewer* aViewer = myWorkshop->viewer(); disconnect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), @@ -312,20 +365,21 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous NCollection_List aShapes; std::list aObjects; aSelection->selectedShapes(aShapes, aObjects); - // if we have selection - if (aShapes.Extent() > 0) { + // if we have selection and use it + if (aShapes.Extent() > 0 && useSelectedShapes()) { TopoDS_Shape aShape = aShapes.First(); ObjectPtr aObject = aObjects.front(); FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aObject); bool anExternal = false; - if (aSelectedFeature.get() != NULL) { - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aSelectedFeature); - if ((!aSPFeature) && (!aShape.IsNull())) { + std::shared_ptr aSPFeature; + if (aSelectedFeature.get() != NULL) + aSPFeature = std::dynamic_pointer_cast(aSelectedFeature); + if ((!aSPFeature && !aShape.IsNull()) || + (aSPFeature.get() && aSPFeature->isExternal())) { anExternal = true; ResultPtr aFixedObject = PartSet_Tools::findFixedObjectByExternal(aShape, aObject, mySketch); if (!aFixedObject.get()) - aObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch); + aFixedObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch); double aX, aY; if (getPoint2d(aView, aShape, aX, aY) && isFeatureContainsPoint(myFeature, aX, aY)) { @@ -336,12 +390,32 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous else { if (getPoint2d(aView, aShape, aX, aY)) setPoint(aX, aY); - setConstraintWith(aObject); - emit vertexSelected(); + else + setValueState(Stored); // in case of edge selection, Apply state should also be updated + 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 + // they are not participate in the contour creation excepting external vertices + if (aShape.ShapeType() == TopAbs_VERTEX) { + FeaturePtr aFixedFeature = ModelAPI_Feature::feature(aFixedObject); + if (aFixedFeature.get() && aFixedFeature->getKind() == SketchPlugin_Point::ID()) { + anOrphanPoint = isOrphanPoint(aFixedFeature, mySketch, aX, aY, true); + } + } + } + + 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 + updateObject(feature()); + + if (!anOrphanPoint) + emit vertexSelected(); // it stops the reentrant operation + emit focusOutWidget(this); } } - } if (!anExternal) { double aX, aY; bool isProcessed = false; @@ -351,6 +425,7 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous setPoint(aX, aY); } else { + bool anOrphanPoint = isOrphanPoint(aSelectedFeature, mySketch, aX, aY); // do not set a coincidence constraint in the attribute if the feature contains a point // with the same coordinates. It is important for line creation in order to do not set // the same constraints for the same points, oterwise the result line has zero length. @@ -359,8 +434,10 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous PartSet_Tools::setConstraints(mySketch, feature(), attributeID(), aX, aY); } else if (aShape.ShapeType() == TopAbs_EDGE) { - if (MyFeaturesForCoincedence.contains(myFeature->getKind().c_str())) + if (MyFeaturesForCoincedence.contains(myFeature->getKind().c_str())) { setConstraintWith(aObject); + setValueState(Stored); // in case of edge selection, Apply state should also be updated + } } // 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 @@ -369,7 +446,8 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous // 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(); + if (!anOrphanPoint && !anExternal) + emit vertexSelected(); emit focusOutWidget(this); } } @@ -436,6 +514,10 @@ bool PartSet_WidgetPoint2D::isFeatureContainsPoint(const FeaturePtr& theFeature, double theX, double theY) { bool aPointIsFound = false; + + if (feature()->getKind() != SketchPlugin_Line::ID()) + return aPointIsFound; + AttributePtr aWidgetAttribute = myFeature->attribute(attributeID()); std::shared_ptr aPnt2d = @@ -455,6 +537,10 @@ bool PartSet_WidgetPoint2D::isFeatureContainsPoint(const FeaturePtr& theFeature, return aPointIsFound; } +void PartSet_WidgetPoint2D::initializeValueByActivate() +{ +} + /*void PartSet_WidgetPoint2D::onValuesChanged() { emit valuesChanged(); @@ -462,13 +548,10 @@ bool PartSet_WidgetPoint2D::isFeatureContainsPoint(const FeaturePtr& theFeature, bool PartSet_WidgetPoint2D::processEnter() { - bool isModified = myXSpin->isModified() || myYSpin->isModified(); + bool isModified = getValueState() == ModifiedInPP; if (isModified) { - bool isXModified = myXSpin->isModified(); + bool isXModified = myXSpin->hasFocus(); emit valuesChanged(); - //onValuesChanged(); - myXSpin->clearModified(); - myYSpin->clearModified(); if (isXModified) myXSpin->selectAll(); else @@ -476,3 +559,61 @@ bool PartSet_WidgetPoint2D::processEnter() } return isModified; } + +bool PartSet_WidgetPoint2D::useSelectedShapes() const +{ + return true; +} + +bool PartSet_WidgetPoint2D::isOrphanPoint(const FeaturePtr& theFeature, + const CompositeFeaturePtr& theSketch, + double theX, double theY, const bool theSearchInResults) +{ + bool anOrphanPoint = false; + if (theFeature.get()) { + std::shared_ptr aPointAttr; + std::string aFeatureKind = theFeature->getKind(); + if (aFeatureKind == SketchPlugin_Point::ID()) + aPointAttr = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Point::COORD_ID())); + else if (aFeatureKind == SketchPlugin_Circle::ID()) + aPointAttr = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Circle::CENTER_ID())); + + else if (aFeatureKind == SketchPlugin_Arc::ID()) + aPointAttr = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Arc::CENTER_ID())); + + /// check that the geometry point with the given coordinates is the checked point + /// e.g. in arc the (x,y) point can not coicide to the center point and it automatically + /// means that this point is not an orphant one. + if (aPointAttr.get()) { + std::shared_ptr aCheckedPoint = std::shared_ptr( + new GeomAPI_Pnt2d(theX, theY)); + if (!aCheckedPoint->isEqual(aPointAttr->pnt())) + return anOrphanPoint; + } + + if (aPointAttr.get()) { + std::shared_ptr aPoint = aPointAttr->pnt(); + // we need to find coincidence features in results also, because external object(point) + // uses refs to me in another feature. + FeaturePtr aCoincidence = PartSet_Tools::findFirstCoincidence(theFeature, aPoint, theSearchInResults); + anOrphanPoint = true; + // if there is at least one concident line to the point, the point is not an orphant + if (aCoincidence.get()) { + QList aCoinsideLines; + PartSet_Tools::findCoincidences(aCoincidence, aCoinsideLines, + SketchPlugin_ConstraintCoincidence::ENTITY_A()); + PartSet_Tools::findCoincidences(aCoincidence, aCoinsideLines, + SketchPlugin_ConstraintCoincidence::ENTITY_B()); + QList::const_iterator anIt = aCoinsideLines.begin(), + aLast = aCoinsideLines.end(); + for (; anIt != aLast && anOrphanPoint; anIt++) { + anOrphanPoint = (*anIt)->getKind() != SketchPlugin_Line::ID(); + } + } + } + } + return anOrphanPoint; +}