X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Tools.cpp;h=82675355b292f78aeec6255f5ac6ad880d81757a;hb=04f3d16c5347e2dd849add526fa1997d09d2f7e5;hp=c97b6c68f2b55fd192de55fdc44544f80539c36f;hpb=4783f146b71a48c651523fcf0e12367bcf3d1fa8;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index c97b6c68f..82675355b 100644 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: PartSet_Tools.h // Created: 28 Apr 2014 // Author: Natalia ERMOLAEVA @@ -18,6 +20,7 @@ #include #include #include +#include #include #include @@ -33,6 +36,7 @@ #include #include #include +#include #include @@ -95,8 +99,9 @@ Handle(V3d_View) theView, std::shared_ptr aX = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Sketch::DIRX_ID())); - std::shared_ptr anY = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Sketch::DIRY_ID())); + std::shared_ptr aNorm = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); + std::shared_ptr anY = aNorm->xyz()->cross(aX->xyz()); gp_Pnt anOriginPnt(anOrigin->x(), anOrigin->y(), anOrigin->z()); gp_Vec aVec(anOriginPnt, thePoint); @@ -126,26 +131,22 @@ Handle(V3d_View) theView, 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, - gp_Pnt& thePoint) +std::shared_ptr PartSet_Tools::convertTo3D(const double theX, const double theY, FeaturePtr theSketch) { - if (!theSketch) - return; - std::shared_ptr aData = theSketch->data(); std::shared_ptr aC = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); std::shared_ptr aX = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Sketch::DIRX_ID())); - std::shared_ptr aY = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Sketch::DIRY_ID())); + std::shared_ptr aNorm = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); + std::shared_ptr aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir()))); - std::shared_ptr aSum = aC->pnt()->xyz()->added(aX->dir()->xyz()->multiplied(theX)) - ->added(aY->dir()->xyz()->multiplied(theY)); + std::shared_ptr aPnt2d = + std::shared_ptr(new GeomAPI_Pnt2d(theX, theY)); - std::shared_ptr aPoint = std::shared_ptr(new GeomAPI_Pnt(aSum)); - thePoint = gp_Pnt(aPoint->x(), aPoint->y(), aPoint->z()); + return aPnt2d->to3D(aC->pnt(), aX->dir(), aY); } ObjectPtr PartSet_Tools::nearestFeature(QPoint thePoint, Handle_V3d_View theView, @@ -221,7 +222,7 @@ std::shared_ptr PartSet_Tools::getFeaturePoint(FeaturePtr t std::shared_ptr aClickedPoint = std::shared_ptr( new GeomAPI_Pnt2d(theX, theY)); std::list > anAttiributes = - theFeature->data()->attributes(GeomDataAPI_Point2D::type()); + theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); std::list >::const_iterator anIt = anAttiributes.begin(), aLast = anAttiributes.end(); std::shared_ptr aFPoint; @@ -309,6 +310,35 @@ void PartSet_Tools::createConstraint(CompositeFeaturePtr theSketch, aFeature->execute(); } +std::shared_ptr PartSet_Tools:: + findAttributePoint(CompositeFeaturePtr theSketch, double theX, double theY, + double theTolerance, const QList& theIgnore) +{ + std::shared_ptr aClickedPoint = std::shared_ptr( + new GeomAPI_Pnt2d(theX, theY)); + + std::list > anAttiributes; + for (int i = 0; i < theSketch->numberOfSubs(); i++) { + FeaturePtr aFeature = theSketch->subFeature(i); + if (!theIgnore.contains(aFeature)) { + anAttiributes = aFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + + std::list >::const_iterator anIt; + for (anIt = anAttiributes.cbegin(); anIt != anAttiributes.cend(); ++anIt) { + std::shared_ptr aCurPoint = + std::dynamic_pointer_cast(*anIt); + double x = aCurPoint->x(); + double y = aCurPoint->y(); + if (aCurPoint && (aCurPoint->pnt()->distance(aClickedPoint) < theTolerance)) { + return aCurPoint; + } + } + } + } + return std::shared_ptr(); +} + + void PartSet_Tools::setConstraints(CompositeFeaturePtr theSketch, FeaturePtr theFeature, const std::string& theAttribute, double theClickedX, double theClickedY) @@ -333,16 +363,20 @@ void PartSet_Tools::setConstraints(CompositeFeaturePtr theSketch, FeaturePtr the new GeomAPI_Pnt2d(theClickedX, theClickedY)); for (; anIt != aLast; anIt++) { FeaturePtr aFeature = std::dynamic_pointer_cast(*anIt); + if (theFeature == aFeature) + continue; // find the given point in the feature attributes - anAttiributes = aFeature->data()->attributes(GeomDataAPI_Point2D::type()); + anAttiributes = aFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); std::list >::const_iterator anIt = anAttiributes.begin(), aLast = anAttiributes.end(); std::shared_ptr aFPoint; for (; anIt != aLast && !aFPoint; anIt++) { - std::shared_ptr aCurPoint = std::dynamic_pointer_cast< - GeomDataAPI_Point2D>(*anIt); - if (aCurPoint && aCurPoint->pnt()->distance(aClickedPoint) < Precision::Confusion()) + std::shared_ptr aCurPoint = + std::dynamic_pointer_cast(*anIt); + if (aCurPoint && (aCurPoint->pnt()->distance(aClickedPoint) < Precision::Confusion())) { aFPoint = aCurPoint; + break; + } } if (aFPoint) PartSet_Tools::createConstraint(theSketch, aFPoint, aFeaturePoint); @@ -352,19 +386,29 @@ void PartSet_Tools::setConstraints(CompositeFeaturePtr theSketch, FeaturePtr the std::shared_ptr PartSet_Tools::sketchPlane(CompositeFeaturePtr theSketch) { std::shared_ptr aPlane; - double aA, aB, aC, aD; std::shared_ptr aData = theSketch->data(); - std::shared_ptr anOrigin = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - std::shared_ptr aNormal = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Sketch::NORM_ID())); - aA = aNormal->x(); - aB = aNormal->y(); - aC = aNormal->z(); - aD = 0; - - aPlane = std::shared_ptr(new GeomAPI_Pln(aA, aB, aC, aD)); + if (aData) { + std::shared_ptr anOrigin = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aNormal = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); + if (aNormal && anOrigin) { + double adX = aNormal->x(); + double adY = aNormal->y(); + double adZ = aNormal->z(); + + if ( (adX != 0) || (adY != 0) || (adZ != 0) ) { // Plane is valid + double aX = anOrigin->x(); + double aY = anOrigin->y(); + double aZ = anOrigin->z(); + gp_Pln aPln(gp_Pnt(aX, aY, aZ), gp_Dir(adX, adY, adZ)); + double aA, aB, aC, aD; + aPln.Coefficients(aA, aB, aC, aD); + aPlane = std::shared_ptr(new GeomAPI_Pln(aA, aB, aC, aD)); + } + } + } return aPlane; } @@ -375,97 +419,108 @@ std::shared_ptr PartSet_Tools::point3D(std::shared_ptrdata(); std::shared_ptr aC = std::dynamic_pointer_cast( - theSketch->data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); std::shared_ptr aX = std::dynamic_pointer_cast( - theSketch->data()->attribute(SketchPlugin_Sketch::DIRX_ID())); - std::shared_ptr aY = std::dynamic_pointer_cast( - theSketch->data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + aData->attribute(SketchPlugin_Sketch::DIRX_ID())); + std::shared_ptr aNorm = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); + std::shared_ptr aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir()))); - return thePoint2D->to3D(aC->pnt(), aX->dir(), aY->dir()); + return thePoint2D->to3D(aC->pnt(), aX->dir(), aY); } -bool PartSet_Tools::isConstraintFeature(const std::string& theKind) +ResultPtr PartSet_Tools::findFixedObjectByExternal(const TopoDS_Shape& theShape, + const ObjectPtr& theObject, + CompositeFeaturePtr theSketch) { - return theKind == SketchPlugin_ConstraintDistance::ID() - || theKind == SketchPlugin_ConstraintLength::ID() - || theKind == SketchPlugin_ConstraintRadius::ID() - || theKind == SketchPlugin_ConstraintRigid::ID(); + ResultPtr aResult; + if (theShape.ShapeType() == TopAbs_EDGE) { + // Check that we already have such external edge + std::shared_ptr aInEdge = std::shared_ptr(new GeomAPI_Edge()); + aInEdge->setImpl(new TopoDS_Shape(theShape)); + aResult = findExternalEdge(theSketch, aInEdge); + } + if (theShape.ShapeType() == TopAbs_VERTEX) { + std::shared_ptr aInVert = std::shared_ptr(new GeomAPI_Vertex()); + aInVert->setImpl(new TopoDS_Shape(theShape)); + aResult = findExternalVertex(theSketch, aInVert); + } + return aResult; } -ResultPtr PartSet_Tools::createFixedObjectByEdge(const ModuleBase_ViewerPrs& thePrs, CompositeFeaturePtr theSketch) +ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShape, + const ObjectPtr& theObject, + CompositeFeaturePtr theSketch) { - TopoDS_Shape aShape = thePrs.shape(); - if (aShape.ShapeType() != TopAbs_EDGE) - return ResultPtr(); - - // Check that we already have such external edge - std::shared_ptr aInEdge = std::shared_ptr(new GeomAPI_Edge()); - aInEdge->setImpl(new TopoDS_Shape(aShape)); - ResultPtr aResult = findExternalEdge(theSketch, aInEdge); - if (aResult) - return aResult; - - // If not found then we have to create new - 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(); - //std::shared_ptr anEndAttr = - // std::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 (theShape.ShapeType() == TopAbs_EDGE) { + Standard_Real aStart, aEnd; + Handle(V3d_View) aNullView; + FeaturePtr aMyFeature; + + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(theShape), aStart, aEnd); + GeomAdaptor_Curve aAdaptor(aCurve); + if (aAdaptor.GetType() == GeomAbs_Line) { + // Create line + aMyFeature = theSketch->addFeature(SketchPlugin_Line::ID()); + } else if (aAdaptor.GetType() == GeomAbs_Circle) { + if (aAdaptor.IsClosed()) { + // Create circle + aMyFeature = theSketch->addFeature(SketchPlugin_Circle::ID()); + } else { + // Create arc + aMyFeature = theSketch->addFeature(SketchPlugin_Arc::ID()); + } + } + if (aMyFeature) { + DataPtr aData = aMyFeature->data(); + AttributeSelectionPtr anAttr = + std::dynamic_pointer_cast + (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + + ResultPtr aRes = std::dynamic_pointer_cast(theObject); + if (anAttr && aRes) { + std::shared_ptr anEdge(new GeomAPI_Shape); + anEdge->setImpl(new TopoDS_Shape(theShape)); + + anAttr->setValue(aRes, anEdge); + + aMyFeature->execute(); + + // fix this edge + FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID()); + aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())-> + setObject(aMyFeature->lastResult()); + + return aMyFeature->lastResult(); + } } } - if (aMyFeature) { - DataPtr aData = aMyFeature->data(); - AttributeSelectionPtr anAttr = - std::dynamic_pointer_cast - (aData->attribute(SketchPlugin_Feature::EXTERNAL_ID())); + if (theShape.ShapeType() == TopAbs_VERTEX) { + FeaturePtr aMyFeature = theSketch->addFeature(SketchPlugin_Point::ID()); - ResultPtr aRes = std::dynamic_pointer_cast(thePrs.object()); - if (anAttr && aRes) { - std::shared_ptr anEdge(new GeomAPI_Shape); - anEdge->setImpl(new TopoDS_Shape(aShape)); + if (aMyFeature) { + DataPtr aData = aMyFeature->data(); + AttributeSelectionPtr anAttr = + std::dynamic_pointer_cast + (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); - anAttr->setValue(aRes, anEdge); + ResultPtr aRes = std::dynamic_pointer_cast(theObject); + if (anAttr && aRes) { + std::shared_ptr aVert(new GeomAPI_Shape); + aVert->setImpl(new TopoDS_Shape(theShape)); - aMyFeature->execute(); + anAttr->setValue(aRes, aVert); + aMyFeature->execute(); - // fix this edge - FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID()); - aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())-> - setObject(aMyFeature->lastResult()); + // fix this edge + FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID()); + aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())-> + setObject(aMyFeature->lastResult()); - return aMyFeature->lastResult(); + return aMyFeature->lastResult(); + } } } return ResultPtr(); @@ -508,6 +563,35 @@ ResultPtr PartSet_Tools::findExternalEdge(CompositeFeaturePtr theSketch, std::sh return ResultPtr(); } + +ResultPtr PartSet_Tools::findExternalVertex(CompositeFeaturePtr theSketch, std::shared_ptr theVert) +{ + for (int i = 0; i < theSketch->numberOfSubs(); i++) { + FeaturePtr aFeature = theSketch->subFeature(i); + std::shared_ptr aSketchFea = + std::dynamic_pointer_cast(aFeature); + if (aSketchFea) { + if (aSketchFea->isExternal()) { + std::list aResults = aSketchFea->results(); + std::list::const_iterator aIt; + for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { + ResultConstructionPtr aRes = + std::dynamic_pointer_cast(*aIt); + if (aRes) { + std::shared_ptr aShape = aRes->shape(); + if (aShape) { + if (theVert->isEqual(aShape)) + return aRes; + } + } + } + } + } + } + return ResultPtr(); +} + + bool PartSet_Tools::hasVertexShape(const ModuleBase_ViewerPrs& thePrs, FeaturePtr theSketch, Handle_V3d_View theView, double& theX, double& theY) { @@ -527,3 +611,39 @@ bool PartSet_Tools::hasVertexShape(const ModuleBase_ViewerPrs& thePrs, FeaturePt return aHasVertex; } + +AttributePtr PartSet_Tools::findAttributeBy2dPoint(ObjectPtr theObj, + const TopoDS_Shape theShape, + FeaturePtr theSketch) +{ + + AttributePtr anAttribute; + FeaturePtr aFeature = ModelAPI_Feature::feature(theObj); + if (aFeature) { + if (theShape.ShapeType() == TopAbs_VERTEX) { + const TopoDS_Vertex& aVertex = TopoDS::Vertex(theShape); + if (!aVertex.IsNull()) { + gp_Pnt aPoint = BRep_Tool::Pnt(aVertex); + std::shared_ptr aValue = std::shared_ptr( + new GeomAPI_Pnt(aPoint.X(), aPoint.Y(), aPoint.Z())); + + // find the given point in the feature attributes + std::list anAttiributes = + aFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + std::list::const_iterator anIt = anAttiributes.begin(), + aLast = anAttiributes.end(); + for (; anIt != aLast && !anAttribute; anIt++) { + std::shared_ptr aCurPoint = + std::dynamic_pointer_cast(*anIt); + + std::shared_ptr aPnt = convertTo3D(aCurPoint->x(), aCurPoint->y(), theSketch); + if (aPnt && (aPnt->distance(aValue) < Precision::Confusion())) { + anAttribute = aCurPoint; + break; + } + } + } + } + } + return anAttribute; +}