X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVISUGUI%2FVisuGUI_Tools.cxx;h=23b90dc2d03f5509b0e9bc5884f8fc958ad7d6b4;hb=a2af64b36f5dc0ef10aea5a727f4504a204a52c4;hp=1b80eb979b5b6d417b76943734c6baeaa7d9f6e0;hpb=b95033d8f2b3010dcaf82ad5af5d4343f7688665;p=modules%2Fvisu.git diff --git a/src/VISUGUI/VisuGUI_Tools.cxx b/src/VISUGUI/VisuGUI_Tools.cxx index 1b80eb97..23b90dc2 100644 --- a/src/VISUGUI/VisuGUI_Tools.cxx +++ b/src/VISUGUI/VisuGUI_Tools.cxx @@ -32,7 +32,9 @@ #include "VISU_Prs3d_i.hh" #include "VISU_Result_i.hh" #include "VISU_Table_i.hh" +#include "VISU_Mesh_i.hh" #include "VISU_ViewManager_i.hh" + #include "VISU_Actor.h" #include "SalomeApp_Module.h" @@ -147,6 +149,59 @@ namespace VISU return aGen; } + VISU::Storable::TRestoringMap + getMapOfValue(SALOMEDS::SObject_var theSObject) + { + VISU::Storable::TRestoringMap aMap; + if(!theSObject->_is_nil()){ + SALOMEDS::GenericAttribute_var anAttr; + if (theSObject->FindAttribute(anAttr, "AttributeComment")) { + SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr); + CORBA::String_var aValue = aComment->Value(); + QString aString(aValue.in()); + VISU::Storable::StrToMap(aString,aMap); + } + } + return aMap; + } + + QString + getValue(SALOMEDS::SObject_var theSObject, + QString theKey) + { + QString aStr(""); + VISU::Storable::TRestoringMap aMap = getMapOfValue(theSObject); + if(!aMap.empty()) + aStr = VISU::Storable::FindValue(aMap,theKey.latin1()); + return aStr; + } + + VISU::Storable::TRestoringMap getMapOfValue (_PTR(SObject) theSObject) + { + VISU::Storable::TRestoringMap aMap; + if (theSObject) { + _PTR(GenericAttribute) anAttr; + if (theSObject->FindAttribute(anAttr, "AttributeComment")) { + _PTR(AttributeComment) aComment (anAttr); + std::string aValue = aComment->Value(); + QString aString (aValue.c_str()); + VISU::Storable::StrToMap(aString, aMap); + } + } + return aMap; + } + + QString getValue (_PTR(SObject) theSObject, QString theKey) + { + QString aStr(""); + VISU::Storable::TRestoringMap aMap = getMapOfValue(theSObject); + if (!aMap.empty()) + aStr = VISU::Storable::FindValue(aMap, theKey.latin1()); + return aStr; + } + + //************************************************************ + // Selection CORBA::Object_var GetSelectedObj(const SalomeApp_Study* theStudy, const QString& theEntry, @@ -189,57 +244,272 @@ namespace VISU return CORBA::Object::_nil(); } - VISU::Storable::TRestoringMap - getMapOfValue(SALOMEDS::SObject_var theSObject) + void + Add(SalomeApp_SelectionMgr* theSelectionMgr, + const Handle(SALOME_InteractiveObject)& theIO) { - VISU::Storable::TRestoringMap aMap; - if(!theSObject->_is_nil()){ - SALOMEDS::GenericAttribute_var anAttr; - if (theSObject->FindAttribute(anAttr, "AttributeComment")) { - SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr); - CORBA::String_var aValue = aComment->Value(); - QString aString(aValue.in()); - VISU::Storable::StrToMap(aString,aMap); + SALOME_ListIO aListIO; + theSelectionMgr->selectedObjects(aListIO); + aListIO.Append(theIO); + theSelectionMgr->setSelectedObjects(aListIO); + } + + void + Remove(SalomeApp_SelectionMgr* theSelectionMgr, + const Handle(SALOME_InteractiveObject)& theIO) + { + if (theIO.IsNull()) return; + SALOME_ListIO aListIO, aNewListIO; + theSelectionMgr->selectedObjects(aListIO); + SALOME_ListIteratorOfListIO anIter (aListIO); + for (; anIter.More(); anIter.Next()) { + Handle(SALOME_InteractiveObject) anIO = anIter.Value(); + if (!anIO->isSame(theIO)) { + aNewListIO.Append(theIO); } } - return aMap; + theSelectionMgr->setSelectedObjects(aNewListIO); } - QString - getValue(SALOMEDS::SObject_var theSObject, - QString theKey) + /*! + * \brief Check, if "Delete" popup-menu can be put on current selection + * + * \param theModule - is used to access SelectionManager, Study and VISU_Gen + * \retval bool - returns TRUE if all currently selected objects are removable + */ + bool + IsRemovableSelected (const SalomeApp_Module* theModule) { - QString aStr(""); - VISU::Storable::TRestoringMap aMap = getMapOfValue(theSObject); - if(!aMap.empty()) - aStr = VISU::Storable::FindValue(aMap,theKey.latin1()); - return aStr; + SalomeApp_SelectionMgr* aSelectionMgr = GetSelectionMgr(theModule); + SALOME_ListIO aListIO; + aSelectionMgr->selectedObjects(aListIO); + + if (aListIO.Extent() < 1) + return false; + + _PTR(Study) aStudy = GetCStudy(GetAppStudy(theModule)); + if (!aStudy) return false; + + // In some cases single selection can have its own popup-menu item for deletion + if (aListIO.Extent() == 1) { + Handle(SALOME_InteractiveObject) anIO = aListIO.First(); + _PTR(SObject) aSObject = aStudy->FindObjectID(anIO->getEntry()); + if (aSObject) { + VISU::VISUType aType = (VISU::VISUType)getValue(aSObject, "myType").toInt(); + if (aType == VISU::TVIEW3D) { + return false; // special case + } + } + } + + SALOME_ListIteratorOfListIO anIter (aListIO); + for (; anIter.More(); anIter.Next()) { + Handle(SALOME_InteractiveObject) anIO = anIter.Value(); + if (anIO->hasEntry()) { + _PTR(SObject) aSObject = aStudy->FindObjectID(anIO->getEntry()); + VISU::Storable::TRestoringMap pMap; + if (aSObject) { + CORBA::Object_var aCORBAObject = VISU::ClientSObjectToObject(aSObject); + if (!CORBA::is_nil(aCORBAObject)) { + VISU::RemovableObject_var aRemovableObj = VISU::RemovableObject::_narrow(aCORBAObject); + if (CORBA::is_nil(aRemovableObj)) { + // Not removable CORBA object + return false; + } + } else { + // Can be removed, if lays directly under VISU + // (first sub-level) or is a child of such an object + string aNAME, aVisuNAME = GetVisuGen(theModule)->ComponentDataType(); + _PTR(GenericAttribute) anAttr; + _PTR(AttributeComment) aComment; + + bool isUnderVISU = false; + _PTR(SObject) aFatherSObject = aSObject->GetFather(); + if (aFatherSObject->FindAttribute(anAttr, "AttributeComment")) { + _PTR(AttributeComment) aComment (anAttr); + aNAME = aComment->Value(); + if (aNAME == aVisuNAME) { + isUnderVISU = true; + } + } + if (!isUnderVISU) { + // Not directly under VISU component, check father + aCORBAObject = VISU::ClientSObjectToObject(aFatherSObject); + if (!CORBA::is_nil(aCORBAObject)) { + // Father has IOR + return false; + } + + isUnderVISU = false; + aFatherSObject = aFatherSObject->GetFather(); + if (aFatherSObject->FindAttribute(anAttr, "AttributeComment")) { + _PTR(AttributeComment) aComment (anAttr); + aNAME = aComment->Value(); + if (aNAME == aVisuNAME) { + isUnderVISU = true; + } + } + if (!isUnderVISU) { + // Father is not directly under VISU component + return false; + } + } + } + } + } + } + return true; } - VISU::Storable::TRestoringMap getMapOfValue (_PTR(SObject) theSObject) + //************************************************************ + // Display/Erase + + void + ErasePrs (const SalomeApp_Module* theModule, + CORBA::Object_ptr theObject, bool theUpdate) { - VISU::Storable::TRestoringMap aMap; - if (theSObject) { - _PTR(GenericAttribute) anAttr; - if (theSObject->FindAttribute(anAttr, "AttributeComment")) { - _PTR(AttributeComment) aComment (anAttr); - std::string aValue = aComment->Value(); - QString aString (aValue.c_str()); - VISU::Storable::StrToMap(aString, aMap); + if (!CORBA::is_nil(theObject)) { + VISU::Base_var aBase = VISU::Base::_narrow(theObject); + if (CORBA::is_nil(aBase)) return; + VISU::VISUType aType = aBase->GetType(); + switch (aType) { + case VISU::TCURVE: + { + if (VISU::Curve_i* aCurve = dynamic_cast(VISU::GetServant(aBase).in())) + PlotCurve(theModule, aCurve, VISU::eErase ); + break; + } + case VISU::TCONTAINER: + { + if (VISU::Container_i* aContainer = dynamic_cast(VISU::GetServant(aBase).in())) + PlotContainer(theModule, aContainer, VISU::eErase ); + break; + } + case VISU::TTABLE: + { + if (VISU::Table_i* aTable = dynamic_cast(VISU::GetServant(aBase).in())) + PlotTable(theModule, aTable, VISU::eErase ); + break; + } + default: + { + if (VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(aBase).in())) { + ErasePrs3d(theModule, aPrsObject); + if (theUpdate) { + if (SVTK_ViewWindow* vw = GetViewWindow(theModule)) + vw->Repaint(); + } + } + } + } // switch (aType) + } + } + + void + DeleteSObject (SalomeApp_Module* theModule, + SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject) + { + SALOMEDS::ChildIterator_var aChildIter = theStudy->NewChildIterator(theSObject); + for (aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()) { + SALOMEDS::SObject_var aChildSObject = aChildIter->Value(); + CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject); + ErasePrs(theModule, aChildObj); + } + + CORBA::Object_var anObj = VISU::SObjectToObject(theSObject); + if (!CORBA::is_nil(anObj)) { + VISU::RemovableObject_var aRemovableObject = VISU::RemovableObject::_narrow(anObj); + if (!CORBA::is_nil(aRemovableObject)) { + aRemovableObject->RemoveFromStudy(); } + } else { + // Remove aSObject together with all its sub-objects + VISU::RemoveFromStudy(theSObject, + false, // remove not only IOR attribute, but Object With Children + false); // not Destroy() sub-objects } - return aMap; } - QString getValue (_PTR(SObject) theSObject, QString theKey) + void + DeletePrs3d(SalomeApp_Module* theModule, + VISU::Prs3d_i* thePrs, + const Handle(SALOME_InteractiveObject)& theIO) { - QString aStr(""); - VISU::Storable::TRestoringMap aMap = getMapOfValue(theSObject); - if (!aMap.empty()) - aStr = VISU::Storable::FindValue(aMap, theKey.latin1()); - return aStr; + if(!thePrs) + return; + if(CheckLock(GetCStudy(GetAppStudy(theModule)))) + return; + SALOMEDS::SObject_var aSObject = thePrs->GetSObject(); + CORBA::String_var anEntry = aSObject->GetID(); + SalomeApp_SelectionMgr* aSelectionMgr = GetSelectionMgr(theModule); + Remove(aSelectionMgr,theIO); + TViewWindows aViewWindows = GetViews(theModule); + for(int i = 0, iEnd = aViewWindows.size(); i < iEnd; i++){ + SVTK_ViewWindow* aView = aViewWindows[i]; + if(VISU_Actor* anActor = FindActor(aView,anEntry.in())){ + aView->RemoveActor(anActor); + anActor->Delete(); + } + } + thePrs->RemoveFromStudy(); + theModule->updateObjBrowser(); //update Object browser + } + + void + ErasePrs3d(const SalomeApp_Module* theModule, + VISU::Prs3d_i* thePrs) + { + if ( SVTK_ViewWindow* vw = GetViewWindow( theModule ) ){ + VISU_Actor* anVISUActor = FindActor( vw, thePrs ); + if (anVISUActor) { + anVISUActor->VisibilityOff(); + } + } } + //************************************************************ + // Presentation management + + void + ChangeRepresentation (const SalomeApp_Module* theModule, + VISU::PresentationType theType) + { + SUIT_ViewWindow* aView = GetActiveView(theModule, VTKViewer_Viewer::Type()); + if (!aView) return; + SVTK_ViewWindow* vw = (SVTK_ViewWindow*) aView; + + Handle(SALOME_InteractiveObject) anIO; + CORBA::Object_var anObject = GetSelectedObj(theModule, &anIO); + if (CORBA::is_nil(anObject)) return; + PortableServer::ServantBase_var aServant = VISU::GetServant(anObject); + if (!aServant.in()) return; + + VISU::Prs3d_i* aPrs3d = dynamic_cast(aServant.in()); + if (aPrs3d) { + if (VISU_Actor* anActor = GetActor(aPrs3d, vw)) { + switch (theType) { + case VISU::SHRINK: + if (anActor->IsShrunk()) + anActor->UnShrink(); + else + anActor->SetShrink(); + break; + default: + if (VISU::Mesh_i* aMesh = dynamic_cast(aPrs3d)) { + aMesh->SetPresentationType(theType); + RecreateActor(theModule, aMesh); + } else { + anActor->SetRepresentation(theType); + } + } + vw->Repaint(); + } + } + } + + //************************************************************ + // SObject type bool CheckTimeStamp(const SalomeApp_Module* theModule, @@ -258,9 +528,9 @@ namespace VISU return true; } SUIT_MessageBox::warn1(GetDesktop(theModule), - QObject::tr("VISU_WARNING"), + QObject::tr("WRN_VISU"), QObject::tr("WRN_NO_AVAILABLE_DATA"), - QObject::tr("VISU_BUT_OK") ); + QObject::tr("BUT_OK") ); return false; } @@ -299,41 +569,31 @@ namespace VISU VISU::Result_i* pResult = dynamic_cast(VISU::GetServant(anObject).in()); if(pResult == NULL) SUIT_MessageBox::warn1(GetDesktop(theModule), - QObject::tr("VISU_WARNING"), + QObject::tr("WRN_VISU"), QObject::tr("WRN_NO_AVAILABLE_DATA"), - QObject::tr("VISU_BUT_OK")); + QObject::tr("BUT_OK")); return pResult; } - SVTK_ViewWindow* - GetViewWindow(const SalomeApp_Module* theModule) + //************************************************************ + // Views + + SUIT_ViewWindow* GetActiveView(const SalomeApp_Module* theModule, QString theType) { if(SalomeApp_Application* anApp = theModule->getApp()){ - if(SUIT_ViewManager* aViewManager = anApp->getViewManager( SVTK_Viewer::Type(), true )){ - if(SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()){ - return dynamic_cast(aViewWindow); + if(SUIT_ViewManager* aViewManager = anApp->activeViewManager()){ + if (!theType.isNull()) { + if (aViewManager->getType() != theType) + return 0; } + return aViewManager->getActiveView(); } } - return NULL; + return 0; } - SVTK_ViewWindow* - GetViewWindow() - { - SalomeApp_Application* anApp = dynamic_cast - (SUIT_Session::session()->activeApplication()); - if (anApp) { - if (SUIT_ViewManager* aViewManager = anApp->activeViewManager()) { - if (aViewManager->getType() == SVTK_Viewer::Type()) { - if (SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()) { - return dynamic_cast(aViewWindow); - } - } - } - } - return NULL; - } + //************************************************************ + // VTK View TViewWindows GetViews(const SalomeApp_Module* theModule) @@ -356,7 +616,38 @@ namespace VISU return aViewWindows; } - VISU_Actor* + SVTK_ViewWindow* + GetViewWindow(const SalomeApp_Module* theModule, const bool theCreate ) + { + if(SalomeApp_Application* anApp = theModule->getApp()){ + if(SUIT_ViewManager* aViewManager = anApp->getViewManager( SVTK_Viewer::Type(), theCreate )){ + if(SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()){ + return dynamic_cast(aViewWindow); + } + } + } + return NULL; + } + + + SVTK_ViewWindow* + GetViewWindow() + { + SalomeApp_Application* anApp = dynamic_cast + (SUIT_Session::session()->activeApplication()); + if (anApp) { + if (SUIT_ViewManager* aViewManager = anApp->activeViewManager()) { + if (aViewManager->getType() == SVTK_Viewer::Type()) { + if (SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()) { + return dynamic_cast(aViewWindow); + } + } + } + } + return NULL; + } + + VISU_Actor* PublishInView(const SalomeApp_Module* theModule, VISU::Prs3d_i* thePrs) { @@ -373,9 +664,9 @@ namespace VISU return aActor; } - VISU_Actor* + VISU_Actor* UpdateViewer(const SalomeApp_Module* theModule, - VISU::Prs3d_i* thePrs, + VISU::Prs3d_i* thePrs, bool theDispOnly) { SVTK_ViewWindow* vw = GetViewWindow( theModule ); @@ -390,15 +681,15 @@ namespace VISU for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL; ){ if(!SALOME_Actor::SafeDownCast(anActor)) continue; - if(anActor->IsA("VISU_Actor")){ + if(anActor->IsA("VISU_Actor")){ anVISUActor = VISU_Actor::SafeDownCast(anActor); - VISU::Prs3d_i* aPrs = anVISUActor->GetPrs3d(); + VISU::Prs3d_i* aPrs = anVISUActor->GetPrs3d(); if(aPrs == NULL) continue; if (thePrs == aPrs) { aResActor = anVISUActor->GetParent(); thePrs->UpdateActor(aResActor); aResActor->VisibilityOn(); - + } else if (theDispOnly) { anVISUActor->GetParent()->VisibilityOff(); } else { @@ -406,15 +697,42 @@ namespace VISU } else if (theDispOnly && anActor->GetVisibility()) { anActor->VisibilityOff(); } else { - } + } } - if (aResActor) + if (aResActor) return aResActor; anVISUActor = PublishInView( theModule, thePrs ); return anVISUActor; } + void + RepaintViewWindows (const SalomeApp_Module* theModule, + const Handle(SALOME_InteractiveObject)& theIObject) + { + TViewWindows aViewWindows; + if (SalomeApp_Application* anApp = theModule->getApp()) { + ViewManagerList aViewManagerList; + anApp->viewManagers(SVTK_Viewer::Type(),aViewManagerList); + QPtrListIterator anIter (aViewManagerList); + while (SUIT_ViewManager* aViewManager = anIter.current()) { + QPtrVector aViews = aViewManager->getViews(); + for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) { + if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { + if (SVTK_ViewWindow* vw = dynamic_cast(aViewWindow)) { + if (vw->isVisible(theIObject)) { + vw->getRenderer()->ResetCameraClippingRange(); + vw->Repaint(); + vw->highlight(theIObject, true, true); + } + } + } + } + ++anIter; + } + } + } + VISU_Actor* FindActor(SVTK_ViewWindow* theViewWindow, const char* theEntry) @@ -440,74 +758,52 @@ namespace VISU } void - Add(SalomeApp_SelectionMgr* theSelectionMgr, - const Handle(SALOME_InteractiveObject)& theIO) + RecreateActor (const SalomeApp_Module* theModule, + VISU::Prs3d_i* thePrs) { - SALOME_ListIO aListIO; - theSelectionMgr->selectedObjects(aListIO); - aListIO.Append(theIO); - theSelectionMgr->setSelectedObjects(aListIO); - } - - void - Remove(SalomeApp_SelectionMgr* theSelectionMgr, - const Handle(SALOME_InteractiveObject)& theIO) - { - SALOME_ListIO aListIO; - theSelectionMgr->selectedObjects(aListIO); - SALOME_ListIteratorOfListIO anIter(aListIO); - while(anIter.More()){ - Handle(SALOME_InteractiveObject) anIO = anIter.Value(); - if(anIO->isSame(theIO)){ - aListIO.Remove(anIter); - } - anIter.Next(); - } - theSelectionMgr->setSelectedObjects(aListIO); - } + QApplication::setOverrideCursor(Qt::waitCursor); - void - DeletePrs3d(SalomeApp_Module* theModule, - VISU::Prs3d_i* thePrs, - const Handle(SALOME_InteractiveObject)& theIO) - { - if(!thePrs) - return; - if(CheckLock(GetCStudy(GetAppStudy(theModule)))) - return; SALOMEDS::SObject_var aSObject = thePrs->GetSObject(); CORBA::String_var anEntry = aSObject->GetID(); - SalomeApp_SelectionMgr* aSelectionMgr = GetSelectionMgr(theModule); - Remove(aSelectionMgr,theIO); - TViewWindows aViewWindows = GetViews(theModule); - for(int i = 0, iEnd = aViewWindows.size(); i < iEnd; i++){ - SVTK_ViewWindow* aView = aViewWindows[i]; - if(VISU_Actor* anActor = FindActor(aView,anEntry.in())){ - aView->RemoveActor(anActor); - anActor->Delete(); - } - } - thePrs->RemoveFromStudy(); - theModule->updateObjBrowser(); //update Object browser - } - void - ErasePrs3d(SalomeApp_Module* theModule, - VISU::Prs3d_i* thePrs) - { - if ( SVTK_ViewWindow* vw = GetViewWindow( theModule ) ){ - VISU_Actor* anVISUActor = FindActor( vw, thePrs ); - if (anVISUActor) { - anVISUActor->VisibilityOff(); + try { + thePrs->Update(); + + TViewWindows aViewWindows = GetViews(theModule); + for (int i = 0, iEnd = aViewWindows.size(); i < iEnd; i++) { + SVTK_ViewWindow* aView = aViewWindows[i]; + if (VISU_Actor* anActor = FindActor(aView, anEntry.in())) { + thePrs->UpdateActor(anActor); + } } + } catch (std::runtime_error& ex) { + INFOS(ex.what()); + QApplication::restoreOverrideCursor(); + SUIT_MessageBox::warn1 (GetDesktop(theModule), QObject::tr("WRN_VISU"), + QObject::tr("ERR_CANT_BUILD_PRESENTATION") + " " + QObject::tr(ex.what()), + QObject::tr("BUT_OK")); + + TViewWindows aViewWindows = GetViews(theModule); + for (int i = 0, iEnd = aViewWindows.size(); i < iEnd; i++) { + SVTK_ViewWindow* aView = aViewWindows[i]; + if (VISU_Actor* anActor = FindActor(aView, anEntry.in())) { + aView->RemoveActor(anActor); + anActor->Delete(); + } + } + return; } + QApplication::restoreOverrideCursor(); } + //************************************************************ + // Plot2d View + SPlot2d_Viewer* - GetPlot2dViewer(const SalomeApp_Module* theModule) + GetPlot2dViewer(const SalomeApp_Module* theModule, const bool theCreate) { if(SalomeApp_Application* anApp = theModule->getApp()){ - if(SUIT_ViewManager* aViewManager = anApp->getViewManager( Plot2d_Viewer::Type(), true )){ + if(SUIT_ViewManager* aViewManager = anApp->getViewManager( Plot2d_Viewer::Type(), theCreate )){ return dynamic_cast(aViewManager->getViewModel()); } } @@ -540,7 +836,7 @@ namespace VISU } if ( !theCurve->IsAuto() ) { plotCurve->setLine( (Plot2d_Curve::LineType)theCurve->GetLine(), theCurve->GetLineWidth() ); - plotCurve->setMarker( (Plot2d_Curve::MarkerType)theCurve->GetMarker() ); + plotCurve->setMarker( (Plot2d_Curve::MarkerType)theCurve->GetMarker() ); SALOMEDS::Color color = theCurve->GetColor(); plotCurve->setColor( QColor( (int)(color.R*255.), (int)(color.G*255.), (int)(color.B*255.) ) ); } @@ -564,24 +860,24 @@ namespace VISU } } - void - PlotTable(const SalomeApp_Module* theModule, - VISU::Table_i* table, + void + PlotTable(const SalomeApp_Module* theModule, + VISU::Table_i* table, int theDisplaying) { - SPlot2d_Viewer* aView = GetPlot2dViewer( theModule ); + SPlot2d_Viewer* aView = GetPlot2dViewer( theModule, true ); // create if necessary if ( !aView ) return; Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame(); if ( !aPlot ) return; - if ( theDisplaying == VISU::eDisplayOnly ) + if ( theDisplaying == VISU::eDisplayOnly ) aPlot->EraseAll(); QList clist; aPlot->getCurves( clist ); _PTR(Study) aStudy = GetCStudy( GetAppStudy( theModule ) ); - _PTR(SObject) TableSO = aStudy->FindObjectID( table->GetEntry() ); + _PTR(SObject) TableSO = aStudy->FindObjectID( table->GetEntry().latin1() ); if ( TableSO ) { _PTR(ChildIterator) Iter = aStudy->NewChildIterator( TableSO ); for ( ; Iter->More(); Iter->Next() ) { @@ -594,7 +890,8 @@ namespace VISU SPlot2d_Curve* tmpCurve; for ( int i = 0; i < clist.count(); i++ ) { tmpCurve = dynamic_cast( clist.at( i ) ); - if ( tmpCurve && tmpCurve->hasIO() && !strcmp( tmpCurve->getIO()->getEntry(), theCurve->GetEntry() ) ) { + if (tmpCurve && tmpCurve->hasIO() && + !strcmp(tmpCurve->getIO()->getEntry(), theCurve->GetEntry())) { plotCurve = tmpCurve; break; } @@ -613,51 +910,51 @@ namespace VISU } void - PlotCurve(const SalomeApp_Module* theModule, - VISU::Curve_i* theCurve, + PlotCurve(const SalomeApp_Module* theModule, + VISU::Curve_i* theCurve, int theDisplaying) { - SPlot2d_Viewer* aView = GetPlot2dViewer( theModule ); + SPlot2d_Viewer* aView = GetPlot2dViewer( theModule, true ); if ( !aView ) return; Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame(); if ( !aPlot ) return; -// if ( theDisplaying == VISU::eDisplayOnly ) +// if ( theDisplaying == VISU::eDisplayOnly ) // aPlot->EraseAll(); QList clist; aPlot->getCurves( clist ); SPlot2d_Curve* plotCurve = 0; SPlot2d_Curve* tmpCurve; - for ( int i = 0; i < clist.count(); i++ ) { - tmpCurve = dynamic_cast( clist.at( i ) ); - if ( tmpCurve && tmpCurve->hasIO() && !strcmp( tmpCurve->getIO()->getEntry(), theCurve->GetEntry() ) ) { + for (int i = 0; i < clist.count(); i++) { + tmpCurve = dynamic_cast(clist.at(i)); + if (tmpCurve && tmpCurve->hasIO() && + !strcmp(tmpCurve->getIO()->getEntry(), theCurve->GetEntry())) { plotCurve = tmpCurve; - } - else if ( theDisplaying == VISU::eDisplayOnly ) { - aPlot->eraseCurve( clist.at( i ) ); + } else if (theDisplaying == VISU::eDisplayOnly) { + aPlot->eraseCurve(clist.at(i)); } } - UpdateCurve( theCurve, aPlot, plotCurve, theDisplaying ); + UpdateCurve(theCurve, aPlot, plotCurve, theDisplaying); aPlot->Repaint(); } void - PlotContainer(const SalomeApp_Module* theModule, - VISU::Container_i* container, + PlotContainer(const SalomeApp_Module* theModule, + VISU::Container_i* container, int theDisplaying) { - SPlot2d_Viewer* aView = GetPlot2dViewer( theModule ); + SPlot2d_Viewer* aView = GetPlot2dViewer( theModule, true ); if ( !aView ) return; Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame(); if ( !aPlot ) return; - if ( theDisplaying == VISU::eDisplayOnly ) + if ( theDisplaying == VISU::eDisplayOnly ) aPlot->EraseAll(); QList clist; aPlot->getCurves( clist ); @@ -666,8 +963,9 @@ namespace VISU for ( int k = 1; k <= nbCurves; k++ ) { VISU::Curve_i* theCurve = container->GetCurve( k ); if ( theCurve && theCurve->IsValid() ) { - SPlot2d_Curve* plotCurve = dynamic_cast( aView->getCurveByIO( new SALOME_InteractiveObject( theCurve->GetEntry(), "", "" ) ) ); - + SPlot2d_Curve* plotCurve = dynamic_cast + (aView->getCurveByIO(new SALOME_InteractiveObject (theCurve->GetEntry(), "", ""))); + UpdateCurve( theCurve, aPlot, plotCurve, theDisplaying ); if ( plotCurve && theDisplaying == VISU::eErase ) { @@ -678,4 +976,242 @@ namespace VISU } aPlot->Repaint(); } + + void + CreatePlot(SalomeApp_Module* theModule, + _PTR(SObject) theTableSO) + { + if ( IsSObjectTable(theTableSO) ) { + CORBA::Object_var aTable = VISU::ClientSObjectToObject(theTableSO); + CORBA::Object_var aContainer = GetVisuGen( theModule )->CreateContainer(); + if ( !CORBA::is_nil( aTable ) && !CORBA::is_nil( aContainer ) ) { + VISU::Table_i* pTable = dynamic_cast(VISU::GetServant(aTable).in()); + VISU::Container_i* pContainer = dynamic_cast(VISU::GetServant(aContainer).in()); + + if ( pContainer && pTable ) { + for ( int i = 2; i <= pTable->GetNbRows(); i++ ) { + CORBA::Object_var aNewCurve = GetVisuGen( theModule )->CreateCurve( pTable->_this(), 1, i ); + if( !CORBA::is_nil( aNewCurve ) ) { + VISU::Curve_i* pCrv = dynamic_cast( VISU::GetServant(aNewCurve).in() ); + if ( pCrv ) { + pContainer->AddCurve( pCrv->_this() ); + } + } + } + theModule->updateObjBrowser(); + PlotContainer( theModule, pContainer, VISU::eDisplay ); + } + } + } + } + + //************************************************************ + // Others + + void CreateMesh (const SalomeApp_Module* theModule, + const Handle(SALOME_InteractiveObject)& theIO) + { + _PTR(Study) aStudy = GetCStudy(GetAppStudy(theModule)); + //if (CheckLock(aStudy)) + // return; + + SALOMEDS::SObject_var aResultSObj = + GetDSStudy(aStudy)->FindObjectID(theIO->getEntry()); + + // Get VISU::Result + VISU::Result_var aResult; + VISU::Result_i* pResult = CheckResult(theModule, aResultSObj, aResult); + if (pResult == NULL) + return; + + Storable::TRestoringMap aMap = getMapOfValue(aResultSObj); + bool isExist; + string aComment = Storable::FindValue(aMap,"myComment",&isExist).latin1(); + if (!isExist) + return; + + CORBA::Object_var aMesh; + string aMeshName = Storable::FindValue(aMap,"myMeshName").latin1(); +#ifdef CHECKTIME + Utils_Timer timer; + timer.Start(); +#endif + if (aComment == "ENTITY") { + VISU::Entity anEntity = (VISU::Entity)Storable::FindValue(aMap,"myId").toInt(); + if (VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),anEntity)) + aMesh = GetVisuGen(theModule)->MeshOnEntity(aResult,aMeshName.c_str(),anEntity); + } else if (aComment == "FAMILY") { + VISU::Entity anEntity = (VISU::Entity)Storable::FindValue(aMap,"myEntityId").toInt(); + string aFamilyName = Storable::FindValue(aMap,"myName").latin1(); + if (VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),anEntity,aFamilyName.c_str())) + aMesh = GetVisuGen(theModule)->FamilyMeshOnEntity + (aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str()); + } else if (aComment == "GROUP") { + string aGroupName = Storable::FindValue(aMap,"myName").latin1(); + if (VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),aGroupName.c_str())) + aMesh = GetVisuGen(theModule)->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str()); + } +#ifdef CHECKTIME + timer.Stop(); + MESSAGE("VisuGUI::CreateMesh() - CREATE MESH"); + timer.Show(); +#endif + + QApplication::restoreOverrideCursor(); + VISU::Mesh_i* pPresent = NULL; + if (!CORBA::is_nil(aMesh)) + pPresent = dynamic_cast(VISU::GetServant(aMesh).in()); + if (pPresent == NULL) { + SUIT_MessageBox::warn1 (GetDesktop(theModule), + QObject::tr("WRN_VISU"), + QObject::tr("ERR_CANT_BUILD_PRESENTATION"), + QObject::tr("BUT_OK")); + return; + } + + if (SVTK_ViewWindow* aView = GetViewWindow(theModule)) { + try { +#ifdef CHECKTIME + Utils_Timer timer; + timer.Start(); +#endif + PublishInView(theModule, pPresent); + aView->onFitAll(); +#ifdef CHECKTIME + timer.Stop(); + MESSAGE("VisuGUI::CreateMesh() - DISPLAY MESH"); + timer.Show(); +#endif + theModule->application()->putInfo(QObject::tr("INF_DONE")); + } catch (std::runtime_error& exc) { + INFOS(exc.what()); + SUIT_MessageBox::warn1 (GetDesktop(theModule), + QObject::tr("WRN_VISU"), + QObject::tr("ERR_CANT_CREATE_ACTOR") + " " + QObject::tr(exc.what()), + QObject::tr("BUT_OK")); + } + } + } + + // ======================================================================================== + // GetPrs3dList: find list of presentations for the given object + // ======================================================================================== + std::vector GetPrs3dList (const SalomeApp_Module* theModule, + const Handle(SALOME_InteractiveObject)& theIO) + { + std::vector aList; + if (!theIO.IsNull() && theIO->hasEntry()) { + _PTR(Study) aCStudy = GetCStudy(GetAppStudy(theModule)); + SALOMEDS::Study_var aStudy = GetDSStudy(aCStudy); + SALOMEDS::SObject_var aSObject = aStudy->FindObjectID(theIO->getEntry()); + aList = GetPrs3dList(theModule, aSObject); + } + return aList; + } + + std::vector GetPrs3dList (const SalomeApp_Module* theModule, + SALOMEDS::SObject_ptr theObject) + { + _PTR(Study) aCStudy = GetCStudy(GetAppStudy(theModule)); + SALOMEDS::Study_var aStudy = GetDSStudy(aCStudy); + + std::vector aList; int k = 0; + if (!theObject->_is_nil()) { + CORBA::Object_var aCORBAObject = VISU::SObjectToObject(theObject); + if (!CORBA::is_nil(aCORBAObject)) { + VISU::Base_var aVisuObj = VISU::Base::_narrow(aCORBAObject); + if (!CORBA::is_nil(aVisuObj)) { + VISU::VISUType aType = aVisuObj->GetType(); + switch (aType) { + case VISU::TSCALARMAP: + case VISU::TISOSURFACE: + case VISU::TDEFORMEDSHAPE: + case VISU::TCUTPLANES: + case VISU::TCUTLINES: + case VISU::TVECTORS: + case VISU::TSTREAMLINES: + case VISU::TPLOT3D: + { + PortableServer::ServantBase_var aServant = VISU::GetServant(aCORBAObject); + if (aServant.in()) { + VISU::Prs3d_i* aPrsObject = dynamic_cast(aServant.in()); + aList.resize(k+1); aList[k] = aPrsObject; k++; + } + } + break; + case VISU::TFIELD: + { + SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theObject); + SALOMEDS::SObject_var aTimeStamp; + anIter->Next(); // First is reference on support + for(;anIter->More();anIter->Next()) { + aTimeStamp = anIter->Value(); + if (aTimeStamp->_is_nil()) continue; + std::vector aSubList = GetPrs3dList(theModule, aTimeStamp); + if (!aSubList.empty()) { + int n = aSubList.size(); + aList.resize(k+n); + for (int i = 0; i < n; i++) + { aList[k] = aSubList[i]; k++; } + } + } + } + break; + } + } + } else { + SALOMEDS::GenericAttribute_var anAttr; + if (theObject->FindAttribute(anAttr, "AttributeComment")) { + SALOMEDS::AttributeComment_var aComment = + SALOMEDS::AttributeComment::_narrow(anAttr); + string aComm = aComment->Value(); + QString strIn( aComm.c_str() ); + VISU::Storable::TRestoringMap pMap; + VISU::Storable::StrToMap( strIn, pMap ); + bool isExist; + VISU::VISUType aType = (VISU::VISUType)VISU::Storable::FindValue(pMap,"myType",&isExist).toInt(); + if (isExist) { + switch (aType) { + case VISU::TFIELD: + { + SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theObject); + SALOMEDS::SObject_var aTimeStamp; + anIter->Next(); // First is reference on support + for (;anIter->More();anIter->Next()) { + aTimeStamp = anIter->Value(); + if (aTimeStamp->_is_nil()) continue; + std::vector aSubList = GetPrs3dList(theModule, aTimeStamp); + if (!aSubList.empty()) { + int n = aSubList.size(); + aList.resize(k+n); + for (int i = 0; i < n; i++) + { aList[k] = aSubList[i]; k++; } + } + } + } + break; + case VISU::TTIMESTAMP: + { + SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theObject); + SALOMEDS::SObject_var aPrs; + for (;anIter->More();anIter->Next()) { + aPrs = anIter->Value(); + if (aPrs->_is_nil()) continue; + std::vector aSubList = GetPrs3dList(theModule, aPrs); + if (!aSubList.empty()) { + int n = aSubList.size(); + aList.resize(k+n); + for (int i = 0; i < n; i++) + { aList[k] = aSubList[i]; k++; } + } + } + } + break; + } + } + } + } + } + return aList; + } }