X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Tools.cpp;h=916a31a71f2a4e958e3ddbf706eb0ce35df99548;hb=94ba553e7b92f11a936e027b49bbd1d501eeee44;hp=dc4feb845df6099a441ecbec50a169b55709155c;hpb=9854dbe3ec458621458f78823cf31d0fc3e9de85;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index dc4feb845..916a31a71 100644 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -28,15 +28,21 @@ #include #include #include +#include +#include +#include #include #include #include +#include #include #include #include #include +#include +#include #ifdef _DEBUG #include @@ -172,16 +178,24 @@ boost::shared_ptr PartSet_Tools::document() return ModelAPI_Session::get()->moduleDocument(); } -void PartSet_Tools::setFeaturePoint(FeaturePtr theFeature, double theX, double theY, - const std::string& theAttribute) +boost::shared_ptr PartSet_Tools::getFeaturePoint(FeaturePtr theFeature, + double theX, double theY) { - 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 aClickedPoint = boost::shared_ptr( + new GeomAPI_Pnt2d(theX, theY)); + std::list > anAttiributes = + theFeature->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< + GeomDataAPI_Point2D>(*anIt); + if (aCurPoint && aCurPoint->pnt()->distance(aClickedPoint) < Precision::Confusion()) + aFPoint = aCurPoint; + } + + return aFPoint; } void PartSet_Tools::setFeatureValue(FeaturePtr theFeature, double theValue, @@ -341,3 +355,76 @@ bool PartSet_Tools::isConstraintFeature(const std::string& theKind) || theKind == SketchPlugin_ConstraintRadius::ID() || theKind == SketchPlugin_ConstraintRigid::ID(); } + +ResultPtr PartSet_Tools::createFixedObjectByEdge(const ModuleBase_ViewerPrs& thePrs, CompositeFeaturePtr theSketch) +{ + TopoDS_Shape aShape = thePrs.shape(); + if (aShape.ShapeType() != TopAbs_EDGE) + return ResultPtr(); + + Standard_Real aStart, aEnd; + Handle(V3d_View) aNullView; + FeaturePtr aMyFeature; + + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(aShape), aStart, aEnd); + GeomAdaptor_Curve aAdaptor(aCurve); + if (aAdaptor.GetType() == GeomAbs_Line) { + // Create line + aMyFeature = theSketch->addFeature(SketchPlugin_Line::ID()); + + //DataPtr aData = myFeature->data(); + //boost::shared_ptr anEndAttr = + // boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Line::END_ID())); + + //double aX, aY; + //gp_Pnt Pnt1 = aAdaptor.Value(aStart); + //convertTo2D(Pnt1, theSketch, aNullView, aX, aY); + //setFeaturePoint(myFeature, aX, aY, SketchPlugin_Line::START_ID()); + + //gp_Pnt Pnt2 = aAdaptor.Value(aEnd); + //convertTo2D(Pnt2, theSketch, aNullView, aX, aY); + //setFeaturePoint(myFeature, aX, aY, SketchPlugin_Line::END_ID()); + } else if (aAdaptor.GetType() == GeomAbs_Circle) { + if (aAdaptor.IsClosed()) { + // Create circle + aMyFeature = theSketch->addFeature(SketchPlugin_Circle::ID()); + //gp_Circ aCirc = aAdaptor.Circle(); + //gp_Pnt aCenter = aCirc.Location(); + + //double aX, aY; + //convertTo2D(aCenter, theSketch, aNullView, aX, aY); + //setFeaturePoint(myFeature, aX, aY, SketchPlugin_Circle::CENTER_ID()); + //setFeatureValue(myFeature, aCirc.Radius(), SketchPlugin_Circle::RADIUS_ID()); + } else { + // Create arc + aMyFeature = theSketch->addFeature(SketchPlugin_Arc::ID()); + } + } + if (aMyFeature) { + DataPtr aData = aMyFeature->data(); + AttributeSelectionPtr anAttr = + boost::dynamic_pointer_cast + (aData->attribute(SketchPlugin_Feature::EXTERNAL_ID())); + + ResultPtr aRes = boost::dynamic_pointer_cast(thePrs.object()); + if (anAttr && aRes) { + boost::shared_ptr anEdge(new GeomAPI_Shape); + anEdge->setImpl(new TopoDS_Shape(aShape)); + + anAttr->setValue(aRes, anEdge); + aMyFeature->execute(); + return aMyFeature->lastResult(); + } + } + return ResultPtr(); +} + +bool PartSet_Tools::isContainPresentation(const QList& theSelected, + const ModuleBase_ViewerPrs& thePrs) +{ + foreach (ModuleBase_ViewerPrs aPrs, theSelected) { + if (aPrs.object() == thePrs.object()) + return true; + } + return false; +}