X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Tools.cpp;h=24a726a90df03bf938282248b2ab5637556dc8c4;hb=329d73a7dbce38e38063ff41186be492e3529ab5;hp=58ed85bb2b67756170e6efa300b63ffc68a24f0c;hpb=d727f40573f7a71044fea24b6af43b419ac19e51;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index 58ed85bb2..24a726a90 100644 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -21,18 +22,12 @@ #include #include #include +#include +#include +#include #include -#include -#include -#include -#include - -#include -#include -#include - -#include +#include #include #include @@ -141,91 +136,38 @@ void PartSet_Tools::convertTo3D(const double theX, const double theY, thePoint = gp_Pnt(aPoint->x(), aPoint->y(), aPoint->z()); } -boost::shared_ptr PartSet_Tools::createFeaturePrs(const std::string& theKind, - FeaturePtr theSketch, - FeaturePtr theFeature) -{ - boost::shared_ptr aFeaturePrs; - - if (theKind == PartSet_FeaturePointPrs::getKind()) { - aFeaturePrs = boost::shared_ptr(new PartSet_FeaturePointPrs(theSketch)); - } - else if (theKind == PartSet_FeatureLinePrs::getKind()) { - aFeaturePrs = boost::shared_ptr(new PartSet_FeatureLinePrs(theSketch)); - } - else if (theKind == PartSet_FeatureCirclePrs::getKind()) { - aFeaturePrs = boost::shared_ptr(new PartSet_FeatureCirclePrs(theSketch)); - } - else if (theKind == PartSet_FeatureArcPrs::getKind()) { - aFeaturePrs = boost::shared_ptr(new PartSet_FeatureArcPrs(theSketch)); - } - else if (theKind == PartSet_ConstraintLengthPrs::getKind()) { - aFeaturePrs = boost::shared_ptr(new PartSet_ConstraintLengthPrs(theSketch)); - } - else if (theKind == PartSet_ConstraintRadiusPrs::getKind()) { - aFeaturePrs = boost::shared_ptr(new PartSet_ConstraintRadiusPrs(theSketch)); - } - else if (theKind == PartSet_ConstraintDistancePrs::getKind()) { - aFeaturePrs = boost::shared_ptr(new PartSet_ConstraintDistancePrs(theSketch)); - } - - - if (theFeature && aFeaturePrs) - aFeaturePrs->init(theFeature); - - return aFeaturePrs; -} - FeaturePtr PartSet_Tools::nearestFeature(QPoint thePoint, Handle_V3d_View theView, FeaturePtr theSketch, - const std::list& theFeatures) + const std::list& theFeatures) { double aX, anY; gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(thePoint, theView); PartSet_Tools::convertTo2D(aPoint, theSketch, theView, aX, anY); FeaturePtr aFeature; - std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); + std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); FeaturePtr aDeltaFeature; double aMinDelta = -1; - XGUI_ViewerPrs aPrs; + ModuleBase_ViewerPrs aPrs; for (; anIt != aLast; anIt++) { aPrs = *anIt; - if (!aPrs.feature()) + if (!aPrs.result()) + continue; + boost::shared_ptr aSketchFeature = + boost::dynamic_pointer_cast(aPrs.result()); + if (!aSketchFeature) continue; - double aDelta = distanceToPoint(aPrs.feature(), aX, anY); + double aDelta = aSketchFeature->distanceToPoint( + boost::shared_ptr(new GeomAPI_Pnt2d(aX, anY))); if (aMinDelta < 0 || aMinDelta > aDelta) { aMinDelta = aDelta; - aDeltaFeature = aPrs.feature(); + aDeltaFeature = aPrs.result(); } } return aDeltaFeature; } -double PartSet_Tools::distanceToPoint(FeaturePtr theFeature, - double theX, double theY) -{ - boost::shared_ptr aFeaturePrs = PartSet_Tools::createFeaturePrs( - theFeature->getKind(), FeaturePtr(), theFeature); - double aDelta = 0; - if (aFeaturePrs) - aDelta = aFeaturePrs->distanceToPoint(theFeature, theX, theY); - - return aDelta; -} - -void PartSet_Tools::moveFeature(FeaturePtr theFeature, double theDeltaX, double theDeltaY) -{ - if (!theFeature) - return; - - boost::shared_ptr aFeaturePrs = PartSet_Tools::createFeaturePrs( - theFeature->getKind(), FeaturePtr(), theFeature); - if (aFeaturePrs) - aFeaturePrs->move(theDeltaX, theDeltaY); -} - boost::shared_ptr PartSet_Tools::document() { return ModelAPI_PluginManager::get()->rootDocument(); @@ -318,17 +260,45 @@ void PartSet_Tools::createConstraint(FeaturePtr theSketch, aFeature->execute(); } -boost::shared_ptr PartSet_Tools::findPoint(FeaturePtr theFeature, - double theX, double theY) +void PartSet_Tools::setConstraints(FeaturePtr theSketch, FeaturePtr theFeature, + const std::string& theAttribute, + double theClickedX, double theClickedY) { - boost::shared_ptr aFeaturePrs = PartSet_Tools::createFeaturePrs( - theFeature->getKind(), FeaturePtr(), theFeature); - - boost::shared_ptr aPoint2D; - if (aFeaturePrs) - aPoint2D = aFeaturePrs->findPoint(theFeature, theX, theY); + // find a feature point by the selection mode + //boost::shared_ptr aPoint = featurePoint(theMode); + boost::shared_ptr aFeaturePoint = + boost::dynamic_pointer_cast(theFeature->data()->attribute(theAttribute)); + if (!aFeaturePoint) + return; - return aPoint2D; + // get all sketch features. If the point with the given coordinates belong to any sketch feature, + // the constraint is created between the feature point and the found sketch point + boost::shared_ptr aData = theSketch->data(); + boost::shared_ptr aRefList = + boost::dynamic_pointer_cast(aData->attribute(SKETCH_ATTR_FEATURES)); + + std::list aFeatures = aRefList->list(); + std::list::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end(); + std::list > anAttiributes; + boost::shared_ptr aClickedPoint = boost::shared_ptr + (new GeomAPI_Pnt2d(theClickedX, theClickedY)); + for (; anIt != aLast; anIt++) + { + FeaturePtr aFeature = *anIt; + // find the given point in the feature attributes + anAttiributes = aFeature->data()->attributes(GeomDataAPI_Point2D::type()); + std::list >::const_iterator anIt = anAttiributes.begin(), + aLast = anAttiributes.end(); + boost::shared_ptr aFPoint; + for (;anIt!=aLast && !aFPoint; anIt++) { + boost::shared_ptr aCurPoint = + boost::dynamic_pointer_cast(*anIt); + if (aCurPoint && aCurPoint->pnt()->distance(aClickedPoint) < Precision::Confusion()) + aFPoint = aCurPoint; + } + if (aFPoint) + PartSet_Tools::createConstraint(theSketch, aFPoint, aFeaturePoint); + } } boost::shared_ptr PartSet_Tools::sketchPlane(FeaturePtr theSketch) @@ -370,7 +340,7 @@ boost::shared_ptr PartSet_Tools::point3D( bool PartSet_Tools::isConstraintFeature(const std::string& theKind) { - return theKind == PartSet_ConstraintLengthPrs::getKind() || - theKind == PartSet_ConstraintDistancePrs::getKind() || - theKind == PartSet_ConstraintRadiusPrs::getKind(); -} \ No newline at end of file + return theKind == SKETCH_CONSTRAINT_DISTANCE_KIND || + theKind == SKETCH_CONSTRAINT_LENGTH_KIND || + theKind == SKETCH_CONSTRAINT_RADIUS_KIND; +}