-// Copyright (C) 2007-2008 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) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
+
// File : StdMeshersGUI_SubShapeSelectorWdg.cxx
// Author : Open CASCADE S.A.S. (dmv)
// SMESH includes
StdMeshersGUI_SubShapeSelectorWdg
::StdMeshersGUI_SubShapeSelectorWdg( QWidget * parent ):
QWidget( parent ),
- myPreviewActor( 0 )
+ myPreviewActor( 0 ),
+ myMaxSize( -1 )
{
QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH", tr( "ICON_SELECT" ) ) );
setLayout( edgesLayout );
setMinimumWidth( 300 );
- myMaxSize = 1000;
mySubShType = TopAbs_EDGE;
init();
void StdMeshersGUI_SubShapeSelectorWdg::init()
{
myParamValue = "";
+ myIsNotCorrected = true; // to dont call the GetCorrectedValue method twice
myListOfIDs.clear();
mySelectedIDs.clear();
+ myAddButton->setEnabled( false );
+ myRemoveButton->setEnabled( false );
+
mySMESHGUI = SMESHGUI::GetSMESHGUI();
mySelectionMgr = SMESH::GetSelectionMgr( mySMESHGUI );
mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
mySelectionMgr->selectedObjects( aList );
int nbSel = aList.Extent();
- if (nbSel < 1)
- return;
-
- SALOME_ListIteratorOfListIO anIt (aList);
+ if (nbSel > 0) {
+ SALOME_ListIteratorOfListIO anIt (aList);
- for ( ; anIt.More(); anIt.Next()) { // Loop on selected objects
- Handle(SALOME_InteractiveObject) IO = anIt.Value();
-
- GEOM::GEOM_Object_var aGeomObj = GetGeomObjectByEntry( IO->getEntry() );
- if ( !CORBA::is_nil( aGeomObj ) ) { // Selected Object From Study
- GEOM::GEOM_Object_ptr aGeomFatherObj = aGeomObj->GetMainShape();
- QString aFatherEntry = "";
- QString aMainFatherEntry = "";
- TopoDS_Shape shape;
- if ( !CORBA::is_nil( aGeomFatherObj ) ) {
- // Get Main Shape
- GEOM::GEOM_Object_var aGeomMain = GetGeomObjectByEntry( myEntry );
- if ( !CORBA::is_nil( aGeomMain ) && aGeomMain->GetType() == 37 ) { // Main Shape is a Group
- GEOM::GEOM_Object_ptr aMainFatherObj = aGeomMain->GetMainShape();
- if ( !CORBA::is_nil( aMainFatherObj ) )
- aMainFatherEntry = aMainFatherObj->GetStudyEntry();
- }
- aFatherEntry = aGeomFatherObj->GetStudyEntry();
- }
+ for ( ; anIt.More(); anIt.Next()) { // Loop on selected objects
+ Handle(SALOME_InteractiveObject) IO = anIt.Value();
- if ( aFatherEntry != "" && ( aFatherEntry == myEntry || aFatherEntry == aMainFatherEntry ) ) {
- if ( aGeomObj->GetType() == 37 /*GEOM_GROUP*/ ) { // Selected Group that belongs the main object
- GEOMBase::GetShape(aGeomObj, shape);
- if ( !shape.IsNull() ) {
- TopExp_Explorer exp( shape, mySubShType );
- for ( ; exp.More(); exp.Next() ) {
- int index = myPreviewActor->GetIndexByShape( exp.Current() );
- if ( index ) {
- mySelectedIDs.append( index );
- myPreviewActor->HighlightID( index );
- }
- }
- }
- } else if ( aGeomObj->GetType() == 28 /*GEOM_SUBSHAPE*/ ) {
- GEOMBase::GetShape(aGeomObj, shape);
- if ( !shape.IsNull() && shape.ShapeType() == mySubShType ) {
- int index = myPreviewActor->GetIndexByShape( shape );
- if ( index ) {
- mySelectedIDs.append( index );
- myPreviewActor->HighlightID( index );
- }
- }
- }
+ GEOM::GEOM_Object_var aGeomObj = GetGeomObjectByEntry( IO->getEntry() );
+ if ( !CORBA::is_nil( aGeomObj ) ) { // Selected Object From Study
+ GEOM::GEOM_Object_ptr aGeomFatherObj = aGeomObj->GetMainShape();
+ QString aFatherEntry = "";
+ QString aMainFatherEntry = "";
+ TopoDS_Shape shape;
+ if ( !CORBA::is_nil( aGeomFatherObj ) ) {
+ // Get Main Shape
+ GEOM::GEOM_Object_var aGeomMain = GetGeomObjectByEntry( myEntry );
+ if ( !CORBA::is_nil( aGeomMain ) && aGeomMain->GetType() == 37 ) { // Main Shape is a Group
+ GEOM::GEOM_Object_ptr aMainFatherObj = aGeomMain->GetMainShape();
+ if ( !CORBA::is_nil( aMainFatherObj ) )
+ aMainFatherEntry = aMainFatherObj->GetStudyEntry();
+ }
+ aFatherEntry = aGeomFatherObj->GetStudyEntry();
+ }
+
+ if ( aFatherEntry != "" && ( aFatherEntry == myEntry || aFatherEntry == aMainFatherEntry ) ) {
+ if ( aGeomObj->GetType() == 37 /*GEOM_GROUP*/ ) { // Selected Group that belongs the main object
+ GEOMBase::GetShape(aGeomObj, shape);
+ if ( !shape.IsNull() ) {
+ TopExp_Explorer exp( shape, mySubShType );
+ for ( ; exp.More(); exp.Next() ) {
+ int index = myPreviewActor->GetIndexByShape( exp.Current() );
+ if ( index ) {
+ mySelectedIDs.append( index );
+ myPreviewActor->HighlightID( index );
+ }
+ }
+ }
+ } else if ( aGeomObj->GetType() == 28 /*GEOM_SUBSHAPE*/ ) {
+ GEOMBase::GetShape(aGeomObj, shape);
+ if ( !shape.IsNull() && shape.ShapeType() == mySubShType ) {
+ int index = myPreviewActor->GetIndexByShape( shape );
+ if ( index ) {
+ mySelectedIDs.append( index );
+ myPreviewActor->HighlightID( index );
+ }
+ }
+ }
+ }
+ } else { // Selected Actor from Actor Collection
+ QString anEntry = IO->getEntry();
+ QString str = "_";
+ int index = anEntry.lastIndexOf( str );
+ anEntry.remove(0, index+1);
+ int ind = anEntry.toInt();
+ if ( ind )
+ mySelectedIDs.append( ind );
}
- } else { // Selected Actor from Actor Collection
- QString anEntry = IO->getEntry();
- QString str = "_";
- int index = anEntry.lastIndexOf( str );
- anEntry.remove(0, index+1);
- int ind = anEntry.toInt();
- if ( ind )
- mySelectedIDs.append( ind );
+ }
+ }
+ // update add button
+ myAddButton->setEnabled( myListWidget->count() < myMaxSize && mySelectedIDs.size() > 0 && ( mySelectedIDs.size() <= myMaxSize || myMaxSize == -1 ) );
+
+ //Connect Selected Ids in viewer and dialog's Ids list
+ myListWidget->clearSelection();
+ if ( mySelectedIDs.size() > 0 ) {
+ for (int i = 0; i < mySelectedIDs.size(); i++) {
+ QString anID = QString(" %1").arg( mySelectedIDs.at(i) );
+ QList<QListWidgetItem*> anItems = myListWidget->findItems ( anID, Qt::MatchExactly );
+ QListWidgetItem* item;
+ foreach(item, anItems)
+ item->setSelected(true);
}
}
}
return;
myListWidget->blockSignals( true );
- for (int i = 0; i < mySelectedIDs.size(); i++) {
+ for (int i = 0; i < mySelectedIDs.size() && (myMaxSize == -1 || myListOfIDs.size() < myMaxSize); i++) {
if ( myListOfIDs.indexOf( mySelectedIDs.at(i) ) == -1 ) {
QString anID = QString(" %1").arg( mySelectedIDs.at(i) );
}
}
onListSelectionChanged();
-
myListWidget->blockSignals( false );
-
- if( myListOfIDs.size() >= myMaxSize )
- myAddButton->setEnabled( false );
+ myAddButton->setEnabled( myMaxSize == -1 || myListOfIDs.size() < myMaxSize );
}
-
+
//=================================================================================
// function : onRemove()
// purpose : Called when Remove Button Clicked
QListWidgetItem* anItem;
foreach(anItem, selItems)
myPreviewActor->HighlightID( anItem->text().toInt() );
+
+ // update remove button
+ myRemoveButton->setEnabled( selItems.size() > 0 );
}
//=================================================================================
// function : setGeomShape
// purpose : Called to set geometry
//================================================================================
-void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEntry )
+void StdMeshersGUI_SubShapeSelectorWdg::SetGeomShapeEntry( const QString& theEntry )
{
if ( theEntry != "") {
myParamValue = theEntry;
myEntry = theEntry;
- myMainShape = GetTopoDSByEntry( theEntry );
+ myGeomShape = GetTopoDSByEntry( theEntry );
updateState();
+ myIsNotCorrected = true;
}
}
void StdMeshersGUI_SubShapeSelectorWdg::updateState()
{
bool state = false;
- if ( !myMainShape.IsNull() )
+ if ( !myGeomShape.IsNull() )
state = true;
myListWidget->setEnabled( state );
- myAddButton->setEnabled( state );
- myRemoveButton->setEnabled( state );
+ myAddButton->setEnabled( mySelectedIDs.size() > 0 );
if (state) {
myPreviewActor = new SMESH_PreviewActorsCollection();
myPreviewActor->SetSelector( mySelector );
- //myPreviewActor->Init( myMainShape, TopAbs_EDGE, myEntry );
- myPreviewActor->Init( myMainShape, mySubShType, myEntry );
+ myPreviewActor->Init( myGeomShape, mySubShType, myEntry );
myPreviewActor->SetShown( false );
myIsShown = false;
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) {
SMESH::long_array_var StdMeshersGUI_SubShapeSelectorWdg::GetListOfIDs()
{
SMESH::long_array_var anArray = new SMESH::long_array;
+
+ if ( myMainEntry != "" && myIsNotCorrected )
+ myListOfIDs = GetCorrectedListOfIDs( true );
+
int size = myListOfIDs.size();
anArray->length( size );
if ( size ) {
for (int i = 0; i < size; i++) {
- anArray[i] = myListOfIDs.at(i);
+ anArray[i] = myListOfIDs.at(i);
}
}
return anArray;
int size = theIds->length();
for ( int i = 0; i < size; i++ )
mySelectedIDs.append( theIds[ i ] );
+
+ mySelectedIDs = GetCorrectedListOfIDs( false );
onAdd();
}
+//=================================================================================
+// function : SetMainShapeEntry
+// purpose : Called to set the Main Object Entry
+//=================================================================================
+void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEntry )
+{
+ myMainEntry = theEntry;
+ myMainShape = GetTopoDSByEntry( theEntry );
+ myIsNotCorrected = true;
+}
+
+//=================================================================================
+// function : GetMainShapeEntry
+// purpose : Called to get the Main Object Entry
+//=================================================================================
+const char* StdMeshersGUI_SubShapeSelectorWdg::GetMainShapeEntry()
+{
+ if ( myMainEntry == "")
+ return myEntry.toLatin1().data();
+
+ return myMainEntry.toLatin1().data();
+}
+
+//=================================================================================
+// function : GetCorrectedListOfIds
+// purpose : Called to convert the list of IDs from subshape IDs to main shape IDs
+//=================================================================================
+QList<int> StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape )
+{
+ if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && fromSubshapeToMainshape )
+ return myListOfIDs;
+ else if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && !fromSubshapeToMainshape )
+ return mySelectedIDs;
+
+ QList<int> aList;
+ TopTools_IndexedMapOfShape aGeomMap;
+ TopTools_IndexedMapOfShape aMainMap;
+ TopExp::MapShapes(myGeomShape, aGeomMap);
+ TopExp::MapShapes(myMainShape, aMainMap);
+
+ if ( fromSubshapeToMainshape ) { // convert indexes from subshape to mainshape
+ int size = myListOfIDs.size();
+ for (int i = 0; i < size; i++) {
+ TopoDS_Shape aSubShape = aGeomMap.FindKey( myListOfIDs.at(i) );
+ int index = aMainMap.FindIndex( aSubShape );
+ aList.append( index );
+ }
+ myIsNotCorrected = false;
+ } else { // convert indexes from main shape to subshape
+ int size = mySelectedIDs.size();
+ for (int i = 0; i < size; i++) {
+ TopoDS_Shape aSubShape = aMainMap.FindKey( mySelectedIDs.at(i) );
+ int index = aGeomMap.FindIndex( aSubShape );
+ aList.append( index );
+ }
+ }
+
+ return aList;
+}