CCAR: optimise GEOM_Swig::setColor speed by using SOCC_Viewer::CreatePrs

and not updating viewer if not required
This commit is contained in:
caremoli 2010-12-09 14:26:58 +00:00
parent 2710d4df0f
commit 2b23fe11ea

View File

@ -472,24 +472,28 @@ void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue, boo
aView->Repaint(); aView->Repaint();
} else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); Handle(AIS_InteractiveContext) ic = occViewer->getAISContext();
AIS_ListOfInteractive List; SOCC_Viewer* soccViewer = dynamic_cast<SOCC_Viewer*>(occViewer);
ic->DisplayedObjects(List); if (soccViewer)
AIS_ListIteratorOfListOfInteractive ite (List); {
for (; ite.More(); ite.Next()) { SALOME_Prs* prs= soccViewer->CreatePrs( myEntry.c_str() );
Handle(SALOME_InteractiveObject) anObj = const SOCC_Prs* anOCCPrs = dynamic_cast<const SOCC_Prs*>( prs );
Handle(SALOME_InteractiveObject)::DownCast(ite.Value()->GetOwner()); if ( !anOCCPrs || anOCCPrs->IsNull() )
if (!anObj.IsNull() && anObj->hasEntry() && anObj->isSame(anIO)) { return;
Quantity_Color CSFColor =
Quantity_Color(myRed/255., myGreen/255., myBlue/255., Quantity_TOC_RGB); // get objects to be displayed
ite.Value()->SetColor(CSFColor); AIS_ListOfInteractive anAISObjects;
if (ite.Value()->IsKind(STANDARD_TYPE(GEOM_AISShape))) anOCCPrs->GetObjects( anAISObjects );
Handle(GEOM_AISShape)::DownCast(ite.Value())->SetShadingColor(CSFColor); AIS_ListIteratorOfListOfInteractive ite( anAISObjects );
ic->Redisplay(ite.Value(), true, true); Quantity_Color CSFColor = Quantity_Color(myRed/255., myGreen/255., myBlue/255., Quantity_TOC_RGB);
if (myUpdateViewer) for ( ; ite.More(); ite.Next() )
occViewer->update(); {
break; if(!ic->IsDisplayed(ite.Value()))continue; //only displayed ais
ite.Value()->SetColor(CSFColor);
if (ite.Value()->IsKind(STANDARD_TYPE(GEOM_AISShape))) Handle(GEOM_AISShape)::DownCast(ite.Value())->SetShadingColor(CSFColor);
ite.Value()->Redisplay(Standard_True); // as in OnColor
}
if (myUpdateViewer) occViewer->update();
} }
}
} }
} }
}; };