X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMBase%2FGEOMBase_Helper.cxx;h=73d1a04beacc4476bacda475feec3a6e76138835;hb=b5d171ec2299b5891ddbafa232f7a1757fbb7b9e;hp=9cd2a40d62d7f0386d99fe4460fb150c40204e99;hpb=9499b99fe2dcb53e1ea364f97986f8f432b04600;p=modules%2Fgeom.git diff --git a/src/GEOMBase/GEOMBase_Helper.cxx b/src/GEOMBase/GEOMBase_Helper.cxx index 9cd2a40d6..73d1a04be 100755 --- a/src/GEOMBase/GEOMBase_Helper.cxx +++ b/src/GEOMBase/GEOMBase_Helper.cxx @@ -1,42 +1,39 @@ -// 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 +// 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 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. +// 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 +// 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 #include "GEOMBase_Helper.h" #include "GEOMBase.h" #include "GEOM_Operation.h" -#include "GeometryGUI.h" -#include "GEOM_Displayer.h" -#include "GEOMImpl_Types.hxx" +#include + +#include #include +#include #include +#include #include #include @@ -44,23 +41,17 @@ #include #include #include +#include #include -#include -#include + +#include #include #include -#include - #include #include -using namespace std; - -#include - - //================================================================ // Function : getActiveView // Purpose : Get active view window, returns 0 if no open study frame @@ -106,9 +97,13 @@ GEOMBase_Helper::~GEOMBase_Helper() erasePreview(); if ( hasCommand() ) abortCommand(); - - globalSelection( GEOM_ALLOBJECTS, true ); - + 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; } @@ -167,9 +162,9 @@ void GEOMBase_Helper::erase( const ObjectList& objList, const bool updateView ) void GEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView ) { if ( !object->_is_nil() ) { - string entry = getEntry( object ); + 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 ); } } @@ -206,16 +201,17 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, // Enable activisation of selection getDisplayer()->SetToActivate( true ); - string entry = getEntry( object ); + std::string entry = getEntry( object ); getDisplayer()->Redisplay(new SALOME_InteractiveObject - (entry.c_str(), "GEOM", strdup(GEOMBase::GetName(object))), false); + (entry.c_str(), "GEOM", strdup(GEOMBase::GetName(object).toLatin1().constData())), false); } if ( withChildren ) { SalomeApp_Study* aDoc = getStudy(); if ( aDoc && aDoc->studyDS() ) { _PTR(Study) aStudy = aDoc->studyDS(); - _PTR(SObject) aSObj (aStudy->FindObjectIOR(SalomeApp_Application::orb()->object_to_string(object))); + CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string(object); + _PTR(SObject) aSObj (aStudy->FindObjectIOR(std::string(objStr.in()))); if ( aSObj ) { _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { @@ -223,9 +219,9 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, (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 ); } } } @@ -244,7 +240,9 @@ 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; QString msg; @@ -266,7 +264,7 @@ void GEOMBase_Helper::displayPreview( const bool activate, 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 ); } @@ -290,19 +288,25 @@ void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, const bool append, const bool activate, const bool update, - const double lineWidth ) + const double lineWidth, + const int displayMode, + const int color ) { // 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( SalomeApp_Application::orb()->object_to_string( object ) ); + CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string( object ); + getDisplayer()->SetName( objStr.in() ); // Build prs SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object ); @@ -313,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 ); @@ -434,10 +440,10 @@ void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMo GEOM::GEOM_Object_ptr anObj = *anIter; if ( anObj->_is_nil() ) continue; - string aEntry = getEntry( anObj ); + 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() ) ) ); } getDisplayer()->LocalSelection( aListOfIO, theMode ); @@ -550,13 +556,14 @@ SalomeApp_Study* GEOMBase_Helper::getStudy() const if (!aDesktop) return 0; - QPtrList anAppList = SUIT_Session::session()->applications(); + QList anAppList = SUIT_Session::session()->applications(); SUIT_Application* anApp = 0; - for ( QPtrListIterator it( anAppList ); it.current() ; ++it ) + QListIterator it( anAppList ); + while ( it.hasNext() ) { - anApp = it.current(); - if ( anApp->desktop() == aDesktop ) + anApp = it.next(); + if ( anApp && anApp->desktop() == aDesktop ) break; } @@ -571,11 +578,13 @@ char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const { SalomeApp_Study* study = getStudy(); if ( study ) { - string IOR = GEOMBase::GetIORFromObject( object); + char * objIOR = GEOMBase::GetIORFromObject( object ); + std::string IOR( objIOR ); + free( objIOR ); if ( IOR != "" ) { _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) ); if ( SO ) { - return TCollection_AsciiString((char*)SO->GetID().c_str()).ToCString(); + return TCollection_AsciiString((char*)SO->GetID().c_str()).ToCString(); } } } @@ -602,15 +611,15 @@ void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj ) if ( CORBA::is_nil( theObj ) ) return; - string IOR = SalomeApp_Application::orb()->object_to_string( theObj ); - TCollection_AsciiString asciiIOR( strdup( IOR.c_str() ) ); + CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj ); + TCollection_AsciiString asciiIOR( (char *)IOR.in() ); GEOM_Client().RemoveShapeFromBuffer( asciiIOR ); if ( !getStudy() || !getStudy()->studyDS() ) return; _PTR(Study) aStudy = getStudy()->studyDS(); - _PTR(SObject) aSObj ( aStudy->FindObjectIOR( IOR ) ); + _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) ); if ( !aSObj ) return; @@ -705,10 +714,11 @@ GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation() bool GEOMBase_Helper::checkViewWindow() { if ( myViewWindow ){ - QPtrList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); - for ( QPtrListIterator it( aViewWindowsList ); it.current(); ++it ) + QList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + QListIterator it( aViewWindowsList ); + while ( it.hasNext() ) { - if ( myViewWindow == it.current() ) + if ( myViewWindow == it.next() ) return true; } } @@ -731,10 +741,10 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked(); if ( aLocked ) { MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked"); - SUIT_MessageBox::warn1 ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_STUDY_LOCKED"), - QObject::tr("BUT_OK") ); + SUIT_MessageBox::warning ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); return false; } @@ -757,8 +767,8 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) 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 ) { @@ -778,15 +788,16 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) 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 ); } } @@ -824,10 +835,10 @@ void GEOMBase_Helper::showError() if ( msg.isEmpty() ) msg = QObject::tr( "GEOM_PRP_ABORT" ); - SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(), - QObject::tr( "GEOM_ERROR_STATUS" ), - msg, - QObject::tr( "BUT_OK" ) ); + SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr( "GEOM_ERROR_STATUS" ), + msg, + QObject::tr( "BUT_OK" ) ); } //================================================================ @@ -839,7 +850,7 @@ void GEOMBase_Helper::showError( const QString& msg ) QString str( QObject::tr( "GEOM_INCORRECT_INPUT" ) ); if ( !msg.isEmpty() ) str += "\n" + msg; - SUIT_MessageBox::error1(SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) ); + SUIT_MessageBox::critical(SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) ); } ////////////////////////////////////////////////////////////////// @@ -905,22 +916,23 @@ 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 ""; } } @@ -981,3 +993,107 @@ 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; + } + } +} + +