-#include "SOCC_ViewModel.h"
-
-#include "SOCC_Prs.h"
-#include "SOCC_ViewWindow.h"
-
-#include "SUIT_Session.h"
-#include "SUIT_Application.h"
-
-#include "ToolsGUI.h"
-
-#include <SALOMEconfig.h>
-#include CORBA_CLIENT_HEADER(SALOMEDS)
-
-#include <AIS_ListIteratorOfListOfInteractive.hxx>
-#include <Visual3d_View.hxx>
-
-#include <SALOME_AISShape.hxx>
-#include <SALOME_AISObject.hxx>
-
-#include <Utils_ORB_INIT.hxx>
-#include <Utils_SINGLETON.hxx>
-#include <SALOME_ModuleCatalog_impl.hxx>
-#include <SALOME_NamingService.hxx>
-
-#include "SALOMEDSClient.hxx"
-#include "SALOMEDS_StudyManager.hxx"
-
-#include <AIS_TypeOfIso.hxx>
-
-// in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study.
-// SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from
-// SALOMEDS::StudyManager - no linkage with SalomeApp.
-
-static _PTR(Study) getStudyDS()
-{
- SALOMEDSClient_Study* aStudy = NULL;
- _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() );
-
- // get id of SUIT_Study, if it's a SalomeApp_Study, it will return
- // id of its underlying SALOMEDS::Study
- SUIT_Application* app = SUIT_Session::session()->activeApplication();
- if ( !app ) return _PTR(Study)(aStudy);
- SUIT_Study* stud = app->activeStudy();
- if ( !stud ) return _PTR(Study)(aStudy);
- const int id = stud->id(); // virtual method, must return SALOMEDS_Study id
- // get SALOMEDS_Study with this id from StudyMgr
- return aMgr->GetStudyByID( id );
-}
-
-SOCC_Viewer::SOCC_Viewer( bool DisplayTrihedron )
-: OCCViewer_Viewer( DisplayTrihedron )
-{
-}
-
-SOCC_Viewer::~SOCC_Viewer()
-{
-}
-
-bool SOCC_Viewer::highlight( const Handle(SALOME_InteractiveObject)& obj,
- bool hilight, bool upd )
-{
- bool isInLocal = getAISContext()->HasOpenedContext();
- //SUIT_Study* ActiveStudy = SUIT_Application::getDesktop()->getActiveStudy();
- //SALOME_Selection* Sel = SALOME_Selection::Selection( ActiveStudy->getSelection() );
-
- AIS_ListOfInteractive List;
- getAISContext()->DisplayedObjects(List);
-
- AIS_ListIteratorOfListOfInteractive ite(List);
- for ( ; ite.More(); ite.Next() )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )
- {
- if ( !isInLocal )
- OCCViewer_Viewer::highlight( ite.Value(), hilight, false );
- // highlight subshapes only when local selection is active
- else
- {
- /*if ( ite.Value()->IsKind( STANDARD_TYPE( SALOME_AISShape ) ) )
- {
- Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast( ite.Value() );
- TColStd_IndexedMapOfInteger MapIndex;
- Sel->GetIndex( IObject, MapIndex );
- aSh->highlightSubShapes( MapIndex, highlight );
- }*/
- }
- break;
- }
- }
-
- if( upd )
- update();
-
- return false;
-}
-
-bool SOCC_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& obj,
- bool onlyInViewer )
-{
- AIS_ListOfInteractive List;
- getAISContext()->DisplayedObjects(List);
-
- if( !onlyInViewer ) {
- AIS_ListOfInteractive List1;
- getAISContext()->ObjectsInCollector(List1);
- List.Append(List1);
- }
-
- AIS_ListIteratorOfListOfInteractive ite(List);
- for ( ; ite.More(); ite.Next() )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )
- return true;
- }
- return false;
-}
-
-bool SOCC_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& obj )
-{
- AIS_ListOfInteractive List;
- getAISContext()->DisplayedObjects( List );
-
- AIS_ListIteratorOfListOfInteractive ite( List );
- for ( ; ite.More(); ite.Next() )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )
- return getAISContext()->IsDisplayed( ite.Value() );
- }
-
- return false;
-}
-
-void SOCC_Viewer::setColor( const Handle(SALOME_InteractiveObject)& obj,
- const QColor& color, bool update )
-{
- AIS_ListOfInteractive List;
- getAISContext()->DisplayedObjects(List);
-
- AIS_ListIteratorOfListOfInteractive ite(List);
- for ( ; ite.More(); ite.Next() )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )
- {
- OCCViewer_Viewer::setColor( ite.Value(), color, update );
- return;
- }
- }
-}
-
-void SOCC_Viewer::switchRepresentation( const Handle(SALOME_InteractiveObject)& obj,
- int mode, bool update )
-{
- AIS_ListOfInteractive List;
- getAISContext()->DisplayedObjects(List);
-
- AIS_ListIteratorOfListOfInteractive ite(List);
- for ( ; ite.More(); ite.Next() )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )
- {
- OCCViewer_Viewer::switchRepresentation( ite.Value(), mode, update );
- return;
- }
- }
-}
-
-void SOCC_Viewer::setTransparency( const Handle(SALOME_InteractiveObject)& obj,
- float trans, bool update )
-{
- AIS_ListOfInteractive List;
- getAISContext()->DisplayedObjects( List );
-
- AIS_ListIteratorOfListOfInteractive ite( List );
- for ( ; ite.More(); ite.Next() )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )
- {
- OCCViewer_Viewer::setTransparency( ite.Value(), trans, update );
- return;
- }
- }
-}
-
-void SOCC_Viewer::rename( const Handle(SALOME_InteractiveObject)& obj,
- const QString& name )
-{
- AIS_ListOfInteractive List;
- getAISContext()->DisplayedObjects(List);
-
- AIS_ListIteratorOfListOfInteractive ite(List);
- while (ite.More())
- {
- if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape)))
- {
- Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite.Value());
-
- if ( aSh->hasIO() )
- {
- Handle(SALOME_InteractiveObject) IO = aSh->getIO();
- if ( IO->isSame( obj ) )
- {
- aSh->setName( (char*)name.latin1() );
- break;
- }
- }
- }
- else if ( ite.Value()->IsKind( STANDARD_TYPE( SALOME_AISObject ) ) )
- {
- Handle(SALOME_AISObject) aSh = Handle(SALOME_AISObject)::DownCast( ite.Value() );
-
- // Add code here, if someone create a MODULE_AISObject.
- }
- ite.Next();
- }
-}
-
-//=======================================================================
-// name : Display
-// Purpose : Display presentation
-//=======================================================================
-void SOCC_Viewer::Display( const SALOME_OCCPrs* prs )
-{
- // try do downcast object
- const SOCC_Prs* anOCCPrs = dynamic_cast<const SOCC_Prs*>( prs );
- if ( !anOCCPrs || anOCCPrs->IsNull() )
- return;
-
- // get SALOMEDS Study
- _PTR(Study) study(getStudyDS());
-
- // get context
- Handle (AIS_InteractiveContext) ic = getAISContext();
-
- // get all displayed objects
- AIS_ListOfInteractive List;
- ic->DisplayedObjects( List );
- // get objects in the collector
- AIS_ListOfInteractive ListCollector;
- ic->ObjectsInCollector( ListCollector );
-
- // get objects to be displayed
- AIS_ListOfInteractive anAISObjects;
- anOCCPrs->GetObjects( anAISObjects );
-
- AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );
- for ( ; aIter.More(); aIter.Next() )
- {
- Handle(AIS_InteractiveObject) anAIS = aIter.Value();
- if ( !anAIS.IsNull() )
- {
- // try to find presentation in the viewer
- bool bDisplayed = false;
- AIS_ListIteratorOfListOfInteractive ite( List );
- for ( ; ite.More(); ite.Next() )
- {
- // compare presentations by handles
- // if the object is already displayed - nothing to do more
- if ( ite.Value() == anAIS )
- {
- // Deactivate object if necessary
- if ( !anOCCPrs->ToActivate() )
- ic->Deactivate( anAIS );
- bDisplayed = true;
- break;
- }
- }
-
- if ( bDisplayed )
- continue;
-
- // then try to find presentation in the collector
- bDisplayed = false;
- ite.Initialize( ListCollector );
- for ( ; ite.More(); ite.Next() )
- {
- // compare presentations by handles
- // if the object is in collector - display it
- if ( ite.Value() == anAIS )
- {
- ic->DisplayFromCollector( anAIS, false );
-
- // Deactivate object if necessary
- if ( !anOCCPrs->ToActivate() )
- ic->Deactivate( anAIS );
- bDisplayed = true;
-
- // Set visibility flag
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );
- if ( !anObj.IsNull() && anObj->hasEntry() )
- {
- if ( study )
- ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );
- }
-
- break;
- }
- }
- if ( bDisplayed )
- continue;
-
- // if object is not displayed and not found in the collector - display it
- if ( anAIS->IsKind( STANDARD_TYPE(AIS_Trihedron) ) )
- {
- Handle(AIS_Trihedron) aTrh = Handle(AIS_Trihedron)::DownCast( anAIS );
- double aNewSize = 100, aSize = 100;
- getTrihedronSize( aNewSize, aSize );
- aTrh->SetSize( aTrh == getTrihedron() ? aNewSize : 0.5 * aNewSize );
- }
-
- ic->Display( anAIS, false );
-
- // Set visibility flag
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );
- if ( !anObj.IsNull() && anObj->hasEntry() )
- {
- if ( study )
- ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );
- }
-
- // Deactivate object if necessary
- if ( !anOCCPrs->ToActivate() )
- ic->Deactivate( anAIS );
- }
- }
-}
-
-//=======================================================================
-// name : Erase
-// Purpose : Erase presentation
-//=======================================================================
-void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced )
-{
- // try do downcast object
- const SOCC_Prs* anOCCPrs = dynamic_cast<const SOCC_Prs*>( prs );
- if ( !anOCCPrs || anOCCPrs->IsNull() )
- return;
-
- // get SALOMEDS Study
- _PTR(Study) study(getStudyDS());
-
- // get context
- Handle(AIS_InteractiveContext) ic = getAISContext();
-
- // get objects to be erased
- AIS_ListOfInteractive anAISObjects;
- anOCCPrs->GetObjects( anAISObjects );
-
- AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );
- for ( ; aIter.More(); aIter.Next() ) {
- Handle(AIS_InteractiveObject) anAIS = aIter.Value();
- if ( !anAIS.IsNull() ) {
- // erase the object from context : move it to collector
- ic->Erase( anAIS, false, forced ? false : true );
-
- // Set visibility flag if necessary
- if ( !forced )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );
- if ( !anObj.IsNull() && anObj->hasEntry() )
- {
- if ( study )
- ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );
- }
- }
- }
- }
-}
-
-//=======================================================================
-// name : EraseAll
-// Purpose : Erase all presentations
-//=======================================================================
-void SOCC_Viewer::EraseAll( const bool forced )
-{
- // get SALOMEDS Study
- _PTR(Study) study(getStudyDS());
-
- // get context
- Handle(AIS_InteractiveContext) ic = getAISContext();
-
- // check if trihedron is displayed
- Standard_Boolean isTrihedronDisplayed = ic->IsDisplayed( getTrihedron() );
-
- // get objects to be erased (all currently displayed objects)
- AIS_ListOfInteractive aList;
- ic->DisplayedObjects( aList );
- AIS_ListIteratorOfListOfInteractive anIter( aList );
- for ( ; anIter.More(); anIter.Next() ) {
- if ( isTrihedronDisplayed && anIter.Value()->DynamicType() == STANDARD_TYPE( AIS_Trihedron ) )
- continue;
-
- // erase an object
- Handle(AIS_InteractiveObject) anIO = anIter.Value();
- ic->Erase( anIO, false, forced ? false : true );
-
- // Set visibility flag if necessary
- if ( !forced ) {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() ) {
- if ( study )
- ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );
- }
- }
- }
-
- // display trihedron if necessary
- if ( isTrihedronDisplayed )
- getAISContext()->Display( getTrihedron() );
- else
- Repaint();
-}
-
-//=======================================================================
-// name : CreatePrs
-// Purpose : Create presentation corresponding to the entry
-//=======================================================================
-SALOME_Prs* SOCC_Viewer::CreatePrs( const char* entry )
-{
- SOCC_Prs* prs = new SOCC_Prs();
- if ( entry )
- {
- // get context
- Handle(AIS_InteractiveContext) ic = getAISContext();
-
- // get displayed objects
- AIS_ListOfInteractive List;
- ic->DisplayedObjects( List );
- // get objects in the collector
- AIS_ListOfInteractive ListCollector;
- ic->ObjectsInCollector( ListCollector );
- List.Append( ListCollector );
-
- AIS_ListIteratorOfListOfInteractive ite( List );
- for ( ; ite.More(); ite.Next() )
- {
- Handle(SALOME_InteractiveObject) anObj =
- Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
-
- if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), entry ) == 0 )
- prs->AddObject( ite.Value() );
- }
- }
- return prs;
-}
-
-//=======================================================================
-// name : LocalSelection
-// Purpose : Activates selection of sub shapes
-//=======================================================================
-void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode )
-{
- Handle(AIS_InteractiveContext) ic = getAISContext();
-
- const SOCC_Prs* anOCCPrs = dynamic_cast<const SOCC_Prs*>( thePrs );
- if ( ic.IsNull() )
- return;
-
- // Open local context if there is no one
- bool allObjects = thePrs == 0 || thePrs->IsNull();
- if ( !ic->HasOpenedContext() ) {
- ic->ClearCurrents( false );
- ic->OpenLocalContext( allObjects, true, true );
- }
-
- AIS_ListOfInteractive anObjs;
- // Get objects to be activated
- if ( allObjects )
- ic->DisplayedObjects( anObjs );
- else
- anOCCPrs->GetObjects( anObjs );
-
- // Activate selection of objects from prs
- AIS_ListIteratorOfListOfInteractive aIter( anObjs );
- for ( ; aIter.More(); aIter.Next() ) {
- Handle(AIS_InteractiveObject) anAIS = aIter.Value();
- if ( !anAIS.IsNull() )
- {
- if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) )
- {
- ic->Load( anAIS, -1, false );
- ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)theMode ) );
- }
- else if ( anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron) )
- {
- ic->Load( anAIS, -1, false );
- ic->Activate( anAIS, theMode );
- }
- }
- }
-}
-
-//=======================================================================
-// name : GlobalSelection
-// Purpose : Deactivates selection of sub shapes
-//=======================================================================
-void SOCC_Viewer::GlobalSelection( const bool update ) const
-{
- Handle(AIS_InteractiveContext) ic = getAISContext();
- if ( !ic.IsNull() )
- {
- ic->CloseAllContexts( false );
- if ( update )
- ic->CurrentViewer()->Redraw();
- }
-}
-
-//=======================================================================
-// name : BeforeDisplay
-// Purpose : Axiluary method called before displaying of objects
-//=======================================================================
-void SOCC_Viewer::BeforeDisplay( SALOME_Displayer* d )
-{
- d->BeforeDisplay( this, SALOME_OCCViewType() );
-}
-
-//=======================================================================
-// name : AfterDisplay
-// Purpose : Axiluary method called after displaying of objects
-//=======================================================================
-void SOCC_Viewer::AfterDisplay( SALOME_Displayer* d )
-{
- d->AfterDisplay( this, SALOME_OCCViewType() );
-}
-
-//=======================================================================
-// name : getTrihedronSize
-// Purpose : Get new and current trihedron size corresponding to the
-// current model size
-//=======================================================================
-bool SOCC_Viewer::getTrihedronSize( double& theNewSize, double& theSize )
-{
- theNewSize = 100;
- theSize = 100;
-
- //SRN: BUG IPAL8996, a usage of method ActiveView without an initialization
- Handle(V3d_Viewer) viewer = getViewer3d();
- viewer->InitActiveViews();
- if(!viewer->MoreActiveViews()) return false;
-
- Handle(V3d_View) view3d = viewer->ActiveView();
- //SRN: END of fix
-
- if ( view3d.IsNull() )
- return false;
-
- double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0;
- double aMaxSide;
-
- view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax );
-
- if ( Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() ||
- Xmax == RealLast() || Ymax == RealLast() || Zmax == RealLast() )
- return false;
-
- aMaxSide = Xmax - Xmin;
- if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin;
- if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin;
-
- float aSizeInPercents = SUIT_Session::session()->resourceMgr()->doubleValue("Viewer","TrihedronSize", 105.);
-
- static float EPS = 5.0E-3;
- theSize = getTrihedron()->Size();
- theNewSize = aMaxSide*aSizeInPercents / 100.0;
-
- return fabs( theNewSize - theSize ) > theSize * EPS ||
- fabs( theNewSize - theSize) > theNewSize * EPS;
-}
-
-//=======================================================================
-// name : Repaint
-// Purpose :
-//=======================================================================
-void SOCC_Viewer::Repaint()
-{
-// onAdjustTrihedron();
- getViewer3d()->Update();
-}
-
-//=======================================================================
-// name : createView
-// Purpose : create SOCC_ViewWindow
-//=======================================================================
-SUIT_ViewWindow* SOCC_Viewer::createView( SUIT_Desktop* theDesktop )
-{
- SOCC_ViewWindow* view = new SOCC_ViewWindow(theDesktop, this);
- initView( view );
- return view;
-}
+#include "SOCC_ViewModel.h"\r
+\r
+#include "SOCC_Prs.h"\r
+#include "SOCC_ViewWindow.h"\r
+\r
+#include "SUIT_Session.h"\r
+#include "SUIT_Application.h"\r
+\r
+//#include "ToolsGUI.h"\r
+\r
+// Temporarily commented to avoid awful dependecy on SALOMEDS\r
+// TODO: better mechanism of storing display/erse status in a study\r
+// should be provided...\r
+//#include <SALOMEconfig.h>\r
+//#include CORBA_CLIENT_HEADER(SALOMEDS)\r
+\r
+#include <AIS_ListIteratorOfListOfInteractive.hxx>\r
+#include <Visual3d_View.hxx>\r
+\r
+#include <SALOME_AISShape.hxx>\r
+#include <SALOME_AISObject.hxx>\r
+\r
+// Temporarily commented to avoid awful dependecy on SALOMEDS\r
+// TODO: better mechanism of storing display/erse status in a study\r
+// should be provided...\r
+//#include <Utils_ORB_INIT.hxx>\r
+//#include <Utils_SINGLETON.hxx>\r
+//#include <SALOME_ModuleCatalog_impl.hxx>\r
+//#include <SALOME_NamingService.hxx>\r
+\r
+//#include "SALOMEDSClient.hxx"\r
+//#include "SALOMEDS_StudyManager.hxx"\r
+\r
+#include <AIS_TypeOfIso.hxx>\r
+\r
+// in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study.\r
+// SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from \r
+// SALOMEDS::StudyManager - no linkage with SalomeApp. \r
+\r
+// Temporarily commented to avoid awful dependecy on SALOMEDS\r
+// TODO: better mechanism of storing display/erse status in a study\r
+// should be provided...\r
+//static _PTR(Study) getStudyDS() \r
+//{\r
+// SALOMEDSClient_Study* aStudy = NULL;\r
+// _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() );\r
+\r
+ // get id of SUIT_Study, if it's a SalomeApp_Study, it will return\r
+ // id of its underlying SALOMEDS::Study\r
+// SUIT_Application* app = SUIT_Session::session()->activeApplication();\r
+// if ( !app ) return _PTR(Study)(aStudy); \r
+// SUIT_Study* stud = app->activeStudy();\r
+// if ( !stud ) return _PTR(Study)(aStudy); \r
+// const int id = stud->id(); // virtual method, must return SALOMEDS_Study id\r
+ // get SALOMEDS_Study with this id from StudyMgr\r
+// return aMgr->GetStudyByID( id );\r
+//}\r
+\r
+SOCC_Viewer::SOCC_Viewer( bool DisplayTrihedron )\r
+: OCCViewer_Viewer( DisplayTrihedron )\r
+{\r
+}\r
+\r
+SOCC_Viewer::~SOCC_Viewer()\r
+{\r
+}\r
+\r
+bool SOCC_Viewer::highlight( const Handle(SALOME_InteractiveObject)& obj,\r
+ bool hilight, bool upd )\r
+{\r
+ bool isInLocal = getAISContext()->HasOpenedContext();\r
+ //SUIT_Study* ActiveStudy = SUIT_Application::getDesktop()->getActiveStudy();\r
+ //SALOME_Selection* Sel = SALOME_Selection::Selection( ActiveStudy->getSelection() );\r
+\r
+ AIS_ListOfInteractive List;\r
+ getAISContext()->DisplayedObjects(List);\r
+ \r
+ AIS_ListIteratorOfListOfInteractive ite(List);\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) anObj =\r
+ Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );\r
+\r
+ if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )\r
+ {\r
+ if ( !isInLocal )\r
+ OCCViewer_Viewer::highlight( ite.Value(), hilight, false );\r
+ // highlight subshapes only when local selection is active\r
+ else\r
+ {\r
+ /*if ( ite.Value()->IsKind( STANDARD_TYPE( SALOME_AISShape ) ) )\r
+ {\r
+ Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast( ite.Value() );\r
+ TColStd_IndexedMapOfInteger MapIndex;\r
+ Sel->GetIndex( IObject, MapIndex );\r
+ aSh->highlightSubShapes( MapIndex, highlight );\r
+ }*/\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ \r
+ if( upd )\r
+ update();\r
+ \r
+ return false;\r
+}\r
+\r
+bool SOCC_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& obj,\r
+ bool onlyInViewer )\r
+{\r
+ AIS_ListOfInteractive List;\r
+ getAISContext()->DisplayedObjects(List);\r
+\r
+ if( !onlyInViewer ) {\r
+ AIS_ListOfInteractive List1;\r
+ getAISContext()->ObjectsInCollector(List1);\r
+ List.Append(List1);\r
+ }\r
+\r
+ AIS_ListIteratorOfListOfInteractive ite(List);\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) anObj =\r
+ Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );\r
+\r
+ if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+bool SOCC_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& obj )\r
+{\r
+ AIS_ListOfInteractive List;\r
+ getAISContext()->DisplayedObjects( List );\r
+\r
+ AIS_ListIteratorOfListOfInteractive ite( List );\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) anObj =\r
+ Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );\r
+\r
+ if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )\r
+ return getAISContext()->IsDisplayed( ite.Value() );\r
+ }\r
+ \r
+ return false;\r
+}\r
+\r
+void SOCC_Viewer::setColor( const Handle(SALOME_InteractiveObject)& obj,\r
+ const QColor& color, bool update )\r
+{\r
+ AIS_ListOfInteractive List;\r
+ getAISContext()->DisplayedObjects(List);\r
+ \r
+ AIS_ListIteratorOfListOfInteractive ite(List);\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) anObj =\r
+ Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );\r
+\r
+ if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )\r
+ {\r
+ OCCViewer_Viewer::setColor( ite.Value(), color, update );\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void SOCC_Viewer::switchRepresentation( const Handle(SALOME_InteractiveObject)& obj,\r
+ int mode, bool update )\r
+{\r
+ AIS_ListOfInteractive List;\r
+ getAISContext()->DisplayedObjects(List);\r
+ \r
+ AIS_ListIteratorOfListOfInteractive ite(List);\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) anObj =\r
+ Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );\r
+\r
+ if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )\r
+ {\r
+ OCCViewer_Viewer::switchRepresentation( ite.Value(), mode, update );\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void SOCC_Viewer::setTransparency( const Handle(SALOME_InteractiveObject)& obj,\r
+ float trans, bool update )\r
+{\r
+ AIS_ListOfInteractive List;\r
+ getAISContext()->DisplayedObjects( List );\r
+ \r
+ AIS_ListIteratorOfListOfInteractive ite( List );\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) anObj =\r
+ Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );\r
+\r
+ if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) )\r
+ {\r
+ OCCViewer_Viewer::setTransparency( ite.Value(), trans, update );\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void SOCC_Viewer::rename( const Handle(SALOME_InteractiveObject)& obj,\r
+ const QString& name )\r
+{\r
+ AIS_ListOfInteractive List;\r
+ getAISContext()->DisplayedObjects(List);\r
+ \r
+ AIS_ListIteratorOfListOfInteractive ite(List);\r
+ while (ite.More())\r
+ {\r
+ if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape)))\r
+ {\r
+ Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite.Value());\r
+ \r
+ if ( aSh->hasIO() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) IO = aSh->getIO();\r
+ if ( IO->isSame( obj ) )\r
+ {\r
+ aSh->setName( (char*)name.latin1() );\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ else if ( ite.Value()->IsKind( STANDARD_TYPE( SALOME_AISObject ) ) )\r
+ {\r
+ Handle(SALOME_AISObject) aSh = Handle(SALOME_AISObject)::DownCast( ite.Value() );\r
+\r
+ // Add code here, if someone create a MODULE_AISObject.\r
+ }\r
+ ite.Next();\r
+ }\r
+}\r
+\r
+//=======================================================================\r
+// name : Display\r
+// Purpose : Display presentation\r
+//=======================================================================\r
+void SOCC_Viewer::Display( const SALOME_OCCPrs* prs )\r
+{\r
+ // try do downcast object\r
+ const SOCC_Prs* anOCCPrs = dynamic_cast<const SOCC_Prs*>( prs );\r
+ if ( !anOCCPrs || anOCCPrs->IsNull() )\r
+ return;\r
+\r
+ // get SALOMEDS Study\r
+ // Temporarily commented to avoid awful dependecy on SALOMEDS\r
+ // TODO: better mechanism of storing display/erse status in a study\r
+ // should be provided...\r
+ // _PTR(Study) study(getStudyDS());\r
+\r
+ // get context\r
+ Handle (AIS_InteractiveContext) ic = getAISContext();\r
+\r
+ // get all displayed objects\r
+ AIS_ListOfInteractive List;\r
+ ic->DisplayedObjects( List );\r
+ // get objects in the collector\r
+ AIS_ListOfInteractive ListCollector;\r
+ ic->ObjectsInCollector( ListCollector );\r
+\r
+ // get objects to be displayed\r
+ AIS_ListOfInteractive anAISObjects;\r
+ anOCCPrs->GetObjects( anAISObjects );\r
+\r
+ AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );\r
+ for ( ; aIter.More(); aIter.Next() )\r
+ {\r
+ Handle(AIS_InteractiveObject) anAIS = aIter.Value();\r
+ if ( !anAIS.IsNull() )\r
+ {\r
+ // try to find presentation in the viewer\r
+ bool bDisplayed = false;\r
+ AIS_ListIteratorOfListOfInteractive ite( List );\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ // compare presentations by handles\r
+ // if the object is already displayed - nothing to do more\r
+ if ( ite.Value() == anAIS )\r
+ {\r
+ // Deactivate object if necessary\r
+ if ( !anOCCPrs->ToActivate() )\r
+ ic->Deactivate( anAIS );\r
+ bDisplayed = true;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if ( bDisplayed )\r
+ continue;\r
+\r
+ // then try to find presentation in the collector\r
+ bDisplayed = false;\r
+ ite.Initialize( ListCollector );\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ // compare presentations by handles\r
+ // if the object is in collector - display it\r
+ if ( ite.Value() == anAIS )\r
+ {\r
+ ic->DisplayFromCollector( anAIS, false );\r
+\r
+ // Deactivate object if necessary\r
+ if ( !anOCCPrs->ToActivate() )\r
+ ic->Deactivate( anAIS );\r
+ bDisplayed = true;\r
+\r
+ // Set visibility flag\r
+ // Temporarily commented to avoid awful dependecy on SALOMEDS\r
+ // TODO: better mechanism of storing display/erse status in a study\r
+ // should be provided...\r
+ //Handle(SALOME_InteractiveObject) anObj =\r
+ // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );\r
+ //if ( !anObj.IsNull() && anObj->hasEntry() )\r
+ //{\r
+ // if ( study )\r
+ // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );\r
+ //}\r
+ break;\r
+ }\r
+ }\r
+ if ( bDisplayed )\r
+ continue;\r
+\r
+ // if object is not displayed and not found in the collector - display it\r
+ if ( anAIS->IsKind( STANDARD_TYPE(AIS_Trihedron) ) )\r
+ {\r
+ Handle(AIS_Trihedron) aTrh = Handle(AIS_Trihedron)::DownCast( anAIS );\r
+ double aNewSize = 100, aSize = 100;\r
+ getTrihedronSize( aNewSize, aSize );\r
+ aTrh->SetSize( aTrh == getTrihedron() ? aNewSize : 0.5 * aNewSize );\r
+ }\r
+\r
+ ic->Display( anAIS, false );\r
+\r
+ // Set visibility flag\r
+ // Temporarily commented to avoid awful dependecy on SALOMEDS\r
+ // TODO: better mechanism of storing display/erse status in a study\r
+ // should be provided...\r
+ //Handle(SALOME_InteractiveObject) anObj =\r
+ // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );\r
+ //if ( !anObj.IsNull() && anObj->hasEntry() )\r
+ //{\r
+ // if ( study )\r
+ // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );\r
+ //}\r
+\r
+ // Deactivate object if necessary\r
+ if ( !anOCCPrs->ToActivate() )\r
+ ic->Deactivate( anAIS );\r
+ }\r
+ }\r
+}\r
+\r
+//=======================================================================\r
+// name : Erase\r
+// Purpose : Erase presentation\r
+//=======================================================================\r
+void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced )\r
+{\r
+ // try do downcast object\r
+ const SOCC_Prs* anOCCPrs = dynamic_cast<const SOCC_Prs*>( prs );\r
+ if ( !anOCCPrs || anOCCPrs->IsNull() )\r
+ return;\r
+\r
+ // get SALOMEDS Study\r
+ // Temporarily commented to avoid awful dependecy on SALOMEDS\r
+ // TODO: better mechanism of storing display/erse status in a study\r
+ // should be provided...\r
+ // _PTR(Study) study(getStudyDS());\r
+\r
+ // get context\r
+ Handle(AIS_InteractiveContext) ic = getAISContext();\r
+\r
+ // get objects to be erased\r
+ AIS_ListOfInteractive anAISObjects;\r
+ anOCCPrs->GetObjects( anAISObjects );\r
+\r
+ AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );\r
+ for ( ; aIter.More(); aIter.Next() ) {\r
+ Handle(AIS_InteractiveObject) anAIS = aIter.Value();\r
+ if ( !anAIS.IsNull() ) {\r
+ // erase the object from context : move it to collector\r
+ ic->Erase( anAIS, false, forced ? false : true );\r
+\r
+ // Set visibility flag if necessary\r
+ // Temporarily commented to avoid awful dependecy on SALOMEDS\r
+ // TODO: better mechanism of storing display/erse status in a study\r
+ // should be provided...\r
+ //if ( !forced )\r
+ //{\r
+ // Handle(SALOME_InteractiveObject) anObj =\r
+ // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );\r
+ // if ( !anObj.IsNull() && anObj->hasEntry() )\r
+ // {\r
+ // if ( study )\r
+ // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );\r
+ // }\r
+ //}\r
+ }\r
+ }\r
+}\r
+\r
+//=======================================================================\r
+// name : EraseAll\r
+// Purpose : Erase all presentations\r
+//=======================================================================\r
+void SOCC_Viewer::EraseAll( const bool forced )\r
+{\r
+ // get SALOMEDS Study\r
+ // Temporarily commented to avoid awful dependecy on SALOMEDS\r
+ // TODO: better mechanism of storing display/erse status in a study\r
+ // should be provided...\r
+ // _PTR(Study) study(getStudyDS());\r
+\r
+ // get context\r
+ Handle(AIS_InteractiveContext) ic = getAISContext();\r
+\r
+ // check if trihedron is displayed\r
+ Standard_Boolean isTrihedronDisplayed = ic->IsDisplayed( getTrihedron() );\r
+\r
+ // get objects to be erased (all currently displayed objects)\r
+ AIS_ListOfInteractive aList;\r
+ ic->DisplayedObjects( aList );\r
+ AIS_ListIteratorOfListOfInteractive anIter( aList );\r
+ for ( ; anIter.More(); anIter.Next() ) {\r
+ if ( isTrihedronDisplayed && anIter.Value()->DynamicType() == STANDARD_TYPE( AIS_Trihedron ) )\r
+ continue;\r
+\r
+ // erase an object\r
+ Handle(AIS_InteractiveObject) anIO = anIter.Value();\r
+ ic->Erase( anIO, false, forced ? false : true );\r
+ \r
+ // Set visibility flag if necessary\r
+ // Temporarily commented to avoid awful dependecy on SALOMEDS\r
+ // TODO: better mechanism of storing display/erse status in a study\r
+ // should be provided...\r
+ //if ( !forced ) {\r
+ // Handle(SALOME_InteractiveObject) anObj =\r
+ // Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() );\r
+\r
+ // if ( !anObj.IsNull() && anObj->hasEntry() ) {\r
+ // if ( study )\r
+ // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this );\r
+ // }\r
+ //}\r
+ }\r
+\r
+ // display trihedron if necessary\r
+ if ( isTrihedronDisplayed )\r
+ getAISContext()->Display( getTrihedron() );\r
+ else\r
+ Repaint();\r
+}\r
+\r
+//=======================================================================\r
+// name : CreatePrs\r
+// Purpose : Create presentation corresponding to the entry\r
+//=======================================================================\r
+SALOME_Prs* SOCC_Viewer::CreatePrs( const char* entry )\r
+{\r
+ SOCC_Prs* prs = new SOCC_Prs();\r
+ if ( entry )\r
+ {\r
+ // get context\r
+ Handle(AIS_InteractiveContext) ic = getAISContext();\r
+\r
+ // get displayed objects\r
+ AIS_ListOfInteractive List;\r
+ ic->DisplayedObjects( List );\r
+ // get objects in the collector\r
+ AIS_ListOfInteractive ListCollector;\r
+ ic->ObjectsInCollector( ListCollector );\r
+ List.Append( ListCollector );\r
+\r
+ AIS_ListIteratorOfListOfInteractive ite( List );\r
+ for ( ; ite.More(); ite.Next() )\r
+ {\r
+ Handle(SALOME_InteractiveObject) anObj =\r
+ Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );\r
+\r
+ if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), entry ) == 0 )\r
+ prs->AddObject( ite.Value() );\r
+ }\r
+ }\r
+ return prs;\r
+}\r
+\r
+//=======================================================================\r
+// name : LocalSelection\r
+// Purpose : Activates selection of sub shapes\r
+//=======================================================================\r
+void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode )\r
+{\r
+ Handle(AIS_InteractiveContext) ic = getAISContext();\r
+ \r
+ const SOCC_Prs* anOCCPrs = dynamic_cast<const SOCC_Prs*>( thePrs );\r
+ if ( ic.IsNull() )\r
+ return;\r
+ \r
+ // Open local context if there is no one\r
+ bool allObjects = thePrs == 0 || thePrs->IsNull();\r
+ if ( !ic->HasOpenedContext() ) {\r
+ ic->ClearCurrents( false );\r
+ ic->OpenLocalContext( allObjects, true, true );\r
+ }\r
+\r
+ AIS_ListOfInteractive anObjs;\r
+ // Get objects to be activated\r
+ if ( allObjects ) \r
+ ic->DisplayedObjects( anObjs );\r
+ else\r
+ anOCCPrs->GetObjects( anObjs );\r
+\r
+ // Activate selection of objects from prs\r
+ AIS_ListIteratorOfListOfInteractive aIter( anObjs );\r
+ for ( ; aIter.More(); aIter.Next() ) {\r
+ Handle(AIS_InteractiveObject) anAIS = aIter.Value();\r
+ if ( !anAIS.IsNull() )\r
+ {\r
+ if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) )\r
+ {\r
+ ic->Load( anAIS, -1, false );\r
+ ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)theMode ) );\r
+ }\r
+ else if ( anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron) )\r
+ {\r
+ ic->Load( anAIS, -1, false );\r
+ ic->Activate( anAIS, theMode );\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+//=======================================================================\r
+// name : GlobalSelection\r
+// Purpose : Deactivates selection of sub shapes\r
+//=======================================================================\r
+void SOCC_Viewer::GlobalSelection( const bool update ) const\r
+{\r
+ Handle(AIS_InteractiveContext) ic = getAISContext();\r
+ if ( !ic.IsNull() )\r
+ {\r
+ ic->CloseAllContexts( false );\r
+ if ( update )\r
+ ic->CurrentViewer()->Redraw();\r
+ }\r
+}\r
+\r
+//=======================================================================\r
+// name : BeforeDisplay\r
+// Purpose : Axiluary method called before displaying of objects\r
+//=======================================================================\r
+void SOCC_Viewer::BeforeDisplay( SALOME_Displayer* d )\r
+{\r
+ d->BeforeDisplay( this, SALOME_OCCViewType() );\r
+}\r
+\r
+//=======================================================================\r
+// name : AfterDisplay\r
+// Purpose : Axiluary method called after displaying of objects\r
+//=======================================================================\r
+void SOCC_Viewer::AfterDisplay( SALOME_Displayer* d )\r
+{\r
+ d->AfterDisplay( this, SALOME_OCCViewType() );\r
+}\r
+\r
+//=======================================================================\r
+// name : getTrihedronSize\r
+// Purpose : Get new and current trihedron size corresponding to the\r
+// current model size\r
+//=======================================================================\r
+bool SOCC_Viewer::getTrihedronSize( double& theNewSize, double& theSize )\r
+{\r
+ theNewSize = 100;\r
+ theSize = 100;\r
+\r
+ //SRN: BUG IPAL8996, a usage of method ActiveView without an initialization\r
+ Handle(V3d_Viewer) viewer = getViewer3d();\r
+ viewer->InitActiveViews();\r
+ if(!viewer->MoreActiveViews()) return false;\r
+\r
+ Handle(V3d_View) view3d = viewer->ActiveView();\r
+ //SRN: END of fix\r
+\r
+ if ( view3d.IsNull() )\r
+ return false;\r
+\r
+ double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0;\r
+ double aMaxSide;\r
+\r
+ view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax );\r
+\r
+ if ( Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() ||\r
+ Xmax == RealLast() || Ymax == RealLast() || Zmax == RealLast() )\r
+ return false;\r
+\r
+ aMaxSide = Xmax - Xmin;\r
+ if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin;\r
+ if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin;\r
+\r
+ float aSizeInPercents = SUIT_Session::session()->resourceMgr()->doubleValue("Viewer","TrihedronSize", 105.);\r
+\r
+ static float EPS = 5.0E-3;\r
+ theSize = getTrihedron()->Size();\r
+ theNewSize = aMaxSide*aSizeInPercents / 100.0;\r
+\r
+ return fabs( theNewSize - theSize ) > theSize * EPS ||\r
+ fabs( theNewSize - theSize) > theNewSize * EPS;\r
+}\r
+\r
+//=======================================================================\r
+// name : Repaint\r
+// Purpose : \r
+//=======================================================================\r
+void SOCC_Viewer::Repaint()\r
+{\r
+// onAdjustTrihedron();\r
+ getViewer3d()->Update();\r
+}\r
+\r
+//=======================================================================\r
+// name : createView\r
+// Purpose : create SOCC_ViewWindow\r
+//=======================================================================\r
+SUIT_ViewWindow* SOCC_Viewer::createView( SUIT_Desktop* theDesktop )\r
+{\r
+ SOCC_ViewWindow* view = new SOCC_ViewWindow(theDesktop, this);\r
+ initView( view );\r
+ return view;\r
+}\r