From e0dddd8c3be7d84a4a195eb02a22f9733da7ed5e Mon Sep 17 00:00:00 2001 From: vsv Date: Wed, 22 Oct 2014 14:53:44 +0400 Subject: [PATCH] Make faces on selection of sketcher --- src/ModuleBase/ModuleBase_ResultPrs.cpp | 59 +++++++++++++------------ src/ModuleBase/ModuleBase_ResultPrs.h | 10 +++-- src/XGUI/XGUI_Displayer.cpp | 25 +++-------- 3 files changed, 44 insertions(+), 50 deletions(-) diff --git a/src/ModuleBase/ModuleBase_ResultPrs.cpp b/src/ModuleBase/ModuleBase_ResultPrs.cpp index a1ca0bdd9..c8eea52c2 100644 --- a/src/ModuleBase/ModuleBase_ResultPrs.cpp +++ b/src/ModuleBase/ModuleBase_ResultPrs.cpp @@ -11,6 +11,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_HANDLE(ModuleBase_ResultPrs, AIS_Shape); IMPLEMENT_STANDARD_RTTIEXT(ModuleBase_ResultPrs, AIS_Shape); @@ -25,23 +26,12 @@ ModuleBase_ResultPrs::ModuleBase_ResultPrs(ResultPtr theResult) if (aWirePtr->hasPlane() ) { // If this is a wire with plane defined thin it is a sketch-like object // It must have invisible faces - std::list > aFaces; GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(), - aWirePtr->dirY(), aWirePtr->norm(), aWirePtr, aFaces); + aWirePtr->dirY(), aWirePtr->norm(), aWirePtr, myFacesList); - BRep_Builder aBuilder; - TopoDS_Shape aShape = aWirePtr->impl(); - std::list>::const_iterator aIt; - for (aIt = aFaces.cbegin(); aIt != aFaces.cend(); ++aIt) { - TopoDS_Shape aFace = (*aIt)->impl(); - aBuilder.Add(aShape, aFace); - } - Set(aShape); + myOriginalShape = aWirePtr->impl(); + Set(myOriginalShape); myIsSketchMode = true; - // Define number of ISO lines - //Handle(AIS_Drawer) aDrawer = Attributes(); - //Attributes()->SetIsoOnPlane(Standard_False); - //SetAttributes(aDrawer); } else { Set(aWirePtr->impl()); } @@ -51,24 +41,35 @@ ModuleBase_ResultPrs::ModuleBase_ResultPrs(ResultPtr theResult) } -Standard_Boolean ModuleBase_ResultPrs::AcceptDisplayMode(const Standard_Integer theMode) const -{ - if (myIsSketchMode) { - return theMode == 0; - } - return AIS_Shape::AcceptDisplayMode(theMode); -} - void ModuleBase_ResultPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, const Handle(Prs3d_Presentation)& thePresentation, const Standard_Integer theMode) { - if (myIsSketchMode) { - Handle(AIS_Drawer) aDrawer = Attributes(); - aDrawer->SetIsoOnPlane(Standard_False); - aDrawer->UIsoAspect()->SetNumber(0); - aDrawer->VIsoAspect()->SetNumber(0); - SetAttributes(aDrawer); - } + boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(myResult); + myOriginalShape = aShapePtr->impl(); + Set(aShapePtr->impl()); AIS_Shape::Compute(thePresentationManager, thePresentation, theMode); } + + +void ModuleBase_ResultPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer aMode) +{ + if (myIsSketchMode) { + if (aMode == TopAbs_FACE) { + BRep_Builder aBuilder; + TopoDS_Compound aComp; + aBuilder.MakeCompound(aComp); + aBuilder.Add(aComp, myOriginalShape); + std::list>::const_iterator aIt; + for (aIt = myFacesList.cbegin(); aIt != myFacesList.cend(); ++aIt) { + TopoDS_Shape aFace = (*aIt)->impl(); + aBuilder.Add(aComp, aFace); + } + Set(aComp); + } else { + Set(myOriginalShape); + } + } + AIS_Shape::ComputeSelection(aSelection, aMode); +} \ No newline at end of file diff --git a/src/ModuleBase/ModuleBase_ResultPrs.h b/src/ModuleBase/ModuleBase_ResultPrs.h index 068cffe93..0d2d058ce 100644 --- a/src/ModuleBase/ModuleBase_ResultPrs.h +++ b/src/ModuleBase/ModuleBase_ResultPrs.h @@ -21,17 +21,21 @@ public: Standard_EXPORT ResultPtr getResult() const { return myResult; } - Standard_EXPORT virtual Standard_Boolean AcceptDisplayMode(const Standard_Integer theMode) const; - DEFINE_STANDARD_RTTI(ModuleBase_ResultPrs) protected: - void Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + Standard_EXPORT virtual void Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, const Handle(Prs3d_Presentation)& thePresentation, const Standard_Integer theMode = 0); + Standard_EXPORT virtual void ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer aMode) ; + private: ResultPtr myResult; bool myIsSketchMode; + + TopoDS_Shape myOriginalShape; + std::list > myFacesList; }; diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index d281f86f0..736de32d2 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -110,38 +110,27 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) if (!isVisible(theObject)) return; - Handle(AIS_InteractiveObject) aAISIO; AISObjectPtr aAISObj = getAISObject(theObject); + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); if (aPrs) { AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj); - if (aAISObj && !aAIS_Obj) { + if (!aAIS_Obj) { erase(theObject, isUpdateViewer); return; } - aAISIO = aAIS_Obj->impl(); - } else { - ResultPtr aResult = boost::dynamic_pointer_cast(theObject); - if (aResult) { - boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - if (aShapePtr) { - Handle(AIS_Shape) aAISShape = Handle(AIS_Shape)::DownCast( - aAISObj->impl()); - if (!aAISShape.IsNull()) { - aAISShape->Set(aShapePtr->impl()); - aAISIO = aAISShape; - } - } + if (aAIS_Obj != aAISObj) { + myResult2AISObjectMap[theObject] = aAIS_Obj; } + aAISIO = aAIS_Obj->impl(); } + if (!aAISIO.IsNull()) { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; aContext->Redisplay(aAISIO, isUpdateViewer); - //if (aContext->HasOpenedContext()) { - // aContext->Load(aAISIO, -1, true/*allow decomposition*/); - //} } } -- 2.39.2