-// Copyright (C) 2007-2010 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
#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
// 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)
{
}
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 );
// 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 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();
}
GEOM::GEOM_Object_var obj=*it;
displayPreview( obj, true, activate, false, lineWidth, displayMode, color );
if ( toRemoveFromEngine )
- obj->Destroy();
+ obj->UnRegister();
}
}
}
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() ||
//================================================================
// 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 )
//================================================================
// 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,
//================================================================
// 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,
// 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;
}
//================================================================
{
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;
}
// 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();
showError( msg );
return false;
}
-
- erasePreview( false );
+
+ if(erasePreviewFlag)
+ erasePreview( false );
bool result = false;
showError();
}
else {
- addSubshapesToStudy(); // add Subshapes if local selection
+ 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 ( aName.isEmpty() )
aName = GEOMBase::GetDefaultName( getPrefix( obj ) );
}
- addInStudy( obj, aName.toLatin1().constData() );
+ anEntryList << addInStudy( obj, aName.toLatin1().constData() );
// updateView=false
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->Destroy();
+ obj->UnRegister();
#endif
}
else {
if ( nbObjs ) {
commitCommand();
updateObjBrowser();
- SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") );
+ 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
catch( const SALOME::SALOME_Exception& e ) {
SalomeApp_Tools::QtCatchCorbaException( e );
abortCommand();
+ MESSAGE("Exception catched")
}
updateViewer();
+ MESSAGE("result ="<<result)
return result;
}
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 )
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()
{
}
//================================================================
-// Function : addSubshapesToFather
-// Purpose : Method to add Father Subshapes to Study if it`s not exist
+// Function : getSelected
+// Purpose : Get selected object by specified type
+//
+// Returns valid object if only one object of the specified type is selected
+// (no matter global or local selection is activated). If \a type is TopAbs_SHAPE,
+// geometrical object of any valid type is expected.
+//
+// \param type type of the object to be obtained from selection
+// \return selected geometrical object or nil object if selection is not satisfactory
+//================================================================
+GEOM::GeomObjPtr GEOMBase_Helper::getSelected( TopAbs_ShapeEnum type )
+{
+ QList<TopAbs_ShapeEnum> types;
+ types << type;
+ return getSelected( types );
+}
+
//================================================================
-void GEOMBase_Helper::addSubshapesToFather( QMap<QString, GEOM::GEOM_Object_var>& theMap )
+// 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 )
{
- //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<GEOM::GeomObjPtr> selected = getSelected( types, 1 );
+ return selected.count() > 0 ? selected[0] : GEOM::GeomObjPtr();
+}
- 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() ) {
- QString aFatherEntry = getEntry( aFatherObj );
- if ( aFatherEntry != "") { // additional checking that object is valid 0020598 EDF 1191
- GEOM::GEOM_Object_var aFindedObject = findObjectInFather(aFatherObj, it.key().toLatin1().data() );
- //Add Object to study if its not exist
- if ( aFindedObject->_is_nil() )
- GeometryGUI::GetGeomGen()->AddInStudy(GeometryGUI::ClientStudyToStudy(aDStudy),
- it.value(), it.key().toLatin1().data(), aFatherObj );
- }
+//================================================================
+// 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;
}