X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketcherPrs%2FSketcherPrs_Coincident.cpp;h=9397f212a48e51f6d80cf332eccd5b90044d2e6d;hb=97917d3698f5a2f7fc9596e7c755ff8f6751e373;hp=8b533fdba3e19c95d8d53d6d34f23a697806c2f1;hpb=545fb9af2e7ff2640157173275c0bbacd94537d9;p=modules%2Fshaper.git diff --git a/src/SketcherPrs/SketcherPrs_Coincident.cpp b/src/SketcherPrs/SketcherPrs_Coincident.cpp index 8b533fdba..9397f212a 100644 --- a/src/SketcherPrs/SketcherPrs_Coincident.cpp +++ b/src/SketcherPrs/SketcherPrs_Coincident.cpp @@ -1,13 +1,28 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: SketcherPrs_Coincident.cpp -// Created: 12 February 2015 -// Author: Vitaly SMETANNIKOV +// Copyright (C) 2014-2019 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "SketcherPrs_Coincident.h" #include "SketcherPrs_Tools.h" #include +#include + #include #include #include @@ -17,6 +32,7 @@ #include #include +#include #include #include @@ -27,67 +43,143 @@ #include -IMPLEMENT_STANDARD_HANDLE(SketcherPrs_Coincident, AIS_InteractiveObject); IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_Coincident, AIS_InteractiveObject); -SketcherPrs_Coincident::SketcherPrs_Coincident(ModelAPI_Feature* theConstraint, - const std::shared_ptr& thePlane) - : AIS_InteractiveObject(), myConstraint(theConstraint), myPlane(thePlane) +SketcherPrs_Coincident::SketcherPrs_Coincident(ModelAPI_Feature* theConstraint, + SketchPlugin_Sketch* theSketch) +: AIS_InteractiveObject(), myConstraint(theConstraint), mySketch(theSketch), + myPoint(gp_Pnt(0.0, 0.0, 0.0)), myIsCustomColor(false) { - -} - +} +bool SketcherPrs_Coincident::IsReadyToDisplay(ModelAPI_Feature* theConstraint, + const std::shared_ptr& thePlane) +{ + gp_Pnt aPoint; + return readyToDisplay(theConstraint, thePlane, aPoint); +} -void SketcherPrs_Coincident::Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) +std::shared_ptr getCoincidencePoint(ModelAPI_Feature* theConstraint) { - std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(myConstraint, - SketchPlugin_Constraint::ENTITY_A()); - if (aPnt.get() == NULL) - aPnt = SketcherPrs_Tools::getPoint(myConstraint, SketchPlugin_Constraint::ENTITY_B()); + std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(theConstraint, + SketchPlugin_Constraint::ENTITY_A()); if (aPnt.get() == NULL) - return; + 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 = getCoincidencePoint(theConstraint); + aReadyToDisplay = aPnt.get() != NULL; + if (aReadyToDisplay) { + std::shared_ptr aPoint = thePlane->to3D(aPnt->x(), aPnt->y()); + thePoint = aPoint->impl(); + } + return aReadyToDisplay; +} - std::shared_ptr aPoint = myPlane->to3D(aPnt->x(), aPnt->y()); - myPoint = aPoint->impl(); - static Handle(Graphic3d_AspectMarker3d) aPtA; - if (aPtA.IsNull()) { - aPtA = new Graphic3d_AspectMarker3d (); +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, + const Standard_Integer theMode) +{ + gp_Pnt 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 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(Quantity_NOC_YELLOW); + aPtA->SetColor(!aCustomColor ? aExternalColor : myCustomColor); Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(thePresentation); aGroup->SetPrimitivesAspect(aPtA); Handle(Graphic3d_ArrayOfPoints) aPntArray = new Graphic3d_ArrayOfPoints(1); - aPntArray->AddVertex (aPoint->x(), aPoint->y(), aPoint->z()); + aPntArray->AddVertex (myPoint.X(), myPoint.Y(), myPoint.Z()); aGroup->AddPrimitiveArray (aPntArray); - aPtA->SetType(Aspect_TOM_RING1); + // Make a black mid ring + aPtA = new Graphic3d_AspectMarker3d(); + aPtA->SetType(aIsEdge ? Aspect_TOM_STAR : Aspect_TOM_RING1); aPtA->SetScale(1.); - aPtA->SetColor(Quantity_NOC_BLACK); + aPtA->SetColor(!aCustomColor ? aInternalColor : myCustomColor); 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 ? aInternalColor : myCustomColor); aGroup->SetPrimitivesAspect(aPtA); aGroup->AddPrimitiveArray (aPntArray); + + if (!aReadyToDisplay) + SketcherPrs_Tools::sendEmptyPresentationError(myConstraint, + "An empty AIS presentation: SketcherPrs_Coincident"); } void SketcherPrs_Coincident::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) { -// if ((aMode == 0) || (aMode == SketcherPrs_Tools::Sel_Constraint)) { -// Handle(SelectMgr_EntityOwner) aOwn = new SelectMgr_EntityOwner(this, 10); -// Handle(Select3D_SensitivePoint) aSp = new Select3D_SensitivePoint(aOwn, myPoint); -// aSelection->Add(aSp); -// } + // There is no selection of coincident - a point is selected instead of coincidence } void SketcherPrs_Coincident::SetColor(const Quantity_NameOfColor aCol) @@ -98,5 +190,14 @@ void SketcherPrs_Coincident::SetColor(const Quantity_NameOfColor aCol) void SketcherPrs_Coincident::SetColor(const Quantity_Color &aCol) { hasOwnColor=Standard_True; - myOwnColor=aCol; +} + +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(); }