X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMBase%2FGEOMBase_Helper.cxx;h=73d1a04beacc4476bacda475feec3a6e76138835;hb=b5d171ec2299b5891ddbafa232f7a1757fbb7b9e;hp=5bb5d91e811bdd473f0322e8af9203919f48919f;hpb=d3dd282390888d7dc091ba2c2ffe7923bd7458e6;p=modules%2Fgeom.git diff --git a/src/GEOMBase/GEOMBase_Helper.cxx b/src/GEOMBase/GEOMBase_Helper.cxx index 5bb5d91e8..73d1a04be 100755 --- a/src/GEOMBase/GEOMBase_Helper.cxx +++ b/src/GEOMBase/GEOMBase_Helper.cxx @@ -1,64 +1,67 @@ -// GEOM GEOMGUI : GUI for Geometry component +// 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 -// -// 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 +// 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.com +// +// File : GEOMBase_Helper.cxx +// Author : Sergey ANIKIN, Open CASCADE S.A.S. (sergey.anikin@opencascade.com) // -// File : GEOMBase_Helper.cxx -// Author : Sergey ANIKIN -// Module : GEOM -// $Header$ #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 #include -using namespace std; - //================================================================ // 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() +static SUIT_ViewWindow* 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,38 +72,45 @@ 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 ) + : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false ) { } //================================================================ // Function : ~GEOMBase_Helper -// Purpose : +// Purpose : //================================================================ GEOMBase_Helper::~GEOMBase_Helper() { + if ( !SUIT_Session::session()->activeApplication()->desktop() ) + return; + if ( myPreview.size() ) erasePreview(); if ( hasCommand() ) abortCommand(); - - globalSelection( GEOM_ALLOBJECTS, true ); - - delete myDisplayer; + SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) { + GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + if(aGeomGUI) + globalSelection(aGeomGUI->getLocalSelectionMode() , true ); + } + + if (myDisplayer) + delete myDisplayer; } //================================================================ // Function : display -// Purpose : +// Purpose : //================================================================ void GEOMBase_Helper::display( const ObjectList& objList, const bool updateView ) { @@ -133,7 +143,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 ) { @@ -147,22 +157,22 @@ 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 ); + std::string entry = getEntry( object ); getDisplayer()->Erase( new SALOME_InteractiveObject( - entry.c_str(), "GEOM", strdup( GEOMBase::GetName( object ) ) ), true, updateView ); + entry.c_str(), "GEOM", strdup( GEOMBase::GetName( object ).toLatin1().constData() ) ), true, updateView ); } } //================================================================ // Function : redisplay -// Purpose : +// Purpose : //================================================================ -void GEOMBase_Helper::redisplay( const ObjectList& objList, +void GEOMBase_Helper::redisplay( const ObjectList& objList, const bool withChildren, const bool updateView ) { @@ -176,9 +186,9 @@ void GEOMBase_Helper::redisplay( const ObjectList& objList, //================================================================ // Function : redisplay -// Purpose : +// Purpose : //================================================================ -void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, +void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, const bool withChildren, const bool updateView ) { @@ -187,35 +197,38 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, // 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 ); + + std::string entry = getEntry( object ); + getDisplayer()->Redisplay(new SALOME_InteractiveObject + (entry.c_str(), "GEOM", strdup(GEOMBase::GetName(object).toLatin1().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 ); + 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( anIt->Value()->GetObject() ); + 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 ); + std::string entry = getEntry( aChild ); getDisplayer()->Redisplay( new SALOME_InteractiveObject( - entry.c_str(), "GEOM", strdup( GEOMBase::GetName( aChild ) ) ), false ); + entry.c_str(), "GEOM", strdup( GEOMBase::GetName( aChild ).toLatin1().constData() ) ), false ); } } } - } + } } } - + if ( updateView ) getDisplayer()->UpdateViewer(); } @@ -227,36 +240,38 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, void GEOMBase_Helper::displayPreview( const bool activate, const bool update, const bool toRemoveFromEngine, - const double lineWidth ) + const double lineWidth, + const int displayMode, + const int color ) { - isPreview = true; + isPreview = true; QString msg; if ( !isValid( msg ) ) { erasePreview( update ); - isPreview = false; + isPreview = false; return; } erasePreview( false ); try { - QAD_WaitCursor wc; + SUIT_OverrideCursor wc; ObjectList objects; 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 ); + displayPreview( *it, true, activate, false, lineWidth, displayMode, color ); if ( toRemoveFromEngine ) getGeomEngine()->RemoveObject( *it ); } } } catch( const SALOME::SALOME_Exception& e ) { - QtCatchCorbaException( e ); + SalomeApp_Tools::QtCatchCorbaException( e ); } isPreview = false; @@ -271,22 +286,28 @@ 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 ) { // 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 ); + + // set display mode of displayed shape + int aPrevDispMode = getDisplayer()->SetDisplayMode( 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() ) @@ -296,6 +317,8 @@ void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, displayPreview( aPrs, append, update ); getDisplayer()->UnsetName(); + getDisplayer()->UnsetColor(); + getDisplayer()->SetDisplayMode( aPrevDispMode ); // Enable activation of displayed objects getDisplayer()->SetToActivate( true ); @@ -313,34 +336,52 @@ 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( 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 ) { 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( *anIter, true ); + } + } delete *anIter; } myPreview.clear(); @@ -357,29 +398,31 @@ 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 ); } //================================================================ @@ -390,20 +433,20 @@ void GEOMBase_Helper::activate( const int theType ) void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode ) { 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 ); + std::string aEntry = getEntry( anObj ); if ( aEntry != "" ) aListOfIO.Append( new SALOME_InteractiveObject( - aEntry.c_str(), "GEOM", strdup( GEOMBase::GetName( anObj ) ) ) ); + aEntry.c_str(), "GEOM", strdup( GEOMBase::GetName( anObj ).toLatin1().constData() ) ) ); } - myDisplayer->LocalSelection( aListOfIO, theMode ); + getDisplayer()->LocalSelection( aListOfIO, theMode ); } //================================================================ @@ -415,7 +458,7 @@ void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode { // 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)(), mode ); return; } @@ -432,7 +475,7 @@ void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode //================================================================ void GEOMBase_Helper::globalSelection( const int theMode, const bool update ) { - myDisplayer->GlobalSelection( theMode, update ); + getDisplayer()->GlobalSelection( theMode, update ); } //================================================================ @@ -443,7 +486,7 @@ void GEOMBase_Helper::globalSelection( const int theMode, const bool update ) void GEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes, const bool update ) { - myDisplayer->GlobalSelection( theModes, update ); + getDisplayer()->GlobalSelection( theModes, update ); } //================================================================ @@ -455,13 +498,14 @@ void GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theN if ( !hasCommand() ) return; - SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument(); - if ( aStudy->_is_nil() || theObj->_is_nil() ) + _PTR(Study) aStudy = getStudy()->studyDS(); + if ( !aStudy || theObj->_is_nil() ) return; GEOM::GEOM_Object_ptr aFatherObj = getFather( theObj ); - GeometryGUI::GetGeomGUI()->GetGeomGen()->AddInStudy( aStudy, theObj, theName, aFatherObj ); + getGeomEngine()->AddInStudy(GeometryGUI::ClientStudyToStudy(aStudy), + theObj, theName, aFatherObj); } //================================================================ @@ -470,7 +514,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( true ); + } + } } //================================================================ @@ -490,34 +541,50 @@ int GEOMBase_Helper::getStudyId() const { int anId = -1; if ( getStudy() ) - anId = getStudy()->getStudyId(); + anId = getStudy()->id(); 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 { - QAD_Study* study = getStudy(); + SalomeApp_Study* study = getStudy(); if ( study ) { - string IOR = GEOMBase::GetIORFromObject( object); + char * objIOR = GEOMBase::GetIORFromObject( object ); + std::string IOR( objIOR ); + free( objIOR ); if ( IOR != "" ) { - SALOMEDS::SObject_var SO = study->getStudyDocument()->FindObjectIOR( IOR.c_str() ); - if ( !SO->_is_nil() ) { - return SO->GetID(); + _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) ); + if ( SO ) { + return TCollection_AsciiString((char*)SO->GetID().c_str()).ToCString(); } } } @@ -526,70 +593,70 @@ char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const //================================================================ // Function : getDisplayer -// Purpose : +// Purpose : //================================================================ GEOM_Displayer* GEOMBase_Helper::getDisplayer() { if ( !myDisplayer ) - myDisplayer = new GEOM_Displayer(); + myDisplayer = new GEOM_Displayer( getStudy() ); return myDisplayer; } //================================================================ // 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 ); + CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj ); + TCollection_AsciiString asciiIOR( (char *)IOR.in() ); + GEOM_Client().RemoveShapeFromBuffer( asciiIOR ); - if ( !getStudy() || CORBA::is_nil( getStudy()->getStudyDocument() ) ) + if ( !getStudy() || !getStudy()->studyDS() ) return; - SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument(); - SALOMEDS::SObject_var aSObj = aStudy->FindObjectIOR( IOR.c_str() ); - if ( CORBA::is_nil( aSObj ) ) + _PTR(Study) aStudy = getStudy()->studyDS(); + _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) ); + if ( !aSObj ) return; - SALOMEDS::ChildIterator_var anIt = aStudy->NewChildIterator( aSObj ); + _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { - SALOMEDS::GenericAttribute_var anAttr; + _PTR(GenericAttribute) 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 ); + _PTR(AttributeIOR) anIOR ( anAttr ); + TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() ); + GEOM_Client().RemoveShapeFromBuffer( asciiIOR ); } } } //================================================================ // Function : openCommand -// Purpose : +// Purpose : //================================================================ -bool GEOMBase_Helper::openCommand() +bool GEOMBase_Helper::openCommand() { bool res = false; if ( !getStudy() || hasCommand() ) 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; } - + return res; } //================================================================ // Function : abortCommand -// Purpose : +// Purpose : //================================================================ bool GEOMBase_Helper::abortCommand() { @@ -598,28 +665,28 @@ bool GEOMBase_Helper::abortCommand() myCommand->abort(); myCommand = 0; - - return true; + + return true; } //================================================================ // Function : commitCommand -// Purpose : +// Purpose : //================================================================ bool GEOMBase_Helper::commitCommand( const char* ) { if ( !hasCommand() ) return false; - myCommand->finish(); + myCommand->commit(); myCommand = 0; - return true; + return true; } //================================================================ // Function : hasCommand -// Purpose : +// Purpose : //================================================================ bool GEOMBase_Helper::hasCommand() const { @@ -628,7 +695,7 @@ bool GEOMBase_Helper::hasCommand() const //================================================================ // Function : getOperation -// Purpose : +// Purpose : //================================================================ GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation() { @@ -641,43 +708,43 @@ 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() ) + 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 perfroms user input validation, then it // performs a proper operation and manages transactions, etc. //================================================================ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) { - 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 ) 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; } @@ -691,44 +758,53 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) 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(); + wc.suspend(); abortCommand(); showError(); } else { + addSubshapesToStudy(); // add Subshapes if local selection const int nbObjs = objects.size(); - bool withChildren = false; + int aNumber = 1; 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(); + QString aName = getNewObjectName(); + if ( nbObjs > 1 ) { + if (aName.isEmpty()) + aName = getPrefix(*it); + if (nbObjs <= 30) { + // Try to find a unique name + aName = GEOMBase::GetDefaultName(aName); + } 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( *it ) ); } - addInStudy( *it, aName.latin1() ); - withChildren = false; + addInStudy( *it, aName.toLatin1().constData() ); + // updateView=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 + 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 ); + // withChildren=true, updateView=false + redisplay( *it, true, false ); } } if ( nbObjs ) { commitCommand(); updateObjBrowser(); - QAD_Application::getDesktop()->putInfo( QObject::tr("GEOM_PRP_DONE") ); + SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") ); } else abortCommand(); @@ -736,7 +812,7 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) } } catch( const SALOME::SALOME_Exception& e ) { - QtCatchCorbaException( e ); + SalomeApp_Tools::QtCatchCorbaException( e ); abortCommand(); } @@ -759,10 +835,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" ) ); } //================================================================ @@ -774,7 +850,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" ) ); } ////////////////////////////////////////////////////////////////// @@ -802,8 +878,8 @@ 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 ) @@ -840,24 +916,184 @@ 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(); - + //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" ); + 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 +//================================================================ +const SALOME_ListIO& GEOMBase_Helper::selectedIO() +{ + mySelected.Clear(); + + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( aSelMgr ) + aSelMgr->selectedObjects( mySelected ); + } + + return mySelected; +} + +//================================================================ +// Function : IObjectCount +// Purpose : Return the number of selected objects +//================================================================ +int GEOMBase_Helper::IObjectCount() +{ + return selectedIO().Extent(); +} +//================================================================ +// Function : firstIObject +// Purpose : Return the first selected object in the selected object list +//================================================================ +Handle(SALOME_InteractiveObject) GEOMBase_Helper::firstIObject() +{ + const SALOME_ListIO& aList = selectedIO(); + return aList.Extent() > 0 ? aList.First() : Handle(SALOME_InteractiveObject)(); +} + +//================================================================ +// Function : lastIObject +// Purpose : Return the last selected object in the selected object list +//================================================================ +Handle(SALOME_InteractiveObject) GEOMBase_Helper::lastIObject() +{ + const SALOME_ListIO& aList = selectedIO(); + return aList.Extent() > 0 ? aList.Last() : Handle(SALOME_InteractiveObject)(); +} + +//================================================================ +// 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 ) + { + std::string entry = getEntry( *anIter ); + QString aEntry( entry.c_str() ); + LightApp_DataOwner* anOwher = new LightApp_DataOwner( aEntry ); + 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(); + std::string IOR = GEOMBase::GetIORFromObject( theFather ); + _PTR(SObject) SObj ( aDStudy->FindObjectIOR( IOR ) ); + + 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 : addSubshapesToStudy +// Purpose : Virtual method to add subshapes if needs +//================================================================ +void GEOMBase_Helper::addSubshapesToStudy() +{ + //Impemented in Dialogs, called from Accept method +} + +//================================================================ +// Function : addSubshapesToFather +// Purpose : Method to add Father Subshapes to Study if it`s not exist +//================================================================ +void GEOMBase_Helper::addSubshapesToFather( QMap& theMap ) +{ + //GetStudyDS + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + _PTR(Study) aDStudy = appStudy->studyDS(); + + GEOM::GEOM_IGroupOperations_var anOp = getGeomEngine()->GetIGroupOperations( getStudyId() ); + + for( QMap::Iterator it = theMap.begin(); it != theMap.end(); it++ ) + { + if ( !anOp->_is_nil() ) { + GEOM::GEOM_Object_var aFatherObj = anOp->GetMainShape( it.value() ); + if ( !aFatherObj->_is_nil() ) { + GEOM::GEOM_Object_var aFindedObject = findObjectInFather(aFatherObj, it.key().toLatin1().data() ); + + //Add Object to study if its not exist + if ( aFindedObject == GEOM::GEOM_Object::_nil() ) + GeometryGUI::GetGeomGen()->AddInStudy(GeometryGUI::ClientStudyToStudy(aDStudy), + it.value(), it.key().toLatin1().data(), aFatherObj ); + } + } + else { + //cout << " anOperations is NULL! " << endl; + } + } +} + +