X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Tools.cpp;h=de6b4bdea529999a760bf98fbd6bbf262f09a2d3;hb=904e1f50449d938d2a2494d8f76abfd0c91364f9;hp=6495c3ce9da85724a5727a442234f72e4c889b46;hpb=2d377b25bd785a251e6a57064a4bfd88c60d2468;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index 6495c3ce9..de6b4bdea 100755 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -17,6 +17,8 @@ #include #include +#include + #include #include @@ -156,7 +158,7 @@ Handle(V3d_View) theView, theY = aVec.X() * anY->x() + aVec.Y() * anY->y() + aVec.Z() * anY->z(); } -std::shared_ptr PartSet_Tools::convertTo2D(FeaturePtr theSketch, +std::shared_ptr PartSet_Tools::convertTo2D(FeaturePtr theSketch, const std::shared_ptr& thePnt) { std::shared_ptr aRes; @@ -173,7 +175,8 @@ std::shared_ptr PartSet_Tools::convertTo2D(FeaturePtr theSketch, } -std::shared_ptr PartSet_Tools::convertTo3D(const double theX, const double theY, FeaturePtr theSketch) +std::shared_ptr PartSet_Tools::convertTo3D(const double theX, const double theY, + FeaturePtr theSketch) { std::shared_ptr aData = theSketch->data(); @@ -185,7 +188,7 @@ std::shared_ptr PartSet_Tools::convertTo3D(const double theX, const aData->attribute(SketchPlugin_Sketch::NORM_ID())); std::shared_ptr aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir()))); - std::shared_ptr aPnt2d = + std::shared_ptr aPnt2d = std::shared_ptr(new GeomAPI_Pnt2d(theX, theY)); return aPnt2d->to3D(aC->pnt(), aX->dir(), aY); @@ -324,8 +327,9 @@ std::shared_ptr PartSet_Tools::findFirstEqualPointInArgumen return aFeaturePoint; } -std::shared_ptr PartSet_Tools::findFirstEqualPoint(const FeaturePtr& theFeature, - const std::shared_ptr& thePoint) +std::shared_ptr PartSet_Tools::findFirstEqualPoint( + const FeaturePtr& theFeature, + const std::shared_ptr& thePoint) { std::shared_ptr aFPoint; @@ -337,7 +341,7 @@ std::shared_ptr PartSet_Tools::findFirstEqualPoint(const Fe ModelAPI_ValidatorsFactory* aValidators = ModelAPI_Session::get()->validators(); for (; anIt != aLast && !aFPoint; anIt++) { - std::shared_ptr aCurPoint = + std::shared_ptr aCurPoint = std::dynamic_pointer_cast(*anIt); if (aCurPoint && aCurPoint->isInitialized() && aValidators->isCase(theFeature, aCurPoint->id()) && @@ -384,7 +388,7 @@ void PartSet_Tools::setConstraints(CompositeFeaturePtr theSketch, FeaturePtr the std::list > anAttiributes; for (; anIt != aLast; anIt++) { FeaturePtr aFeature = std::dynamic_pointer_cast(*anIt); - if (!aFeature.get() || theFeature == aFeature) + if (!aFeature.get() || (theFeature == aFeature) || (aFeaturePoint->owner() == aFeature)) continue; std::shared_ptr aFPoint = PartSet_Tools::findFirstEqualPoint(aFeature, aClickedPoint); @@ -447,8 +451,8 @@ ResultPtr PartSet_Tools::findFixedObjectByExternal(const TopoDS_Shape& theShape, return aResult; } -ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShape, - const ObjectPtr& theObject, +ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShape, + const ObjectPtr& theObject, CompositeFeaturePtr theSketch, const bool theTemporary) { @@ -472,10 +476,12 @@ ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShap std::shared_ptr aPnt2d2 = convertTo2D(theSketch, aPnt2); std::shared_ptr aData = aMyFeature->data(); - std::shared_ptr aPoint1 = - std::dynamic_pointer_cast(aData->attribute(SketchPlugin_Line::START_ID())); - std::shared_ptr aPoint2 = - std::dynamic_pointer_cast(aData->attribute(SketchPlugin_Line::END_ID())); + std::shared_ptr aPoint1 = + std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::START_ID())); + std::shared_ptr aPoint2 = + std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::END_ID())); aPoint1->setValue(aPnt2d1); aPoint2->setValue(aPnt2d2); @@ -500,6 +506,8 @@ ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShap if (anEdge->isArc()) { // Create arc aMyFeature = theSketch->addFeature(SketchPlugin_Arc::ID()); + if (theShape.Orientation() == TopAbs_REVERSED) + aMyFeature->boolean(SketchPlugin_Arc::INVERSED_ID())->setValue(true); } else { // Create circle @@ -508,19 +516,20 @@ ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShap } if (aMyFeature) { DataPtr aData = aMyFeature->data(); - AttributeSelectionPtr anAttr = + AttributeSelectionPtr anAttr = std::dynamic_pointer_cast (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); ResultPtr aRes = std::dynamic_pointer_cast(theObject); // selection shape has no result owner => the trihedron axis - // TODO: make reference to the real axes when they are implemented in the initialization plugin + // TODO: make reference to the real axes when + // they are implemented in the initialization plugin if (!aRes.get()) { ObjectPtr aPointObj = ModelAPI_Session::get()->moduleDocument()->objectByName( ModelAPI_ResultConstruction::group(), "Origin"); if (aPointObj.get()) { // if initialization plugin performed well aRes = std::dynamic_pointer_cast(aPointObj); - } + } } if (!aRes.get()) { aRes = aMyFeature->firstResult(); @@ -537,6 +546,8 @@ ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShap FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID()); aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())-> setObject(aMyFeature->lastResult()); + // we need to flush created signal in order to fixed constraint is processed by solver + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); //} return aMyFeature->lastResult(); } @@ -547,35 +558,37 @@ ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShap if (aMyFeature) { DataPtr aData = aMyFeature->data(); - AttributeSelectionPtr anAttr = + AttributeSelectionPtr anAttr = std::dynamic_pointer_cast (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); ResultPtr aRes = std::dynamic_pointer_cast(theObject); - // if there is no object, it means that this is the origin point: search it in the module document + // if there is no object, + // it means that this is the origin point: search it in the module document if (!aRes.get()) { ObjectPtr aPointObj = ModelAPI_Session::get()->moduleDocument()->objectByName( ModelAPI_ResultConstruction::group(), "Origin"); if (aPointObj.get()) { // if initialization plugin performed well aRes = std::dynamic_pointer_cast(aPointObj); - } + } } // reference to itself with name "Origin" (but this may cause the infinitive cycling) if (!aRes.get()) { // If the point is selected not from Result object - std::shared_ptr aShape = + std::shared_ptr aShape = std::shared_ptr(new GeomAPI_Shape()); aShape->setImpl(new TopoDS_Shape(theShape)); - std::shared_ptr aVertex = + std::shared_ptr aVertex = std::shared_ptr(new GeomAPI_Vertex(aShape)); std::shared_ptr aPnt = aVertex->point(); std::shared_ptr aPnt2d = convertTo2D(theSketch, aPnt); - std::shared_ptr aPoint = - std::dynamic_pointer_cast(aData->attribute(SketchPlugin_Point::COORD_ID())); + std::shared_ptr aPoint = + std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Point::COORD_ID())); aPoint->setValue(aPnt2d); - if ((aPnt->x() < Precision::Confusion()) && + if ((aPnt->x() < Precision::Confusion()) && (aPnt->y() < Precision::Confusion()) && (aPnt->z() < Precision::Confusion())) aData->setName("Origin"); @@ -595,6 +608,8 @@ ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShap FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID()); aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())-> setObject(aMyFeature->lastResult()); + // we need to flush created signal in order to fixed constraint is processed by solver + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); //} return aMyFeature->lastResult(); } @@ -613,18 +628,20 @@ bool PartSet_Tools::isContainPresentation(const QList& return false; } -ResultPtr PartSet_Tools::findExternalEdge(CompositeFeaturePtr theSketch, std::shared_ptr theEdge) +ResultPtr PartSet_Tools::findExternalEdge(CompositeFeaturePtr theSketch, + std::shared_ptr theEdge) { for (int i = 0; i < theSketch->numberOfSubs(); i++) { FeaturePtr aFeature = theSketch->subFeature(i); - std::shared_ptr aSketchFea = + std::shared_ptr aSketchFea = std::dynamic_pointer_cast(aFeature); - if (aSketchFea) { + // not displayed result of feature projection should not be returned as external edge + if (aSketchFea && aSketchFea->canBeDisplayed()) { if (aSketchFea->isExternal()) { std::list aResults = aSketchFea->results(); std::list::const_iterator aIt; for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - ResultConstructionPtr aRes = + ResultConstructionPtr aRes = std::dynamic_pointer_cast(*aIt); if (aRes) { std::shared_ptr aShape = aRes->shape(); @@ -641,18 +658,19 @@ ResultPtr PartSet_Tools::findExternalEdge(CompositeFeaturePtr theSketch, std::sh } -ResultPtr PartSet_Tools::findExternalVertex(CompositeFeaturePtr theSketch, std::shared_ptr theVert) +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::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 = + ResultConstructionPtr aRes = std::dynamic_pointer_cast(*aIt); if (aRes) { std::shared_ptr aShape = aRes->shape(); @@ -670,7 +688,7 @@ ResultPtr PartSet_Tools::findExternalVertex(CompositeFeaturePtr theSketch, std:: bool PartSet_Tools::hasVertexShape(const ModuleBase_ViewerPrsPtr& thePrs, FeaturePtr theSketch, - Handle_V3d_View theView, double& theX, double& theY) + Handle(V3d_View) theView, double& theX, double& theY) { bool aHasVertex = false; @@ -737,35 +755,20 @@ GeomShapePtr PartSet_Tools::findShapeBy2DPoint(const AttributePtr& theAttribute, return aShape; } -std::shared_ptr PartSet_Tools::getPoint(std::shared_ptr& theFeature, - const std::string& theAttribute) +std::shared_ptr PartSet_Tools::getPoint( + std::shared_ptr& theFeature, + const std::string& theAttribute) { - std::shared_ptr aPointAttr; - - if (!theFeature->data()) - return std::shared_ptr(); - - FeaturePtr aFeature; - std::shared_ptr anAttr = std::dynamic_pointer_cast< - ModelAPI_AttributeRefAttr>(theFeature->data()->attribute(theAttribute)); - if (!anAttr) - return std::shared_ptr(); - - aFeature = ModelAPI_Feature::feature(anAttr->object()); - - if (aFeature && aFeature->getKind() == SketchPlugin_Point::ID()) - aPointAttr = std::dynamic_pointer_cast( - aFeature->data()->attribute(SketchPlugin_Point::COORD_ID())); - - else if (anAttr->attr()) { - aPointAttr = std::dynamic_pointer_cast(anAttr->attr()); - } + std::shared_ptr aPointAttr = ModelGeomAlgo_Point2D::getPointOfRefAttr( + theFeature.get(), theAttribute, SketchPlugin_Point::ID(), + SketchPlugin_Point::COORD_ID()); if (aPointAttr.get() != NULL) return aPointAttr->pnt(); return std::shared_ptr(); } -FeaturePtr findFirstCoincidenceByData(const DataPtr& theData, std::shared_ptr thePoint) +FeaturePtr findFirstCoincidenceByData(const DataPtr& theData, + std::shared_ptr thePoint) { FeaturePtr aCoincident; @@ -774,16 +777,16 @@ FeaturePtr findFirstCoincidenceByData(const DataPtr& theData, std::shared_ptr aAttr = (*aIt); FeaturePtr aConstrFeature = std::dynamic_pointer_cast(aAttr->owner()); - if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { - std::shared_ptr a2dPnt = + if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { + std::shared_ptr a2dPnt = PartSet_Tools::getPoint(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A()); - if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { + if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { aCoincident = aConstrFeature; break; } else { a2dPnt = PartSet_Tools::getPoint(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_B()); - if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { + if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { aCoincident = aConstrFeature; break; } @@ -805,16 +808,16 @@ FeaturePtr PartSet_Tools::findFirstCoincidence(const FeaturePtr& theFeature, for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) { std::shared_ptr aAttr = (*aIt); FeaturePtr aConstrFeature = std::dynamic_pointer_cast(aAttr->owner()); - if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { - std::shared_ptr a2dPnt = + if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { + std::shared_ptr a2dPnt = PartSet_Tools::getPoint(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A()); - if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { + if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { aCoincident = aConstrFeature; break; } else { a2dPnt = PartSet_Tools::getPoint(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_B()); - if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { + if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { aCoincident = aConstrFeature; break; } @@ -844,7 +847,7 @@ void PartSet_Tools::findCoincidences(FeaturePtr theStartCoin, QList& return; AttributeRefAttrPtr aPnt = theStartCoin->refattr(theAttr); - if (!aPnt) + if (!aPnt) return; ObjectPtr aObj = aPnt->object(); FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); @@ -857,13 +860,13 @@ void PartSet_Tools::findCoincidences(FeaturePtr theStartCoin, QList& for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) { std::shared_ptr aAttr = (*aIt); FeaturePtr aConstrFeature = std::dynamic_pointer_cast(aAttr->owner()); - if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { + if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { if (!theCoincidencies.contains(aConstrFeature)) { std::shared_ptr aPnt = getCoincedencePoint(aConstrFeature); if (aPnt.get() && aOrig->isEqual(aPnt)) { - findCoincidences(aConstrFeature, theList, theCoincidencies, + findCoincidences(aConstrFeature, theList, theCoincidencies, SketchPlugin_ConstraintCoincidence::ENTITY_A()); - findCoincidences(aConstrFeature, theList, theCoincidencies, + findCoincidences(aConstrFeature, theList, theCoincidencies, SketchPlugin_ConstraintCoincidence::ENTITY_B()); } } @@ -875,7 +878,7 @@ void PartSet_Tools::findCoincidences(FeaturePtr theStartCoin, QList& ResultConstructionPtr aResult = std::dynamic_pointer_cast(aObj); if (aResult.get()) { FeaturePtr aFeature = ModelAPI_Feature::feature(aPnt->object()); - if (!theList.contains(aFeature)) + if (!theList.contains(aFeature)) theList.append(aFeature); theCoincidencies.append(theStartCoin); @@ -884,13 +887,13 @@ void PartSet_Tools::findCoincidences(FeaturePtr theStartCoin, QList& for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) { std::shared_ptr aAttr = (*aIt); FeaturePtr aConstrFeature = std::dynamic_pointer_cast(aAttr->owner()); - if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { + if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { if (!theCoincidencies.contains(aConstrFeature)) { std::shared_ptr aPnt = getCoincedencePoint(aConstrFeature); if (aPnt.get() && aOrig->isEqual(aPnt)) { - findCoincidences(aConstrFeature, theList, theCoincidencies, + findCoincidences(aConstrFeature, theList, theCoincidencies, SketchPlugin_ConstraintCoincidence::ENTITY_A()); - findCoincidences(aConstrFeature, theList, theCoincidencies, + findCoincidences(aConstrFeature, theList, theCoincidencies, SketchPlugin_ConstraintCoincidence::ENTITY_B()); } } @@ -902,15 +905,15 @@ void PartSet_Tools::findCoincidences(FeaturePtr theStartCoin, QList& std::shared_ptr PartSet_Tools::getCoincedencePoint(FeaturePtr theStartCoin) { - std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), - SketchPlugin_Constraint::ENTITY_A()); + std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), + SketchPlugin_Constraint::ENTITY_A()); if (aPnt.get() == NULL) aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), SketchPlugin_Constraint::ENTITY_B()); return aPnt; } -AttributePtr PartSet_Tools::findAttributeBy2dPoint(ObjectPtr theObj, - const TopoDS_Shape theShape, +AttributePtr PartSet_Tools::findAttributeBy2dPoint(ObjectPtr theObj, + const TopoDS_Shape theShape, FeaturePtr theSketch) { @@ -925,15 +928,18 @@ AttributePtr PartSet_Tools::findAttributeBy2dPoint(ObjectPtr theObj, new GeomAPI_Pnt(aPoint.X(), aPoint.Y(), aPoint.Z())); // find the given point in the feature attributes - std::list anAttiributes = + std::list anAttiributes = aFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); - std::list::const_iterator anIt = anAttiributes.begin(), + std::list::const_iterator anIt = anAttiributes.begin(), aLast = anAttiributes.end(); for (; anIt != aLast && !anAttribute; anIt++) { - std::shared_ptr aCurPoint = + std::shared_ptr aCurPoint = std::dynamic_pointer_cast(*anIt); + if (!aCurPoint->isInitialized()) + continue; - std::shared_ptr aPnt = convertTo3D(aCurPoint->x(), aCurPoint->y(), theSketch); + std::shared_ptr aPnt = + convertTo3D(aCurPoint->x(), aCurPoint->y(), theSketch); if (aPnt && (aPnt->distance(aValue) < Precision::Confusion())) { anAttribute = aCurPoint; break;