X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=59e99f4c7ccf2dccdfd54361c3dbc3dd95f0fb8b;hb=ca05954b3f9fe2c1a21333df5d454eeccbd42224;hp=7f5932011a1da79c11a9d3e1e57fdcdf125ab3dd;hpb=d840e491027b1586b200eefe5db878be35180cf2;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 7f5932011..59e99f4c7 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -11,7 +11,9 @@ #include "XGUI_Selection.h" #include "XGUI_CustomPrs.h" +#ifndef HAVE_SALOME #include +#endif #include #include @@ -35,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -96,7 +99,7 @@ QString qIntListInfo(const QIntList& theValues, const QString& theSeparator = QS } XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) - : myWorkshop(theWorkshop), myEnableUpdateViewer(true) + : myWorkshop(theWorkshop), myEnableUpdateViewer(true), myNeedUpdate(false) { enableUpdateViewer(true); myCustomPrs = std::shared_ptr(new XGUI_CustomPrs()); @@ -217,8 +220,10 @@ bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, // the fix from VPA for more suitable selection of sketcher lines if(anAISIO->Width() > 1) { for(int aModeIdx = 0; aModeIdx < myActiveSelectionModes.length(); ++aModeIdx) { - aContext->SetSelectionSensitivity(anAISIO, - myActiveSelectionModes.value(aModeIdx), anAISIO->Width() + 2); + int aMode = myActiveSelectionModes.value(aModeIdx); + double aPrecision = (aMode == getSelectionMode(TopAbs_VERTEX))? 20 : + (anAISIO->Width() + 2); + aContext->SetSelectionSensitivity(anAISIO, aMode, aPrecision); } } } @@ -359,12 +364,17 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer) void XGUI_Displayer::deactivateObjects(const QObjectPtrList& theObjList, const bool theUpdateViewer) { + //Handle(AIS_InteractiveObject) aTriehedron = getTrihedron(); + //if (!aTriehedron.IsNull()) + // deactivateAIS(aTriehedron); + QObjectPtrList::const_iterator anIt = theObjList.begin(), aLast = theObjList.end(); for (; anIt != aLast; anIt++) { deactivate(*anIt, false); } - if (theUpdateViewer) - updateViewer(); + //VSV It seems that there is no necessity to update viewer on deactivation + //if (theUpdateViewer) + // updateViewer(); } void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theModes) @@ -386,16 +396,19 @@ void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theMode } } +int XGUI_Displayer::getSelectionMode(int theShapeType) +{ + return (theShapeType >= TopAbs_SHAPE)? theShapeType : + AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theShapeType); +} + void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrList& theObjList, const bool theUpdateViewer) { // Convert shape types to selection types QIntList aModes; foreach(int aType, theModes) { - if (aType >= TopAbs_SHAPE) - aModes.append(aType); - else - aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum)aType)); + aModes.append(getSelectionMode(aType)); } #ifdef DEBUG_ACTIVATE_OBJECTS @@ -429,22 +442,37 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL Handle(AIS_InteractiveObject) anAISIO; AIS_ListOfInteractive aPrsList; - if (theObjList.isEmpty()) - return; - else { - foreach(ObjectPtr aObj, theObjList) { - if (myResult2AISObjectMap.contains(aObj)) - aPrsList.Append(myResult2AISObjectMap[aObj]->impl()); - } + //if (aObjList.isEmpty()) + // return; + //else { + foreach(ObjectPtr aObj, theObjList) { + if (myResult2AISObjectMap.contains(aObj)) + aPrsList.Append(myResult2AISObjectMap[aObj]->impl()); } + //} + + // Add trihedron because it has to partisipate in selection + Handle(AIS_InteractiveObject) aTrihedron = getTrihedron(); + if (!aTrihedron.IsNull()) + aPrsList.Append(aTrihedron); + + if (aPrsList.Extent() == 0) + return; AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); + bool isActivationChanged = false; for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ anAISIO = aLIt.Value(); - activate(anAISIO, myActiveSelectionModes, false); + if (activate(anAISIO, myActiveSelectionModes, false)) + isActivationChanged = true; } - if (theUpdateViewer) - updateViewer(); + if (!aTrihedron.IsNull()) { + foreach(int aMode, myActiveSelectionModes) + aContext->SetSelectionSensitivity(aTrihedron, aMode, 8); + } + // VSV It seems that there is no necessity to update viewer on activation + //if (theUpdateViewer && isActivationChanged) + // updateViewer(); } bool XGUI_Displayer::isActive(ObjectPtr theObject) const @@ -544,7 +572,16 @@ bool XGUI_Displayer::eraseAll(const bool theUpdateViewer) void XGUI_Displayer::deactivateTrihedron() const { - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + Handle(AIS_InteractiveObject) aTrihedron = getTrihedron(); + if (!aTrihedron.IsNull()) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + aContext->Deactivate(aTrihedron); + } +} + +Handle(AIS_InteractiveObject) XGUI_Displayer::getTrihedron() const +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); if (!aContext.IsNull()) { AIS_ListOfInteractive aList; aContext->DisplayedObjects(aList, true); @@ -552,15 +589,16 @@ void XGUI_Displayer::deactivateTrihedron() const for (aIt.Initialize(aList); aIt.More(); aIt.Next()) { Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aIt.Value()); if (!aTrihedron.IsNull()) { - aContext->Deactivate(aTrihedron); + return aTrihedron; } } } + return Handle(AIS_InteractiveObject)(); } void XGUI_Displayer::openLocalContext() { - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + Handle(AIS_InteractiveContext) aContext = AISContext(); // Open local context if there is no one if (!aContext.IsNull() && !aContext->HasOpenedContext()) { // Preserve selected objects @@ -578,7 +616,7 @@ void XGUI_Displayer::openLocalContext() //aContext->ClearCurrents(); aContext->OpenLocalContext(); - deactivateTrihedron(); + //deactivateTrihedron(); //aContext->NotUseDisplayedObjects(); //myUseExternalObjects = false; @@ -685,7 +723,10 @@ bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled) bool aWasEnabled = myEnableUpdateViewer; myEnableUpdateViewer = isEnabled; - + if (myNeedUpdate && myEnableUpdateViewer) { + updateViewer(); + myNeedUpdate = false; + } return aWasEnabled; } @@ -695,6 +736,8 @@ void XGUI_Displayer::updateViewer() const if (!aContext.IsNull() && myEnableUpdateViewer) { myWorkshop->viewer()->Zfitall(); aContext->UpdateCurrentViewer(); + } else { + myNeedUpdate = true; } } @@ -715,7 +758,7 @@ void XGUI_Displayer::activateAIS(const Handle(AIS_InteractiveObject)& theIO, void XGUI_Displayer::deactivateAIS(const Handle(AIS_InteractiveObject)& theIO, const int theMode) const { - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + Handle(AIS_InteractiveContext) aContext = AISContext(); if (!aContext.IsNull()) { if (theMode == -1) aContext->Deactivate(theIO); @@ -735,7 +778,7 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (!aContext.IsNull() && !aContext->HasOpenedContext()) { aContext->OpenLocalContext(); - deactivateTrihedron(); + //deactivateTrihedron(); aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0); aContext->DefaultDrawer()->UIsoAspect()->SetNumber(0); } @@ -940,14 +983,15 @@ bool XGUI_Displayer::canBeShaded(ObjectPtr theObject) const return ::canBeShaded(anAIS); } -void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, +bool XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, const QIntList& theModes, const bool theUpdateViewer) const { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull() || theIO.IsNull()) - return; - + return false; + + bool isActivationChanged = false; // deactivate object in all modes, which are not in the list of activation // It seems that after the IO deactivation the selected state of the IO's owners // is modified in OCC(version: 6.8.0) and the selection of the object later is lost. @@ -976,8 +1020,10 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, // the selection from the previous activation modes should be cleared manually (#26172) theIO->ClearSelected(); aContext->LocalContext()->ClearOutdatedSelection(theIO, true); - if (theUpdateViewer) - updateViewer(); + // For performance issues + //if (theUpdateViewer) + // updateViewer(); + isActivationChanged = true; } // loading the interactive object allowing the decomposition @@ -987,8 +1033,8 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, // trihedron AIS check should be after the AIS loading. // If it is not loaded, it is steel selectable in the viewer. - Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(theIO); - if (aTrihedron.IsNull()) { + //Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(theIO); + //if (aTrihedron.IsNull()) { //aContext->Load(anAISIO, -1, true); // In order to clear active modes list if (theModes.size() == 0) { @@ -999,10 +1045,12 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, //aContext->Load(anAISIO, aMode, true); if (!aModesActivatedForIO.contains(aMode)) { activateAIS(theIO, aMode, theUpdateViewer); + isActivationChanged = true; } } - } + //} } + return isActivationChanged; } bool XGUI_Displayer::customizeObject(ObjectPtr theObject)