X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_WidgetPoint2d.cpp;h=6b77f8535f2e5ee63b02678667b992afbd49dcc9;hb=09dabb6acd9664f589a0bd9415d804d7a37ab801;hp=813741c88172a86b3a5f9ead67acb576d3b80bfc;hpb=2214a01e99079a3bfb6d8f15393f0bb870dd0958;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index 813741c88..6b77f8535 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -7,6 +7,7 @@ #include "PartSet_WidgetPoint2d.h" #include #include +#include #include #include @@ -17,6 +18,8 @@ #include #include #include +#include +#include #include #include @@ -31,6 +34,9 @@ #include #include +#include +#include + #include #include #include @@ -58,9 +64,8 @@ static QStringList MyFeaturesForCoincedence; PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, - const Config_WidgetAPI* theData, - const std::string& theParentId) -: ModuleBase_ModelWidget(theParent, theData, theParentId), myWorkshop(theWorkshop), + const Config_WidgetAPI* theData) +: ModuleBase_ModelWidget(theParent, theData), myWorkshop(theWorkshop), myValueIsCashed(false), myIsFeatureVisibleInCash(true), myXValueInCash(0), myYValueInCash(0) { @@ -73,7 +78,6 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, // 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); @@ -116,6 +120,58 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent, ModuleBase_Tools::zeroMargins(aLayout); aLayout->addWidget(myGroupBox); setLayout(aLayout); + + myWidgetValidator = new ModuleBase_WidgetValidator(this, myWorkshop); +} + +bool PartSet_WidgetPoint2D::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& theValue) +{ + bool aValid = true; + + PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); + 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); + if (aPrs.get()) { + AISObjectPtr anAIS; + anAIS = aPrs->getAISObject(anAIS); + if (anAIS.get()) { + anAISShape = anAIS->getShape(); + } + } + const std::list >& aResults = myFeature->results(); + if (!anAISShape.get() && aResults.empty()) + return true; + + /// analysis of AIS + if (anAISShape.get()) + aFoundPoint = shapeContainsPoint(anAISShape, aPoint, mySketch); + + /// analysis of results + std::list >::const_iterator aRIter = aResults.cbegin(); + for (; aRIter != aResults.cend() && !aFoundPoint; aRIter++) { + ResultPtr aResult = *aRIter; + if (aResult.get() && aResult->shape().get()) { + GeomShapePtr aShape = aResult->shape(); + aFoundPoint = shapeContainsPoint(aShape, aPoint, mySketch); + } + } + return aFoundPoint; } bool PartSet_WidgetPoint2D::resetCustom() @@ -129,6 +185,7 @@ bool PartSet_WidgetPoint2D::resetCustom() // if the restored value should be hidden, aDone = true to set // reset state for the widget in the parent aDone = restoreCurentValue(); + emit objectUpdated(); } else { bool isOk; @@ -148,26 +205,27 @@ PartSet_WidgetPoint2D::~PartSet_WidgetPoint2D() { } -bool PartSet_WidgetPoint2D::setSelection(QList& theValues, +bool PartSet_WidgetPoint2D::setSelection(QList& theValues, const bool theToValidate) { bool isDone = false; if (theValues.empty()) return isDone; - ModuleBase_ViewerPrs aValue = theValues.takeFirst(); - TopoDS_Shape aShape = aValue.shape(); - if (!aShape.IsNull()) { + ModuleBase_ViewerPrsPtr aValue = theValues.takeFirst(); + GeomShapePtr aShape = aValue->shape(); + if (aShape.get() && !aShape->isNull()) { Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); double aX, aY; - if (getPoint2d(aView, aShape, aX, aY)) { + const TopoDS_Shape& aTDShape = aShape->impl(); + if (getPoint2d(aView, aTDShape, 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()); + 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(); @@ -205,7 +263,7 @@ bool PartSet_WidgetPoint2D::setPoint(double theX, double theY) return true; } -bool PartSet_WidgetPoint2D::storeValueCustom() const +bool PartSet_WidgetPoint2D::storeValueCustom() { std::shared_ptr aData = myFeature->data(); if (!aData) // can be on abort of sketcher element @@ -384,7 +442,7 @@ bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView, return false; } -void PartSet_WidgetPoint2D::setConstraintWith(const ObjectPtr& theObject) +bool PartSet_WidgetPoint2D::setConstraintWith(const ObjectPtr& theObject) { std::shared_ptr aFeaturePoint; if (feature()->isMacro()) { @@ -403,7 +461,7 @@ void PartSet_WidgetPoint2D::setConstraintWith(const ObjectPtr& theObject) aFeaturePoint = std::dynamic_pointer_cast(aThisAttr); } if (!aFeaturePoint.get()) - return; + return false; // Create point-edge coincedence FeaturePtr aFeature = mySketch->addFeature(SketchPlugin_ConstraintCoincidence::ID()); @@ -418,7 +476,10 @@ void PartSet_WidgetPoint2D::setConstraintWith(const ObjectPtr& theObject) ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_B())); aRef2->setObject(theObject); + // we need to flush created signal in order to coincidence is processed by solver Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); + + return true; } void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) @@ -429,14 +490,15 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous 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); + + QList aList = aSelection->getSelected(ModuleBase_ISelection::Viewer); + ModuleBase_ViewerPrsPtr aFirstValue = aList.size() > 0 ? aList.first() : ModuleBase_ViewerPrsPtr(); // if we have selection and use it - if (aShapes.Extent() > 0 && useSelectedShapes()) { - TopoDS_Shape aShape = aShapes.First(); - ObjectPtr aObject = aObjects.front(); + if (aFirstValue.get() && isValidSelectionCustom(aFirstValue)) { + GeomShapePtr aGeomShape = aFirstValue->shape(); + TopoDS_Shape aShape = aGeomShape->impl(); + ObjectPtr aObject = aFirstValue->object(); + FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aObject); bool anExternal = false; std::shared_ptr aSPFeature; @@ -468,7 +530,7 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous 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); + anOrphanPoint = isOrphanPoint(aFixedFeature, mySketch, aX, aY); } } } @@ -504,15 +566,13 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous PartSet_Tools::setConstraints(mySketch, feature(), attributeID(), aX, aY); } else if (aShape.ShapeType() == TopAbs_EDGE) { - setConstraintWith(aObject); + if (!setConstraintWith(aObject)) { + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); + PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY); + setPoint(aX, aY); + } setValueState(Stored); // in case of edge selection, Apply state should also be updated - - FeaturePtr anObjectFeature = ModelAPI_Feature::feature(aObject); - std::string anAuxiliaryAttribute = SketchPlugin_SketchEntity::AUXILIARY_ID(); - AttributeBooleanPtr anAuxiliaryAttr = std::dynamic_pointer_cast( - anObjectFeature->data()->attribute(anAuxiliaryAttribute)); - if (anAuxiliaryAttr.get()) - isAuxiliaryFeature = anAuxiliaryAttr->value(); + isAuxiliaryFeature = PartSet_Tools::isAuxiliarySketchEntity(aObject); } // 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 @@ -644,7 +704,7 @@ bool PartSet_WidgetPoint2D::useSelectedShapes() const bool PartSet_WidgetPoint2D::isOrphanPoint(const FeaturePtr& theFeature, const CompositeFeaturePtr& theSketch, - double theX, double theY, const bool theSearchInResults) + double theX, double theY) { bool anOrphanPoint = false; if (theFeature.get()) { @@ -675,14 +735,15 @@ bool PartSet_WidgetPoint2D::isOrphanPoint(const FeaturePtr& theFeature, 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); + FeaturePtr aCoincidence = PartSet_Tools::findFirstCoincidence(theFeature, aPoint); 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, + QList aCoins; + PartSet_Tools::findCoincidences(aCoincidence, aCoinsideLines, aCoins, SketchPlugin_ConstraintCoincidence::ENTITY_A()); - PartSet_Tools::findCoincidences(aCoincidence, aCoinsideLines, + PartSet_Tools::findCoincidences(aCoincidence, aCoinsideLines, aCoins, SketchPlugin_ConstraintCoincidence::ENTITY_B()); QList::const_iterator anIt = aCoinsideLines.begin(), aLast = aCoinsideLines.end(); @@ -694,3 +755,20 @@ bool PartSet_WidgetPoint2D::isOrphanPoint(const FeaturePtr& theFeature, } return anOrphanPoint; } + +bool PartSet_WidgetPoint2D::shapeContainsPoint(const GeomShapePtr& theShape, + const std::shared_ptr& thePoint, + const CompositeFeaturePtr& theSketch) +{ + std::shared_ptr aPoint = PartSet_Tools::point3D(thePoint, theSketch); + + bool aContainPoint = false; + GeomAPI_ShapeExplorer anExp(theShape, GeomAPI_Shape::VERTEX); + for(; anExp.more() && !aContainPoint; anExp.next()) { + std::shared_ptr aVertexInCompSolid = anExp.current(); + std::shared_ptr aVertex(new GeomAPI_Vertex(aVertexInCompSolid)); + if (aVertex.get()) + aContainPoint = aPoint->isEqual(aVertex->point()); + } + return aContainPoint; +}