X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_CustomPrs.cpp;h=c38e89494867b6eaa6ba468fe6ea55c0558e24b0;hb=refs%2Fheads%2FV9_11_BR;hp=cc52284cca9e8e51c1452c7cadf4bd56adfa6603;hpb=6bf7d56801cd3ef5253adf2c9a38c5f226c2c2e4;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_CustomPrs.cpp b/src/PartSet/PartSet_CustomPrs.cpp old mode 100755 new mode 100644 index cc52284cc..c38e89494 --- a/src/PartSet/PartSet_CustomPrs.cpp +++ b/src/PartSet/PartSet_CustomPrs.cpp @@ -1,13 +1,27 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_CustomPrs.cpp -// Created: 30 Jun 2015 -// Author: Natalia ERMOLAEVA - -#include -#include +// Copyright (C) 2014-2023 CEA, EDF +// +// 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 "PartSet_CustomPrs.h" +#include "PartSet_Module.h" #include "PartSet_OperationPrs.h" #include "PartSet_OverconstraintListener.h" +#include "PartSet_SketcherMgr.h" #include #include @@ -17,9 +31,13 @@ #include #include +#include +#include + #include #include #include +#include #include #include @@ -28,10 +46,12 @@ //#define DO_NOT_VISUALIZE_CUSTOM_PRESENTATION PartSet_CustomPrs::PartSet_CustomPrs(ModuleBase_IWorkshop* theWorkshop) - : myWorkshop(theWorkshop), myFeature(FeaturePtr()), myPresentationIsEmpty(false) + : myWorkshop(theWorkshop), myFeature(FeaturePtr()), myPresentationIsEmpty(false), + myDisabledMode(-1) { Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OPERATION_SHAPES_FAILED)); initPresentation(ModuleBase_IModule::CustomizeArguments); initPresentation(ModuleBase_IModule::CustomizeResults); @@ -54,12 +74,22 @@ bool PartSet_CustomPrs::activate(const FeaturePtr& theFeature, #ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION return false; #endif + bool isModified = false; + + // Do not call customisation for sketcher and all its sub-objects + if (theFeature->getKind() == SketchPlugin_Sketch::ID()) + return isModified; - myIsActive[theFlag] = true; - myFeature = theFeature; + FeaturePtr aParent = ModelAPI_Tools::compositeOwner(theFeature); + if (aParent.get()) { + std::string aType = aParent->getKind(); + if (aType == SketchPlugin_Sketch::ID()) + return isModified; + } - bool isModified = false; if (theFeature.get()) { + myIsActive[theFlag] = true; + myFeature = theFeature; displayPresentation(theFlag, theUpdateViewer); isModified = true; } @@ -71,6 +101,8 @@ bool PartSet_CustomPrs::deactivate(const ModuleBase_IModule::ModuleBase_Customiz { myIsActive[theFlag] = false; erasePresentation(theFlag, theUpdateViewer); + if (theFlag == ModuleBase_IModule::CustomizeResults) + clearErrorShape(); return true; } @@ -80,6 +112,9 @@ bool PartSet_CustomPrs::displayPresentation( { bool isModified = false; + if (myDisabledMode == theFlag) + return isModified; + // update the AIS objects content AISObjectPtr aPresentation = getPresentation(theFlag, true); Handle(AIS_InteractiveObject) anAISIO = aPresentation->impl(); @@ -96,6 +131,7 @@ bool PartSet_CustomPrs::displayPresentation( break; case ModuleBase_IModule::CustomizeResults: PartSet_OperationPrs::getResultShapes(myFeature, myWorkshop, aFeatureShapes); + PartSet_OperationPrs::getPresentationShapes(myFeature, myWorkshop, aFeatureShapes, false); break; case ModuleBase_IModule::CustomizeHighlightedObjects: PartSet_OperationPrs::getHighlightedShapes(myWorkshop, aFeatureShapes); @@ -103,7 +139,7 @@ bool PartSet_CustomPrs::displayPresentation( default: return isModified; } - NCollection_DataMap& aShapeMap = + NCollection_DataMap& aShapeMap = anOperationPrs->shapesMap(); PartSet_OperationPrs::fillShapeList(aFeatureShapes, myWorkshop, aShapeMap); @@ -122,7 +158,7 @@ bool PartSet_CustomPrs::displayPresentation( PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); XGUI_Workshop* aWorkshop = workshop(); aRedisplayed = aWorkshop->displayer()->displayAIS(myPresentations[theFlag], - false/*load object in selection*/, false); + false/*load object in selection*/, 0, false); aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId()); isModified = true; } @@ -135,6 +171,9 @@ bool PartSet_CustomPrs::displayPresentation( isModified = true; } else { + if (myFeature->firstResult().get()) { + PartSet_Module::setTexture(aPresentation, myFeature->firstResult()); + } anOperationPrs->Redisplay(); isModified = true; aRedisplayed = true; @@ -212,12 +251,53 @@ void PartSet_CustomPrs::clearPrs() clearPresentation(ModuleBase_IModule::CustomizeArguments); clearPresentation(ModuleBase_IModule::CustomizeResults); clearPresentation(ModuleBase_IModule::CustomizeHighlightedObjects); + clearErrorShape(); +} + +void PartSet_CustomPrs::clearErrorShape() +{ + if (!myErrorShapes.IsNull()) { + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (aContext->IsDisplayed(myErrorShapes)) { + aContext->Remove(myErrorShapes, true); + myErrorShapes.Nullify(); + } + } } void PartSet_CustomPrs::processEvent(const std::shared_ptr& theMessage) { if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)) myPresentationIsEmpty = true; /// store state to analize it after display/erase is finished + else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_OPERATION_SHAPES_FAILED)) { + std::shared_ptr aErrMsg = + std::dynamic_pointer_cast(theMessage); + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + ListOfShape aShapes = aErrMsg->shapes(); + if (aShapes.size() > 0) { + GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes); + TopoDS_Shape aErrShape = aCompound->impl(); + if (myErrorShapes.IsNull()) { + myErrorShapes = new AIS_Shape(aErrShape); + myErrorShapes->SetColor(Quantity_NOC_RED); + Handle(Prs3d_Drawer) aDrawer = myErrorShapes->Attributes(); + aDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_RING1, Quantity_NOC_RED, 2.)); + aDrawer->SetLineAspect(new Prs3d_LineAspect(Quantity_NOC_RED, Aspect_TOL_SOLID, 2.)); + aContext->Display(myErrorShapes, true); + aContext->Deactivate(myErrorShapes); + } + else { + myErrorShapes->Set(aErrShape); + aContext->Redisplay(myErrorShapes, true); + } + } + else { + if (!myErrorShapes.IsNull()) { + aContext->Remove(myErrorShapes, true); + myErrorShapes.Nullify(); + } + } + } } void PartSet_CustomPrs::initPresentation( @@ -229,7 +309,7 @@ void PartSet_CustomPrs::initPresentation( if (theFlag == ModuleBase_IModule::CustomizeArguments || theFlag == ModuleBase_IModule::CustomizeResults) { anOperationPrs->setPointMarker(5, 2.); - anOperationPrs->setWidth(1); + anOperationPrs->setWidth((theFlag == ModuleBase_IModule::CustomizeHighlightedObjects)? 2 : 1); } else if (theFlag == ModuleBase_IModule::CustomizeHighlightedObjects) anAISPrs->useAISWidth();