+//================================================================
+// Function : getSelected
+// Purpose : Get selected object by specified types
+//
+// Returns valid object if only one object of the specified type is selected
+// (no matter global or local selection is activated). The list of allowed
+// shape types is passed via \a types. If \a types includes TopAbs_SHAPE,
+// geometrical object of any valid type is expected.
+//
+// \param types list of allowed shape types for the objects to be obtained from selection
+// \return selected geometrical object or nil object if selection is not satisfactory
+//================================================================
+GEOM::GeomObjPtr GEOMBase_Helper::getSelected( const QList<TopAbs_ShapeEnum>& types )
+{
+ QList<GEOM::GeomObjPtr> selected = getSelected( types, 1 );
+ return selected.count() > 0 ? selected[0] : GEOM::GeomObjPtr();
+}
+
+//================================================================
+// Function : getSelected
+// Purpose : Get selected object(s) by specified type
+//
+// Returns list of selected objects if selection satisfies specifies selection options.
+// (no matter global or local selection is activated). If \a type is TopAbs_SHAPE,
+// geometrical objects of any valid type are expected.
+//
+// The \a type parameter specifies allowed type of the object(s) being selected.
+// The \a count parameter specifies exact number of the objects to be retrieved from selection.
+// The \a strict parameter specifies policy being applied to the selection.
+// If \a count < 0, then any number of the selected objects is valid (including 0).
+// In this case, if \a strict is \c true (default), all selected objects should satisfy
+// the specified \a type.
+// If \a count > 0, only specified number of the objects is retrieved from the selection.
+// In this case, if \a strict is \c true (default), function returns empty list if total number of selected
+// objects does not correspond to the \a count parameter. Otherwise (if \a strict is \c false),
+// function returns valid list of objects if at least \a count objects satisfy specified \a type.
+//
+// \param type type of the object(s) to be obtained from selection
+// \param count number of items to be retrieved from selection
+// \param strict selection policy
+// \return list of selected geometrical objects or empty list if selection is not satisfactory
+//================================================================
+QList<GEOM::GeomObjPtr> GEOMBase_Helper::getSelected( TopAbs_ShapeEnum type, int count, bool strict )
+{
+ QList<TopAbs_ShapeEnum> types;
+ types << type;
+ return getSelected( types, count, strict );
+}
+
+static bool typeInList( TopAbs_ShapeEnum type, const QList<TopAbs_ShapeEnum>& types )
+{
+ bool ok = false;
+ for ( int i = 0; i < types.count() && !ok; i++ )
+ ok = types[i] == TopAbs_SHAPE || types[i] == type;
+ return ok;
+}
+
+//================================================================
+// Function : getSelected
+// Purpose : Get selected objects by specified types
+//
+// Returns list of selected objects if selection satisfies specifies selection options.
+// (no matter global or local selection is activated). If \a types includes TopAbs_SHAPE,
+// geometrical objects of any valid type are expected.
+//
+// The \a types parameter specifies allowed types of the object(s) being selected.
+// The \a count parameter specifies exact number of the objects to be retrieved from selection.
+// The \a strict parameter specifies policy being applied to the selection.
+// If \a count < 0, then any number of the selected objects is valid (including 0).
+// In this case, if \a strict is \c true (default), all selected objects should satisfy
+// the specified \a type.
+// If \a count > 0, only specified number of the objects is retrieved from the selection.
+// In this case, if \a strict is \c true (default), function returns empty list if total number of selected
+// objects does not correspond to the \a count parameter. Otherwise (if \a strict is \c false),
+// function returns valid list of objects if at least \a count objects satisfy specified \a type.
+//
+// \param types list of allowed shape types for the objects to be obtained from selection
+// \param count number of items to be retrieved from selection
+// \param strict selection policy
+// \return list of selected geometrical objects or empty list if selection is not satisfactory
+//================================================================
+QList<GEOM::GeomObjPtr> GEOMBase_Helper::getSelected( const QList<TopAbs_ShapeEnum>& types, int count, bool strict )
+{
+ SUIT_Session* session = SUIT_Session::session();
+ QList<GEOM::GeomObjPtr> result;
+
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( session->activeApplication() );
+ if ( app ) {
+ LightApp_SelectionMgr* selMgr = app->selectionMgr();
+ if ( selMgr ) {
+ SALOME_ListIO selected;
+ selMgr->selectedObjects( selected );
+ SALOME_ListIteratorOfListIO it( selected );
+ bool stopped = false;
+ for ( ; it.More() && !stopped; it.Next() ) {
+ Handle(SALOME_InteractiveObject) IO = it.Value();
+ GEOM::GeomObjPtr object = GEOMBase::ConvertIOinGEOMObject( IO );
+ if ( object ) {
+ TColStd_IndexedMapOfInteger subShapes;
+ selMgr->GetIndexes( IO, subShapes );
+ int nbSubShapes = subShapes.Extent();
+ if ( nbSubShapes == 0 ) {
+ // global selection
+ if ( typeInList( (TopAbs_ShapeEnum)(object->GetShapeType()), types ) ) {
+ result << object;
+ if ( count > 0 ) {
+ if ( strict && result.count() > count ) {
+ result.clear();
+ stopped = true;
+ }
+ else if ( !strict && result.count() == count )
+ stopped = true;
+ }
+ }
+ else if ( strict ) {
+ result.clear();
+ stopped = true;
+ }
+ }
+ else {
+ // local selection
+ for ( int i = 1; i <= nbSubShapes && !stopped; i++ ) {
+ int idx = subShapes( i );
+ GEOM::GeomObjPtr subShape = findObjectInFather( object.get(), idx );
+ if ( !subShape ) {
+ // sub-shape is not yet published in the study
+ GEOM::ShapesOpPtr shapesOp = getGeomEngine()->GetIShapesOperations();
+ subShape.take( shapesOp->GetSubShape( object.get(), idx ) ); // take ownership!
+ }
+ if ( typeInList( (TopAbs_ShapeEnum)(subShape->GetShapeType()), types ) ) {
+ result << subShape;
+ if ( count > 0 ) {
+ if ( strict && result.count() > count ) {
+ result.clear();
+ stopped = true;
+ }
+ else if ( !strict && result.count() == count )
+ stopped = true;
+ }
+ }
+ else if ( strict ) {
+ result.clear();
+ stopped = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return result;
+}
+//================================================================
+// Function : hideSourceObject
+// Purpose :
+//================================================================
+void GEOMBase_Helper::hideSourceObjects( QList<GEOM::GeomObjPtr> theObject )
+{
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+ if ( resMgr->booleanValue( "Geometry", "hide_input_object", true) ) {
+ GEOM_Displayer* aDisplayer = getDisplayer();
+ for ( int i = 0; i < theObject.count(); i++ )
+ aDisplayer->Erase( theObject[i].get() );
+ }
+}
+
+//================================================================
+// Function : setIsApplyAndClose
+// Purpose : Set value of the flag indicating that the dialog is
+// accepted by Apply & Close button
+//================================================================
+void GEOMBase_Helper::setIsApplyAndClose( const bool theFlag )
+{
+ myIsApplyAndClose = theFlag;
+}
+
+//================================================================
+// Function : isApplyAndClose
+// Purpose : Get value of the flag indicating that the dialog is
+// accepted by Apply & Close button
+//================================================================
+bool GEOMBase_Helper::isApplyAndClose() const
+{
+ return myIsApplyAndClose;
+}
+
+//================================================================
+// Function : setIsOptimizedBrowsing
+// Purpose : Set value of the flag switching to optimized
+// browsing mode (to select the first published
+// object only)
+//================================================================
+void GEOMBase_Helper::setIsOptimizedBrowsing( const bool theFlag )
+{
+ myIsOptimizedBrowsing = theFlag;
+}
+
+//================================================================
+// Function : isOptimizedBrowsing
+// Purpose : Get value of the flag switching to optimized
+// browsing mode (to select the first published
+// object only)
+//================================================================
+bool GEOMBase_Helper::isOptimizedBrowsing() const
+{
+ return myIsOptimizedBrowsing;
+}