X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=1fef7d318df56218a33259c935498e3c42dcbea8;hb=9d2e6d9c21e4f16817ca5b572847fe323f6ef32a;hp=ce6aadefccc27003aa65cee1f139a9ecfc48b1ce;hpb=e1aac64495c108d7e9b7a4e922f495b4e938c47e;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index ce6aadefc..1fef7d318 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -93,14 +94,6 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) if (isVisible(theObject)) { redisplay(theObject, isUpdateViewer); } else { -#ifdef DEBUG_DISPLAY - FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (aFeature.get() != NULL) { - qDebug(QString("display feature: %1, displayed: %2"). - arg(aFeature->data()->name().c_str()). - arg(displayedObjects().size()).toStdString().c_str()); - } -#endif AISObjectPtr anAIS; GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); @@ -152,7 +145,8 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { - myResult2AISObjectMap[theObject] = theAIS; + appendResultObject(theObject, theAIS); + bool aCanBeShaded = ::canBeShaded(anAISIO); // In order to avoid extra closing/opening context SelectMgr_IndexedMapOfOwner aSelectedOwners; @@ -217,7 +211,7 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) return; } if (aAIS_Obj != aAISObj) { - myResult2AISObjectMap[theObject] = aAIS_Obj; + appendResultObject(theObject, aAIS_Obj); } aAISIO = aAIS_Obj->impl(); } @@ -337,7 +331,7 @@ void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theMode } } -void XGUI_Displayer::activateObjects(const QIntList& theModes) +void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrList& theObjList) { #ifdef DEBUG_ACTIVATE qDebug(QString("activate all features: theModes: %2, myActiveSelectionModes: %3"). @@ -362,15 +356,24 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes) //aContext->UseDisplayedObjects(); //myUseExternalObjects = true; + Handle(AIS_InteractiveObject) anAISIO; AIS_ListOfInteractive aPrsList; - ::displayedObjects(aContext, aPrsList); + if (theObjList.isEmpty()) + ::displayedObjects(aContext, aPrsList); + else { + foreach(ObjectPtr aObj, theObjList) { + if (myResult2AISObjectMap.contains(aObj)) + aPrsList.Append(myResult2AISObjectMap[aObj]->impl()); + } + } Handle(AIS_Trihedron) aTrihedron; AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); - Handle(AIS_InteractiveObject) anAISIO; for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ anAISIO = aLIt.Value(); - activate(anAISIO, myActiveSelectionModes); + aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO); + if (aTrihedron.IsNull()) + activate(anAISIO, myActiveSelectionModes); } } @@ -416,44 +419,6 @@ bool XGUI_Displayer::isActive(ObjectPtr theObject) const return aModes.Extent() > 0; } -void XGUI_Displayer::setSelected(const QObjectPtrList& theResults, const bool isUpdateViewer) -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; - if (aContext->HasOpenedContext()) { - aContext->UnhilightSelected(); - aContext->ClearSelected(); - foreach(ObjectPtr aResult, theResults) { - if (isVisible(aResult)) { - AISObjectPtr anObj = myResult2AISObjectMap[aResult]; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (!anAIS.IsNull()) { - // The methods are replaced in order to provide multi-selection, e.g. restore selection - // by activating multi selector widget. It also gives an advantage that the multi - // selection in OB gives multi-selection in the viewer - //aContext->SetSelected(anAIS, false); - // The selection in the context was cleared, so the method sets the objects are selected - aContext->AddOrRemoveSelected(anAIS, false); - } - } - } - } else { - aContext->UnhilightCurrents(); - aContext->ClearCurrents(); - foreach(ObjectPtr aResult, theResults) { - if (isVisible(aResult)) { - AISObjectPtr anObj = myResult2AISObjectMap[aResult]; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (!anAIS.IsNull()) - aContext->SetCurrentObject(anAIS, false); - } - } - } - if (isUpdateViewer) - updateViewer(); -} - void XGUI_Displayer::setSelected(const QList& theValues, bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -464,19 +429,16 @@ void XGUI_Displayer::setSelected(const QList& theValues, aContext->ClearSelected(); //if (aSelected.size() > 0) { foreach (ModuleBase_ViewerPrs aPrs, theValues) { - // if (isValidSelection(aPrs)) { - //foreach(ObjectPtr aResult, theResults) { - ObjectPtr anObject = aPrs.object(); - ResultPtr aResult = std::dynamic_pointer_cast(anObject); - if (aResult.get() && isVisible(aResult)) { - AISObjectPtr anObj = myResult2AISObjectMap[aResult]; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (!anAIS.IsNull()) { - const TopoDS_Shape& aShape = aPrs.shape(); - if (!aShape.IsNull()) { - aContext->AddOrRemoveSelected(aShape, false); - } - else { + const TopoDS_Shape& aShape = aPrs.shape(); + if (!aShape.IsNull()) { + aContext->AddOrRemoveSelected(aShape, false); + } else { + ObjectPtr anObject = aPrs.object(); + ResultPtr aResult = std::dynamic_pointer_cast(anObject); + if (aResult.get() && isVisible(aResult)) { + AISObjectPtr anObj = myResult2AISObjectMap[aResult]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (!anAIS.IsNull()) { // The methods are replaced in order to provide multi-selection, e.g. restore selection // by activating multi selector widget. It also gives an advantage that the multi // selection in OB gives multi-selection in the viewer @@ -490,7 +452,6 @@ void XGUI_Displayer::setSelected(const QList& theValues, } else { aContext->UnhilightCurrents(); aContext->ClearCurrents(); - //foreach(ObjectPtr aResult, theResults) { foreach (ModuleBase_ViewerPrs aPrs, theValues) { ObjectPtr anObject = aPrs.object(); ResultPtr aResult = std::dynamic_pointer_cast(anObject); @@ -881,26 +842,22 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, if (aTColModes.IsEmpty()) aContext->Load(theIO, -1, true); - Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(theIO); - //Deactivate trihedron which can be activated in local selector - if (aTrihedron.IsNull()) { //aContext->Load(anAISIO, -1, true); // In order to clear active modes list - if (theModes.size() == 0) { - //aContext->Load(anAISIO, 0, true); - aContext->Activate(theIO); + if (theModes.size() == 0) { + //aContext->Load(anAISIO, 0, true); + aContext->Activate(theIO); #ifdef DEBUG_ACTIVATE - qDebug("activate in all modes"); + qDebug("activate in all modes"); #endif - } else { - foreach(int aMode, theModes) { - //aContext->Load(anAISIO, aMode, true); - if (!aModesActivatedForIO.contains(aMode)) { - aContext->Activate(theIO, aMode); + } else { + foreach(int aMode, theModes) { + //aContext->Load(anAISIO, aMode, true); + if (!aModesActivatedForIO.contains(aMode)) { + aContext->Activate(theIO, aMode); #ifdef DEBUG_ACTIVATE - qDebug(QString("activate: %1").arg(aMode).toStdString().c_str()); + qDebug(QString("activate: %1").arg(aMode).toStdString().c_str()); #endif - } } } } @@ -944,3 +901,31 @@ QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject, const QColor& theColo updateViewer(); return QColor(aR, aG, aB); } + +void XGUI_Displayer::appendResultObject(ObjectPtr theObject, AISObjectPtr theAIS) +{ + myResult2AISObjectMap[theObject] = theAIS; + +#ifdef DEBUG_DISPLAY + std::ostringstream aPtrStr; + aPtrStr << theObject.get(); + qDebug(QString("display object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str()); + qDebug(getResult2AISObjectMapInfo().c_str()); +#endif +} + +std::string XGUI_Displayer::getResult2AISObjectMapInfo() const +{ + QStringList aContent; + foreach (ObjectPtr aObj, myResult2AISObjectMap.keys()) { + AISObjectPtr aAISObj = myResult2AISObjectMap[aObj]; + std::ostringstream aPtrStr; + aPtrStr << "aObj = " << aObj.get() << ":"; + aPtrStr << "anAIS = " << aAISObj.get() << ":"; + aPtrStr << "[" << ModuleBase_Tools::objectInfo(aObj).toStdString().c_str() << "]"; + + aContent.append(aPtrStr.str().c_str()); + } + return QString("myResult2AISObjectMap: size = %1\n%2").arg(myResult2AISObjectMap.size()). + arg(aContent.join("\n")).toStdString().c_str(); +}