From ff79b1d7d55d2d8156d9f9cebad0d9e42bde3c9b Mon Sep 17 00:00:00 2001 From: mbs Date: Wed, 10 Jan 2024 19:21:20 +0000 Subject: [PATCH] [bos #40506][CEA] Cannot hide faces of a group * Removed old behaviour where entire groups were hidden, when selecting a face of a group. * Updated documentation. --- doc/gui/General/Introduction.rst | 11 +- src/XGUI/XGUI_FacesPanel.cpp | 230 ++++++------------------------- src/XGUI/XGUI_FacesPanel.h | 16 --- 3 files changed, 46 insertions(+), 211 deletions(-) diff --git a/doc/gui/General/Introduction.rst b/doc/gui/General/Introduction.rst index 33e78472f..927f12705 100644 --- a/doc/gui/General/Introduction.rst +++ b/doc/gui/General/Introduction.rst @@ -337,20 +337,19 @@ The shapes information, equal to the provided Inspection panel information on th Hide Faces panel ^^^^^^^^^^^^^^^^ -**Hide Faces** panel makes possible to hide temporary faces of any displayed object. **Hide Faces** panel looks like following: +**Hide Faces** panel makes it possible to temporarily hide faces of any displayed object. **Hide Faces** panel looks like following: .. figure:: /images/hide_faces_panel.png :align: center **Hide Faces** panel -- If this panel is activated it "listens" user selection. +- If this panel is activated it "listens" to the user selection. - If a face is selected then its name will be shown in the panel's list and hidden in the viewer. -- If user selects a group of faces (or at least a one face of this group) then whole group will be hidden and also all faces from all objects referenced by this group. -- If user will display the hidden group again (by a show operation) then the group will be removed from Hide Faces list and visibility of all referenced faces will be restored. +- If the user wants to display a hidden result body again (by a show operation) then the faces of this result body will be removed from Hide Faces list and the visibility of all referenced faces will be restored. -It is also possible not to hide faces, but make them transparent. For this purpose **"Transparent"** check-box can be used. Value of the transparency can be changed in **Visualization** tab of **Preferences** dialog box. -Closing of **Hide Faces** panel restores visibility state of all objects. If it is necessary to deactivete the **Hide Faces** panel (preserving the current display state) then user has to press **"Esc"** button. +Instead of hiding the faces, it is also possible to make them transparent. For this purpose the **"Transparent"** check-box can be used. The value of the transparency can be changed under the **Visualization** tab of the **Preferences** dialog box. +Closing the **Hide Faces** panel restores the visibility state of all objects. If it is necessary to deactivete the **Hide Faces** panel (preserving the current display state) then the user has to press the **"Esc"** button. .. _python console: diff --git a/src/XGUI/XGUI_FacesPanel.cpp b/src/XGUI/XGUI_FacesPanel.cpp index 73cdb7481..17582541e 100644 --- a/src/XGUI/XGUI_FacesPanel.cpp +++ b/src/XGUI/XGUI_FacesPanel.cpp @@ -62,26 +62,6 @@ static const int LayoutMargin = 3; -//******************************************************************** -bool getGroup(ModuleBase_ViewerPrsPtr thePrs, ResultGroupPtr& theResGroup, - FeaturePtr& theGroupFeature) -{ - ObjectPtr anObject = thePrs->object(); - if (!anObject.get()) - return false; - - theResGroup = std::dynamic_pointer_cast(anObject); - if (theResGroup.get()) { - theGroupFeature = ModelAPI_Feature::feature(theResGroup); - } - else { - theGroupFeature = std::dynamic_pointer_cast(anObject); - if (theGroupFeature.get()) - theResGroup = std::dynamic_pointer_cast(theGroupFeature->firstResult()); - } - return theGroupFeature.get() && theResGroup.get(); -} - //******************************************************************** void updateHiddenShapes(Handle(ModuleBase_ResultPrs) thePrs, const TopoDS_ListOfShape& theShapes) { @@ -94,6 +74,31 @@ void updateHiddenShapes(Handle(ModuleBase_ResultPrs) thePrs, const TopoDS_ListOf thePrs->setSubShapeHidden(aAlreadyHidden); } +//******************************************************************** +void objectsMapFromPrs(ModuleBase_ViewerPrsPtr thePrs, + std::map& theObjectToShapes, + std::map& theObjectToPrs) +{ + ObjectPtr anObject = thePrs->object(); + if (!anObject.get()) + return; + + // Process bodies + Handle(ModuleBase_ResultPrs) aResultPrs = Handle(ModuleBase_ResultPrs)::DownCast( + thePrs->interactive()); + if (aResultPrs.IsNull()) + return; + + if (theObjectToShapes.find(anObject) != theObjectToShapes.end()) + theObjectToShapes.at(anObject).Append(ModuleBase_Tools::getSelectedShape(thePrs)); + else { + TopoDS_ListOfShape aListOfShapes; + aListOfShapes.Append(ModuleBase_Tools::getSelectedShape(thePrs)); + theObjectToShapes[anObject] = aListOfShapes; + theObjectToPrs[anObject] = aResultPrs; + } +} + //******************************************************************** XGUI_FacesPanel::XGUI_FacesPanel(QWidget* theParent, XGUI_Workshop* theWorkshop) : QDockWidget(theParent), myWorkshop(theWorkshop), myIsActive(false), myLastItemIndex(0) @@ -136,7 +141,7 @@ void XGUI_FacesPanel::reset(const bool isToFlushRedisplay) std::map anObjectToPrs; QMap::const_iterator aIt; for (aIt = myItems.cbegin(); aIt != myItems.cend(); aIt++) { - getObjectsMapFromPrs(aIt.value(), anObjectToShapes, anObjectToPrs); + objectsMapFromPrs(aIt.value(), anObjectToShapes, anObjectToPrs); } std::set aObjects; @@ -146,10 +151,6 @@ void XGUI_FacesPanel::reset(const bool isToFlushRedisplay) aObjects.insert(aPrsIt->first); aPrsIt->second->setSubShapeHidden(anEmpty); } - std::set::const_iterator aGrpIt; - for (aGrpIt = myHiddenGroups.cbegin(); aGrpIt != myHiddenGroups.cend(); aGrpIt++) - (*aGrpIt)->setDisplayed(true); - myHiddenGroups.clear(); if (redisplayObjects(aObjects)) flushRedisplay(); @@ -281,75 +282,6 @@ bool XGUI_FacesPanel::processAction(ModuleBase_ActionType theActionType) } } -//******************************************************************** -void XGUI_FacesPanel::getObjectsMapFromResult(ResultGroupPtr theResGroup, - FeaturePtr theGroupFeature, - std::map& theObjectToShapes, - std::map& theObjectToPrs) -{ - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - // Process a grouip result - AttributeSelectionListPtr aSelectionList = theGroupFeature->selectionList("group_list"); - AISObjectPtr aPrs; - for (int i = 0; i < aSelectionList->size(); i++) { - AttributeSelectionPtr aSelection = aSelectionList->value(i); - ResultPtr aRes = aSelection->context(); - aPrs = aDisplayer->getAISObject(aRes); - if (aPrs.get()) { - Handle(ModuleBase_ResultPrs) aResultPrs = Handle(ModuleBase_ResultPrs)::DownCast( - aPrs->impl()); - if (!aResultPrs.IsNull()) { - GeomShapePtr aShape = aSelection->value(); - if (theObjectToShapes.find(aRes) != theObjectToShapes.end()) - theObjectToShapes.at(aRes).Append(aShape->impl()); - else { - TopoDS_ListOfShape aListOfShapes; - aListOfShapes.Append(aShape->impl()); - theObjectToShapes[aRes] = aListOfShapes; - theObjectToPrs[aRes] = aResultPrs; - } - } - } - } -} - -//******************************************************************** -void objectsMapFromPrs(ModuleBase_ViewerPrsPtr thePrs, - std::map& theObjectToShapes, - std::map& theObjectToPrs) -{ - ObjectPtr anObject = thePrs->object(); - if (!anObject.get()) - return; - - // Process bodies - Handle(ModuleBase_ResultPrs) aResultPrs = Handle(ModuleBase_ResultPrs)::DownCast( - thePrs->interactive()); - if (aResultPrs.IsNull()) - return; - - if (theObjectToShapes.find(anObject) != theObjectToShapes.end()) - theObjectToShapes.at(anObject).Append(ModuleBase_Tools::getSelectedShape(thePrs)); - else { - TopoDS_ListOfShape aListOfShapes; - aListOfShapes.Append(ModuleBase_Tools::getSelectedShape(thePrs)); - theObjectToShapes[anObject] = aListOfShapes; - theObjectToPrs[anObject] = aResultPrs; - } -} - -//******************************************************************** -void XGUI_FacesPanel::getObjectsMapFromPrs(ModuleBase_ViewerPrsPtr thePrs, - std::map& theObjectToShapes, - std::map& theObjectToPrs) -{ - ResultGroupPtr aResGroup; - FeaturePtr aGroupFeature; - if (getGroup(thePrs, aResGroup, aGroupFeature)) - getObjectsMapFromResult(aResGroup, aGroupFeature, theObjectToShapes, theObjectToPrs); - else - objectsMapFromPrs(thePrs, theObjectToShapes, theObjectToPrs); -} //******************************************************************** void XGUI_FacesPanel::processSelection() @@ -373,35 +305,15 @@ void XGUI_FacesPanel::processSelection() if (!anObject.get()) continue; - ResultGroupPtr aResGroup; - FeaturePtr aGroupFeature; - if (getGroup(aPrs, aResGroup, aGroupFeature)) { - AttributeSelectionListPtr aSelectionListAttr = - aGroupFeature->data()->selectionList("group_list"); - std::string aType = aSelectionListAttr->selectionType(); - if (aType != "Faces") - continue; - } - else { - GeomShapePtr aShapePtr = aPrs->shape(); - if (!aShapePtr.get() || !aShapePtr->isFace()) - continue; - } + GeomShapePtr aShapePtr = aPrs->shape(); + if (!aShapePtr.get() || !aShapePtr->isFace()) + continue; - QString aItemName = aResGroup.get()? - QString::fromStdWString(aResGroup->data()->name()) : XGUI_Tools::generateName(aPrs); + QString aItemName = XGUI_Tools::generateName(aPrs); if (myListView->hasItem(aItemName)) continue; - if (aResGroup.get()) { - if (aResGroup->isDisplayed()) { - aResGroup->setDisplayed(false); - myHiddenGroups.insert(aResGroup); - } - getObjectsMapFromResult(aResGroup, aGroupFeature, anObjectToShapes, anObjectToPrs); - } - else - objectsMapFromPrs(aPrs, anObjectToShapes, anObjectToPrs); + objectsMapFromPrs(aPrs, anObjectToShapes, anObjectToPrs); // The code is dedicated to remove already selected items if they are selected twice // It can happen in case of groups selection @@ -409,9 +321,6 @@ void XGUI_FacesPanel::processSelection() for (aIt = myItems.cbegin(); aIt != myItems.cend(); aIt++) { ModuleBase_ViewerPrsPtr aCurPrs = aIt.value(); ObjectPtr aObject = aCurPrs->object(); - ResultGroupPtr aCurResGroup = std::dynamic_pointer_cast(aObject); - if (aCurResGroup.get()) - continue; if (anObjectToShapes.find(aObject) != anObjectToShapes.end()) { TopoDS_ListOfShape aShapes = anObjectToShapes[aObject]; GeomShapePtr aShapePtr = aCurPrs->shape(); @@ -464,6 +373,7 @@ void XGUI_FacesPanel::processSelection() // Remove duplicate items removeItems(aToRemove); + myWorkshop->selector()->clearSelection(); if (isModified) { updateProcessedObjects(myItems, myItemObjects); flushRedisplay(); @@ -495,16 +405,7 @@ bool XGUI_FacesPanel::processDelete() std::set::const_iterator aIt; for (aIt = aRestored.cbegin(); aIt != aRestored.cend(); aIt++) { - getObjectsMapFromPrs((*aIt), anObjectToShapes, anObjectToPrs); - ResultGroupPtr aResGroup; - FeaturePtr aGroupFeature; - if (getGroup((*aIt), aResGroup, aGroupFeature)) { - std::set::iterator aGrpIt = myHiddenGroups.find(aResGroup); - if (aGrpIt != myHiddenGroups.end()) { - aResGroup->setDisplayed(true); - myHiddenGroups.erase(aGrpIt); - } - } + objectsMapFromPrs((*aIt), anObjectToShapes, anObjectToPrs); } std::set aRestoredObjects; @@ -557,21 +458,8 @@ void XGUI_FacesPanel::updateProcessedObjects(QMap for (QMap::const_iterator anIt = theItems.begin(); anIt != theItems.end(); anIt++) { ModuleBase_ViewerPrsPtr aPrs = anIt.value(); - ResultGroupPtr aResGroup; - FeaturePtr aGroupFeature; - if (getGroup(aPrs, aResGroup, aGroupFeature)) { - AttributeSelectionListPtr aSelectionList = aGroupFeature->selectionList("group_list"); - for (int i = 0; i < aSelectionList->size(); i++) { - AttributeSelectionPtr aSelection = aSelectionList->value(i); - ResultPtr aRes = aSelection->context(); - if (theObjects.find(aRes) == theObjects.end()) - theObjects.insert(aRes); - } - } - else { - if (theObjects.find(aPrs->object()) == theObjects.end()) - theObjects.insert(aPrs->object()); - } + if (theObjects.find(aPrs->object()) == theObjects.end()) + theObjects.insert(aPrs->object()); } } @@ -595,7 +483,7 @@ void XGUI_FacesPanel::onTransparencyChanged() std::map anObjectToPrs; QMap::const_iterator aIt; for (aIt = myItems.cbegin(); aIt != myItems.cend(); aIt++) { - getObjectsMapFromPrs(aIt.value(), anObjectToShapes, anObjectToPrs); + objectsMapFromPrs(aIt.value(), anObjectToShapes, anObjectToPrs); } double aTransp = Config_PropManager::real("Visualization", "hidden_face_transparency"); @@ -653,8 +541,6 @@ void XGUI_FacesPanel::onObjectDisplay(ObjectPtr theObject, AISObjectPtr theAIS) } } if (aContains) { - ResultGroupPtr aResGroup; - FeaturePtr aGroupFeature; std::map aObjectToShapes; std::map aObjectToPrs; std::set aObjects; @@ -664,45 +550,11 @@ void XGUI_FacesPanel::onObjectDisplay(ObjectPtr theObject, AISObjectPtr theAIS) std::map::const_iterator aSIt; for (aIt = myItems.begin(); aIt != myItems.end(); aIt++) { ModuleBase_ViewerPrsPtr aPrs = aIt.value(); - if (getGroup(aPrs, aResGroup, aGroupFeature)) { - getObjectsMapFromResult(aResGroup, aGroupFeature, aObjectToShapes, aObjectToPrs); - if (aResGroup == theObject) { - // If group is displayed it means that it has to be deleted from the Faces list and all - // corresponded faces have been restored - for (aSIt = aObjectToShapes.begin(); aSIt != aObjectToShapes.end(); aSIt++) { - TopoDS_ListOfShape aShapes = aSIt->second; - Handle(ModuleBase_ResultPrs) aResPrs = aObjectToPrs[aSIt->first]; - TopoDS_ListOfShape aAlreadyHidden = aResPrs->hiddenSubShapes(); - TopoDS_ListOfShape::Iterator aShPIt(aShapes); - for (; aShPIt.More(); aShPIt.Next()) { - if (aAlreadyHidden.Contains(aShPIt.Value())) - aAlreadyHidden.Remove(aShPIt.Value()); - } - aResPrs->setSubShapeHidden(aAlreadyHidden); - aObjects.insert(aSIt->first); - } - aIdsToRem.insert(aIt.key()); - } - else { - std::map::iterator aPIt = - aObjectToPrs.find(theObject); - if (aPIt != aObjectToPrs.end()) { - ObjectPtr aObj = aPIt->first; - if (aObj == theObject) { - TopoDS_ListOfShape aShapes = aObjectToShapes[aObj]; - aHideShapes.Append(aShapes); - aObjects.insert(aObj); - } - } - } - } - else { - if (aPrs->object() == theObject) { - TopoDS_Shape aShape = aPrs->shape()->impl(); - if (!aShape.IsNull()) - aHideShapes.Append(aShape); - aPrs->setInteractive(theAIS->impl()); - } + if (aPrs->object() == theObject) { + TopoDS_Shape aShape = aPrs->shape()->impl(); + if (!aShape.IsNull()) + aHideShapes.Append(aShape); + aPrs->setInteractive(theAIS->impl()); } } double aTransp = transparency(); diff --git a/src/XGUI/XGUI_FacesPanel.h b/src/XGUI/XGUI_FacesPanel.h index a76dfa550..87650843e 100644 --- a/src/XGUI/XGUI_FacesPanel.h +++ b/src/XGUI/XGUI_FacesPanel.h @@ -28,7 +28,6 @@ #include #include -#include #include #include @@ -159,20 +158,6 @@ private: static void updateProcessedObjects(QMap theItems, std::set& theObjects); - /// Returns maps of shapes and presentations. If object is a body result then it returns - /// its ruslts. If it is a group then it returns result of shapes included into the gropup - /// The function doesn't clear content of input maps. - /// \param thePrs a selected presintation - /// \param theObjectsToShapes map of objects to shapes list - /// \param theObjectToPrs map of objects to presentations - void getObjectsMapFromResult(ResultGroupPtr theResGroup, FeaturePtr theGroupFeature, - std::map& theObjectsToShapes, - std::map& theObjectToPrs); - - void getObjectsMapFromPrs(ModuleBase_ViewerPrsPtr thePrs, - std::map& theObjectToShapes, - std::map& theObjectToPrs); - /// Returns true if transparency choice is checked /// \return boolean value bool useTransparency() const; @@ -208,7 +193,6 @@ private: QMap myItems; ///< selected face items std::set myItemObjects; ///< cached objects of myItems std::set myHiddenObjects; ///< hidden objects - std::set myHiddenGroups; ///< hidden objects }; #endif -- 2.39.2