const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity
XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
+ : myUseExternalObjects(false), myWorkshop(theWorkshop)
{
- myWorkshop = theWorkshop;
}
XGUI_Displayer::~XGUI_Displayer()
bool XGUI_Displayer::isVisible(ObjectPtr theObject) const
{
- return myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end();
+ return myResult2AISObjectMap.contains(theObject);
}
void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer)
} else {
AISObjectPtr anAIS;
- GeomPresentablePtr aPrs = boost::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
+ GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
bool isShading = false;
if (aPrs) {
anAIS = aPrs->getAISObject(AISObjectPtr());
} else {
- ResultPtr aResult = boost::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
if (aResult) {
- boost::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
+ std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
if (aShapePtr) {
anAIS = AISObjectPtr(new GeomAPI_AISObject());
anAIS->setImpl(new Handle(AIS_InteractiveObject)(new ModuleBase_ResultPrs(aResult)));
myResult2AISObjectMap[theObject] = theAIS;
aContext->Display(anAISIO, false);
aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, isUpdateViewer);
+ if (aContext->HasOpenedContext()) {
+ if (myUseExternalObjects) {
+ if (myActiveSelectionModes.size() == 0)
+ aContext->Activate(anAISIO);
+ else {
+ foreach(int aMode, myActiveSelectionModes) {
+ aContext->Activate(anAISIO, aMode);
+ }
+ }
+ }
+ }
}
}
aContext->Remove(anAIS, isUpdateViewer);
}
}
- myResult2AISObjectMap.erase(theObject);
+ myResult2AISObjectMap.remove(theObject);
}
void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer)
AISObjectPtr aAISObj = getAISObject(theObject);
Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
- GeomPresentablePtr aPrs = boost::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
+ GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
if (aPrs) {
AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj);
if (!aAIS_Obj) {
}
}
+void XGUI_Displayer::activate(ObjectPtr theFeature)
+{
+ QIntList aModes;
+ activate(theFeature, aModes);
+}
+
void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes)
{
if (isVisible(theObject)) {
if (!isVisible(theObject))
return false;
- AISObjectPtr anObj = myResult2AISObjectMap.at(theObject);
+ AISObjectPtr anObj = myResult2AISObjectMap[theObject];
Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
TColStd_ListOfInteger aModes;
return aModes.Extent() > 0;
}
-void XGUI_Displayer::stopSelection(const QList<ObjectPtr>& theResults, const bool isStop,
+void XGUI_Displayer::stopSelection(const QObjectPtrList& theResults, const bool isStop,
const bool isUpdateViewer)
{
Handle(AIS_InteractiveContext) aContext = AISContext();
return;
Handle(AIS_Shape) anAIS;
- QList<ObjectPtr>::const_iterator anIt = theResults.begin(), aLast = theResults.end();
+ QObjectPtrList::const_iterator anIt = theResults.begin(), aLast = theResults.end();
ObjectPtr aFeature;
for (; anIt != aLast; anIt++) {
aFeature = *anIt;
updateViewer();
}
-void XGUI_Displayer::setSelected(const QList<ObjectPtr>& theResults, const bool isUpdateViewer)
+void XGUI_Displayer::setSelected(const QObjectPtrList& theResults, const bool isUpdateViewer)
{
Handle(AIS_InteractiveContext) aContext = AISContext();
// we need to unhighligth objects manually in the current local context
if (ic.IsNull())
return;
- ResultToAISMap::iterator aIt;
- for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) {
+ foreach (AISObjectPtr aAISObj, myResult2AISObjectMap) {
// erase an object
- AISObjectPtr aAISObj = (*aIt).second;
Handle(AIS_InteractiveObject) anIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
if (!anIO.IsNull())
- ic->Remove(anIO, false);
+ ic->Remove(anIO, false);
}
myResult2AISObjectMap.clear();
if (isUpdateViewer)
if (aContext.IsNull())
return;
- ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast =
- myResult2AISObjectMap.end();
- std::list<ObjectPtr> aRemoved;
- for (; aFIt != aFLast; aFIt++) {
- ObjectPtr aFeature = (*aFIt).first;
+ QObjectPtrList aRemoved;
+ foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) {
if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) {
- AISObjectPtr anObj = (*aFIt).second;
+ AISObjectPtr anObj = myResult2AISObjectMap[aFeature];
if (!anObj)
continue;
Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
if (!anAIS.IsNull()) {
aContext->Remove(anAIS, false);
- aRemoved.push_back(aFeature);
+ aRemoved.append(aFeature);
}
}
}
- std::list<ObjectPtr>::const_iterator anIt = aRemoved.begin(), aLast = aRemoved.end();
- for (; anIt != aLast; anIt++) {
- myResult2AISObjectMap.erase(myResult2AISObjectMap.find(*anIt));
+ foreach(ObjectPtr aObj, aRemoved) {
+ myResult2AISObjectMap.remove(aObj);
}
if (isUpdateViewer)
return;
// Open local context if there is no one
if (!aContext->HasOpenedContext()) {
- aContext->ClearCurrents(false);
- //aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/);
+ // Preserve selected objects
+ //AIS_ListOfInteractive aAisList;
+ //for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent())
+ // aAisList.Append(aContext->Current());
+
+ SelectMgr_ListOfFilter aFilters;
+ aFilters.Assign(aContext->Filters());
+
+ aContext->ClearCurrents();
aContext->OpenLocalContext();
aContext->NotUseDisplayedObjects();
+
+ myUseExternalObjects = false;
+ myActiveSelectionModes.clear();
+
+ SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
+ for (;aIt.More(); aIt.Next()) {
+ aContext->AddFilter(aIt.Value());
+ }
+ // Restore selection
+ //AIS_ListIteratorOfListOfInteractive aIt(aAisList);
+ //for(; aIt.More(); aIt.Next()) {
+ // if (aContext->IsDisplayed(aIt.Value()))
+ // aContext->SetSelected(aIt.Value(), false);
+ //}
}
}
void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer)
{
- AISContext()->ClearSelected(false);
- closeAllContexts(true);
+ Handle(AIS_InteractiveContext) ic = AISContext();
+ if ( (!ic.IsNull()) && (ic->HasOpenedContext()) ) {
+ // Preserve selected objects
+ //AIS_ListOfInteractive aAisList;
+ //for (ic->InitSelected(); ic->MoreSelected(); ic->NextSelected())
+ // aAisList.Append(ic->SelectedInteractive());
+
+ ic->ClearSelected();
+ ic->CloseAllContexts(false);
+
+ // Redisplay all object if they were displayed in localContext
+ Handle(AIS_InteractiveObject) aAISIO;
+ foreach (AISObjectPtr aAIS, myResult2AISObjectMap) {
+ aAISIO = aAIS->impl<Handle(AIS_InteractiveObject)>();
+ if (ic->DisplayStatus(aAISIO) != AIS_DS_Displayed) {
+ ic->Display(aAISIO, false);
+ ic->SetDisplayMode(aAISIO, Shading, false);
+ }
+ }
+ if (isUpdateViewer)
+ updateViewer();
+ myUseExternalObjects = false;
+ myActiveSelectionModes.clear();
+
+ // Restore selection
+ //AIS_ListIteratorOfListOfInteractive aIt(aAisList);
+ //for(; aIt.More(); aIt.Next()) {
+ // if (ic->IsDisplayed(aIt.Value()))
+ // ic->SetCurrentObject(aIt.Value(), false);
+ //}
+ }
}
AISObjectPtr XGUI_Displayer::getAISObject(ObjectPtr theObject) const
{
AISObjectPtr anIO;
- if (myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end())
- anIO = (myResult2AISObjectMap.find(theObject))->second;
+ if (myResult2AISObjectMap.contains(theObject))
+ anIO = myResult2AISObjectMap[theObject];
return anIO;
}
ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) const
{
ObjectPtr aFeature;
- ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast =
- myResult2AISObjectMap.end();
- for (; aFIt != aFLast && !aFeature; aFIt++) {
- AISObjectPtr anObj = (*aFIt).second;
- if (!anObj)
- continue;
- Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
- if (anAIS != theIO)
- continue;
- aFeature = (*aFIt).first;
+ foreach (ObjectPtr anObj, myResult2AISObjectMap.keys()) {
+ AISObjectPtr aAIS = myResult2AISObjectMap[anObj];
+ Handle(AIS_InteractiveObject) anAIS = aAIS->impl<Handle(AIS_InteractiveObject)>();
+ if (anAIS == theIO)
+ return anObj;
}
return aFeature;
}
-void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer)
-{
- Handle(AIS_InteractiveContext) ic = AISContext();
- if (!ic.IsNull()) {
- ic->CloseAllContexts(false);
- if (isUpdateViewer)
- updateViewer();
- }
-}
-
void XGUI_Displayer::updateViewer()
{
Handle(AIS_InteractiveContext) ic = AISContext();
return myWorkshop->viewer()->AISContext();
}
-void XGUI_Displayer::display(AISObjectPtr theAIS, bool isUpdate)
+void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate)
{
Handle(AIS_InteractiveContext) aContext = AISContext();
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
- if (!anAISIO.IsNull())
+ if (!anAISIO.IsNull()) {
aContext->Display(anAISIO, isUpdate);
+ if (aContext->HasOpenedContext()) {
+ if (myUseExternalObjects) {
+ if (myActiveSelectionModes.size() == 0)
+ aContext->Activate(anAISIO);
+ else {
+ foreach(int aMode, myActiveSelectionModes) {
+ aContext->Activate(anAISIO, aMode);
+ }
+ }
+ }
+ }
+ }
}
-void XGUI_Displayer::erase(AISObjectPtr theAIS, const bool isUpdate)
+void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool isUpdate)
{
Handle(AIS_InteractiveContext) aContext = AISContext();
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
return;
aContext->UseDisplayedObjects();
+ myUseExternalObjects = true;
+ myActiveSelectionModes = theModes;
//Deactivate trihedron which can be activated in local selector
AIS_ListOfInteractive aPrsList;
}
}
- ResultToAISMap::iterator aIt;
Handle(AIS_InteractiveObject) anAISIO;
- for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) {
- anAISIO = (*aIt).second->impl<Handle(AIS_InteractiveObject)>();
+ foreach (AISObjectPtr aAIS, myResult2AISObjectMap) {
+ anAISIO = aAIS->impl<Handle(AIS_InteractiveObject)>();
aContext->Load(anAISIO, -1, true);
if (theModes.size() == 0)
aContext->Activate(anAISIO);