X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMBase%2FGEOMBase_Helper.cxx;h=b9cc7c710d98051d62e9749e8284d0476160c7eb;hb=bbafce4b04731f9219f75dc124ec2429d994c202;hp=69196f3aae28f775da4af600c6af032a96a894da;hpb=9bb681b8008911b5de76f53b64360da4df573dea;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 69196f3aa..b9cc7c710 --- a/src/GEOMBase/GEOMBase_Helper.cxx +++ b/src/GEOMBase/GEOMBase_Helper.cxx @@ -1,64 +1,78 @@ -// GEOM GEOMGUI : GUI for Geometry component +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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. // -// Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// 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. -// -// 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.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 "GEOMBase_Helper.h" #include "GEOMBase.h" #include "GEOM_Operation.h" -#include "GeometryGUI.h" -#include "GEOM_Displayer.h" -#include "GEOMImpl_Types.hxx" -#include "QAD_Study.h" -#include "QAD_Application.h" -#include "QAD_Desktop.h" -#include "QAD_MessageBox.h" -#include "QAD_ViewFrame.h" -#include "QAD_RightFrame.h" -#include "QAD_WaitCursor.h" -#include "SALOMEGUI_QtCatchCorbaException.hxx" - -#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "utilities.h" + +#include +#include "utilities.h" + +#include +#include + #include +#include -using namespace std; +//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 study frame, returns 0 if no open study frame +// Purpose : Get active view window, returns 0 if no open study frame //================================================================ -static QAD_ViewFrame* getActiveView() +SUIT_ViewWindow* GEOMBase_Helper::getActiveView() { - QAD_Study* activeStudy = QAD_Application::getDesktop()->getActiveStudy(); - if ( activeStudy ) { - QAD_StudyFrame* sf = activeStudy->getActiveStudyFrame(); - if ( sf ) { - return sf->getRightFrame()->getViewFrame(); - } - } + SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy(); + if ( activeStudy ) + return SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + return 0; } @@ -69,41 +83,50 @@ static QAD_ViewFrame* getActiveView() //================================================================ GEOM::GEOM_Gen_ptr GEOMBase_Helper::getGeomEngine() { - Engines::Component_var comp = QAD_Application::getDesktop()->getEngine("FactoryServer", "GEOM"); - return GEOM::GEOM_Gen::_narrow(comp); + return GeometryGUI::GetGeomGen(); } //================================================================ // Function : GEOMBase_Helper // Purpose : //================================================================ -GEOMBase_Helper::GEOMBase_Helper() - : myViewFrame( 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) { } //================================================================ // Function : ~GEOMBase_Helper -// Purpose : +// Purpose : //================================================================ GEOMBase_Helper::~GEOMBase_Helper() { - if ( !QAD_Application::getDesktop() ) + //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(); } //================================================================ // Function : display -// Purpose : +// Purpose : //================================================================ void GEOMBase_Helper::display( const ObjectList& objList, const bool updateView ) { @@ -124,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 ); @@ -136,7 +161,7 @@ void GEOMBase_Helper::display( GEOM::GEOM_Object_ptr object, const bool updateVi //================================================================ // Function : erase -// Purpose : +// Purpose : //================================================================ void GEOMBase_Helper::erase( const ObjectList& objList, const bool updateView ) { @@ -150,24 +175,27 @@ void GEOMBase_Helper::erase( const ObjectList& objList, const bool updateView ) //================================================================ // Function : erase -// Purpose : +// Purpose : //================================================================ 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 ); } } //================================================================ // Function : redisplay -// Purpose : +// Purpose : //================================================================ -void GEOMBase_Helper::redisplay( const ObjectList& objList, - const bool withChildren, - const bool updateView ) +void GEOMBase_Helper::redisplay( const ObjectList& objList, + const bool withChildren, + const bool updateView ) { ObjectList::const_iterator it = objList.begin(); for ( ; it != objList.end(); it++ ) { @@ -179,46 +207,57 @@ void GEOMBase_Helper::redisplay( const ObjectList& objList, //================================================================ // Function : redisplay -// Purpose : +// Purpose : //================================================================ -void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, - const bool withChildren, - const bool updateView ) +void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, + const bool withChildren, + const bool updateView ) { if ( !object->_is_nil() ) { // Unset color of shape ( this color may be set during preview displaying ) // Default color will be used getDisplayer()->UnsetColor(); getDisplayer()->UnsetWidth(); - + // 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 ) { - QAD_Study* aDoc = getStudy(); - if ( aDoc && !CORBA::is_nil( aDoc->getStudyDocument() ) ) { - SALOMEDS::Study_var aStudy = aDoc->getStudyDocument(); - SALOMEDS::SObject_var aSObj = aStudy->FindObjectIOR( GeometryGUI::GetORB()->object_to_string( object ) ); - if ( !CORBA::is_nil( aSObj ) ) { - SALOMEDS::ChildIterator_var anIt = aStudy->NewChildIterator( aSObj ); - for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { - GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow( anIt->Value()->GetObject() ); - 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 ); - } - } - } - } + SalomeApp_Study* aDoc = getStudy(); + if ( aDoc && aDoc->studyDS() ) { + _PTR(Study) aStudy = aDoc->studyDS(); + 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 + (GeometryGUI::ClientSObjectToObject(anIt->Value())); + 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 ); + } + } + } + } } } - + if ( updateView ) getDisplayer()->UpdateViewer(); } @@ -227,39 +266,54 @@ 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 ) { - isPreview = true; + if(!display) { + erasePreview( update ); + return; + } + + isPreview = true; QString msg; if ( !isValid( msg ) ) { erasePreview( update ); - isPreview = false; + isPreview = false; return; } - erasePreview( false ); + if( !append ) + erasePreview( false ); try { - QAD_WaitCursor wc; + SUIT_OverrideCursor wc; ObjectList objects; + + if ( !isWaitCursorEnabled() ) + wc.suspend(); + if ( !execute( objects ) || !getOperation()->IsDone() ) { - wc.stop(); + 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(); } } } catch( const SALOME::SALOME_Exception& e ) { - QtCatchCorbaException( e ); + SalomeApp_Tools::QtCatchCorbaException( e ); } isPreview = false; @@ -274,31 +328,44 @@ void GEOMBase_Helper::displayPreview( const bool activate, //================================================================ void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, const bool append, - const bool activate, + 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( GeometryGUI::GetORB()->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 ); @@ -316,34 +383,53 @@ void GEOMBase_Helper::displayPreview( const SALOME_Prs* prs, erasePreview( false ); // remember current view frame to make correct erase preview later - myViewFrame = getActiveView(); + myViewWindow = getActiveView(); - if ( myViewFrame == 0 ) + if ( myViewWindow == 0 ) return; // Display prs - ( (SALOME_View*)myViewFrame )->Display( prs ); + SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); + if ( aViewManager->getType() == OCCViewer_Viewer::Type() || + 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 ); // Update viewer if ( update ) - myViewFrame->Repaint(); + getDisplayer()->UpdateViewer(); } //================================================================ // Function : erasePreview -// Purpose : +// Purpose : //================================================================ void GEOMBase_Helper::erasePreview( const bool update ) { // check view frame where the preview was displayed - bool vfOK = checkViewFrame() && myViewFrame; + 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 ) - ( (SALOME_View*)myViewFrame )->Erase( *anIter, true ); + { + SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); + if ( aViewManager->getType() == OCCViewer_Viewer::Type() || + aViewManager->getType() == SVTK_Viewer::Type() ) + { + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView) + aView->Erase( getDisplayer(), *anIter, true ); + } + } delete *anIter; } myPreview.clear(); @@ -360,111 +446,217 @@ void GEOMBase_Helper::erasePreview( const bool update ) //================================================================ void GEOMBase_Helper::activate( const int theType ) { - SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument(); - SALOMEDS::SComponent_var aGeom = aStudy->FindComponent( "GEOM" ); - if ( aGeom->_is_nil() ) + if (!getStudy()) return; + _PTR(Study) aStudy = getStudy()->studyDS(); + _PTR(SComponent) aGeom ( aStudy->FindComponent( "GEOM" ) ); + if ( !aGeom ) return; SALOME_ListIO aList; - SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( aGeom ); + _PTR(ChildIterator) anIter ( aStudy->NewChildIterator( aGeom ) ); for ( ; anIter->More(); anIter->Next() ) { - SALOMEDS::SObject_var aSO = anIter->Value(); - if ( !aSO->_is_nil() ) + _PTR(SObject) aSO ( anIter->Value() ); + if ( aSO ) { - SALOMEDS::SObject_var aRefSO; + _PTR(SObject) aRefSO; if ( !aSO->ReferencedObject( aRefSO ) ) { - GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow( aSO->GetObject() ); + GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow + (GeometryGUI::ClientSObjectToObject(aSO)); if ( !anObj->_is_nil() && anObj->GetType() == theType ) - aList.Append( new SALOME_InteractiveObject( aSO->GetID(), "GEOM", aSO->GetName()) ); + aList.Append( new SALOME_InteractiveObject( aSO->GetID().c_str(), "GEOM", aSO->GetName().c_str()) ); } } } - myDisplayer->LocalSelection( aList, 0 ); + getDisplayer()->LocalSelection( aList, 0 ); } //================================================================ // 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; - + ObjectList::const_iterator anIter = theObjs.begin(); for ( ; anIter != theObjs.end(); ++anIter ) { 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() )); + } } - myDisplayer->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() ) { - myDisplayer->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 ) { - myDisplayer->GlobalSelection( theMode, update ); + getDisplayer()->GlobalSelection( theMode, 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 bool update ) +{ + getDisplayer()->GlobalSelection( theModes, 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 QList& subShapes, + const bool update ) { - myDisplayer->GlobalSelection( theModes, 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(); - SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument(); - if ( aStudy->_is_nil() || theObj->_is_nil() ) - return; + _PTR(Study) aStudy = getStudy()->studyDS(); + if ( !aStudy || theObj->_is_nil() ) + return QString(); GEOM::GEOM_Object_ptr aFatherObj = getFather( theObj ); - GeometryGUI::GetGeomGUI()->GetGeomGen()->AddInStudy( 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); } //================================================================ @@ -473,7 +665,14 @@ void GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theN //================================================================ void GEOMBase_Helper::updateObjBrowser() const { - getStudy()->updateObjBrowser(); + SalomeApp_Application* app = dynamic_cast(SUIT_Session::session()->activeApplication()); + if (app) { + CAM_Module* module = app->module( "Geometry" ); + SalomeApp_Module* appMod = dynamic_cast( module ); + if ( appMod ) { + appMod->updateObjBrowser(); + } + } } //================================================================ @@ -485,43 +684,44 @@ void GEOMBase_Helper::updateViewer() getDisplayer()->UpdateViewer(); } -//================================================================ -// Function : getStudyId -// Purpose : Get study Id -//================================================================ -int GEOMBase_Helper::getStudyId() const -{ - int anId = -1; - if ( getStudy() ) - anId = getStudy()->getStudyId(); - return anId; -} - //================================================================ // Function : getStudy -// Purpose : Returns the active study. It is recommended to use +// Purpose : Returns the active study. It is recommended to use // this method instead of direct desktop->getActiveStudy() calls //================================================================ -QAD_Study* GEOMBase_Helper::getStudy() const +SalomeApp_Study* GEOMBase_Helper::getStudy() const { - // Probably, it would be better to rememeber the active study in helper... - return QAD_Application::getDesktop()->getActiveStudy(); + SUIT_Desktop* aDesktop = getDesktop(); + if (!aDesktop) + return 0; + + QList anAppList = SUIT_Session::session()->applications(); + + SUIT_Application* anApp = 0; + QListIterator it( anAppList ); + while ( it.hasNext() ) + { + anApp = it.next(); + if ( anApp && anApp->desktop() == aDesktop ) + break; + } + + return dynamic_cast(anApp->activeStudy()); } //================================================================ // Function : getEntry -// Purpose : +// Purpose : //================================================================ -char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const +QString GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const { - QAD_Study* study = getStudy(); + SalomeApp_Study* study = getStudy(); if ( study ) { - string IOR = GEOMBase::GetIORFromObject( object); - if ( IOR != "" ) { - SALOMEDS::SObject_var SO = study->getStudyDocument()->FindObjectIOR( IOR.c_str() ); - if ( !SO->_is_nil() ) { - return SO->GetID(); - } + QString objIOR = GEOMBase::GetIORFromObject( object ); + if ( objIOR != "" ) { + _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( objIOR.toUtf8().constData() ) ); + if ( SO ) + return QString::fromStdString(SO->GetID()); } } return ""; @@ -529,7 +729,7 @@ char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const //================================================================ // Function : getDisplayer -// Purpose : +// Purpose : //================================================================ GEOM_Displayer* GEOMBase_Helper::getDisplayer() { @@ -540,59 +740,43 @@ GEOM_Displayer* GEOMBase_Helper::getDisplayer() //================================================================ // Function : clearShapeBuffer -// Purpose : +// Purpose : //================================================================ void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj ) { - if ( CORBA::is_nil( theObj ) ) - return; - - string IOR = GeometryGUI::GetORB()->object_to_string( theObj ); - TCollection_AsciiString asciiIOR( strdup( IOR.c_str() ) ); - GeometryGUI::GetGeomGUI()->GetShapeReader().RemoveShapeFromBuffer( asciiIOR ); - - if ( !getStudy() || CORBA::is_nil( getStudy()->getStudyDocument() ) ) - return; - - SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument(); - SALOMEDS::SObject_var aSObj = aStudy->FindObjectIOR( IOR.c_str() ); - if ( CORBA::is_nil( aSObj ) ) - return; - - SALOMEDS::ChildIterator_var anIt = aStudy->NewChildIterator( aSObj ); - for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { - SALOMEDS::GenericAttribute_var anAttr; - if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) { - SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - TCollection_AsciiString asciiIOR( anIOR->Value() ); - GeometryGUI::GetGeomGUI()->GetShapeReader().RemoveShapeFromBuffer( asciiIOR ); - } - } + GeometryGUI::ClearShapeBuffer(theObj); } //================================================================ // Function : openCommand -// Purpose : +// Purpose : //================================================================ -bool GEOMBase_Helper::openCommand() +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() ) { - myCommand = new GEOM_Operation( getStudy(), anOp.in() ); + myCommand = new GEOM_Operation( SUIT_Session::session()->activeApplication(), anOp.in() ); myCommand->start(); res = true; } - + else + { + MESSAGE("anOp->_is_nil() = true"); + } + return res; } //================================================================ // Function : abortCommand -// Purpose : +// Purpose : //================================================================ bool GEOMBase_Helper::abortCommand() { @@ -600,29 +784,31 @@ bool GEOMBase_Helper::abortCommand() return false; myCommand->abort(); + delete myCommand; // I don't know where to delete this object here ? myCommand = 0; - - return true; + + return true; } //================================================================ // Function : commitCommand -// Purpose : +// Purpose : //================================================================ bool GEOMBase_Helper::commitCommand( const char* ) { if ( !hasCommand() ) return false; - myCommand->finish(); + myCommand->commit(); + delete myCommand; // I don't know where to delete this object here ? myCommand = 0; - return true; + return true; } //================================================================ // Function : hasCommand -// Purpose : +// Purpose : //================================================================ bool GEOMBase_Helper::hasCommand() const { @@ -631,7 +817,7 @@ bool GEOMBase_Helper::hasCommand() const //================================================================ // Function : getOperation -// Purpose : +// Purpose : //================================================================ GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation() { @@ -644,43 +830,47 @@ GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation() //================================================================ -// Function : checkViewFrame -// Purpose : +// Function : checkViewWindow +// Purpose : //================================================================ -bool GEOMBase_Helper::checkViewFrame() +bool GEOMBase_Helper::checkViewWindow() { - if ( myViewFrame ){ - QListIterator it( QAD_Application::getDesktop()->getActiveApp()->getStudies() ); - for ( ; it.current(); ++it ) { - QListIterator it1( it.current()->getStudyFrames() ); - for ( ; it1.current(); ++it1 ) { - if ( myViewFrame == it1.current()->getRightFrame()->getViewFrame() ) - return true; - } + if ( myViewWindow ){ + QList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + QListIterator it( aViewWindowsList ); + while ( it.hasNext() ) + { + if ( myViewWindow == it.next() ) + return true; } } - myViewFrame = 0; + myViewWindow = 0; return false; } //================================================================ // 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 ) { - QAD_Study* aDoc = QAD_Application::getDesktop()->getActiveStudy(); - SALOMEDS::Study_var aStudy = aDoc->getStudyDocument(); + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) + { + MESSAGE("appStudy is empty"); + return false; + } + _PTR(Study) aStudy = appStudy->studyDS(); - bool aLocked = aStudy->GetProperties()->IsLocked(); + bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked(); if ( aLocked ) { MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked"); - QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(), - 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; } @@ -690,68 +880,117 @@ 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() ) { - QAD_WaitCursor wc; - QAD_Application::getDesktop()->putInfo( "" ); + SUIT_OverrideCursor wc; + SUIT_Session::session()->activeApplication()->putInfo( "" ); ObjectList objects; if ( !execute( objects ) || !getOperation()->IsDone() ) { - wc.stop(); - 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 + } + 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 ) { - commitCommand(); - updateObjBrowser(); - QAD_Application::getDesktop()->putInfo( QObject::tr("GEOM_PRP_DONE") ); - } - else - abortCommand(); + } + + 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 ) { - QtCatchCorbaException( 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() { @@ -762,10 +1001,10 @@ void GEOMBase_Helper::showError() if ( msg.isEmpty() ) msg = QObject::tr( "GEOM_PRP_ABORT" ); - QAD_MessageBox::error1( QAD_Application::getDesktop(), - 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" ) ); } //================================================================ @@ -777,7 +1016,7 @@ void GEOMBase_Helper::showError( const QString& msg ) QString str( QObject::tr( "GEOM_INCORRECT_INPUT" ) ); if ( !msg.isEmpty() ) str += "\n" + msg; - QAD_MessageBox::error1( QAD_Application::getDesktop(), 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" ) ); } ////////////////////////////////////////////////////////////////// @@ -805,11 +1044,11 @@ bool GEOMBase_Helper::isValid( QString& ) //================================================================ // Function : execute -// Purpose : This method is called by onAccept(). -// It should perform the required operation and put all new or modified objects into +// Purpose : This method is called by onAccept(). +// 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; } @@ -820,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; } //================================================================ @@ -843,24 +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 : getDesktop +// Purpose : Returns myDesktop field. Initialized in constructor, +// usually as dynamic_cast(parentWidget()) +//================================================================ +SUIT_Desktop* GEOMBase_Helper::getDesktop() const +{ + return myDesktop; +} + +//================================================================ +// 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 ); + } + + 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 : findObjectInFather +// Purpose : It should return an object if its founded in study or +// return Null object if the object is not founded +//================================================================ +GEOM::GEOM_Object_ptr GEOMBase_Helper::findObjectInFather (GEOM::GEOM_Object_ptr theFather, + const QString& theName) +{ + 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 : findObjectInFather +// Purpose : It should return an object if its founded in study or +// return Null object if the object is not founded +//================================================================ +GEOM::GEOM_Object_ptr GEOMBase_Helper::findObjectInFather( GEOM::GEOM_Object_ptr theFather, + int theIndex ) +{ + 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 : addSubshapesToStudy +// Purpose : Virtual method to add sub-shapes if needs +//================================================================ +void GEOMBase_Helper::addSubshapesToStudy() +{ + //Implemented in Dialogs, called from Accept method +} + +//================================================================ +// Function : getSourceObjects +// Purpose : Virtual method to get source objects +//================================================================ +QList GEOMBase_Helper::getSourceObjects() +{ + //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; +}