-// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// 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.
+// 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
+// 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, Open CASCADE S.A.S. (sergey.anikin@opencascade.com)
+
+// GEOM GEOMGUI : GUI for Geometry component
+// File : GEOMBase_Helper.cxx
+// Author : Sergey ANIKIN, Open CASCADE S.A.S. (sergey.anikin@opencascade.com)
//
#include "GEOMBase_Helper.h"
#include "GEOMBase.h"
#include <SUIT_ViewModel.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
+#include <SUIT_ResourceMgr.h>
#include <SalomeApp_Module.h>
#include <SalomeApp_Application.h>
#include <LightApp_SelectionMgr.h>
#include <LightApp_DataOwner.h>
#include <SalomeApp_Tools.h>
+#include <SALOME_ListIteratorOfListIO.hxx>
#include <SALOME_Prs.h>
#include <TColStd_MapOfInteger.hxx>
#include <TCollection_AsciiString.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+//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 :
//================================================================
GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop )
- : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false )
+ : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false ),
+ myIsApplyAndClose( false ), myIsOptimizedBrowsing( false ), myIsWaitCursorEnabled( true ),
+ myIsDisableBrowsing(false)
{
}
//================================================================
GEOMBase_Helper::~GEOMBase_Helper()
{
- if ( !SUIT_Session::session()->activeApplication()->desktop() )
+ //rnv: Fix for the "IPAL21922 : WinTC5.1.4: incorrect quit salome"
+ if ( !SUIT_Session::session()->activeApplication() || !SUIT_Session::session()->activeApplication()->desktop() )
return;
if ( myPreview.size() )
if(aGeomGUI)
globalSelection(aGeomGUI->getLocalSelectionMode() , true );
}
-
+
if (myDisplayer)
delete myDisplayer;
if ( !CORBA::is_nil( myOperation ) )
- myOperation->Destroy();
+ myOperation->UnRegister();
}
//================================================================
{
// 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 = "<<getDisplayer()->GetTexture())
// Enable activisation of selection
getDisplayer()->SetToActivate( true );
void GEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView )
{
if ( !object->_is_nil() ) {
- std::string entry = getEntry( object );
+ QString entry = getEntry( object );
getDisplayer()->Erase( new SALOME_InteractiveObject(
- entry.c_str(), "GEOM", strdup( GEOMBase::GetName( object ).toLatin1().constData() ) ), true, updateView );
+ entry.toLatin1().constData(),
+ "GEOM", strdup( GEOMBase::GetName( object ).toLatin1().constData() ) ), true, updateView );
}
}
// Purpose :
//================================================================
void GEOMBase_Helper::redisplay( const ObjectList& objList,
- const bool withChildren,
- const bool updateView )
+ const bool withChildren,
+ const bool updateView )
{
ObjectList::const_iterator it = objList.begin();
for ( ; it != objList.end(); it++ ) {
// Purpose :
//================================================================
void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object,
- const bool withChildren,
- const bool updateView )
+ const bool withChildren,
+ const bool updateView )
{
if ( !object->_is_nil() ) {
// Unset color of shape ( this color may be set during preview displaying )
// Enable activisation of selection
getDisplayer()->SetToActivate( true );
- std::string entry = getEntry( object );
+ QString entry = getEntry( object );
getDisplayer()->Redisplay(new SALOME_InteractiveObject
- (entry.c_str(), "GEOM", strdup(GEOMBase::GetName(object).toLatin1().constData())), false);
+ (entry.toLatin1().constData(), "GEOM", strdup(GEOMBase::GetName(object).toLatin1().constData())), false);
}
if ( withChildren ) {
CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string(object);
_PTR(SObject) aSObj (aStudy->FindObjectIOR(std::string(objStr.in())));
if ( aSObj ) {
- _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
- for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
- GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow
+ _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
+ for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
+ GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow
(GeometryGUI::ClientSObjectToObject(anIt->Value()));
- if ( !CORBA::is_nil( aChild ) ) {
- if ( !aChild->_is_nil() ) {
- std::string entry = getEntry( aChild );
- getDisplayer()->Redisplay( new SALOME_InteractiveObject(
- entry.c_str(), "GEOM", strdup( GEOMBase::GetName( aChild ).toLatin1().constData() ) ), false );
- }
- }
- }
+ if ( !CORBA::is_nil( aChild ) ) {
+ if ( !aChild->_is_nil() ) {
+ QString entry = getEntry( aChild );
+ getDisplayer()->Redisplay( new SALOME_InteractiveObject(
+ entry.toLatin1().constData(), "GEOM", strdup( GEOMBase::GetName( aChild ).toLatin1().constData() ) ), false );
+ }
+ }
+ }
}
}
}
// 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 int displayMode,
+ const double lineWidth,
+ const int displayMode,
const int color )
{
+ if(!display) {
+ erasePreview( update );
+ return;
+ }
+
isPreview = true;
QString msg;
if ( !isValid( msg ) )
try {
SUIT_OverrideCursor wc;
ObjectList objects;
+
+ if ( !isWaitCursorEnabled() )
+ wc.suspend();
+
if ( !execute( objects ) || !getOperation()->IsDone() ) {
wc.suspend();
}
else {
for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it )
{
- GEOM::GEOM_Object_var obj=*it;
+ GEOM::GEOM_Object_var obj=*it;
displayPreview( obj, true, activate, false, lineWidth, displayMode, color );
if ( toRemoveFromEngine )
- obj->Destroy();
+ obj->UnRegister();
}
}
}
const bool append,
const bool activate,
const bool update,
- const double lineWidth,
- const int displayMode,
+ const double lineWidth,
+ const int displayMode,
const int color )
{
// Set color for preview shape
getDisplayer()->SetColor( color == -1 ? Quantity_NOC_VIOLET : color );
// set width of displayed shape
- getDisplayer()->SetWidth( lineWidth );
-
+ int lw = lineWidth;
+ if(lw == -1) {
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+ lw = resMgr->integerValue("Geometry", "preview_edge_width", -1);
+ }
+ getDisplayer()->SetWidth( lw );
+
// set display mode of displayed shape
int aPrevDispMode = getDisplayer()->SetDisplayMode( displayMode );
if ( myViewWindow == 0 )
return;
-
+
// Display prs
SUIT_ViewManager* aViewManager = myViewWindow->getViewManager();
if ( aViewManager->getType() == OCCViewer_Viewer::Type() ||
SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
if (aView)
- aView->Display( prs );
+ aView->Display( prs );
}
// Add prs to the preview list
for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter ) {
if ( vfOK )
{
- SUIT_ViewManager* aViewManager = myViewWindow->getViewManager();
- if ( aViewManager->getType() == OCCViewer_Viewer::Type() ||
- aViewManager->getType() == SVTK_Viewer::Type() )
- {
- SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
- SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
- if (aView)
- aView->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<SALOME_View*>(aViewModel);
+ if (aView)
+ aView->Erase( *anIter, true );
+ }
}
delete *anIter;
}
//================================================================
// 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( const ObjectList& theObjs, const int theMode )
GEOM::GEOM_Object_ptr anObj = *anIter;
if ( anObj->_is_nil() )
continue;
- std::string aEntry = getEntry( anObj );
- if ( aEntry != "" )
+ QString anEntry = getEntry( anObj );
+ if ( anEntry != "" )
aListOfIO.Append( new SALOME_InteractiveObject(
- aEntry.c_str(), "GEOM", strdup( GEOMBase::GetName( anObj ).toLatin1().constData() ) ) );
+ anEntry.toLatin1().constData(), "GEOM", strdup( GEOMBase::GetName( anObj ).toLatin1().constData() ) ) );
}
getDisplayer()->LocalSelection( aListOfIO, theMode );
//================================================================
// 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 )
//================================================================
// 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 )
//================================================================
// Function : globalSelection
-// Purpose : Activate selection of subshapes. Set selection filters
+// Purpose : Activate selection of sub-shapes. Set selection filters
// in accordance with mode. theMode is from GEOMImpl_Types
//================================================================
void GEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes,
- const bool update )
+ const bool update )
{
getDisplayer()->GlobalSelection( theModes, update );
}
//================================================================
// Function : globalSelection
-// Purpose : Activate selection of 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 QList<int>& subShapes,
- const bool update )
+ const bool update )
{
getDisplayer()->GlobalSelection( theModes, update, &subShapes );
}
// Function : addInStudy
// Purpose : Add object in study
//================================================================
-void GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theName )
+QString GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theName )
{
if ( !hasCommand() )
- return;
+ return QString();
_PTR(Study) aStudy = getStudy()->studyDS();
if ( !aStudy || theObj->_is_nil() )
- return;
+ return QString();
SALOMEDS::Study_var aStudyDS = GeometryGUI::ClientStudyToStudy(aStudy);
SALOMEDS::SObject_var aSO =
getGeomEngine()->AddInStudy(aStudyDS, theObj, theName, aFatherObj);
+ QString anEntry;
+ if ( !aSO->_is_nil() )
+ anEntry = aSO->GetID();
+
// Each dialog is responsible for this method implementation,
// default implementation does nothing
restoreSubShapes(aStudyDS, aSO);
- aSO->Destroy();
+ aSO->UnRegister();
+
+ return anEntry;
}
//================================================================
{
anApp = it.next();
if ( anApp && anApp->desktop() == aDesktop )
- break;
+ break;
}
return dynamic_cast<SalomeApp_Study*>(anApp->activeStudy());
// Function : getEntry
// Purpose :
//================================================================
-char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const
+QString GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const
{
SalomeApp_Study* study = getStudy();
if ( study ) {
- char * objIOR = GEOMBase::GetIORFromObject( object );
- std::string IOR( objIOR );
- free( objIOR );
- if ( IOR != "" ) {
- _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) );
- if ( SO ) {
- return (char*) TCollection_AsciiString((char*)SO->GetID().c_str()).ToCString();
- }
+ QString objIOR = GEOMBase::GetIORFromObject( object );
+ if ( objIOR != "" ) {
+ _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( objIOR.toLatin1().constData() ) );
+ if ( SO )
+ return QString::fromStdString(SO->GetID());
}
}
- return (char*)"";
+ return "";
}
//================================================================
CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
TCollection_AsciiString asciiIOR( (char *)IOR.in() );
- GEOM_Client().RemoveShapeFromBuffer( asciiIOR );
+ GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
if ( !getStudy() || !getStudy()->studyDS() )
return;
if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
_PTR(AttributeIOR) anIOR ( anAttr );
TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
- GEOM_Client().RemoveShapeFromBuffer( asciiIOR );
+ GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
}
}
}
{
bool res = false;
if ( !getStudy() || hasCommand() )
+ {
+ MESSAGE("Getting out from openCommand()")
return res;
+ }
GEOM::GEOM_IOperations_var anOp = GEOM::GEOM_IOperations::_narrow( getOperation() );
if ( !anOp->_is_nil() ) {
myCommand->start();
res = true;
}
+ else
+ {
+ MESSAGE("anOp->_is_nil() = true")
+ }
return res;
}
//================================================================
bool GEOMBase_Helper::hasCommand() const
{
+ bool res = (bool) myCommand;
return (bool)myCommand;
}
QListIterator<SUIT_ViewWindow*> it( aViewWindowsList );
while ( it.hasNext() )
{
- if ( myViewWindow == it.next() )
- return true;
+ if ( myViewWindow == it.next() )
+ return true;
}
}
myViewWindow = 0;
// 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 )
+bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction, bool erasePreviewFlag )
{
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
- if ( !appStudy ) return false;
+ if ( !appStudy )
+ {
+ MESSAGE("appStudy is empty")
+ return false;
+ }
_PTR(Study) aStudy = appStudy->studyDS();
bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked();
if ( aLocked ) {
MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked");
SUIT_MessageBox::warning ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(),
- QObject::tr("WRN_WARNING"),
- QObject::tr("WRN_STUDY_LOCKED"),
- QObject::tr("BUT_OK") );
+ QObject::tr("WRN_WARNING"),
+ QObject::tr("WRN_STUDY_LOCKED"),
+ QObject::tr("BUT_OK") );
return false;
}
showError( msg );
return false;
}
+
+ if(erasePreviewFlag)
+ erasePreview( false );
- erasePreview( false );
+ bool result = false;
try {
if ( ( !publish && !useTransaction ) || openCommand() ) {
SUIT_Session::session()->activeApplication()->putInfo( "" );
ObjectList objects;
if ( !execute( objects ) || !getOperation()->IsDone() ) {
- wc.suspend();
- abortCommand();
- showError();
+ wc.suspend();
+ abortCommand();
+ showError();
}
else {
- addSubshapesToStudy(); // add Subshapes if local selection
- const int nbObjs = objects.size();
+ addSubshapesToStudy(); // add Sub-shapes if local selection
+ const int nbObjs = objects.size();
+ QStringList anEntryList;
int aNumber = 1;
- for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) {
- GEOM::GEOM_Object_var obj=*it;
- if ( publish ) {
- QString aName = getNewObjectName();
- if ( nbObjs > 1 ) {
+ for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) {
+ GEOM::GEOM_Object_var obj=*it;
+ if ( publish ) {
+ QString aName = getNewObjectName();
+ if ( nbObjs > 1 ) {
if (aName.isEmpty())
aName = getPrefix(obj);
if (nbObjs <= 30) {
// Try to find a unique name
- aName = GEOMBase::GetDefaultName(aName);
+ 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 ) );
- }
- addInStudy( obj, aName.toLatin1().constData() );
+ } 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.toLatin1().constData() );
// updateView=false
- display( obj, false );
- // 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->Destroy();
- }
- else {
+ 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 );
+ clearShapeBuffer( obj );
// withChildren=true, updateView=false
- redisplay( obj, true, false );
+ redisplay( obj, true, false );
}
- }
-
- if ( nbObjs ) {
- commitCommand();
- updateObjBrowser();
- SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") );
- }
- else
- abortCommand();
+ }
+
+ if ( nbObjs ) {
+ commitCommand();
+ updateObjBrowser();
+ if( SUIT_Application* anApp = SUIT_Session::session()->activeApplication() ) {
+ LightApp_Application* aLightApp = dynamic_cast<LightApp_Application*>( anApp );
+ if(aLightApp && !isDisableBrowsing() )
+ aLightApp->browseObjects( anEntryList, isApplyAndClose(), isOptimizedBrowsing() );
+ anApp->putInfo( QObject::tr("GEOM_PRP_DONE") );
+ }
+ result = true;
+ }
+ else
+ abortCommand();
}
}
}
catch( const SALOME::SALOME_Exception& e ) {
SalomeApp_Tools::QtCatchCorbaException( e );
abortCommand();
+ MESSAGE("Exception catched")
}
updateViewer();
- return true;
+ MESSAGE("result ="<<result)
+ return result;
}
msg = QObject::tr( "GEOM_PRP_ABORT" );
SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(),
- QObject::tr( "GEOM_ERROR_STATUS" ),
- msg,
- QObject::tr( "BUT_OK" ) );
+ QObject::tr( "GEOM_ERROR_STATUS" ),
+ msg,
+ QObject::tr( "BUT_OK" ) );
}
//================================================================
return QString::null;
}
+//================================================================
+// 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;
+}
+
//================================================================
// Function : getPrefix
// Purpose : Get prefix for name of created object
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 )
//================================================================
// Function : selectObjects
-// Purpose : Selects list of objects
+// Purpose : Selects list of objects
//================================================================
bool GEOMBase_Helper::selectObjects( ObjectList& objects )
{
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 );
+ 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<SalomeApp_Application*>( session->activeApplication() );
if ( !app )
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
dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
_PTR(Study) aDStudy = appStudy->studyDS();
- std::string IOR = GEOMBase::GetIORFromObject( theFather );
- _PTR(SObject) SObj ( aDStudy->FindObjectIOR( IOR ) );
+ QString IOR = GEOMBase::GetIORFromObject( theFather );
+ _PTR(SObject) SObj ( aDStudy->FindObjectIOR( IOR.toLatin1().constData() ) );
bool inStudy = false;
GEOM::GEOM_Object_var aReturnObject;
}
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;
+ bool found = false;
+ SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( 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() && !found; 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();
+ for ( int i = 0; i < length && !found; i++ ) {
+ if ( indices[i] == theIndex ) {
+ object = cobject;
+ found = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return object._retn();
+}
+
//================================================================
// Function : addSubshapesToStudy
-// Purpose : Virtual method to add subshapes if needs
-//================================================================
+// Purpose : Virtual method to add sub-shapes 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<QString, GEOM::GEOM_Object_var>& theMap )
+// 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 )
{
- //GetStudyDS
- SalomeApp_Application* app =
- dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
- SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
- _PTR(Study) aDStudy = appStudy->studyDS();
+ QList<TopAbs_ShapeEnum> types;
+ types << type;
+ return getSelected( types );
+}
- GEOM::GEOM_IGroupOperations_var anOp = getGeomEngine()->GetIGroupOperations( getStudyId() );
-
- for( QMap<QString, GEOM::GEOM_Object_var>::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 );
+//================================================================
+// Function : getSelected
+// Purpose : Get selected object by specified types
+//
+// Returns valid object if only one object of the specified type is selected
+// (no matter global or local selection is activated). The list of allowed
+// shape types is passed via \a types. If \a types includes TopAbs_SHAPE,
+// geometrical object of any valid type is expected.
+//
+// \param types list of allowed shape types for the objects to be obtained from selection
+// \return selected geometrical object or nil object if selection is not satisfactory
+//================================================================
+GEOM::GeomObjPtr GEOMBase_Helper::getSelected( const QList<TopAbs_ShapeEnum>& types )
+{
+ QList<GEOM::GeomObjPtr> selected = getSelected( types, 1 );
+ return selected.count() > 0 ? selected[0] : GEOM::GeomObjPtr();
+}
+
+//================================================================
+// Function : getSelected
+// Purpose : Get selected object(s) by specified type
+//
+// Returns list of selected objects if selection satisfies specifies selection options.
+// (no matter global or local selection is activated). If \a type is TopAbs_SHAPE,
+// geometrical objects of any valid type are expected.
+//
+// The \a type parameter specifies allowed type of the object(s) being selected.
+// The \a count parameter specifies exact number of the objects to be retrieved from selection.
+// The \a strict parameter specifies policy being applied to the selection.
+// If \a count < 0, then any number of the selected objects is valid (including 0).
+// In this case, if \a strict is \c true (default), all selected objects should satisfy
+// the specified \a type.
+// If \a count > 0, only specified number of the objects is retrieved from the selection.
+// In this case, if \a strict is \c true (default), function returns empty list if total number of selected
+// objects does not correspond to the \a count parameter. Otherwise (if \a strict is \c false),
+// function returns valid list of objects if at least \a count objects satisfy specified \a type.
+//
+// \param type type of the object(s) to be obtained from selection
+// \param count number of items to be retrieved from selection
+// \param strict selection policy
+// \return list of selected geometrical objects or empty list if selection is not satisfactory
+//================================================================
+QList<GEOM::GeomObjPtr> GEOMBase_Helper::getSelected( TopAbs_ShapeEnum type, int count, bool strict )
+{
+ QList<TopAbs_ShapeEnum> types;
+ types << type;
+ return getSelected( types, count, strict );
+}
+
+static bool typeInList( TopAbs_ShapeEnum type, const QList<TopAbs_ShapeEnum>& types )
+{
+ bool ok = false;
+ for ( int i = 0; i < types.count() && !ok; i++ )
+ ok = types[i] == TopAbs_SHAPE || types[i] == type;
+ return ok;
+}
+
+//================================================================
+// Function : getSelected
+// Purpose : Get selected objects by specified types
+//
+// Returns list of selected objects if selection satisfies specifies selection options.
+// (no matter global or local selection is activated). If \a types includes TopAbs_SHAPE,
+// geometrical objects of any valid type are expected.
+//
+// The \a types parameter specifies allowed types of the object(s) being selected.
+// The \a count parameter specifies exact number of the objects to be retrieved from selection.
+// The \a strict parameter specifies policy being applied to the selection.
+// If \a count < 0, then any number of the selected objects is valid (including 0).
+// In this case, if \a strict is \c true (default), all selected objects should satisfy
+// the specified \a type.
+// If \a count > 0, only specified number of the objects is retrieved from the selection.
+// In this case, if \a strict is \c true (default), function returns empty list if total number of selected
+// objects does not correspond to the \a count parameter. Otherwise (if \a strict is \c false),
+// function returns valid list of objects if at least \a count objects satisfy specified \a type.
+//
+// \param types list of allowed shape types for the objects to be obtained from selection
+// \param count number of items to be retrieved from selection
+// \param strict selection policy
+// \return list of selected geometrical objects or empty list if selection is not satisfactory
+//================================================================
+QList<GEOM::GeomObjPtr> GEOMBase_Helper::getSelected( const QList<TopAbs_ShapeEnum>& types, int count, bool strict )
+{
+ SUIT_Session* session = SUIT_Session::session();
+ QList<GEOM::GeomObjPtr> result;
+
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( session->activeApplication() );
+ if ( app ) {
+ LightApp_SelectionMgr* selMgr = app->selectionMgr();
+ if ( selMgr ) {
+ SALOME_ListIO selected;
+ selMgr->selectedObjects( selected );
+ SALOME_ListIteratorOfListIO it( selected );
+ bool stopped = false;
+ for ( ; it.More() && !stopped; it.Next() ) {
+ Handle(SALOME_InteractiveObject) IO = it.Value();
+ GEOM::GeomObjPtr object = GEOMBase::ConvertIOinGEOMObject( IO );
+ if ( object ) {
+ TColStd_IndexedMapOfInteger subShapes;
+ selMgr->GetIndexes( IO, subShapes );
+ int nbSubShapes = subShapes.Extent();
+ if ( nbSubShapes == 0 ) {
+ // global selection
+ if ( typeInList( (TopAbs_ShapeEnum)(object->GetShapeType()), types ) ) {
+ result << object;
+ if ( count > 0 ) {
+ if ( strict && result.count() > count ) {
+ result.clear();
+ stopped = true;
+ }
+ else if ( !strict && result.count() == count )
+ stopped = true;
+ }
+ }
+ else if ( strict ) {
+ result.clear();
+ stopped = true;
+ }
+ }
+ else {
+ // local selection
+ for ( int i = 1; i <= nbSubShapes && !stopped; i++ ) {
+ int idx = subShapes( i );
+ GEOM::GeomObjPtr subShape = findObjectInFather( object.get(), idx );
+ if ( !subShape ) {
+ // sub-shape is not yet published in the study
+ GEOM::ShapesOpPtr shapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
+ 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;
+ }
+ }
+ }
}
}
- else {
- //cout << " anOperations is NULL! " << endl;
- }
}
-}
+ }
+ return result;
+}
-
+//================================================================
+// 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;
+}