-// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESHGUI : GUI for SMESH component
*/
//================================================================================
- void RemoveVisualObjectWithActors( const char* theEntry )
+ void RemoveVisualObjectWithActors( const char* theEntry, bool fromAllViews )
{
- SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
- ( SUIT_Session::session()->activeApplication() );
- SUIT_ViewManager* aViewManager =
- app ? app->getViewManager(SVTK_Viewer::Type(), true) : 0;
- if ( aViewManager ) {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
+ if(!app)
+ return;
+ SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
+ if(!aStudy)
+ return;
+ ViewManagerList aList;
+
+ if(fromAllViews) {
+ app->viewManagers(SVTK_Viewer::Type() , aList);
+ } else {
+ SUIT_ViewManager* aVM = app->getViewManager(SVTK_Viewer::Type(), true);
+ if(aVM)
+ aList.append(aVM);
+ }
+ bool actorRemoved = false;
+ ViewManagerList::ConstIterator it = aList.begin();
+ SUIT_ViewManager* aViewManager = 0;
+ for( ; it!=aList.end();it++) {
+ aViewManager = *it;
QVector<SUIT_ViewWindow*> views = aViewManager->getViews();
for ( int iV = 0; iV < views.count(); ++iV ) {
if ( SMESH_Actor* actor = FindActorByEntry( views[iV], theEntry)) {
- if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV]))
+ if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) {
vtkWnd->RemoveActor(actor);
+ actorRemoved = true;
+ }
actor->Delete();
}
}
+ }
+
+ if (aViewManager ) {
int aStudyId = aViewManager->study()->id();
TVisualObjCont::key_type aKey(aStudyId,theEntry);
TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey);
}
VISUAL_OBJ_CONT.erase(aKey);
}
+
+ if(actorRemoved)
+ aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
}
//================================================================================
/*!
if ( objModified ) {
// PAL16631. Mesurements showed that to show aVisualObj in SHADING(default) mode,
- // ~10 times more memory is used than it occupies.
+ // ~5 times more memory is used than it occupies.
// Warn the user if there is less free memory than 30 sizes of a grid
// TODO: estimate memory usage in other modes and take current mode into account
int freeMB = SMDS_Mesh::CheckMemory(true);
int usedMB = aVisualObj->GetUnstructuredGrid()->GetActualMemorySize() / 1024;
- if ( freeMB > 0 && usedMB * 30 > freeMB ) {
-#ifdef _DEBUG_
- MESSAGE ( "SMESHGUI_VTKUtils::GetVisualObj(), freeMB=" << freeMB
- << ", usedMB=" << usedMB );
-#endif
-// bool continu = false;
-// if ( usedMB * 10 > freeMB )
-// // even dont try to show
-// SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"),
-// QObject::tr("SMESH_NO_MESH_VISUALIZATION"));
-// else
-// // there is a chance to succeed
-// continu = SUIT_MessageBox::warning
-// (SMESHGUI::desktop(),
-// QObject::tr("SMESH_WRN_WARNING"),
-// QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"),
-// SUIT_MessageBox::Yes | SUIT_MessageBox::No,
-// SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes;
-// if ( !continu ) {
-// // remove the corresponding actors from all views
-// RemoveVisualObjectWithActors( theEntry );
-// aVisualObj.reset();
-// }
+ MESSAGE("SMESHGUI_VTKUtils::GetVisualObj(), freeMB=" << freeMB << ", usedMB=" <<usedMB);
+ if ( freeMB > 0 && usedMB * 5 > freeMB ) {
+ bool continu = false;
+ if ( usedMB * 3 > freeMB )
+ // even dont try to show
+ SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("SMESH_NO_MESH_VISUALIZATION"));
+ else
+ // there is a chance to succeed
+ continu = SUIT_MessageBox::warning
+ (SMESHGUI::desktop(),
+ QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"),
+ SUIT_MessageBox::Yes | SUIT_MessageBox::No,
+ SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes;
+ if ( !continu ) {
+ // remove the corresponding actors from all views
+ RemoveVisualObjectWithActors( theEntry );
+ aVisualObj.reset();
+ }
}
}
}
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj ));
- if(!CORBA::is_nil(aGroup))
+ if(!CORBA::is_nil(aGroup) && anActor)
{
+ QColor c;
+ int deltaF, deltaV;
+ SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100" );
+ SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" );
+ SMESH::GetColor( "SMESH", "default_grp_color", c );
SALOMEDS::Color aColor = aGroup->GetColor();
- if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ) )
+ if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ))
{
- int r = 0, g = 0, b = 0;
- SMESH::GetColor( "SMESH", "fill_color", r, g, b, QColor( 0, 170, 255 ) );
- aColor.R = (float)r / 255.0;
- aColor.G = (float)g / 255.0;
- aColor.B = (float)b / 255.0;
+ aColor.R = c.redF();
+ aColor.G = c.greenF();
+ aColor.B = c.blueF();
aGroup->SetColor( aColor );
}
if( aGroup->GetType() == SMESH::NODE )
anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B );
else if( aGroup->GetType() == SMESH::ELEM0D )
anActor->Set0DColor( aColor.R, aColor.G, aColor.B );
+ else if( aGroup->GetType() == SMESH::BALL )
+ anActor->SetBallColor( aColor.R, aColor.G, aColor.B );
+ else if( aGroup->GetType() == SMESH::VOLUME )
+ anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, deltaV );
else
- anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B );
+ anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, deltaF );
}
}
}
if (!aViewWnd)
return OK;
+ SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd);
+ if (!vtkWnd)
+ return OK;
+
+ SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( vtkWnd->getViewManager()->study() );
+
+ if (!aStudy)
+ return OK;
+
{
OK = true;
vtkRenderer *aRenderer = aViewWnd->getRenderer();
if (SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)) {
MESSAGE("--- display " << anActor);
anActor->SetVisibility(true);
+
+ if(anActor->hasIO()){
+ Handle(SALOME_InteractiveObject) anIO = anActor->getIO();
+ if(anIO->hasEntry()){
+ aStudy->setVisibilityState(anIO->getEntry(), Qtx::ShownState);
+ }
+ }
}
}
break;
anActor->SetVisibility(false);
}
}
+ aStudy->setVisibilityStateForAll(Qtx::HiddenState);
}
default: {
if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) {
case eDisplay:
case eDisplayOnly:
//MESSAGE("--- display " << anActor);
+ anActor->Update();
anActor->SetVisibility(true);
if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange();
+ aStudy->setVisibilityState(theEntry, Qtx::ShownState);
break;
case eErase:
//MESSAGE("--- erase " << anActor);
anActor->SetVisibility(false);
+ aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
break;
}
} else {
if ((anActor = CreateActor(aDocument,theEntry,true))) {
bool needFitAll = noSmeshActors(theWnd); // fit for the first object only
DisplayActor(theWnd,anActor);
+ aStudy->setVisibilityState(theEntry, Qtx::ShownState);
// FitAll(); - PAL16770(Display of a group performs an automatic fit all)
if (needFitAll) FitAll();
} else {
aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ),
aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan );
- int SW = mgr->integerValue( "SMESH", "selection_width", 5 ),
- PW = mgr->integerValue( "SMESH", "highlight_width", 5 );
-
- // adjust highlight_width to the width of mesh entities
int aElem0DSize = mgr->integerValue("SMESH", "elem0d_size", 5);
+ int aBallSize = mgr->integerValue("SMESH", "ball_elem_size", 5);
int aLineWidth = mgr->integerValue("SMESH", "element_width", 1);
int maxSize = aElem0DSize;
if (aElem0DSize > maxSize) maxSize = aElem0DSize;
if (aLineWidth > maxSize) maxSize = aLineWidth;
- if (PW < maxSize + 2) PW = maxSize + 2;
+ if (aBallSize > maxSize) maxSize = aBallSize;
double SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ),
SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 ),
// mesh element selection
aVtkView->SetSelectionProp(aSelColor.red()/255.,
aSelColor.green()/255.,
- aSelColor.blue()/255.,
- SW );
+ aSelColor.blue()/255.);
// tolerances
aVtkView->SetSelectionTolerance(SP1, SP2, SP3);
// pre-selection
aVtkView->SetPreselectionProp(aPreColor.red()/255.,
aPreColor.green()/255.,
- aPreColor.blue()/255.,
- PW);
+ aPreColor.blue()/255.);
// update actors
vtkRenderer* aRenderer = aVtkView->getRenderer();
VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
{theBounds[0],theBounds[3],theBounds[5]},
{theBounds[1],theBounds[3],theBounds[5]}};
- int aMaxId = 0, aMinId = aMaxId;
+ int aMaxId = 0;
theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]);
theMinBoundPrj = theMaxBoundPrj;
for(int i = 1; i < 8; i++){
}
if(theMinBoundPrj > aTmp){
theMinBoundPrj = aTmp;
- aMinId = i;
}
}
vtkFloatingPointType *aMinPnt = aBoundPoints[aMaxId];
if( !anIsOk )
return false;
-
+
DistanceToPosition( theBounds, theNormal, theDist, theOrigin );
return true;
}