#include <AIS_ListIteratorOfListOfInteractive.hxx>
#include <AIS_ListOfInteractive.hxx>
+#include <TColStd_SequenceOfInteger.hxx>
+
#include <OCCViewer_ViewManager.h>
#include <OCCViewer_ViewModel.h>
#include <OCCViewer_ViewWindow.h>
-#include <QApplication>
-
HYDROGUI_OCCDisplayer::HYDROGUI_OCCDisplayer( HYDROGUI_Module* theModule )
-: myModule( theModule )
+: HYDROGUI_AbstractDisplayer( theModule )
{
}
void HYDROGUI_OCCDisplayer::SetToUpdate( const HYDROData_SequenceOfObjects& theObjs,
const int theViewerId )
{
- OCCViewer_Viewer* aViewer = myModule->getOCCViewer( theViewerId );
+ OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
if( !aViewer )
return;
for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
{
- Handle(HYDROData_Object) anObj = theObjs.Value( i );
+ Handle(HYDROData_Entity) anObj = theObjs.Value( i );
if( anObj.IsNull() )
continue;
- HYDROGUI_Shape* anObjShape = myModule->getObjectShape( (size_t)aViewer, anObj );
+ HYDROGUI_Shape* anObjShape = module()->getObjectShape( (size_t)aViewer, anObj );
if ( !anObjShape )
continue;
}
}
-void HYDROGUI_OCCDisplayer::UpdateAll( const int theViewerId,
- const bool theIsInit,
- const bool theIsForced )
-{
- if ( theIsInit )
- EraseAll( theViewerId );
-
- DisplayAll( theViewerId, theIsForced );
-}
-
void HYDROGUI_OCCDisplayer::EraseAll( const int theViewerId )
{
- OCCViewer_Viewer* aViewer = myModule->getOCCViewer( theViewerId );
+ OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
if( !aViewer )
return;
- myModule->removeViewShapes( (size_t)aViewer );
-}
-
-void HYDROGUI_OCCDisplayer::DisplayAll( const int theViewerId,
- const bool theIsForced )
-{
- HYDROData_SequenceOfObjects aSeq;
- HYDROGUI_Tool::GetPrsSubObjects( myModule, aSeq );
- Update( aSeq, theViewerId, theIsForced );
-}
-
-void HYDROGUI_OCCDisplayer::Update( const HYDROData_SequenceOfObjects& theObjs,
- const int theViewerId,
- const bool theIsForced )
-{
- // First of all, kill all bad presentations
- purgeObjects( theViewerId );
-
- // Now dig in the data model
- HYDROData_SequenceOfObjects anObjectsToErase, anObjectsToDisplay;
-
- for( int i = 1, n = theObjs.Length(); i <= n; i++ )
- {
- const Handle(HYDROData_Object)& anObj = theObjs.Value( i );
- if( anObj.IsNull() )
- anObjectsToErase.Append( anObj );
- else
- anObjectsToDisplay.Append( anObj );
- }
-
- if( anObjectsToErase.Length() )
- Erase( anObjectsToErase, theViewerId );
- if( anObjectsToDisplay.Length() )
- Display( anObjectsToDisplay, theViewerId, theIsForced );
+ module()->removeViewShapes( (size_t)aViewer );
}
void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs,
const int theViewerId )
{
- OCCViewer_Viewer* aViewer = myModule->getOCCViewer( theViewerId );
+ OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
if( !aViewer )
return;
for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
{
- Handle(HYDROData_Object) anObj = theObjs.Value( i );
+ Handle(HYDROData_Entity) anObj = theObjs.Value( i );
if( anObj.IsNull() )
continue;
- myModule->removeObjectShape( (size_t)aViewer, anObj );
+ module()->removeObjectShape( (size_t)aViewer, anObj );
}
+ aViewer->update();
}
HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int theViewerId,
const Handle(AIS_InteractiveContext)& theContext,
- const Handle(HYDROData_Object)& theObject )
+ const Handle(HYDROData_Entity)& theObject )
{
HYDROGUI_Shape* aResShape = NULL;
if ( theContext.IsNull() || theObject.IsNull() )
return aResShape;
- ObjectKind anObjectKind = theObject->GetKind();
- if ( anObjectKind != KIND_IMAGE &&
- anObjectKind != KIND_POLYLINE &&
- anObjectKind != KIND_ZONE )
+ if ( !HYDROGUI_Tool::IsObjectHasPresentation( theObject, OCCViewer_Viewer::Type() ) )
return aResShape;
aResShape = new HYDROGUI_Shape( theContext, theObject );
- myModule->setObjectShape( theViewerId, theObject, aResShape );
+ module()->setObjectShape( theViewerId, theObject, aResShape );
return aResShape;
}
void HYDROGUI_OCCDisplayer::Display( const HYDROData_SequenceOfObjects& theObjs,
const int theViewerId,
- const bool theIsForced )
+ const bool theIsForced,
+ const bool theDoFitAll )
{
- OCCViewer_Viewer* aViewer = myModule->getOCCViewer( theViewerId );
+ OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
if( !aViewer )
return;
if( aCtx.IsNull() )
return;
- for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
+ // Sort objects by display order ( needed for Z layers assignment only )
+ HYDROData_SequenceOfObjects anObjects;
+ int aMaxIndex = -1;
+ for ( int i = 1, n = theObjs.Length(); i <= n; i++ ) {
+ Handle(HYDROData_Entity) anObj = theObjs.Value( i );
+ if ( anObj.IsNull() || anObj->IsRemoved() ) {
+ continue;
+ }
+
+ int aDisplayOrderIndex = module()->getObjectDisplayOrder( (size_t)aViewer, anObj );
+ if ( aDisplayOrderIndex > aMaxIndex ) {
+ anObjects.Append( anObj );
+ aMaxIndex = aDisplayOrderIndex;
+ } else {
+ anObjects.Prepend( anObj );
+ }
+ }
+
+ // Get existing Z layers
+ TColStd_SequenceOfInteger anExistingZLayers;
+ aViewer->getViewer3d()->GetAllZLayers( anExistingZLayers );
+ int aNbLayers = anExistingZLayers.Length();
+
+ // Display
+ for ( int i = 1, n = anObjects.Length(); i <= n; i++ )
{
- Handle(HYDROData_Object) anObj = theObjs.Value( i );
+ Handle(HYDROData_Entity) anObj = anObjects.Value( i );
if ( anObj.IsNull() || anObj->IsRemoved() )
continue;
- HYDROGUI_Shape* anObjShape = myModule->getObjectShape( (size_t)aViewer, anObj );
+ HYDROGUI_Shape* anObjShape = module()->getObjectShape( (size_t)aViewer, anObj );
if ( !anObjShape || anObjShape->getIsToUpdate() || theIsForced )
{
if ( anObjShape )
{
- bool anIsVisible = myModule->isObjectVisible( (size_t)aViewer, anObj );
+ bool anIsVisible = module()->isObjectVisible( (size_t)aViewer, anObj );
anObjShape->setVisible( anIsVisible, false );
+
+ // Set Z layer
+ Standard_Integer aLayerId = -1;
+ if ( i <= aNbLayers ) {
+ aLayerId = anExistingZLayers.Value( i );
+ } else {
+ Standard_Integer aNewId = -1;
+ if ( aViewer->getViewer3d()->AddZLayer( aNewId ) ) {
+ aLayerId = aNewId;
+ }
+ }
+ if ( aLayerId >= 0 ) {
+ aCtx->SetZLayer( anObjShape->getAISShape(), aLayerId );
+ }
}
}
- OCCViewer_ViewManager* aViewManager
- = ::qobject_cast<OCCViewer_ViewManager*>( aViewer->getViewManager() );
- if ( aViewManager )
+ if ( theDoFitAll )
{
- OCCViewer_ViewWindow* aViewWindow =
- ::qobject_cast<OCCViewer_ViewWindow*>( aViewManager->getActiveView() );
- if ( aViewWindow )
+ OCCViewer_ViewManager* aViewManager
+ = ::qobject_cast<OCCViewer_ViewManager*>( aViewer->getViewManager() );
+ if ( aViewManager )
{
- QApplication::processEvents(); //Process the draw events for viewer
- aViewWindow->onFitAll();
+ OCCViewer_ViewWindow* aViewWindow =
+ ::qobject_cast<OCCViewer_ViewWindow*>( aViewManager->getActiveView() );
+ if ( aViewWindow )
+ {
+ aViewWindow->onFitAll();
+ }
}
}
+ else if ( aCtx.IsNull() )
+ {
+ aCtx->UpdateSelected();
+ }
}
void HYDROGUI_OCCDisplayer::purgeObjects( const int theViewerId )
{
- OCCViewer_Viewer* aViewer = myModule->getOCCViewer( theViewerId );
+ OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
if( !aViewer )
return;
if ( aPrsObj.IsNull() )
continue;
- Handle(HYDROData_Object) anOwnerObj =
- Handle(HYDROData_Object)::DownCast( aPrsObj->GetOwner() );
+ Handle(HYDROData_Entity) anOwnerObj =
+ Handle(HYDROData_Entity)::DownCast( aPrsObj->GetOwner() );
if ( !anOwnerObj.IsNull() && anOwnerObj->IsRemoved() )
- myModule->removeObjectShape( (size_t)aViewer, anOwnerObj );
+ module()->removeObjectShape( (size_t)aViewer, anOwnerObj );
}
}
-
+QString HYDROGUI_OCCDisplayer::GetType() const
+{
+ return OCCViewer_Viewer::Type();
+}