X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Tools.cpp;h=451971a16c145ef5e60f0f699aba57552b804388;hb=6a74c9552a6deed91fa0f00eb4d1996d788b6bd3;hp=4713f2cdaf4fb8bd475aa07434216e6b36765d36;hpb=3693d9d6895f68f9df22b54d46059125e9b009ef;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index 4713f2cda..451971a16 100644 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -14,8 +15,17 @@ #include #include +#include #include -#include +#include +#include + +#include +#include +#include +#include + +#include #include @@ -57,13 +67,13 @@ gp_Pnt PartSet_Tools::convertClickToPoint(QPoint thePoint, Handle(V3d_View) theV return ResultPoint; } -void PartSet_Tools::convertTo2D(const gp_Pnt& thePoint, boost::shared_ptr theSketch, +void PartSet_Tools::convertTo2D(const gp_Pnt& thePoint, FeaturePtr theSketch, Handle(V3d_View) theView, double& theX, double& theY) { if (!theSketch) return; - boost::shared_ptr anAttr; + AttributeDoublePtr anAttr; boost::shared_ptr aData = theSketch->data(); boost::shared_ptr anOrigin = @@ -104,7 +114,7 @@ void PartSet_Tools::convertTo2D(const gp_Pnt& thePoint, boost::shared_ptr theSketch, + FeaturePtr theSketch, gp_Pnt& thePoint) { if (!theSketch) @@ -126,60 +136,46 @@ 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) +boost::shared_ptr PartSet_Tools::createFeaturePrs(const std::string& theKind, + FeaturePtr theSketch, + FeaturePtr theFeature) { - 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); - } -} + boost::shared_ptr aFeaturePrs; -void PartSet_Tools::projectPointOnLine(double theX1, double theY1, double theX2, double theY2, - double thePointX, double thePointY, double& theX, double& theY) -{ - theX = theY = 0; + 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_FeatureLengthPrs::getKind()) { + aFeaturePrs = boost::shared_ptr(new PartSet_FeatureLengthPrs(theSketch)); + } - 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); + if (theFeature && aFeaturePrs) + aFeaturePrs->init(theFeature, FeaturePtr()); - Standard_Integer aNbPoint = aProj.NbPoints(); - if (aNbPoint > 0) { - gp_Pnt aPoint = aProj.Point(1); - theX = aPoint.X(); - theY = aPoint.Y(); - } + return aFeaturePrs; } -boost::shared_ptr PartSet_Tools::nearestFeature(QPoint thePoint, - Handle_V3d_View theView, - boost::shared_ptr theSketch, - const std::list& theFeatures) +FeaturePtr PartSet_Tools::nearestFeature(QPoint thePoint, Handle_V3d_View theView, + FeaturePtr theSketch, + const std::list& theFeatures) { double aX, anY; gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(thePoint, theView); PartSet_Tools::convertTo2D(aPoint, theSketch, theView, aX, anY); - boost::shared_ptr aFeature; + FeaturePtr aFeature; std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); - boost::shared_ptr aDeltaFeature; + FeaturePtr aDeltaFeature; double aMinDelta = -1; XGUI_ViewerPrs aPrs; for (; anIt != aLast; anIt++) { @@ -195,24 +191,94 @@ boost::shared_ptr PartSet_Tools::nearestFeature(QPoint thePoin return aDeltaFeature; } -double PartSet_Tools::distanceToPoint(boost::shared_ptr theFeature, +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 (theFeature->getKind() != SKETCH_LINE_KIND) - return aDelta; + 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(); +} + +void PartSet_Tools::setFeaturePoint(FeaturePtr theFeature, double theX, double theY, + const std::string& theAttribute) +{ + if (!theFeature) + return; boost::shared_ptr aData = theFeature->data(); + boost::shared_ptr aPoint = + boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + if (aPoint) + aPoint->setValue(theX, theY); +} - boost::shared_ptr aPoint1 = - boost::dynamic_pointer_cast(aData->attribute(LINE_ATTR_START)); - boost::shared_ptr aPoint2 = - boost::dynamic_pointer_cast(aData->attribute(LINE_ATTR_END)); +void PartSet_Tools::setFeatureValue(FeaturePtr theFeature, double theValue, + const std::string& theAttribute) +{ + if (!theFeature) + return; + boost::shared_ptr aData = theFeature->data(); + AttributeDoublePtr anAttribute = + boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + if (anAttribute) + anAttribute->setValue(theValue); +} - double aX, anY; - PartSet_Tools::projectPointOnLine(aPoint1->x(), aPoint1->y(), aPoint2->x(), aPoint2->y(), theX, theY, aX, anY); +void PartSet_Tools::createConstraint(FeaturePtr theSketch, + boost::shared_ptr thePoint1, + boost::shared_ptr thePoint2) +{ + boost::shared_ptr aDoc = document(); + FeaturePtr aFeature = aDoc->addFeature(SKETCH_CONSTRAINT_COINCIDENCE_KIND); - aDelta = gp_Pnt(theX, theY, 0).Distance(gp_Pnt(aX, anY, 0)); + if (theSketch) { + boost::shared_ptr aSketch = + boost::dynamic_pointer_cast(theSketch); + aSketch->addSub(aFeature); + } - return aDelta; + boost::shared_ptr aData = aFeature->data(); + + boost::shared_ptr aRef1 = + boost::dynamic_pointer_cast(aData->attribute(CONSTRAINT_ATTR_ENTITY_A)); + aRef1->setAttr(thePoint1); + + boost::shared_ptr aRef2 = + boost::dynamic_pointer_cast(aData->attribute(CONSTRAINT_ATTR_ENTITY_B)); + aRef2->setAttr(thePoint2); + + if (aFeature) // TODO: generate an error if feature was not created + aFeature->execute(); +} + +boost::shared_ptr PartSet_Tools::findPoint(FeaturePtr theFeature, + double theX, double theY) +{ + boost::shared_ptr aFeaturePrs = PartSet_Tools::createFeaturePrs( + theFeature->getKind(), FeaturePtr(), theFeature); + + boost::shared_ptr aPoint2D; + if (aFeaturePrs) + aPoint2D = aFeaturePrs->findPoint(theFeature, theX, theY); + + return aPoint2D; }