From 54bfbc5d59f5573d54cf0479057d7f66ae54fc10 Mon Sep 17 00:00:00 2001 From: vsv Date: Wed, 5 Sep 2018 17:18:54 +0300 Subject: [PATCH] Issue #2619: Show specific coincidence presentation for point/line connection --- src/PartSet/PartSet_Module.cpp | 7 ++- src/SketcherPrs/SketcherPrs_Coincident.cpp | 67 +++++++++++++++++++--- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 544d4b5c5..cd4512562 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -47,6 +47,8 @@ #include #include +#include + #include #include #include @@ -1089,7 +1091,10 @@ void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) } if (aToUseZLayer) { Handle(AIS_InteractiveContext) aCtx = anAIS->GetContext(); - aCtx->SetZLayer(anAIS, myVisualLayerId); + if (aFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) + aCtx->SetZLayer(anAIS, Graphic3d_ZLayerId_Top); + else + aCtx->SetZLayer(anAIS, myVisualLayerId); } } } diff --git a/src/SketcherPrs/SketcherPrs_Coincident.cpp b/src/SketcherPrs/SketcherPrs_Coincident.cpp index 9e4c24723..684065e0a 100644 --- a/src/SketcherPrs/SketcherPrs_Coincident.cpp +++ b/src/SketcherPrs/SketcherPrs_Coincident.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -59,17 +60,24 @@ bool SketcherPrs_Coincident::IsReadyToDisplay(ModelAPI_Feature* theConstraint, return readyToDisplay(theConstraint, thePlane, aPoint); } +std::shared_ptr getCoincidencePoint(ModelAPI_Feature* theConstraint) +{ + std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(theConstraint, + SketchPlugin_Constraint::ENTITY_A()); + if (aPnt.get() == NULL) + aPnt = SketcherPrs_Tools::getPoint(theConstraint, SketchPlugin_Constraint::ENTITY_B()); + + return aPnt; +} + + bool SketcherPrs_Coincident::readyToDisplay(ModelAPI_Feature* theConstraint, const std::shared_ptr& thePlane, gp_Pnt& thePoint) { bool aReadyToDisplay = false; // Get point of the presentation - std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(theConstraint, - SketchPlugin_Constraint::ENTITY_A()); - if (aPnt.get() == NULL) - aPnt = SketcherPrs_Tools::getPoint(theConstraint, SketchPlugin_Constraint::ENTITY_B()); - + std::shared_ptr aPnt = getCoincidencePoint(theConstraint); aReadyToDisplay = aPnt.get() != NULL; if (aReadyToDisplay) { std::shared_ptr aPoint = thePlane->to3D(aPnt->x(), aPnt->y()); @@ -79,6 +87,28 @@ bool SketcherPrs_Coincident::readyToDisplay(ModelAPI_Feature* theConstraint, } +bool hasEdge(ModelAPI_Feature* theConstraint) +{ + ObjectPtr aObjA = + SketcherPrs_Tools::getResult(theConstraint, SketchPlugin_Constraint::ENTITY_A()); + ObjectPtr aObjB = + SketcherPrs_Tools::getResult(theConstraint, SketchPlugin_Constraint::ENTITY_B()); + ResultPtr aResA = std::dynamic_pointer_cast(aObjA); + ResultPtr aResB = std::dynamic_pointer_cast(aObjB); + if (aResA.get()) { + GeomAPI_Shape::ShapeType aTypeA = aResA->shape()->shapeType(); + if (aTypeA == GeomAPI_Shape::EDGE) + return true; + } + if (aResB.get()) { + GeomAPI_Shape::ShapeType aTypeB = aResB->shape()->shapeType(); + if (aTypeB == GeomAPI_Shape::EDGE) + return true; + } + return false; +} + + void SketcherPrs_Coincident::Compute( const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, const Handle(Prs3d_Presentation)& thePresentation, @@ -89,13 +119,34 @@ void SketcherPrs_Coincident::Compute( if (aReadyToDisplay) myPoint = aPoint; + bool aIsEdge = hasEdge(myConstraint); + if (!aIsEdge) { + std::shared_ptr aPnt = getCoincidencePoint(myConstraint); + std::shared_ptr aP; + FeaturePtr aSub; + for (int i = 0; i < mySketch->numberOfSubs(); i++) { + aSub = mySketch->subFeature(i); + if (aSub->getKind() == SketchPlugin_ConstraintCoincidence::ID() && + aSub.get() != myConstraint) { + aP = getCoincidencePoint(aSub.get()); + if (aP->isEqual(aPnt)) { + aIsEdge = hasEdge(aSub.get()); + if (aIsEdge) + break; + } + } + } + } + Quantity_Color aExternalColor = aIsEdge ? Quantity_NOC_BLACK : Quantity_NOC_YELLOW; + Quantity_Color aInternalColor = aIsEdge ? Quantity_NOC_YELLOW : Quantity_NOC_BLACK; + // Create the presentation as a combination of standard point markers bool aCustomColor = myIsCustomColor; // The external yellow contour Handle(Graphic3d_AspectMarker3d) aPtA = new Graphic3d_AspectMarker3d(); aPtA->SetType(Aspect_TOM_RING3); aPtA->SetScale(2.); - aPtA->SetColor(!aCustomColor ? Quantity_NOC_YELLOW : myCustomColor); + aPtA->SetColor(!aCustomColor ? aExternalColor : myCustomColor); Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(thePresentation); aGroup->SetPrimitivesAspect(aPtA); @@ -107,7 +158,7 @@ void SketcherPrs_Coincident::Compute( aPtA = new Graphic3d_AspectMarker3d(); aPtA->SetType(Aspect_TOM_RING1); aPtA->SetScale(1.); - aPtA->SetColor(!aCustomColor ? Quantity_NOC_BLACK : myCustomColor); + aPtA->SetColor(!aCustomColor ? aInternalColor : myCustomColor); aGroup->SetPrimitivesAspect(aPtA); aGroup->AddPrimitiveArray (aPntArray); @@ -115,7 +166,7 @@ void SketcherPrs_Coincident::Compute( aPtA = new Graphic3d_AspectMarker3d(); aPtA->SetType(Aspect_TOM_POINT); aPtA->SetScale(5.); - aPtA->SetColor(!aCustomColor ? Quantity_NOC_BLACK : myCustomColor); + aPtA->SetColor(!aCustomColor ? aInternalColor : myCustomColor); aGroup->SetPrimitivesAspect(aPtA); aGroup->AddPrimitiveArray (aPntArray); -- 2.39.2