X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMBase%2FGEOMBase_Helper.cxx;h=d7fa50169943083c59382e1e8e36b49811bb445e;hb=efb533a09c6c5f38d840c71cb4e73355d13af530;hp=7c2707cab2e42924564d415708edd2224c9888b0;hpb=131a4abe500d60f9a8771655794cd5f8d5da75a9;p=modules%2Fgeom.git diff --git a/src/GEOMBase/GEOMBase_Helper.cxx b/src/GEOMBase/GEOMBase_Helper.cxx old mode 100755 new mode 100644 index 7c2707cab..d7fa50169 --- a/src/GEOMBase/GEOMBase_Helper.cxx +++ b/src/GEOMBase/GEOMBase_Helper.cxx @@ -1,71 +1,73 @@ -// GEOM GEOMGUI : GUI for Geometry component -// -// Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2007-2023 CEA, EDF, 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. +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// 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 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, or (at your option) any later version. // -// 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.org +// 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 // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// GEOM GEOMGUI : GUI for Geometry component // File : GEOMBase_Helper.cxx -// Author : Sergey ANIKIN -// Module : GEOM -// $Header$ +// Author : Sergey ANIKIN, Open CASCADE S.A.S. (sergey.anikin@opencascade.com) -#include +#include #include "GEOMBase_Helper.h" #include "GEOMBase.h" #include "GEOM_Operation.h" -#include "GeometryGUI.h" -#include "GEOM_Displayer.h" -#include "GEOMImpl_Types.hxx" +#include + +#include #include +#include #include +#include #include #include +#include #include #include #include -#include +#include +#include #include -#include -#include +#include +#include "utilities.h" -#include -#include +#include +#include "utilities.h" -#include +#include +#include -#include #include +#include -using namespace std; - -#include - +//To disable automatic genericobj management, the following line should be commented. +//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx +#define WITHGENERICOBJ //================================================================ // Function : getActiveView // Purpose : Get active view window, returns 0 if no open study frame //================================================================ -static SUIT_ViewWindow* getActiveView() +SUIT_ViewWindow* GEOMBase_Helper::getActiveView() { SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy(); if ( activeStudy ) @@ -88,8 +90,10 @@ GEOM::GEOM_Gen_ptr GEOMBase_Helper::getGeomEngine() // Function : GEOMBase_Helper // Purpose : //================================================================ -GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop ) - : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false ) +GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop, SUIT_ViewWindow* aVW ) + : myDisplayer( 0 ), myCommand( 0 ), myViewWindow( aVW ), isPreview( false ), myDesktop( desktop ), + myIsApplyAndClose( false ), myIsOptimizedBrowsing( false ), myIsWaitCursorEnabled( true ), + myIsDisableBrowsing(false), myIsDisplayResult(true) { } @@ -99,17 +103,25 @@ GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop ) //================================================================ GEOMBase_Helper::~GEOMBase_Helper() { - if ( !SUIT_Session::session()->activeApplication()->desktop() ) + //rnv: Fix for the "IPAL21922 : WinTC5.1.4: incorrect quit salome" + if ( !SUIT_Session::session()->activeApplication() || !SUIT_Session::session()->activeApplication()->desktop() ) return; if ( myPreview.size() ) erasePreview(); if ( hasCommand() ) abortCommand(); + SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) { + GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + if(aGeomGUI) + globalSelection(aGeomGUI->getLocalSelectionMode() , true ); + } - globalSelection( GEOM_ALLOBJECTS, true ); - - delete myDisplayer; + if (myDisplayer) + delete myDisplayer; + if ( !CORBA::is_nil( myOperation ) ) + myOperation->UnRegister(); } //================================================================ @@ -135,9 +147,11 @@ void GEOMBase_Helper::display( GEOM::GEOM_Object_ptr object, const bool updateVi { // Unset color of shape ( this color may be set during preview displaying ) // Default color will be used - getDisplayer()->UnsetColor(); + // getDisplayer()->UnsetColor(); getDisplayer()->UnsetWidth(); + MESSAGE("GEOMBase_Helper::display myTexture = "<GetTexture()); + // Enable activisation of selection getDisplayer()->SetToActivate( true ); @@ -166,9 +180,12 @@ void GEOMBase_Helper::erase( const ObjectList& objList, const bool updateView ) void GEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView ) { if ( !object->_is_nil() ) { - string entry = getEntry( object ); - getDisplayer()->Erase( new SALOME_InteractiveObject( - entry.c_str(), "GEOM", strdup( GEOMBase::GetName( object ) ) ), true, updateView ); + QString entry = getEntry( object ); + QString name = GEOMBase::GetName( object ); + getDisplayer()->Erase ( new SALOME_InteractiveObject(entry.toUtf8().constData(), + "GEOM", + name.toUtf8().constData() ), + true, updateView ); } } @@ -177,8 +194,8 @@ void GEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView // Purpose : //================================================================ void GEOMBase_Helper::redisplay( const ObjectList& objList, - const bool withChildren, - const bool updateView ) + const bool withChildren, + const bool updateView ) { ObjectList::const_iterator it = objList.begin(); for ( ; it != objList.end(); it++ ) { @@ -193,8 +210,8 @@ void GEOMBase_Helper::redisplay( const ObjectList& objList, // Purpose : //================================================================ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, - const bool withChildren, - const bool updateView ) + const bool withChildren, + const bool updateView ) { if ( !object->_is_nil() ) { // Unset color of shape ( this color may be set during preview displaying ) @@ -205,29 +222,38 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, // Enable activisation of selection getDisplayer()->SetToActivate( true ); - string entry = getEntry( object ); - getDisplayer()->Redisplay(new SALOME_InteractiveObject - (entry.c_str(), "GEOM", strdup(GEOMBase::GetName(object))), false); + QString entry = getEntry( object ); + QString name = GEOMBase::GetName( object ); + getDisplayer()->Redisplay + (new SALOME_InteractiveObject (entry.toUtf8().constData(), + "GEOM", + name.toUtf8().constData()), + false); } if ( withChildren ) { SalomeApp_Study* aDoc = getStudy(); if ( aDoc && aDoc->studyDS() ) { _PTR(Study) aStudy = aDoc->studyDS(); - _PTR(SObject) aSObj (aStudy->FindObjectIOR(SalomeApp_Application::orb()->object_to_string(object))); + CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string(object); + _PTR(SObject) aSObj (aStudy->FindObjectIOR(std::string(objStr.in()))); if ( aSObj ) { - _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); - for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { - GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow + _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); + for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { + GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow (GeometryGUI::ClientSObjectToObject(anIt->Value())); - if ( !CORBA::is_nil( aChild ) ) { - if ( !aChild->_is_nil() ) { - string entry = getEntry( aChild ); - getDisplayer()->Redisplay( new SALOME_InteractiveObject( - entry.c_str(), "GEOM", strdup( GEOMBase::GetName( aChild ) ) ), false ); - } - } - } + if ( !CORBA::is_nil( aChild ) ) { + if ( !aChild->_is_nil() ) { + QString entry = getEntry( aChild ); + QString name = GEOMBase::GetName( aChild ); + getDisplayer()->Redisplay + ( new SALOME_InteractiveObject( entry.toUtf8().constData(), + "GEOM", + name.toUtf8().constData() ), + false ); + } + } + } } } } @@ -240,11 +266,20 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, // Function : displayPreview // Purpose : Method for displaying preview based on execute() results //================================================================ -void GEOMBase_Helper::displayPreview( const bool activate, +void GEOMBase_Helper::displayPreview( const bool display, + const bool activate, const bool update, const bool toRemoveFromEngine, - const double lineWidth ) + const double lineWidth, + const int displayMode, + const int color, + const bool append ) { + if(!display) { + erasePreview( update ); + return; + } + isPreview = true; QString msg; if ( !isValid( msg ) ) @@ -254,20 +289,26 @@ void GEOMBase_Helper::displayPreview( const bool activate, return; } - erasePreview( false ); + if( !append ) + erasePreview( false ); try { SUIT_OverrideCursor wc; ObjectList objects; + + if ( !isWaitCursorEnabled() ) + wc.suspend(); + if ( !execute( objects ) || !getOperation()->IsDone() ) { wc.suspend(); } else { for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { - displayPreview( *it, true, activate, false, lineWidth ); + GEOM::GEOM_Object_var obj = *it; + displayPreview( obj, true, activate, false, lineWidth, displayMode, color ); if ( toRemoveFromEngine ) - getGeomEngine()->RemoveObject( *it ); + obj->UnRegister(); } } } @@ -289,29 +330,42 @@ void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, const bool append, const bool activate, const bool update, - const double lineWidth ) + const double lineWidth, + const int displayMode, + const int color ) { + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + // Set color for preview shape - getDisplayer()->SetColor( Quantity_NOC_VIOLET ); + getDisplayer()->SetColor( color == -1 ? Quantity_NOC_VIOLET : color ); // set width of displayed shape - getDisplayer()->SetWidth( lineWidth ); + getDisplayer()->SetWidth( lineWidth == -1 ? resMgr->integerValue("Geometry", "preview_edge_width", -1) : lineWidth ); + + // set display mode of displayed shape + int aPrevDispMode = getDisplayer()->SetDisplayMode( displayMode == -1 ? resMgr->integerValue( "Geometry", "display_mode", 0 ) : displayMode ); // Disable activation of selection getDisplayer()->SetToActivate( activate ); // Make a reference to GEOM_Object - getDisplayer()->SetName( SalomeApp_Application::orb()->object_to_string( object ) ); + CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string( object ); + getDisplayer()->SetName( objStr.in() ); // Build prs SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object ); if ( aPrs == 0 || aPrs->IsNull() ) return; + // Make preview not clippable + aPrs->SetClippable (false); + // Display prs displayPreview( aPrs, append, update ); getDisplayer()->UnsetName(); + getDisplayer()->UnsetColor(); + getDisplayer()->SetDisplayMode( aPrevDispMode ); // Enable activation of displayed objects getDisplayer()->SetToActivate( true ); @@ -337,13 +391,13 @@ void GEOMBase_Helper::displayPreview( const SALOME_Prs* prs, // Display prs SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); if ( aViewManager->getType() == OCCViewer_Viewer::Type() || - aViewManager->getType() == VTKViewer_Viewer::Type() ) - { - SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); - SALOME_View* aView = dynamic_cast(aViewModel); - if (aView) - aView->Display( prs ); - } + aViewManager->getType() == SVTK_Viewer::Type() ) + { + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView) + aView->Display( getDisplayer(), prs ); + } // Add prs to the preview list myPreview.push_back( (SALOME_Prs*)prs ); @@ -362,19 +416,20 @@ void GEOMBase_Helper::erasePreview( const bool update ) // check view frame where the preview was displayed bool vfOK = checkViewWindow() && myViewWindow; // Iterate through presentations and delete them - for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter ) { + for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter ) + { if ( vfOK ) + { + SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); + if ( aViewManager->getType() == OCCViewer_Viewer::Type() || + aViewManager->getType() == SVTK_Viewer::Type() ) { - SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); - if ( aViewManager->getType() == OCCViewer_Viewer::Type() || - aViewManager->getType() == VTKViewer_Viewer::Type() ) - { - SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); - SALOME_View* aView = dynamic_cast(aViewModel); - if (aView) - aView->Erase( *anIter, true ); - } + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView) + aView->Erase( getDisplayer(), *anIter, true ); } + } delete *anIter; } myPreview.clear(); @@ -420,10 +475,10 @@ void GEOMBase_Helper::activate( const int theType ) //================================================================ // Function : localSelection -// Purpose : Activate selection of subshapes in accordance with mode -// theMode is from TopAbs_ShapeEnum +// Purpose : Activate selection of sub-shapes in accordance with mode +// modes are from TopAbs_ShapeEnum //================================================================ -void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode ) +void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const std::list modes ) { SALOME_ListIO aListOfIO; @@ -433,37 +488,100 @@ void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMo GEOM::GEOM_Object_ptr anObj = *anIter; if ( anObj->_is_nil() ) continue; - string aEntry = getEntry( anObj ); - if ( aEntry != "" ) - aListOfIO.Append( new SALOME_InteractiveObject( - aEntry.c_str(), "GEOM", strdup( GEOMBase::GetName( anObj ) ) ) ); + QString anEntry = getEntry( anObj ); + if ( anEntry != "" ) + { + //MESSAGE("anEntry: "<< anEntry.toStdString().c_str()); + QString aName = GEOMBase::GetName( anObj ); + aListOfIO.Append( new SALOME_InteractiveObject( anEntry.toUtf8().constData(), + "GEOM", aName.toUtf8().constData() )); + } } - getDisplayer()->LocalSelection( aListOfIO, theMode ); + getDisplayer()->LocalSelection( aListOfIO, modes ); } //================================================================ // Function : localSelection -// Purpose : Activate selection of subshapes in accordance with mode +// Purpose : Activate selection of sub-shapes in accordance with mode // theMode is from TopAbs_ShapeEnum //================================================================ -void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode ) +void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode ) +{ + std::list modes; + modes.push_back( theMode ); + localSelection( theObjs, modes ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of sub-shapes in accordance with mode +// modes are from TopAbs_ShapeEnum +//================================================================ +void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const std::list modes ) { // If object is null local selection for all objects is activated if ( obj->_is_nil() ) { - getDisplayer()->LocalSelection( Handle(SALOME_InteractiveObject)(), mode ); + getDisplayer()->LocalSelection( Handle(SALOME_InteractiveObject)(), modes ); return; } ObjectList objList; objList.push_back( obj ); - localSelection( objList, mode ); + localSelection( objList, modes ); } +//================================================================ +// Function : localSelection +// Purpose : Activate selection of sub-shapes in accordance with mode +// mode is from TopAbs_ShapeEnum +//================================================================ +void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode ) +{ + std::list modes; + modes.push_back( mode ); + localSelection( obj, modes ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of sub-shapes in accordance with mode +// mode is from TopAbs_ShapeEnum +//================================================================ +void GEOMBase_Helper::localSelection( const std::string& entry, const std::string& name, const std::list modes) +{ + SALOME_ListIO aListOfIO; + QString aName = name.c_str(); + aListOfIO.Append( new SALOME_InteractiveObject( entry.c_str(), + "GEOM", aName.toUtf8().constData() )); + getDisplayer()->LocalSelection( aListOfIO, modes ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of sub-shapes in accordance with mode +// modes are from TopAbs_ShapeEnum +//================================================================ +void GEOMBase_Helper::localSelection( const std::list modes ) +{ + localSelection( GEOM::GEOM_Object::_nil(), modes ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of sub-shapes in accordance with mode +// mode is from TopAbs_ShapeEnum +//================================================================ +void GEOMBase_Helper::localSelection( const int mode ) +{ + std::list modes; + modes.push_back( mode ); + localSelection( modes ); +} //================================================================ // Function : globalSelection -// Purpose : Activate selection of subshapes. Set selection filters +// Purpose : Activate selection of sub-shapes. Set selection filters // in accordance with mode. theMode is from GEOMImpl_Types //================================================================ void GEOMBase_Helper::globalSelection( const int theMode, const bool update ) @@ -473,32 +591,72 @@ void GEOMBase_Helper::globalSelection( const int theMode, const bool update ) //================================================================ // Function : globalSelection -// Purpose : Activate selection of subshapes. Set selection filters +// Purpose : Activate selection of sub-shapes. Set selection filters // in accordance with mode. theMode is from GEOMImpl_Types //================================================================ void GEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes, - const bool update ) + const bool update ) { getDisplayer()->GlobalSelection( theModes, update ); } +//================================================================ +// Function : globalSelection +// Purpose : Activate selection of sub-shapes. Set selection filters +// in accordance with mode. theMode is from GEOMImpl_Types +//================================================================ +void GEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes, + const QList& subShapes, + const bool update ) +{ + getDisplayer()->GlobalSelection( theModes, update, &subShapes ); +} + //================================================================ // Function : addInStudy // Purpose : Add object in study //================================================================ -void GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theName ) +QString GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theName ) { if ( !hasCommand() ) - return; + return QString(); _PTR(Study) aStudy = getStudy()->studyDS(); if ( !aStudy || theObj->_is_nil() ) - return; + return QString(); GEOM::GEOM_Object_ptr aFatherObj = getFather( theObj ); - getGeomEngine()->AddInStudy(GeometryGUI::ClientStudyToStudy(aStudy), - theObj, theName, aFatherObj); + SALOMEDS::SObject_var aSO = + getGeomEngine()->AddInStudy(theObj, theName, aFatherObj); + + QString anEntry; + if ( !aSO->_is_nil() ) { + CORBA::String_var entry = aSO->GetID(); + anEntry = entry.in(); + } + // Each dialog is responsible for this method implementation, + // default implementation does nothing + restoreSubShapes(aSO); + aSO->UnRegister(); + + return anEntry; +} + +//================================================================ +// Function : restoreSubShapes +// Purpose : restore tree of argument's sub-shapes under the resulting shape +//================================================================ +void GEOMBase_Helper::restoreSubShapes (SALOMEDS::SObject_ptr /*theSObject*/) +{ + // do nothing by default + + // example of implementation in particular dialog: + // GEOM::ListOfGO anArgs; + // anArgs.length(0); // empty list means that all arguments should be restored + // getGeomEngine()->RestoreSubShapesSO(theSObject, anArgs, + // /*theFindMethod=*/GEOM::FSM_GetInPlace, + // /*theInheritFirstArg=*/false); } //================================================================ @@ -512,7 +670,7 @@ void GEOMBase_Helper::updateObjBrowser() const CAM_Module* module = app->module( "Geometry" ); SalomeApp_Module* appMod = dynamic_cast( module ); if ( appMod ) { - appMod->updateObjBrowser( true ); + appMod->updateObjBrowser(); } } } @@ -526,18 +684,6 @@ void GEOMBase_Helper::updateViewer() getDisplayer()->UpdateViewer(); } -//================================================================ -// Function : getStudyId -// Purpose : Get study Id -//================================================================ -int GEOMBase_Helper::getStudyId() const -{ - int anId = -1; - if ( getStudy() ) - anId = getStudy()->id(); - return anId; -} - //================================================================ // Function : getStudy // Purpose : Returns the active study. It is recommended to use @@ -549,15 +695,16 @@ SalomeApp_Study* GEOMBase_Helper::getStudy() const if (!aDesktop) return 0; - QPtrList anAppList = SUIT_Session::session()->applications(); + QList anAppList = SUIT_Session::session()->applications(); SUIT_Application* anApp = 0; - for ( QPtrListIterator it( anAppList ); it.current() ; ++it ) - { - anApp = it.current(); - if ( anApp->desktop() == aDesktop ) - break; - } + QListIterator it( anAppList ); + while ( it.hasNext() ) + { + anApp = it.next(); + if ( anApp && anApp->desktop() == aDesktop ) + break; + } return dynamic_cast(anApp->activeStudy()); } @@ -566,16 +713,15 @@ SalomeApp_Study* GEOMBase_Helper::getStudy() const // Function : getEntry // Purpose : //================================================================ -char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const +QString GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const { SalomeApp_Study* study = getStudy(); if ( study ) { - string IOR = GEOMBase::GetIORFromObject( object); - if ( IOR != "" ) { - _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) ); - if ( SO ) { - return TCollection_AsciiString((char*)SO->GetID().c_str()).ToCString(); - } + QString objIOR = GEOMBase::GetIORFromObject( object ); + if ( objIOR != "" ) { + _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( objIOR.toUtf8().constData() ) ); + if ( SO ) + return QString::fromStdString(SO->GetID()); } } return ""; @@ -588,7 +734,7 @@ char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const GEOM_Displayer* GEOMBase_Helper::getDisplayer() { if ( !myDisplayer ) - myDisplayer = new GEOM_Displayer( getStudy() ); + myDisplayer = new GEOM_Displayer(); return myDisplayer; } @@ -598,30 +744,7 @@ GEOM_Displayer* GEOMBase_Helper::getDisplayer() //================================================================ void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj ) { - if ( CORBA::is_nil( theObj ) ) - return; - - string IOR = SalomeApp_Application::orb()->object_to_string( theObj ); - TCollection_AsciiString asciiIOR( strdup( IOR.c_str() ) ); - GEOM_Client().RemoveShapeFromBuffer( asciiIOR ); - - if ( !getStudy() || !getStudy()->studyDS() ) - return; - - _PTR(Study) aStudy = getStudy()->studyDS(); - _PTR(SObject) aSObj ( aStudy->FindObjectIOR( IOR ) ); - if ( !aSObj ) - return; - - _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); - for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { - _PTR(GenericAttribute) anAttr; - if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) { - _PTR(AttributeIOR) anIOR ( anAttr ); - TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() ); - GEOM_Client().RemoveShapeFromBuffer( asciiIOR ); - } - } + GeometryGUI::ClearShapeBuffer(theObj); } //================================================================ @@ -632,7 +755,10 @@ bool GEOMBase_Helper::openCommand() { bool res = false; if ( !getStudy() || hasCommand() ) - return res; + { + MESSAGE("Getting out from openCommand()"); + return res; + } GEOM::GEOM_IOperations_var anOp = GEOM::GEOM_IOperations::_narrow( getOperation() ); if ( !anOp->_is_nil() ) { @@ -640,6 +766,10 @@ bool GEOMBase_Helper::openCommand() myCommand->start(); res = true; } + else + { + MESSAGE("anOp->_is_nil() = true"); + } return res; } @@ -654,6 +784,7 @@ bool GEOMBase_Helper::abortCommand() return false; myCommand->abort(); + delete myCommand; // I don't know where to delete this object here ? myCommand = 0; return true; @@ -669,6 +800,7 @@ bool GEOMBase_Helper::commitCommand( const char* ) return false; myCommand->commit(); + delete myCommand; // I don't know where to delete this object here ? myCommand = 0; return true; @@ -704,12 +836,13 @@ GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation() bool GEOMBase_Helper::checkViewWindow() { if ( myViewWindow ){ - QPtrList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); - for ( QPtrListIterator it( aViewWindowsList ); it.current(); ++it ) - { - if ( myViewWindow == it.current() ) - return true; - } + QList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + QListIterator it( aViewWindowsList ); + while ( it.hasNext() ) + { + if ( myViewWindow == it.next() ) + return true; + } } myViewWindow = 0; return false; @@ -718,22 +851,26 @@ bool GEOMBase_Helper::checkViewWindow() //================================================================ // Function : onAccept // Purpose : This method should be called from dialog's slots onOk() and onApply() -// It perfroms user input validation, then it +// It performs user input validation, then it // performs a proper operation and manages transactions, etc. //================================================================ -bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) +bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction, bool erasePreviewFlag ) { SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); - if ( !appStudy ) return false; + if ( !appStudy ) + { + MESSAGE("appStudy is empty"); + return false; + } _PTR(Study) aStudy = appStudy->studyDS(); bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked(); if ( aLocked ) { MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked"); - SUIT_MessageBox::warn1 ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_STUDY_LOCKED"), - QObject::tr("BUT_OK") ); + SUIT_MessageBox::warning ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); return false; } @@ -743,7 +880,10 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) return false; } - erasePreview( false ); + if(erasePreviewFlag) + erasePreview( false ); + + bool result = false; try { if ( ( !publish && !useTransaction ) || openCommand() ) { @@ -751,60 +891,106 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) SUIT_Session::session()->activeApplication()->putInfo( "" ); ObjectList objects; if ( !execute( objects ) || !getOperation()->IsDone() ) { - wc.suspend(); - abortCommand(); - showError(); + wc.suspend(); + abortCommand(); + showError(); } else { - const int nbObjs = objects.size(); - bool withChildren = false; - for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { - if ( publish ) { - QString aName(""); - if ( nbObjs > 1 ) - aName = strlen( getNewObjectName() ) ? GEOMBase::GetDefaultName( getNewObjectName() ) : GEOMBase::GetDefaultName( getPrefix( *it ) ); - else { - aName = getNewObjectName(); - // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() - if ( aName.isEmpty() ) - aName = GEOMBase::GetDefaultName( getPrefix( *it ) ); - } - addInStudy( *it, aName.latin1() ); - withChildren = false; - display( *it, false ); - } - else { // asv : fix of PAL6454. If publish==false, then the original shape was modified, and need to be re-cached in GEOM_Client - // before redisplay - clearShapeBuffer( *it ); - withChildren = true; - redisplay( *it, withChildren, false ); + QList anObjectList = getSourceObjects( ); + addSubshapesToStudy(); // add Sub-shapes if local selection + const int nbObjs = objects.size(); + QStringList anEntryList; + int currObj = 1, aNumber = 1; + for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it, currObj++ ) { + GEOM::GEOM_Object_var obj=*it; + if ( publish ) { + QString aName = getObjectName(obj); + if (aName.isEmpty()) { + aName = getNewObjectName(currObj); + if ( nbObjs > 1 ) { + if (aName.isEmpty()) + aName = getPrefix(obj); + if (nbObjs <= 30) { + // Try to find a unique name + aName = GEOMBase::GetDefaultName(aName, extractPrefix()); + } else { + // Don't check name uniqueness in case of numerous objects + aName = aName + "_" + QString::number(aNumber++); + } + } else { + // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() + if ( aName.isEmpty() ) + aName = GEOMBase::GetDefaultName( getPrefix( obj ) ); + } + } + anEntryList << addInStudy( obj, aName.toUtf8().constData() ); + // updateView=false + if( isDisplayResult() ) + display( obj, false ); +#ifdef WITHGENERICOBJ + // obj has been published in study. Its refcount has been incremented. + // It is safe to decrement its refcount + // so that it will be destroyed when the entry in study will be removed + obj->UnRegister(); +#endif } - } - - if ( nbObjs ) { - commitCommand(); - updateObjBrowser(); - SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") ); - } - else - abortCommand(); + else { + // asv : fix of PAL6454. If publish==false, then the original shape + // was modified, and need to be re-cached in GEOM_Client before redisplay + clearShapeBuffer( obj ); + // withChildren=true, updateView=false + if( isDisplayResult() ) + redisplay( obj, true, false ); + } + } + + if ( nbObjs ) { + const QString anOpName( typeid(*this).name() ); + // The operator name may have the following format: 24PrimitiveGUI_CylinderDlg + // clean it up to get the simple operator (here Cylinder) name into the log. + const QRegExp rx("^[^\w]*_(.*)Dlg$"); + const int pos = rx.indexIn(anOpName); + SalomeApp_Application::logStructuredUserEvent( "Geom", + "geometry", + pos == -1 ? anOpName : rx.cap(1), + "applied" ); + commitCommand(); + updateObjBrowser(); + if( SUIT_Application* anApp = SUIT_Session::session()->activeApplication() ) { + LightApp_Application* aLightApp = dynamic_cast( anApp ); + if(aLightApp) { + aLightApp->emitOperationFinished( "Geometry", anOpName, anEntryList ); + + if ( !isDisableBrowsing() ) + aLightApp->browseObjects( anEntryList, isApplyAndClose(), isOptimizedBrowsing() ); + } + anApp->putInfo( QObject::tr("GEOM_PRP_DONE") ); + } + if ( anObjectList.count() > 0 ) + hideSourceObjects( anObjectList ); + result = true; + } + else + abortCommand(); } } } catch( const SALOME::SALOME_Exception& e ) { SalomeApp_Tools::QtCatchCorbaException( e ); abortCommand(); + MESSAGE("Exception caught"); } updateViewer(); - return true; + MESSAGE("result ="<GetErrorCode() +// Purpose : Shows a message box with information about an error taken from getOperation()->GetErrorCode() //================================================================ void GEOMBase_Helper::showError() { @@ -815,10 +1001,10 @@ void GEOMBase_Helper::showError() if ( msg.isEmpty() ) msg = QObject::tr( "GEOM_PRP_ABORT" ); - SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(), - QObject::tr( "GEOM_ERROR_STATUS" ), - msg, - QObject::tr( "BUT_OK" ) ); + SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr( "GEOM_ERROR_STATUS" ), + msg, + QObject::tr( "BUT_OK" ) ); } //================================================================ @@ -830,7 +1016,7 @@ void GEOMBase_Helper::showError( const QString& msg ) QString str( QObject::tr( "GEOM_INCORRECT_INPUT" ) ); if ( !msg.isEmpty() ) str += "\n" + msg; - SUIT_MessageBox::error1(SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) ); + SUIT_MessageBox::critical(SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) ); } ////////////////////////////////////////////////////////////////// @@ -862,7 +1048,7 @@ bool GEOMBase_Helper::isValid( QString& ) // It should perform the required operation and put all new or modified objects into // argument.Should return if some error occurs during its execution. //================================================================ -bool GEOMBase_Helper::execute( ObjectList& objects ) +bool GEOMBase_Helper::execute( ObjectList& ) { return false; } @@ -873,18 +1059,38 @@ bool GEOMBase_Helper::execute( ObjectList& objects ) // for or a nil reference if should be published // as a top-level object. //================================================================ -GEOM::GEOM_Object_ptr GEOMBase_Helper::getFather( GEOM::GEOM_Object_ptr theObj ) +GEOM::GEOM_Object_ptr GEOMBase_Helper::getFather( GEOM::GEOM_Object_ptr ) { return GEOM::GEOM_Object::_nil(); } +//================================================================ +// Function : getObjectName +// Purpose : Redefine this method to return proper name for the given object +//================================================================ +QString GEOMBase_Helper::getObjectName( GEOM::GEOM_Object_ptr ) const +{ + return QString(); +} + //================================================================ // Function : getNewObjectName // Purpose : Redefine this method to return proper name for a new object //================================================================ -const char* GEOMBase_Helper::getNewObjectName() const +QString GEOMBase_Helper::getNewObjectName( int ) const { - return ""; + return QString(); +} + +//================================================================ +// Function : extractPrefix +// Purpose : Redefine this method to return \c true if necessary +// to extract prefix when generating new name for the +// object(s) being created +//================================================================ +bool GEOMBase_Helper::extractPrefix() const +{ + return false; } //================================================================ @@ -896,79 +1102,370 @@ QString GEOMBase_Helper::getPrefix( GEOM::GEOM_Object_ptr theObj ) const if ( !myPrefix.isEmpty() || theObj->_is_nil() ) return myPrefix; - TopoDS_Shape aShape; - if ( !GEOMBase::GetShape( theObj, aShape ) ) - return ""; - - long aType = aShape.ShapeType(); + GEOM::shape_type aType = theObj->GetShapeType(); switch ( aType ) { - case TopAbs_VERTEX : return QObject::tr( "GEOM_VERTEX" ); - case TopAbs_EDGE : return QObject::tr( "GEOM_EDGE" ); - case TopAbs_WIRE : return QObject::tr( "GEOM_WIRE" ); - case TopAbs_FACE : return QObject::tr( "GEOM_FACE" ); - case TopAbs_SHELL : return QObject::tr( "GEOM_SHELL" ); - case TopAbs_SOLID : return QObject::tr( "GEOM_SOLID" ); - case TopAbs_COMPSOLID: return QObject::tr( "GEOM_COMPOUNDSOLID" ); - case TopAbs_COMPOUND : return QObject::tr( "GEOM_COMPOUND" ); - default : return ""; + case GEOM::VERTEX : return QObject::tr( "GEOM_VERTEX" ); + case GEOM::EDGE : return QObject::tr( "GEOM_EDGE" ); + case GEOM::WIRE : return QObject::tr( "GEOM_WIRE" ); + case GEOM::FACE : return QObject::tr( "GEOM_FACE" ); + case GEOM::SHELL : return QObject::tr( "GEOM_SHELL" ); + case GEOM::SOLID : return QObject::tr( "GEOM_SOLID" ); + case GEOM::COMPSOLID: return QObject::tr( "GEOM_COMPOUNDSOLID" ); + case GEOM::COMPOUND : return QObject::tr( "GEOM_COMPOUND" ); + default : return ""; } } //================================================================ -// Function : selectedIO -// Purpose : Return the list of selected SALOME_InteractiveObject's +// Function : getDesktop +// Purpose : Returns myDesktop field. Initialized in constructor, +// usually as dynamic_cast(parentWidget()) //================================================================ -const SALOME_ListIO& GEOMBase_Helper::selectedIO() +SUIT_Desktop* GEOMBase_Helper::getDesktop() const { - mySelected.Clear(); + return myDesktop; +} - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); - if ( app ) { - SalomeApp_SelectionMgr* aSelMgr = app->selectionMgr(); - if ( aSelMgr ) - aSelMgr->selectedObjects( mySelected ); +//================================================================ +// Function : selectObjects +// Purpose : Selects list of objects +//================================================================ +bool GEOMBase_Helper::selectObjects( ObjectList& objects ) +{ + SUIT_DataOwnerPtrList aList; + ObjectList::iterator anIter; + for ( anIter = objects.begin(); anIter != objects.end(); ++anIter ) + { + QString anEntry = getEntry( *anIter ); + LightApp_DataOwner* anOwher = new LightApp_DataOwner( anEntry ); + aList.append( anOwher ); } - return mySelected; + SUIT_Session* session = SUIT_Session::session(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( !app ) + return false; + + LightApp_SelectionMgr* aMgr = app->selectionMgr(); + if ( !aMgr ) + return false; + + aMgr->setSelected( aList, false ); + + return true; } //================================================================ -// Function : IObjectCount -// Purpose : Return the number of selected objects +// Function : findObjectInFather +// Purpose : It should return an object if its founded in study or +// return Null object if the object is not founded //================================================================ -int GEOMBase_Helper::IObjectCount() +GEOM::GEOM_Object_ptr GEOMBase_Helper::findObjectInFather (GEOM::GEOM_Object_ptr theFather, + const QString& theName) { - return selectedIO().Extent(); + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + _PTR(Study) aDStudy = appStudy->studyDS(); + QString IOR = GEOMBase::GetIORFromObject( theFather ); + _PTR(SObject) SObj ( aDStudy->FindObjectIOR( IOR.toUtf8().constData() ) ); + + bool inStudy = false; + GEOM::GEOM_Object_var aReturnObject; + for (_PTR(ChildIterator) iit (aDStudy->NewChildIterator( SObj )); iit->More() && !inStudy; iit->Next()) { + _PTR(SObject) child (iit->Value()); + QString aChildName = child->GetName().c_str(); + if (aChildName == theName) { + inStudy = true; + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(iit->Value()); + aReturnObject = GEOM::GEOM_Object::_narrow( corbaObj ); + } + } + if (inStudy) + return aReturnObject._retn(); + + return GEOM::GEOM_Object::_nil(); } //================================================================ -// Function : firstIObject -// Purpose : Return the first selected object in the selected object list +// Function : findObjectInFather +// Purpose : It should return an object if its founded in study or +// return Null object if the object is not founded //================================================================ -Handle(SALOME_InteractiveObject) GEOMBase_Helper::firstIObject() +GEOM::GEOM_Object_ptr GEOMBase_Helper::findObjectInFather( GEOM::GEOM_Object_ptr theFather, + int theIndex ) { - const SALOME_ListIO& aList = selectedIO(); - return aList.Extent() > 0 ? aList.First() : Handle(SALOME_InteractiveObject)(); + GEOM::GEOM_Object_var object; + + SalomeApp_Study* study = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( study ) { + _PTR(Study) studyDS = study->studyDS(); + QString IOR = GEOMBase::GetIORFromObject( theFather ); + _PTR(SObject) sobject( studyDS->FindObjectIOR( IOR.toLatin1().constData() ) ); + if ( sobject ) { + _PTR(ChildIterator) it( studyDS->NewChildIterator( sobject ) ); + for ( ; it->More(); it->Next() ) { + GEOM::GEOM_Object_var cobject = GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( it->Value() ) ); + if ( !CORBA::is_nil( cobject ) ) { + GEOM::ListOfLong_var indices = cobject->GetSubShapeIndices(); + int length = indices->length(); + // VSR 18/03/2014: we need only sub-shapes with single sub-shape index (to exclude groups, etc) + if ( length == 1 && indices[0] == theIndex ) { + object = cobject; + break; + } + } + } + } + } + + return object._retn(); } //================================================================ -// Function : lastIObject -// Purpose : Return the last selected object in the selected object list +// Function : addSubshapesToStudy +// Purpose : Virtual method to add sub-shapes if needs //================================================================ -Handle(SALOME_InteractiveObject) GEOMBase_Helper::lastIObject() +void GEOMBase_Helper::addSubshapesToStudy() { - const SALOME_ListIO& aList = selectedIO(); - return aList.Extent() > 0 ? aList.Last() : Handle(SALOME_InteractiveObject)(); + //Implemented in Dialogs, called from Accept method } //================================================================ -// Function : getDesktop -// Purpose : Returns myDesktop field. Initialized in constructor, usually as dynamic_cast(parentWidget()) +// Function : getSourceObjects +// Purpose : Virtual method to get source objects //================================================================ -SUIT_Desktop* GEOMBase_Helper::getDesktop() const +QList GEOMBase_Helper::getSourceObjects() { - return myDesktop; + //Implemented in Dialogs, called from Accept method + QList res; + return res; +} + +//================================================================ +// Function : getSelected +// Purpose : Get selected object by specified type +// +// Returns valid object if only one object of the specified type is selected +// (no matter global or local selection is activated). If \a type is TopAbs_SHAPE, +// geometrical object of any valid type is expected. +// +// \param type type of the object to be obtained from selection +// \return selected geometrical object or nil object if selection is not satisfactory +//================================================================ +GEOM::GeomObjPtr GEOMBase_Helper::getSelected( TopAbs_ShapeEnum type ) +{ + QList types; + types << type; + return getSelected( types ); } +//================================================================ +// 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& types ) +{ + QList 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 GEOMBase_Helper::getSelected( TopAbs_ShapeEnum type, int count, bool strict ) +{ + QList types; + types << type; + return getSelected( types, count, strict ); +} + +static bool typeInList( TopAbs_ShapeEnum type, const QList& 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 GEOMBase_Helper::getSelected( const QList& types, int count, bool strict ) +{ + SUIT_Session* session = SUIT_Session::session(); + QList result; + + SalomeApp_Application* app = dynamic_cast( 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 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; +}