X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_CustomPrs.cpp;h=604e593c2d711f41d2dadf84d650090edde09517;hb=7b7716a3d09dd4532f2580e43039bcf71adb4a97;hp=2990969e94f9d4c6355deb77b5b44c6aadcc44b1;hpb=f5ddae43cdb88e20e6fe3e0efc7f1751a39f216c;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_CustomPrs.cpp b/src/PartSet/PartSet_CustomPrs.cpp index 2990969e9..604e593c2 100755 --- a/src/PartSet/PartSet_CustomPrs.cpp +++ b/src/PartSet/PartSet_CustomPrs.cpp @@ -5,6 +5,9 @@ // Author: Natalia ERMOLAEVA #include +#include +#include "PartSet_OperationPrs.h" +#include "PartSet_OverconstraintListener.h" #include #include @@ -12,148 +15,251 @@ #include #include - -#include - -#include -#include +#include #include +#include +#include #include +#include +#include -#define OPERATION_PARAMETER_COLOR "255, 255, 0" +//#define DO_NOT_VISUALIZE_CUSTOM_PRESENTATION PartSet_CustomPrs::PartSet_CustomPrs(ModuleBase_IWorkshop* theWorkshop) - : myWorkshop(theWorkshop) + : myWorkshop(theWorkshop), myFeature(FeaturePtr()), myPresentationIsEmpty(false) +{ + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)); + + initPresentation(ModuleBase_IModule::CustomizeArguments); + initPresentation(ModuleBase_IModule::CustomizeResults); + initPresentation(ModuleBase_IModule::CustomizeHighlightedObjects); + + myIsActive[ModuleBase_IModule::CustomizeArguments] = false; + myIsActive[ModuleBase_IModule::CustomizeResults] = false; + myIsActive[ModuleBase_IModule::CustomizeHighlightedObjects] = false; +} + +bool PartSet_CustomPrs::isActive(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) { - Handle(PartSet_OperationPrs) myOperationPrs = new PartSet_OperationPrs(); /// AIS presentation for the feature of operation + return myIsActive[theFlag]; } -void PartSet_CustomPrs::setCustomized(const FeaturePtr& theFeature) +bool PartSet_CustomPrs::activate(const FeaturePtr& theFeature, + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) { +#ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION + return false; +#endif - myOperationPrs->setFeature(theFeature); - /* QMap > aNewCustomized; + myIsActive[theFlag] = true; + myFeature = theFeature; - QList aShapeList; - ResultPtr aResult = std::dynamic_pointer_cast(theObject); - if (aResult.get()) { - aNewCustomized[aResult] = aShapeList; + bool isModified = false; + if (theFeature.get()) { + displayPresentation(theFlag, theUpdateViewer); + isModified = true; } - else { - FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (aFeature.get()) { - std::list anAttributes = aFeature->data()->attributes(""); - std::list::const_iterator anIt = anAttributes.begin(), aLast = anAttributes.end(); - for (; anIt != aLast; anIt++) { - AttributePtr anAttribute = *anIt; - ObjectPtr anObject = GeomValidators_Tools::getObject(anAttribute); - if (anObject.get()) { - ResultPtr aResult = std::dynamic_pointer_cast(anObject); - if (aResult.get()) - aNewCustomized[aResult] = aShapeList; - } - else if (anAttribute->attributeType() == ModelAPI_AttributeSelectionList::typeId()) { - std::shared_ptr aCurSelList = - std::dynamic_pointer_cast(anAttribute); - for(int i = 0; i < aCurSelList->size(); i++) { - std::shared_ptr aSelAttribute = aCurSelList->value(i); - ObjectPtr anObject = GeomValidators_Tools::getObject(aSelAttribute); - if (anObject.get()) { - ResultPtr aResult = std::dynamic_pointer_cast(anObject); - if (aResult.get()) - aNewCustomized[aResult] = aShapeList; - } - } - } - } - } + return isModified; +} + +bool PartSet_CustomPrs::deactivate(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) +{ + myIsActive[theFlag] = false; + erasePresentation(theFlag, theUpdateViewer); + return true; +} + +bool PartSet_CustomPrs::displayPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) +{ + bool isModified = false; + + // update the AIS objects content + AISObjectPtr aPresentation = getPresentation(theFlag, true); + Handle(AIS_InteractiveObject) anAISIO = aPresentation->impl(); + Handle(PartSet_OperationPrs) anOperationPrs = Handle(PartSet_OperationPrs)::DownCast(anAISIO); + + // do nothing if the feature can not be displayed [is moved from presentation, to be checked] + if (!myFeature.get()) + return isModified; + + QMap > aFeatureShapes; + switch (theFlag) { + case ModuleBase_IModule::CustomizeArguments: + PartSet_OperationPrs::getFeatureShapes(myFeature, myWorkshop, aFeatureShapes); + break; + case ModuleBase_IModule::CustomizeResults: + PartSet_OperationPrs::getResultShapes(myFeature, myWorkshop, aFeatureShapes); + break; + case ModuleBase_IModule::CustomizeHighlightedObjects: + PartSet_OperationPrs::getHighlightedShapes(myWorkshop, aFeatureShapes); + break; + default: + return isModified; } + NCollection_DataMap& aShapeMap = + anOperationPrs->shapesMap(); + PartSet_OperationPrs::fillShapeList(aFeatureShapes, myWorkshop, aShapeMap); - bool isDone = false; - XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); - XGUI_Workshop* aWorkshop = aConnector->workshop(); - XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + myPresentationIsEmpty = false; + // redisplay AIS objects + bool aRedisplayed = false; Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - // find objects which are not customized anymore - QMap > aNotCustomized; - QMap >::const_iterator anIt = myCustomized.begin(), - aLast = myCustomized.end(); - for (; anIt != aLast; anIt++) { - ResultPtr aResult = anIt.key(); - if (!aNewCustomized.contains(aResult)) - aNotCustomized[aResult] = aShapeList; - } + if (!aContext.IsNull() && !aContext->IsDisplayed(anOperationPrs)) { + // when the feature can not be visualized in the module, the operation preview should not + // be visualized also + if (anOperationPrs->hasShapes() && myWorkshop->module()->canDisplayObject(myFeature)) { + // set color here because it can be changed in preferences + Quantity_Color aShapeColor = getShapeColor(theFlag); + anOperationPrs->setShapeColor(aShapeColor); - myCustomized.clear(); - // restore the previous state of the object if there is no such object in the new map - for (anIt = aNotCustomized.begin(), aLast = aNotCustomized.end(); anIt != aLast; anIt++) { - ResultPtr aResult = anIt.key(); - AISObjectPtr anAISObj = aDisplayer->getAISObject(aResult); - if (anAISObj.get()) { - Handle(AIS_InteractiveObject) anAISIO = anAISObj->impl(); - aContext->Redisplay(anAISIO, false); + PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); + XGUI_Workshop* aWorkshop = workshop(); + aRedisplayed = aWorkshop->displayer()->displayAIS(myPresentations[theFlag], + false/*load object in selection*/, false); + aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId()); + isModified = true; + } + } + else { + // when the feature can not be visualized in the module, the operation preview should not + // be visualized also + if (!anOperationPrs->hasShapes() || !myWorkshop->module()->canDisplayObject(myFeature)) { + aRedisplayed = erasePresentation(theFlag, false); + isModified = true; } - isDone = aDisplayer->customizeObject(aResult); + else { + anOperationPrs->Redisplay(); + isModified = true; + aRedisplayed = true; + } + } + if (myPresentationIsEmpty) { + aRedisplayed = erasePresentation(theFlag, false); + } + if (aRedisplayed && theUpdateViewer) + workshop()->displayer()->updateViewer(); + + return isModified; +} + +bool PartSet_CustomPrs::erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) +{ + bool isErased = false; + XGUI_Workshop* aWorkshop = workshop(); + if (myPresentations.contains(theFlag)) + isErased = aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer); + return isErased; +} + +void PartSet_CustomPrs::clearPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) +{ + AISObjectPtr aPresentation = getPresentation(theFlag, false); + if (aPresentation.get()) { + Handle(AIS_InteractiveObject) anAISIO = aPresentation->impl(); + Handle(PartSet_OperationPrs) anOperationPrs = Handle(PartSet_OperationPrs)::DownCast(anAISIO); + + anOperationPrs->shapesMap().Clear(); + if (!anOperationPrs.IsNull()) + anOperationPrs.Nullify(); + myPresentations.remove(theFlag); } +} - // set customized for the new objects - myCustomized = aNewCustomized; - for (anIt = myCustomized.begin(), aLast = myCustomized.end(); anIt != aLast; anIt++) { - ResultPtr aResult = anIt.key(); - AISObjectPtr anAISObj = aDisplayer->getAISObject(aResult); - if (anAISObj.get()) - isDone = customisePresentation(aResult, anAISObj, 0) || isDone; +AISObjectPtr PartSet_CustomPrs::getPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theToCreate) +{ + Handle(PartSet_OperationPrs) aPresentation; + + AISObjectPtr anOperationPrs; + if (myPresentations.contains(theFlag)) + anOperationPrs = myPresentations[theFlag]; + + if (!anOperationPrs.get() && theToCreate) { + initPresentation(theFlag); + anOperationPrs = myPresentations[theFlag]; } - if (isDone) - aDisplayer->updateViewer();*/ + + return anOperationPrs; } -/*#include -#include -#include -#include -#include -#include */ -bool PartSet_CustomPrs::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs, - std::shared_ptr theCustomPrs) +bool PartSet_CustomPrs::redisplay(const ObjectPtr& theObject, + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) { - bool isDone = false; - /*if (myCustomized.contains(theResult)) { - std::vector aColor = Config_PropManager::color("Visualization", "operation_parameter_color", - OPERATION_PARAMETER_COLOR); - isDone = thePrs->setColor(aColor[0], aColor[1], aColor[2]); - /* - Handle(AIS_InteractiveObject) anAISIO = thePrs->impl(); - - const Handle(Prs3d_Presentation)& aPresentation = anAISIO->Presentation(); - if (!aPresentation.IsNull()) { - Handle(AIS_Shape) aShapeAIS = Handle(AIS_Shape)::DownCast(anAISIO); - if (!aShapeAIS.IsNull()) { - TopExp_Explorer anExp(aShapeAIS->Shape(), TopAbs_VERTEX); - Handle(Prs3d_Drawer) aDrawer = aShapeAIS->Attributes(); - for (; anExp.More(); anExp.Next()) { - const TopoDS_Vertex& aVertex = (const TopoDS_Vertex&)anExp.Current(); - StdPrs_WFDeflectionShape::Add(aPresentation, aVertex, aDrawer); - } - } - } - thePrs->setPointMarker(5, 5.); // Set point as a '+' symbol*+/ +#ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION + return false; +#endif + bool aRedisplayed = false; + if (myIsActive[theFlag]) + aRedisplayed = displayPresentation(theFlag, theUpdateViewer); + + return aRedisplayed; +} + +void PartSet_CustomPrs::clearPrs() +{ + clearPresentation(ModuleBase_IModule::CustomizeArguments); + clearPresentation(ModuleBase_IModule::CustomizeResults); + clearPresentation(ModuleBase_IModule::CustomizeHighlightedObjects); +} + +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 +} + +void PartSet_CustomPrs::initPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) +{ + AISObjectPtr anOperationPrs = AISObjectPtr(new GeomAPI_AISObject()); + Handle(PartSet_OperationPrs) anAISPrs = new PartSet_OperationPrs(myWorkshop); + anOperationPrs->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs)); + if (theFlag == ModuleBase_IModule::CustomizeArguments || + theFlag == ModuleBase_IModule::CustomizeResults) { + anOperationPrs->setPointMarker(5, 2.); + anOperationPrs->setWidth(1); } - /* - std::vector aColor; - - getResultColor(theResult, aColor); - - SessionPtr aMgr = ModelAPI_Session::get(); - if (aMgr->activeDocument() != theResult->document()) { - QColor aQColor(aColor[0], aColor[1], aColor[2]); - QColor aNewColor = QColor::fromHsvF(aQColor.hueF(), aQColor.saturationF()/3., aQColor.valueF()); - aColor[0] = aNewColor.red(); - aColor[1] = aNewColor.green(); - aColor[2] = aNewColor.blue(); + else if (theFlag == ModuleBase_IModule::CustomizeHighlightedObjects) + anAISPrs->useAISWidth(); + + if (anOperationPrs.get()) + myPresentations[theFlag] = anOperationPrs; +} + +Quantity_Color PartSet_CustomPrs::getShapeColor( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) +{ + Quantity_Color aColor; + switch(theFlag) { + case ModuleBase_IModule::CustomizeArguments: + aColor = ModuleBase_Tools::color("Visualization", "operation_parameter_color", + OPERATION_PARAMETER_COLOR()); + break; + case ModuleBase_IModule::CustomizeResults: + aColor = ModuleBase_Tools::color("Visualization", "operation_result_color", + OPERATION_RESULT_COLOR()); + break; + case ModuleBase_IModule::CustomizeHighlightedObjects: + aColor = ModuleBase_Tools::color("Visualization", "operation_highlight_color", + OPERATION_HIGHLIGHT_COLOR()); + break; + default: + break; } - return !aColor.empty() && thePrs->setColor(aColor[0], aColor[1], aColor[2]);*/ - return isDone; + return aColor; +} + +XGUI_Workshop* PartSet_CustomPrs::workshop() const +{ + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + return aConnector->workshop(); }