X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketcherPrs%2FSketcherPrs_Coincident.cpp;h=381034260f34223394253ea5f811c5f1806ee69d;hb=182de51a49e6bf55fd81d092bbe77034f02f71c3;hp=fc2f3e36aa163cd5b35d2dc28d8efb8f4d74b447;hpb=1e696647e5203fc6f23c7acc9e78a720163a225e;p=modules%2Fshaper.git diff --git a/src/SketcherPrs/SketcherPrs_Coincident.cpp b/src/SketcherPrs/SketcherPrs_Coincident.cpp index fc2f3e36a..381034260 100644 --- a/src/SketcherPrs/SketcherPrs_Coincident.cpp +++ b/src/SketcherPrs/SketcherPrs_Coincident.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "SketcherPrs_Coincident.h" @@ -33,11 +32,12 @@ #include #include +#include +#include #include #include #include -#include #include #include #include @@ -46,10 +46,11 @@ IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_Coincident, AIS_InteractiveObject); SketcherPrs_Coincident::SketcherPrs_Coincident(ModelAPI_Feature* theConstraint, - const std::shared_ptr& thePlane) -: AIS_InteractiveObject(), myConstraint(theConstraint), mySketcherPlane(thePlane), - myPoint(gp_Pnt(0.0, 0.0, 0.0)), myIsCustomColor(false) + SketchPlugin_Sketch* theSketch) +: AIS_InteractiveObject(), myConstraint(theConstraint), mySketch(theSketch), + myPoint(gp_Pnt(0.0, 0.0, 0.0)) { + SetColor(Quantity_NOC_BLACK); } bool SketcherPrs_Coincident::IsReadyToDisplay(ModelAPI_Feature* theConstraint, @@ -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,25 +87,72 @@ 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(PrsMgr_PresentationManager3d)& /*thePresentationManager*/, const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) + const Standard_Integer /*theMode*/) { gp_Pnt aPoint; - bool aReadyToDisplay = readyToDisplay(myConstraint, mySketcherPlane, aPoint); + bool aReadyToDisplay = readyToDisplay(myConstraint, mySketch->coordinatePlane(), aPoint); if (aReadyToDisplay) myPoint = aPoint; + bool aIsEdge = hasEdge(myConstraint); + if (!aIsEdge) { + std::shared_ptr aPnt = getCoincidencePoint(myConstraint); + std::shared_ptr aP; + FeaturePtr aSub; + int aNumberOfSubs = mySketch->numberOfSubs(); + for (int i = 0; i < aNumberOfSubs; i++) { + aSub = mySketch->subFeature(i); + if (aSub->getKind() == SketchPlugin_ConstraintCoincidence::ID() && + aSub.get() != myConstraint) { + aP = getCoincidencePoint(aSub.get()); + if (aP && aP->isEqual(aPnt)) { + aIsEdge = hasEdge(aSub.get()); + if (aIsEdge) + break; + } + } + } + } + Quantity_Color aMainColor; + Color(aMainColor); + Quantity_Color aExternalColor = aIsEdge ? aMainColor : Quantity_NOC_YELLOW; + Quantity_Color aInternalColor = aIsEdge ? Quantity_NOC_YELLOW : aMainColor; + + int aRatio = SketcherPrs_Tools::pixelRatio(); + // 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->SetScale(2. * aRatio); + aPtA->SetColor(aExternalColor); - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(thePresentation); + Handle(Graphic3d_Group) aGroup = thePresentation->CurrentGroup(); aGroup->SetPrimitivesAspect(aPtA); Handle(Graphic3d_ArrayOfPoints) aPntArray = new Graphic3d_ArrayOfPoints(1); aPntArray->AddVertex (myPoint.X(), myPoint.Y(), myPoint.Z()); @@ -105,17 +160,17 @@ void SketcherPrs_Coincident::Compute( // Make a black mid ring aPtA = new Graphic3d_AspectMarker3d(); - aPtA->SetType(Aspect_TOM_RING1); - aPtA->SetScale(1.); - aPtA->SetColor(!aCustomColor ? Quantity_NOC_BLACK : myCustomColor); + aPtA->SetType(aIsEdge ? Aspect_TOM_STAR : Aspect_TOM_RING1); + aPtA->SetScale(1. * aRatio); + aPtA->SetColor(aInternalColor); aGroup->SetPrimitivesAspect(aPtA); aGroup->AddPrimitiveArray (aPntArray); // Make an internal ring aPtA = new Graphic3d_AspectMarker3d(); aPtA->SetType(Aspect_TOM_POINT); - aPtA->SetScale(5.); - aPtA->SetColor(!aCustomColor ? Quantity_NOC_BLACK : myCustomColor); + aPtA->SetScale(5. * aRatio); + aPtA->SetColor(aInternalColor); aGroup->SetPrimitivesAspect(aPtA); aGroup->AddPrimitiveArray (aPntArray); @@ -125,28 +180,8 @@ void SketcherPrs_Coincident::Compute( } -void SketcherPrs_Coincident::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer aMode) +void SketcherPrs_Coincident::ComputeSelection(const Handle(SelectMgr_Selection)& /*theSelection*/, + const Standard_Integer /*theMode*/) { // There is no selection of coincident - a point is selected instead of coincidence } - -void SketcherPrs_Coincident::SetColor(const Quantity_NameOfColor aCol) -{ - SetColor(Quantity_Color(aCol)); -} - -void SketcherPrs_Coincident::SetColor(const Quantity_Color &aCol) -{ - hasOwnColor=Standard_True; -} - -void SketcherPrs_Coincident::SetCustomColor(const std::vector& theColor) -{ - myIsCustomColor = !theColor.empty(); - if (myIsCustomColor) - myCustomColor = Quantity_Color(theColor[0] / 255., theColor[1] / 255., - theColor[2] / 255., Quantity_TOC_RGB); - else - myCustomColor = Quantity_Color(); -}