X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Tools.cpp;h=74a83734c198efb1ead726d00276d7fab3cefc1b;hb=61da4e89d2ec63daa429d304f928482a0e6fa0b7;hp=eb07e5baa11d0f0bd7e15eaaa5490e2726b058c1;hpb=5d9f5c6e19b94b5b2c4bf8d314b7f7f1c6f49897;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index eb07e5baa..74a83734c 100644 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -63,12 +64,14 @@ gp_Pnt PartSet_Tools::convertClickToPoint(QPoint thePoint, Handle(V3d_View) theV gp_Pnt ConvertedPoint(X, Y, Z); gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project(PlaneOfTheView, ConvertedPoint); - gp_Pnt ResultPoint = ElSLib::Value(ConvertedPointOnPlane.X(), ConvertedPointOnPlane.Y(), PlaneOfTheView); + gp_Pnt ResultPoint = ElSLib::Value(ConvertedPointOnPlane.X(), ConvertedPointOnPlane.Y(), + PlaneOfTheView); return ResultPoint; } void PartSet_Tools::convertTo2D(const gp_Pnt& thePoint, FeaturePtr theSketch, - Handle(V3d_View) theView, double& theX, double& theY) +Handle(V3d_View) theView, + double& theX, double& theY) { if (!theSketch) return; @@ -76,19 +79,18 @@ void PartSet_Tools::convertTo2D(const gp_Pnt& thePoint, FeaturePtr theSketch, AttributeDoublePtr anAttr; boost::shared_ptr aData = theSketch->data(); - boost::shared_ptr anOrigin = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr anOrigin = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - boost::shared_ptr aX = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::DIRX_ID())); - boost::shared_ptr anY = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::DIRY_ID())); + boost::shared_ptr aX = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::DIRX_ID())); + boost::shared_ptr anY = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::DIRY_ID())); gp_Pnt anOriginPnt(anOrigin->x(), anOrigin->y(), anOrigin->z()); gp_Vec aVec(anOriginPnt, thePoint); - if (!theView.IsNull()) - { + if (!theView.IsNull()) { V3d_Coordinate XEye, YEye, ZEye, XAt, YAt, ZAt; theView->Eye(XEye, YEye, ZEye); @@ -99,22 +101,21 @@ void PartSet_Tools::convertTo2D(const gp_Pnt& thePoint, FeaturePtr theSketch, gp_Vec anEyeVec(EyePoint, AtPoint); anEyeVec.Normalize(); - boost::shared_ptr aNormal = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::NORM_ID())); + boost::shared_ptr aNormal = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); gp_Vec aNormalVec(aNormal->x(), aNormal->y(), aNormal->z()); double aDen = anEyeVec * aNormalVec; double aLVec = aDen != 0 ? aVec * aNormalVec / aDen : DBL_MAX; - gp_Vec aDeltaVec = anEyeVec*aLVec; + gp_Vec aDeltaVec = anEyeVec * aLVec; aVec = aVec - aDeltaVec; } theX = aVec.X() * aX->x() + aVec.Y() * aX->y() + aVec.Z() * aX->z(); theY = aVec.X() * anY->x() + aVec.Y() * anY->y() + aVec.Z() * anY->z(); } -void PartSet_Tools::convertTo3D(const double theX, const double theY, - FeaturePtr theSketch, +void PartSet_Tools::convertTo3D(const double theX, const double theY, FeaturePtr theSketch, gp_Pnt& thePoint) { if (!theSketch) @@ -122,15 +123,15 @@ void PartSet_Tools::convertTo3D(const double theX, const double theY, boost::shared_ptr aData = theSketch->data(); - boost::shared_ptr aC = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - boost::shared_ptr aX = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::DIRX_ID())); - boost::shared_ptr aY = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::DIRY_ID())); + boost::shared_ptr aC = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aX = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::DIRX_ID())); + boost::shared_ptr aY = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::DIRY_ID())); - boost::shared_ptr aSum = aC->pnt()->xyz()->added( - aX->dir()->xyz()->multiplied(theX))->added(aY->dir()->xyz()->multiplied(theY)); + boost::shared_ptr aSum = aC->pnt()->xyz()->added(aX->dir()->xyz()->multiplied(theX)) + ->added(aY->dir()->xyz()->multiplied(theY)); boost::shared_ptr aPoint = boost::shared_ptr(new GeomAPI_Pnt(aSum)); thePoint = gp_Pnt(aPoint->x(), aPoint->y(), aPoint->z()); @@ -138,31 +139,28 @@ void PartSet_Tools::convertTo3D(const double theX, const double theY, FeaturePtr PartSet_Tools::nearestFeature(QPoint thePoint, Handle_V3d_View theView, FeaturePtr theSketch, - const std::list& theFeatures) + const QList& 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(); - - FeaturePtr aDeltaFeature; + FeaturePtr aDeltaFeature; double aMinDelta = -1; ModuleBase_ViewerPrs aPrs; - for (; anIt != aLast; anIt++) { - aPrs = *anIt; - if (!aPrs.feature()) + foreach (ModuleBase_ViewerPrs aPrs, theFeatures) { + if (!aPrs.object()) continue; - boost::shared_ptr aSketchFeature = - boost::dynamic_pointer_cast(aPrs.feature()); + boost::shared_ptr aSketchFeature = boost::dynamic_pointer_cast< + SketchPlugin_Feature>(aPrs.object()); if (!aSketchFeature) continue; double aDelta = aSketchFeature->distanceToPoint( - boost::shared_ptr(new GeomAPI_Pnt2d(aX, anY))); + boost::shared_ptr(new GeomAPI_Pnt2d(aX, anY))); if (aMinDelta < 0 || aMinDelta > aDelta) { aMinDelta = aDelta; - aDeltaFeature = aPrs.feature(); + // TODO aDeltaFeature = aPrs.result(); } } return aDeltaFeature; @@ -170,7 +168,7 @@ FeaturePtr PartSet_Tools::nearestFeature(QPoint thePoint, Handle_V3d_View theVie boost::shared_ptr PartSet_Tools::document() { - return ModelAPI_PluginManager::get()->rootDocument(); + return ModelAPI_Session::get()->moduleDocument(); } void PartSet_Tools::setFeaturePoint(FeaturePtr theFeature, double theX, double theY, @@ -179,8 +177,8 @@ void PartSet_Tools::setFeaturePoint(FeaturePtr theFeature, double theX, double t if (!theFeature) return; boost::shared_ptr aData = theFeature->data(); - boost::shared_ptr aPoint = - boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + boost::shared_ptr aPoint = boost::dynamic_pointer_cast( + aData->attribute(theAttribute)); if (aPoint) aPoint->setValue(theX, theY); } @@ -191,8 +189,8 @@ void PartSet_Tools::setFeatureValue(FeaturePtr theFeature, double theValue, if (!theFeature) return; boost::shared_ptr aData = theFeature->data(); - AttributeDoublePtr anAttribute = - boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + AttributeDoublePtr anAttribute = boost::dynamic_pointer_cast( + aData->attribute(theAttribute)); if (anAttribute) anAttribute->setValue(theValue); } @@ -204,8 +202,8 @@ double PartSet_Tools::featureValue(FeaturePtr theFeature, const std::string& the double aValue; if (theFeature) { boost::shared_ptr aData = theFeature->data(); - AttributeDoublePtr anAttribute = - boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + AttributeDoublePtr anAttribute = boost::dynamic_pointer_cast( + aData->attribute(theAttribute)); if (anAttribute) { aValue = anAttribute->value(); isValid = true; @@ -222,10 +220,10 @@ FeaturePtr PartSet_Tools::feature(FeaturePtr theFeature, const std::string& theA return aFeature; boost::shared_ptr aData = theFeature->data(); - boost::shared_ptr anAttr = - boost::dynamic_pointer_cast(aData->attribute(theAttribute)); + boost::shared_ptr anAttr = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aData->attribute(theAttribute)); if (anAttr) { - aFeature = anAttr->feature(); + aFeature = boost::dynamic_pointer_cast(anAttr->object()); if (!theKind.empty() && aFeature && aFeature->getKind() != theKind) { aFeature = FeaturePtr(); } @@ -233,66 +231,64 @@ FeaturePtr PartSet_Tools::feature(FeaturePtr theFeature, const std::string& theA return aFeature; } -void PartSet_Tools::createConstraint(FeaturePtr theSketch, +void PartSet_Tools::createConstraint(CompositeFeaturePtr theSketch, boost::shared_ptr thePoint1, boost::shared_ptr thePoint2) { - boost::shared_ptr aDoc = document(); - FeaturePtr aFeature = aDoc->addFeature(SketchPlugin_ConstraintCoincidence::ID()); - + FeaturePtr aFeature; if (theSketch) { - boost::shared_ptr aSketch = - boost::dynamic_pointer_cast(theSketch); - aSketch->addSub(aFeature); + aFeature = theSketch->addFeature(SketchPlugin_ConstraintCoincidence::ID()); + } else { + boost::shared_ptr aDoc = document(); + aFeature = aDoc->addFeature(SketchPlugin_ConstraintCoincidence::ID()); } boost::shared_ptr aData = aFeature->data(); - boost::shared_ptr aRef1 = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Constraint::ENTITY_A())); + boost::shared_ptr aRef1 = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_A())); aRef1->setAttr(thePoint1); - boost::shared_ptr aRef2 = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Constraint::ENTITY_B())); + boost::shared_ptr aRef2 = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_B())); aRef2->setAttr(thePoint2); - if (aFeature) // TODO: generate an error if feature was not created + if (aFeature) // TODO: generate an error if feature was not created aFeature->execute(); } -void PartSet_Tools::setConstraints(FeaturePtr theSketch, FeaturePtr theFeature, - const std::string& theAttribute, - double theClickedX, double theClickedY) +void PartSet_Tools::setConstraints(CompositeFeaturePtr theSketch, FeaturePtr theFeature, + const std::string& theAttribute, double theClickedX, + double theClickedY) { // 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)); + boost::shared_ptr aFeaturePoint = boost::dynamic_pointer_cast< + GeomDataAPI_Point2D>(theFeature->data()->attribute(theAttribute)); if (!aFeaturePoint) return; // 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(SketchPlugin_Sketch::FEATURES_ID())); + boost::shared_ptr aRefList = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(aData->attribute(SketchPlugin_Sketch::FEATURES_ID())); - std::list aFeatures = aRefList->list(); - std::list::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end(); + 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; + boost::shared_ptr aClickedPoint = boost::shared_ptr( + new GeomAPI_Pnt2d(theClickedX, theClickedY)); + for (; anIt != aLast; anIt++) { + FeaturePtr aFeature = boost::dynamic_pointer_cast(*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(); + aLast = anAttiributes.end(); boost::shared_ptr aFPoint; - for (;anIt!=aLast && !aFPoint; anIt++) { - boost::shared_ptr aCurPoint = - boost::dynamic_pointer_cast(*anIt); + for (; anIt != aLast && !aFPoint; anIt++) { + boost::shared_ptr aCurPoint = boost::dynamic_pointer_cast< + GeomDataAPI_Point2D>(*anIt); if (aCurPoint && aCurPoint->pnt()->distance(aClickedPoint) < Precision::Confusion()) aFPoint = aCurPoint; } @@ -301,16 +297,16 @@ void PartSet_Tools::setConstraints(FeaturePtr theSketch, FeaturePtr theFeature, } } -boost::shared_ptr PartSet_Tools::sketchPlane(FeaturePtr theSketch) +boost::shared_ptr PartSet_Tools::sketchPlane(CompositeFeaturePtr 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(SketchPlugin_Sketch::ORIGIN_ID())); - boost::shared_ptr aNormal = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::NORM_ID())); + boost::shared_ptr anOrigin = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aNormal = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); aA = aNormal->x(); aB = aNormal->y(); aC = aNormal->z(); @@ -320,27 +316,27 @@ boost::shared_ptr PartSet_Tools::sketchPlane(FeaturePtr theSketch) return aPlane; } -boost::shared_ptr PartSet_Tools::point3D( - boost::shared_ptr thePoint2D, - FeaturePtr theSketch) +boost::shared_ptr PartSet_Tools::point3D(boost::shared_ptr thePoint2D, + CompositeFeaturePtr theSketch) { boost::shared_ptr aPoint; if (!theSketch || !thePoint2D) return aPoint; - boost::shared_ptr aC = - boost::dynamic_pointer_cast(theSketch->data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - boost::shared_ptr aX = - boost::dynamic_pointer_cast(theSketch->data()->attribute(SketchPlugin_Sketch::DIRX_ID())); - boost::shared_ptr aY = - boost::dynamic_pointer_cast(theSketch->data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + boost::shared_ptr aC = boost::dynamic_pointer_cast( + theSketch->data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aX = boost::dynamic_pointer_cast( + theSketch->data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + boost::shared_ptr aY = boost::dynamic_pointer_cast( + theSketch->data()->attribute(SketchPlugin_Sketch::DIRY_ID())); return thePoint2D->to3D(aC->pnt(), aX->dir(), aY->dir()); } bool PartSet_Tools::isConstraintFeature(const std::string& theKind) { - return theKind == SketchPlugin_ConstraintDistance::ID() || - theKind == SketchPlugin_ConstraintLength::ID() || - theKind == SketchPlugin_ConstraintRadius::ID(); + return theKind == SketchPlugin_ConstraintDistance::ID() + || theKind == SketchPlugin_ConstraintLength::ID() + || theKind == SketchPlugin_ConstraintRadius::ID() + || theKind == SketchPlugin_ConstraintRigid::ID(); }