From e062bbd05514787b430741e6a4739e35b9531f75 Mon Sep 17 00:00:00 2001 From: vsr Date: Tue, 9 Aug 2011 08:39:43 +0000 Subject: [PATCH] 0021343: EDF 1930 SMESH: Huge memory occupation when assigning an hypothesis to a big model --- resources/SalomeApp.xml | 1 + src/SMESHGUI/SMESHGUI.cxx | 7 ++ src/SMESHGUI/SMESH_msg_en.ts | 15 ++++ .../StdMeshersGUI_SubShapeSelectorWdg.cxx | 70 +++++++++++++++++-- .../StdMeshersGUI_SubShapeSelectorWdg.h | 7 ++ 5 files changed, 93 insertions(+), 7 deletions(-) diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index 6035cdc67..a0958857e 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -80,6 +80,7 @@ + diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 7d608fae5..dba756038 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -4396,6 +4396,13 @@ void SMESHGUI::createPreferences() setPreferenceProperty( precs[ii], "precision", 2 ); } + int previewGroup = addPreference( tr( "SMESH_PREF_GROUP_PREVIEW" ), genTab ); + setPreferenceProperty( previewGroup, "columns", 2 ); + int chunkSize = addPreference( tr( "PREF_PREVIEW_CHUNK_SIZE" ), previewGroup, LightApp_Preferences::IntSpin, "SMESH", "preview_actor_chunk_size" ); + setPreferenceProperty( chunkSize, "min", 0 ); + setPreferenceProperty( chunkSize, "max", 1000 ); + setPreferenceProperty( chunkSize, "step", 50 ); + // Mesh tab ------------------------------------------------------------------------ int meshTab = addPreference( tr( "PREF_TAB_MESH" ) ); int nodeGroup = addPreference( tr( "PREF_GROUP_NODES" ), meshTab ); diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 5bbd260f5..d0805425a 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -3612,6 +3612,10 @@ Please, create VTK viewer and try again SMESH_PREF_GROUP_PRECISION Input fields precision + + SMESH_PREF_GROUP_PREVIEW + Preview + PREF_GROUP_ELEMENTS Elements @@ -3736,6 +3740,10 @@ Please, create VTK viewer and try again PREF_WIDTH Width + + PREF_PREVIEW_CHUNK_SIZE + Sub-shapes preview chunk size + SMESHGUI_AddQuadraticElementDlg @@ -6058,4 +6066,11 @@ as they are of improper type: elements + + StdMeshersGUI_SubShapeSelectorWdg + + X_FROM_Y_ITEMS_SHOWN + %1-%2 from %3 items shown + + diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx index 09ba1f2f0..80259747b 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx @@ -93,20 +93,28 @@ StdMeshersGUI_SubShapeSelectorWdg edgesLayout->setMargin( MARGIN ); edgesLayout->setSpacing( SPACING ); - myListWidget = new QListWidget( this ); + myListWidget = new QListWidget( this ); myAddButton = new QPushButton( tr( "SMESH_BUT_ADD" ), this ); myRemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this ); + myInfoLabel = new QLabel( this ); + myPrevButton = new QPushButton( "<<", this ); + myNextButton = new QPushButton( ">>", this ); myListWidget->setSelectionMode( QListWidget::ExtendedSelection ); edgesLayout->addWidget(myListWidget, 0, 0, 3, 3); - edgesLayout->addWidget(myAddButton, 0, 4); - edgesLayout->addWidget(myRemoveButton, 1, 4); + edgesLayout->addWidget(myAddButton, 0, 3); + edgesLayout->addWidget(myRemoveButton, 1, 3); + edgesLayout->addWidget(myInfoLabel, 3, 0, 1, 3); + edgesLayout->addWidget(myPrevButton, 4, 0); + edgesLayout->addWidget(myNextButton, 4, 2); - //edgesLayout->setRowStretch(2, 5); - edgesLayout->setColumnStretch(2, 5); + edgesLayout->setRowStretch(2, 5); + edgesLayout->setColumnStretch(1, 5); - setLayout( edgesLayout ); - setMinimumWidth( 300 ); + myListWidget->setMinimumWidth(300); + myInfoLabel->setMinimumWidth(300); + myInfoLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + myInfoLabel->setAlignment(Qt::AlignCenter); mySubShType = aSubShType; @@ -171,6 +179,8 @@ void StdMeshersGUI_SubShapeSelectorWdg::init() connect( myAddButton, SIGNAL(clicked()), SLOT(onAdd())); connect( myRemoveButton, SIGNAL(clicked()), SLOT(onRemove())); + connect( myPrevButton, SIGNAL(clicked()), SLOT(onPrevious())); + connect( myNextButton, SIGNAL(clicked()), SLOT(onNext())); connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); connect( myListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onListSelectionChanged())); @@ -296,6 +306,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument() myAddButton->setEnabled( ( myListWidget->count() < myMaxSize || myMaxSize == -1 ) && mySelectedIDs.size() > 0 && ( mySelectedIDs.size() <= myMaxSize || myMaxSize == -1 ) ); //Connect Selected Ids in viewer and dialog's Ids list + bool signalsBlocked = myListWidget->blockSignals( true ); myListWidget->clearSelection(); if ( mySelectedIDs.size() > 0 ) { for (int i = 0; i < mySelectedIDs.size(); i++) { @@ -306,6 +317,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument() item->setSelected(true); } } + myListWidget->blockSignals( signalsBlocked ); } //================================================================================= @@ -360,6 +372,28 @@ void StdMeshersGUI_SubShapeSelectorWdg::onRemove() myAddButton->setEnabled( true ); } +void StdMeshersGUI_SubShapeSelectorWdg::onPrevious() +{ + if ( myPreviewActor ) { + myPreviewActor->previous(); + myListWidget->clearSelection(); + updateButtons(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->Repaint(); + } +} + +void StdMeshersGUI_SubShapeSelectorWdg::onNext() +{ + if ( myPreviewActor ) { + myPreviewActor->next(); + myListWidget->clearSelection(); + updateButtons(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->Repaint(); + } +} + //================================================================================= // function : onListSelectionChanged() // purpose : Called when selection in element list is changed @@ -404,6 +438,9 @@ void StdMeshersGUI_SubShapeSelectorWdg::updateState() bool state = false; if ( !myGeomShape.IsNull() ) state = true; + myInfoLabel->setVisible( false ); + myPrevButton->setVisible( false ); + myNextButton->setVisible( false ); myListWidget->setEnabled( state ); myAddButton->setEnabled( mySelectedIDs.size() > 0 ); @@ -419,6 +456,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::updateState() myPreviewActor->AddToRender( myRenderer ); aViewWindow->Repaint(); } + updateButtons(); } } @@ -552,3 +590,21 @@ QList StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSu return aList; } + +void StdMeshersGUI_SubShapeSelectorWdg::updateButtons() +{ + if ( myPreviewActor ) { + int total = myPreviewActor->count(); + int chunk = myPreviewActor->currentChunk(); + int chunkSize = myPreviewActor->chunkSize(); + int imin = chunk*chunkSize+1; + int imax = std::min((chunk+1)*chunkSize, total); + bool vis = imax > 0 && total > chunkSize; + myInfoLabel->setVisible( vis ); + myPrevButton->setVisible( vis ); + myNextButton->setVisible( vis ); + myInfoLabel->setText( tr( "X_FROM_Y_ITEMS_SHOWN" ).arg(imin).arg(imax).arg(total) ); + myPrevButton->setEnabled( myPreviewActor->hasPrevious() ); + myNextButton->setEnabled( myPreviewActor->hasNext() ); + } +} diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h index 2cc304ff2..897b873fd 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h @@ -39,6 +39,7 @@ class SMESHGUI; class LightApp_SelectionMgr; class SVTK_Selector; class QPushButton; +class QLabel; class QLineEdit; class QCheckBox; class QListWidget; @@ -85,10 +86,13 @@ public: private: void updateState(); void setFilter(); + void updateButtons(); private slots: void onAdd(); void onRemove(); + void onPrevious(); + void onNext(); void SelectionIntoArgument(); void onListSelectionChanged(); @@ -109,6 +113,9 @@ private: QListWidget* myListWidget; QPushButton* myAddButton; QPushButton* myRemoveButton; + QLabel* myInfoLabel; + QPushButton* myPrevButton; + QPushButton* myNextButton; QList mySelectedIDs; QList myListOfIDs; -- 2.39.2