X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=59e99f4c7ccf2dccdfd54361c3dbc3dd95f0fb8b;hb=ca05954b3f9fe2c1a21333df5d454eeccbd42224;hp=4ddd905723cb49e16e58ff3c57bc401ca6a65040;hpb=8265a72ffc4629fde76928773cffbca1db07e2dd;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 4ddd90572..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 @@ -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,6 +364,10 @@ 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); @@ -387,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 @@ -430,14 +442,22 @@ 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; @@ -446,6 +466,10 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL if (activate(anAISIO, myActiveSelectionModes, false)) isActivationChanged = true; } + 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(); @@ -548,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); @@ -556,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 @@ -582,7 +616,7 @@ void XGUI_Displayer::openLocalContext() //aContext->ClearCurrents(); aContext->OpenLocalContext(); - deactivateTrihedron(); + //deactivateTrihedron(); //aContext->NotUseDisplayedObjects(); //myUseExternalObjects = false; @@ -698,7 +732,6 @@ bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled) void XGUI_Displayer::updateViewer() const { - static int ai = 0; Handle(AIS_InteractiveContext) aContext = AISContext(); if (!aContext.IsNull() && myEnableUpdateViewer) { myWorkshop->viewer()->Zfitall(); @@ -725,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); @@ -745,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); } @@ -1000,8 +1033,8 @@ bool 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) { @@ -1015,7 +1048,7 @@ bool XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, isActivationChanged = true; } } - } + //} } return isActivationChanged; }