X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=6ee3b9348ca6d06762f143a943fd7929d856ed6f;hb=06e7f5859095193fc7f498bd89a7d28009794f53;hp=052bdcdf94b5b96e12db72c23036c8d3eebbbea7;hpb=4635fa2d17f7d9cca2892169b7372ffa37cd2180;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 052bdcdf9..6ee3b9348 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2020 CEA/DEN, EDF R&D +// 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 @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include @@ -56,9 +56,7 @@ #include #include #include -#include #include -#include #include #ifdef BEFORE_TRIHEDRON_PATCH #include @@ -68,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -90,9 +89,19 @@ #include +#ifdef _MSC_VER +#pragma warning(disable: 4702) +#endif + /// defines the local context mouse selection sensitivity const int MOUSE_SENSITIVITY_IN_PIXEL = 10; +/// defines the display priority for results brought to front +constexpr int FRONT_DISPLAY_PRIORITY = 8; /* = Graphic3d_DisplayPriority_Highlight-1 */ + +/// defines the default (normal) display priority for all results +constexpr int DEFAULT_DISPLAY_PRIORITY = 5; /* = Graphic3d_DisplayPriority_Normal */ + //#define DEBUG_DISPLAY //#define DEBUG_FEATURE_REDISPLAY //#define DEBUG_SELECTION_FILTERS @@ -126,8 +135,10 @@ QString qIntListInfo(const QIntList& theValues, const QString& theSeparator = QS //************************************************************** XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) -: myWorkshop(theWorkshop), myNeedUpdate(false), - myViewerBlockedRecursiveCount(0), myContextId(0) +: myWorkshop(theWorkshop), + myViewerBlockedRecursiveCount(0), + myContextId(0), + myNeedUpdate(false) { BRepMesh_IncrementalMesh::SetParallelDefault(Standard_True); } @@ -160,6 +171,8 @@ bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) aScreen->setViewScale(getViewScale()); } anAIS = aPrs->getAISObject(anAIS); + if (anAIS.get()) + myWorkshop->module()->customizePresentation(theObject, anAIS); } else { anAIS = myWorkshop->module()->createPresentation(theObject); isShading = true; @@ -209,6 +222,13 @@ bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, int aDispMode = isShading? Shading : Wireframe; anAISIO->SetDisplayMode(aDispMode); aContext->Display(anAISIO, aDispMode, 0, false, AIS_DS_Displayed); + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (ModelAPI_Tools::isBringToFront(aResult)) { + // NOTE: do not use a priority higher than 8 as highlight uses priority 9! + // Any higher level prevents the highlight from being visible as it would + // appear "behind" the Groups. + aContext->SetDisplayPriority(anAISIO, FRONT_DISPLAY_PRIORITY); + } #ifdef TINSPECTOR if (getCallBack()) getCallBack()->Display(anAISIO); #endif @@ -217,6 +237,7 @@ bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, emit objectDisplayed(theObject, theAIS); selectionActivate()->activate(anAISIO, theUpdateViewer); } + myWorkshop->updateGroupsText(); if (theUpdateViewer) updateViewer(); @@ -254,7 +275,7 @@ bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer) qDebug(QString("erase object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str()); qDebug(getResult2AISObjectMapInfo().c_str()); #endif - + myWorkshop->updateGroupsText(); if (theUpdateViewer) updateViewer(); @@ -322,6 +343,13 @@ bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) Handle(ModuleBase_ResultPrs) aResPrs = Handle(ModuleBase_ResultPrs)::DownCast(aAISIO); if (!aResPrs.IsNull()) aResPrs->updateIsoLines(); + + // Only support the "Bring To Front" command for Groups (for now) + ResultGroupPtr aGroup = std::dynamic_pointer_cast(aResult); + if (aGroup.get()) { + bool isInFront = ModelAPI_Tools::isBringToFront(aResult); + aContext->SetDisplayPriority(aAISIO, (isInFront ? FRONT_DISPLAY_PRIORITY : DEFAULT_DISPLAY_PRIORITY)); + } } //myWorkshop->module()->storeSelection(); @@ -345,6 +373,7 @@ bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) #ifdef DEBUG_FEATURE_REDISPLAY qDebug(" Redisplay happens"); #endif + myWorkshop->updateGroupsText(); if (theUpdateViewer) updateViewer(); } @@ -526,6 +555,7 @@ bool XGUI_Displayer::eraseAll(const bool theUpdateViewer) aErased = true; } } + myWorkshop->updateGroupsText(); if (theUpdateViewer) updateViewer(); } @@ -632,25 +662,13 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const myContextId = aContext.get(); if (!myWorkshop->selectionActivate()->isTrihedronActive()) selectionActivate()->deactivateTrihedron(true); - // Do not modify default drawer. The same is done in ModuleBase_ResultPrs - //aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0); - //aContext->DefaultDrawer()->UIsoAspect()->SetNumber(0); - - //Handle(AIS_Trihedron) aTrihedron = myWorkshop->viewer()->trihedron(); - //aTrihedron->getHighlightPointAspect()->SetScale(2.0); - //aTrihedron->getHighlightPointAspect()->SetTypeOfMarker(Aspect_TOM_O_STAR); // Commented out according to discussion in bug #2825 ModuleBase_IViewer::DefaultHighlightDrawer = aContext->HighlightStyle(); - //Handle(Prs3d_Drawer) aSelStyle = aContext->SelectionStyle(); - //double aDeflection = - // QString(ModelAPI_ResultConstruction::DEFAULT_DEFLECTION().c_str()).toDouble(); - //try { - // aDeflection = Config_PropManager::real("Visualization", "construction_deflection"); - //} catch (...) {} - - //ModuleBase_IViewer::DefaultHighlightDrawer->SetDeviationCoefficient(aDeflection); - //aSelStyle->SetDeviationCoefficient(aDeflection); + + Handle(AIS_Trihedron) aTrihedron = myWorkshop->viewer()->trihedron(); + if (!aTrihedron.IsNull()) + ModuleBase_Tools::setPointBallHighlighting(aTrihedron.get()); } return aContext; } @@ -908,39 +926,6 @@ bool XGUI_Displayer::canBeShaded(ObjectPtr theObject) const return ::canBeShaded(anAIS, myWorkshop->module()); } -//************************************************************** -//bool XGUI_Displayer::customizeObject(ObjectPtr theObject) -//{ -// AISObjectPtr anAISObj = getAISObject(theObject); -// // correct the result's color it it has the attribute -// ResultPtr aResult = std::dynamic_pointer_cast(theObject); -// -// // Customization of presentation -// GeomCustomPrsPtr aCustomPrs; -// FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); -// if (aFeature.get() != NULL) { -// GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast(aFeature); -// if (aCustPrs.get() != NULL) -// aCustomPrs = aCustPrs; -// } -// if (aCustomPrs.get() == NULL) { -// GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); -// // we ignore presentable not customized objects -// if (aPrs.get() == NULL) -// aCustomPrs = myCustomPrs; -// } -// bool isCustomized = aCustomPrs.get() && -// aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs); -// isCustomized = myWorkshop->module()->afterCustomisePresentation(aResult, anAISObj, myCustomPrs) -// || isCustomized; -// -// // update presentation state if faces panel is active -// if (anAISObj.get() && myWorkshop->facesPanel()) -// isCustomized = myWorkshop->facesPanel()->customizeObject(theObject, anAISObj) || isCustomized; -// -// return isCustomized; -//} - //************************************************************** QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject, const QColor& theColor, @@ -953,6 +938,7 @@ QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject, int aR, aG, aB; anAISObj->getColor(aR, aG, aB); anAISObj->setColor(theColor.red(), theColor.green(), theColor.blue()); + myWorkshop->updateGroupsText(); if (theUpdateViewer) updateViewer(); return QColor(aR, aG, aB); @@ -1034,9 +1020,9 @@ void XGUI_Displayer::getPresentations(const ObjectPtr& theObject, ModelAPI_Tools::allResults(aFeature, aResults); std::list::const_iterator anIt = aResults.begin(), aLast = aResults.end(); for (; anIt != aLast; ++anIt) { - AISObjectPtr aAISObj = getAISObject(*anIt); - if (aAISObj.get() != NULL) { - Handle(AIS_InteractiveObject) anAIS = aAISObj->impl(); + AISObjectPtr aCurAISObj = getAISObject(*anIt); + if (aCurAISObj.get() != NULL) { + Handle(AIS_InteractiveObject) anAIS = aCurAISObj->impl(); if (!anAIS.IsNull() && !thePresentations.Contains(anAIS)) thePresentations.Add(anAIS); } @@ -1099,7 +1085,7 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th /// OCCT: to write about the problem that active owners method returns one owner several times QList aSelectedIds; // Remember of selected address in order to avoid duplicates for (; anOwnersIt.More(); anOwnersIt.Next()) { - anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anOwnersIt.Value()); + anOwner = anOwnersIt.Value(); if (aSelectedIds.contains((size_t)anOwner.get())) continue; aSelectedIds.append((size_t)anOwner.get()); @@ -1107,6 +1093,14 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(anOwner); if (!BROwnr.IsNull() && BROwnr->HasShape()) { const TopoDS_Shape& aShape = BROwnr->Shape(); + + Handle(ModuleBase_ResultPrs) aResPrs = + Handle(ModuleBase_ResultPrs)::DownCast(BROwnr->Selectable()); + TopoDS_Shape aRealShape; + if (!aResPrs.IsNull()) { + aRealShape = aResPrs->originalShape(); + } + if (aShape.IsNull()) continue; @@ -1123,7 +1117,15 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th // isSame should be used here as it does not check orientation of shapes // despite on isEqual of shapes or IsBound for shape in QMap. Orientation is // different for Edges shapes in model shape and owner even if this is the same shape - if (ModuleBase_Tools::isSameShape(aParameterShape, aShape)) { + bool isSame = ModuleBase_Tools::isSameShape(aParameterShape, aShape); + if (!isSame) { + // In case of using HideFaces panel we can have instead of an original shape + // a compaund of faces which represent original shape with hidden faces. + // So, we have to compare the parameter with original shape + if (!aRealShape.IsNull()) + isSame = ModuleBase_Tools::isSameShape(aParameterShape, aRealShape); + } + if (isSame) { Handle(AIS_InteractiveObject) anOwnerPresentation = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); NCollection_Map aPresentations = @@ -1142,7 +1144,7 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th Handle(AIS_Shape) anOwnerPresentation = Handle(AIS_Shape)::DownCast(anOwner->Selectable()); const TopoDS_Shape& aPresentationShape = anOwnerPresentation->Shape(); - if (aParameterShape.IsSame(anOwnerPresentation->Shape()) && + if (aParameterShape.IsSame(aPresentationShape) && !aCompsolidPresentations.Contains(anOwnerPresentation)) aCompsolidPresentations.Add(anOwnerPresentation); } @@ -1171,11 +1173,7 @@ GeomPlanePtr XGUI_Displayer::getScreenPlane() const Handle(AIS_InteractiveContext) aContext = AISContext(); if (!aContext.IsNull()) { Handle(V3d_Viewer) aViewer = aContext->CurrentViewer(); - Handle(V3d_View) aView; - for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews()) { - aView = aViewer->ActiveView(); - break; - } + Handle(V3d_View) aView = aViewer->ActiveViews().First(); if (!aView.IsNull()) { double aEyeX, aEyeY, aEyeZ; aView->Eye(aEyeX, aEyeY, aEyeZ); @@ -1197,11 +1195,7 @@ double XGUI_Displayer::getViewScale() const Handle(AIS_InteractiveContext) aContext = AISContext(); if (!aContext.IsNull()) { Handle(V3d_Viewer) aViewer = aContext->CurrentViewer(); - Handle(V3d_View) aView; - for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews()) { - aView = aViewer->ActiveView(); - break; - } + Handle(V3d_View) aView = aViewer->ActiveViews().First(); return aView->Camera()->Scale(); } return 1;