X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Tools.cpp;h=24a726a90df03bf938282248b2ab5637556dc8c4;hb=329d73a7dbce38e38063ff41186be492e3529ab5;hp=bc73da323c6f1de6ecb374c0e16b759164b440a0;hpb=6afffd6ecead648c7a8e96190dfab01ff5955ebb;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index bc73da323..24a726a90 100644 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -6,11 +6,15 @@ #include #include +#include #include #include #include #include +#include +#include +#include #include #include @@ -18,14 +22,12 @@ #include #include #include +#include +#include +#include #include -#include -#include -#include -#include - -#include +#include #include #include @@ -71,7 +73,7 @@ void PartSet_Tools::convertTo2D(const gp_Pnt& thePoint, FeaturePtr theSketch, if (!theSketch) return; - boost::shared_ptr anAttr; + AttributeDoublePtr anAttr; boost::shared_ptr aData = theSketch->data(); boost::shared_ptr anOrigin = @@ -134,116 +136,38 @@ void PartSet_Tools::convertTo3D(const double theX, const double theY, thePoint = gp_Pnt(aPoint->x(), aPoint->y(), aPoint->z()); } -void PartSet_Tools::intersectLines(double theX0, double theY0, double theX1, double theY1, - double theX2, double theY2, double theX3, double theY3, - double& theX, double& theY) -{ - double aV1 = theX1 - theX0, aV2 = theY1 - theY0; - double aW1 = theX3 - theX2, aW2 = theY3 - theY2; - - double aT2 = 0; - if (aV1 != 0 && aV2 != 0) - aT2 = (( theY2 - theY0 )/aV2 - ( theX2 - theX0 )/aV1) / ( aW1/aV1 - aW2/aV2 ); - else - aT2 = DBL_MAX; - - theX = theX2 + aT2*aW1; - theY = theY2 + aT2*aW2; - - // the coordinates of two lines are on the common line - //It is not possible to use Precision::Confusion(), because it is e-0.8, but V is sometimes e-6 - Standard_Real aPrec = PRECISION_TOLERANCE; - if (fabs(theX - theX0) < aPrec && fabs(theY - theY0) < aPrec) { - projectPointOnLine(theX2, theY2, theX3, theY3, theX1, theY1, theX, theY); - } -} - -void PartSet_Tools::projectPointOnLine(double theX1, double theY1, double theX2, double theY2, - double thePointX, double thePointY, double& theX, double& theY) -{ - theX = theY = 0; - - Handle(Geom_Line) aLine = new Geom_Line(gp_Pnt(theX1, theY1, 0), - gp_Dir(gp_Vec(gp_Pnt(theX1, theY1, 0), gp_Pnt(theX2, theY2, 0)))); - GeomAPI_ProjectPointOnCurve aProj(gp_Pnt(thePointX, thePointY, 0), aLine); - - Standard_Integer aNbPoint = aProj.NbPoints(); - if (aNbPoint > 0) { - gp_Pnt aPoint = aProj.Point(1); - theX = aPoint.X(); - theY = aPoint.Y(); - } -} - -boost::shared_ptr PartSet_Tools::createFeaturePrs(const std::string& theKind, - FeaturePtr theSketch, - FeaturePtr theFeature) -{ - PartSet_FeaturePrs* aFeaturePrs; - - if (theKind == PartSet_FeaturePointPrs::getKind()) { - aFeaturePrs = new PartSet_FeaturePointPrs(theSketch); - } - else if (theKind == PartSet_FeatureLinePrs::getKind()) { - aFeaturePrs = new PartSet_FeatureLinePrs(theSketch); - } - else if (theKind == PartSet_FeatureCirclePrs::getKind()) { - aFeaturePrs = new PartSet_FeatureCirclePrs(theSketch); - } - else if (theKind == PartSet_FeatureArcPrs::getKind()) { - aFeaturePrs = new PartSet_FeatureArcPrs(theSketch); - } - if (theFeature) - aFeaturePrs->init(theFeature, FeaturePtr()); - - return boost::shared_ptr(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) -{ - double aDelta = 0; - std::string aKind = theFeature->getKind(); - if (aKind == PartSet_FeatureLinePrs::getKind()) { - aDelta = PartSet_FeatureLinePrs::distanceToPoint(theFeature, theX, theY); - } - else if (aKind == PartSet_FeaturePointPrs::getKind()) { - aDelta = PartSet_FeaturePointPrs::distanceToPoint(theFeature, theX, theY); - } - else if (aKind == PartSet_FeatureCirclePrs::getKind()) { - aDelta = PartSet_FeatureCirclePrs::distanceToPoint(theFeature, theX, theY); - } - - return aDelta; -} - boost::shared_ptr PartSet_Tools::document() { return ModelAPI_PluginManager::get()->rootDocument(); @@ -267,12 +191,48 @@ void PartSet_Tools::setFeatureValue(FeaturePtr theFeature, double theValue, if (!theFeature) return; boost::shared_ptr aData = theFeature->data(); - boost::shared_ptr anAttribute = + AttributeDoublePtr anAttribute = boost::dynamic_pointer_cast(aData->attribute(theAttribute)); if (anAttribute) anAttribute->setValue(theValue); } +double PartSet_Tools::featureValue(FeaturePtr theFeature, const std::string& theAttribute, + bool& isValid) +{ + isValid = false; + double aValue; + if (theFeature) { + boost::shared_ptr aData = theFeature->data(); + AttributeDoublePtr anAttribute = + boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + if (anAttribute) { + aValue = anAttribute->value(); + isValid = true; + } + } + return aValue; +} + +FeaturePtr PartSet_Tools::feature(FeaturePtr theFeature, const std::string& theAttribute, + const std::string& theKind) +{ + FeaturePtr aFeature; + if (!theFeature) + return aFeature; + + boost::shared_ptr aData = theFeature->data(); + boost::shared_ptr anAttr = + boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + if (anAttr) { + aFeature = anAttr->feature(); + if (!theKind.empty() && aFeature && aFeature->getKind() != theKind) { + aFeature = FeaturePtr(); + } + } + return aFeature; +} + void PartSet_Tools::createConstraint(FeaturePtr theSketch, boost::shared_ptr thePoint1, boost::shared_ptr thePoint2) @@ -300,23 +260,87 @@ 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 aPoint2D; - if (!theFeature) - return aPoint2D; + // 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; - std::string aKind = theFeature->getKind(); - if (aKind == PartSet_FeatureLinePrs::getKind()) { - aPoint2D = PartSet_FeatureLinePrs::findPoint(theFeature, theX, theY); - } - else if (aKind == PartSet_FeaturePointPrs::getKind()) { - aPoint2D = PartSet_FeaturePointPrs::findPoint(theFeature, theX, theY); - } - else if (aKind == PartSet_FeatureCirclePrs::getKind()) { - aPoint2D = PartSet_FeatureCirclePrs::findPoint(theFeature, theX, theY); + // 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); } +} - return aPoint2D; +boost::shared_ptr PartSet_Tools::sketchPlane(FeaturePtr theSketch) +{ + boost::shared_ptr aPlane; + double aA, aB, aC, aD; + + boost::shared_ptr aData = theSketch->data(); + boost::shared_ptr anOrigin = + boost::dynamic_pointer_cast(aData->attribute(SKETCH_ATTR_ORIGIN)); + boost::shared_ptr aNormal = + boost::dynamic_pointer_cast(aData->attribute(SKETCH_ATTR_NORM)); + aA = aNormal->x(); + aB = aNormal->y(); + aC = aNormal->z(); + aD = 0; + + aPlane = boost::shared_ptr(new GeomAPI_Pln(aA, aB, aC, aD)); + return aPlane; +} + +boost::shared_ptr PartSet_Tools::point3D( + boost::shared_ptr thePoint2D, + FeaturePtr theSketch) +{ + boost::shared_ptr aPoint; + if (!theSketch || !thePoint2D) + return aPoint; + + boost::shared_ptr aC = + boost::dynamic_pointer_cast(theSketch->data()->attribute(SKETCH_ATTR_ORIGIN)); + boost::shared_ptr aX = + boost::dynamic_pointer_cast(theSketch->data()->attribute(SKETCH_ATTR_DIRX)); + boost::shared_ptr aY = + boost::dynamic_pointer_cast(theSketch->data()->attribute(SKETCH_ATTR_DIRY)); + + return thePoint2D->to3D(aC->pnt(), aX->dir(), aY->dir()); +} + +bool PartSet_Tools::isConstraintFeature(const std::string& theKind) +{ + return theKind == SKETCH_CONSTRAINT_DISTANCE_KIND || + theKind == SKETCH_CONSTRAINT_LENGTH_KIND || + theKind == SKETCH_CONSTRAINT_RADIUS_KIND; }