X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshersGUI%2FStdMeshersGUI_SubShapeSelectorWdg.cxx;h=551fe766314c055b9b85b874a729aa6248f6f6db;hp=4f63c559b5027472855678b4c77d0070aca20791;hb=251f8c052dd12dd29922210dc901b295fe999a0e;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx index 4f63c559b..551fe7663 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -43,7 +43,6 @@ // SALOME GUI includes #include #include -#include // SUIT Includes #include @@ -515,9 +514,9 @@ SMESH::long_array_var StdMeshersGUI_SubShapeSelectorWdg::GetListOfIDs() //================================================================================= // function : SetListOfIds -// purpose : Called to set the list of SubShapes IDs +// purpose : Called to set the list of SubShapes IDs. Returns false if any ID is invalid //================================================================================= -void StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theIds) +bool StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theIds) { mySelectedIDs.clear(); myListOfIDs.clear(); @@ -525,8 +524,10 @@ void StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theI for ( int i = 0; i < size; i++ ) mySelectedIDs.append( theIds[ i ] ); - mySelectedIDs = GetCorrectedListOfIDs( false ); + bool isOk; + mySelectedIDs = GetCorrectedListOfIDs( false, &isOk ); onAdd(); + return isOk; } //================================================================================= @@ -556,35 +557,74 @@ const char* StdMeshersGUI_SubShapeSelectorWdg::GetMainShapeEntry() // function : GetCorrectedListOfIds // purpose : Called to convert the list of IDs from sub-shape IDs to main shape IDs //================================================================================= -QList StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape ) +QList +StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape, + bool* isOK ) { - if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && fromSubshapeToMainshape ) + if (( myMainShape.IsNull() || myGeomShape.IsNull() ) && fromSubshapeToMainshape ) return myListOfIDs; - else if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && !fromSubshapeToMainshape ) + else if (( myMainShape.IsNull() /*||*/&& myGeomShape.IsNull() ) && !fromSubshapeToMainshape ) return mySelectedIDs; + if ( !fromSubshapeToMainshape ) // called from SetListOfIDs + { + if ( myMainShape.IsNull() ) + std::swap( myMainShape, myGeomShape ); + } + QList aList; - TopTools_IndexedMapOfShape aGeomMap; - TopTools_IndexedMapOfShape aMainMap; - TopExp::MapShapes(myGeomShape, aGeomMap); + TopTools_IndexedMapOfShape aGeomMap, aMainMap; TopExp::MapShapes(myMainShape, aMainMap); + if ( !myGeomShape.IsNull() ) + TopExp::MapShapes(myGeomShape, aGeomMap); - if ( fromSubshapeToMainshape ) { // convert indexes from sub-shape to mainshape + bool ok = true; + if ( fromSubshapeToMainshape ) // convert indexes from sub-shape 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 ); + int index = myListOfIDs.at(i); + if ( aGeomMap.Extent() < index ) + { + ok = false; + } + else + { + TopoDS_Shape aSubShape = aGeomMap.FindKey( index ); + if ( mySubShType != aSubShape.ShapeType() ) + ok = false; + if ( !aMainMap.Contains( aSubShape )) + ok = false; + else + index = aMainMap.FindIndex( aSubShape ); + } aList.append( index ); } myIsNotCorrected = false; - } else { // convert indexes from main shape to sub-shape + } + else // convert indexes from main shape to sub-shape, or just check indices + { int size = mySelectedIDs.size(); for (int i = 0; i < size; i++) { - TopoDS_Shape aSubShape = aMainMap.FindKey( mySelectedIDs.at(i) ); - int index = aGeomMap.FindIndex( aSubShape ); + int index = mySelectedIDs.at(i); + if ( aMainMap.Extent() < index ) + { + ok = false; + } + else + { + TopoDS_Shape aSubShape = aMainMap.FindKey( index ); + if ( mySubShType != aSubShape.ShapeType() ) + ok = false; + if ( !aGeomMap.Contains( aSubShape ) && !aGeomMap.IsEmpty() ) + ok = false; + else + index = aGeomMap.FindIndex( aSubShape ); + } aList.append( index ); } } + if ( isOK ) *isOK = ok; return aList; }