-// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016 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
// 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.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// 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 "GEOM_Operation.h"
#include <LightApp_SelectionMgr.h>
#include <LightApp_DataOwner.h>
#include <SalomeApp_Tools.h>
-#include <SALOME_ListIteratorOfListIO.hxx>
+#include <SALOME_ListIO.hxx>
+#include "utilities.h"
#include <SALOME_Prs.h>
+#include "utilities.h"
#include <OCCViewer_ViewModel.h>
#include <SVTK_ViewModel.h>
-#include <TColStd_MapOfInteger.hxx>
#include <TCollection_AsciiString.hxx>
#include <TColStd_IndexedMapOfInteger.hxx>
// Function : getActiveView
// Purpose : Get active view window, returns 0 if no open study frame
//================================================================
-static SUIT_ViewWindow* getActiveView()
+SUIT_ViewWindow* GEOMBase_Helper::getActiveView()
{
SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy();
if ( activeStudy )
// Purpose :
//================================================================
GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop )
- : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false ),
+ : myDisplayer( 0 ), myCommand( 0 ), myViewWindow( 0 ), isPreview( false ), myDesktop( desktop ),
myIsApplyAndClose( false ), myIsOptimizedBrowsing( false ), myIsWaitCursorEnabled( true ),
- myIsDisableBrowsing(false)
+ myIsDisableBrowsing(false), myIsDisplayResult(true)
{
}
const bool toRemoveFromEngine,
const double lineWidth,
const int displayMode,
- const int color )
+ const int color,
+ const bool append )
{
if(!display) {
erasePreview( update );
return;
}
- erasePreview( false );
+ if( !append )
+ erasePreview( false );
try {
SUIT_OverrideCursor wc;
const int displayMode,
const int color )
{
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+
// Set color for preview shape
getDisplayer()->SetColor( color == -1 ? Quantity_NOC_VIOLET : color );
// set width of displayed shape
- int lw = lineWidth;
- if(lw == -1) {
- SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
- lw = resMgr->integerValue("Geometry", "preview_edge_width", -1);
- }
- getDisplayer()->SetWidth( lw );
+ getDisplayer()->SetWidth( lineWidth == -1 ? resMgr->integerValue("Geometry", "preview_edge_width", -1) : lineWidth );
// set display mode of displayed shape
- int aPrevDispMode = getDisplayer()->SetDisplayMode( displayMode );
+ int aPrevDispMode = getDisplayer()->SetDisplayMode( displayMode == -1 ? resMgr->integerValue( "Geometry", "display_mode", 0 ) : displayMode );
// Disable activation of selection
getDisplayer()->SetToActivate( activate );
SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object );
if ( aPrs == 0 || aPrs->IsNull() )
return;
+
+ // Make preview not clippable
+ aPrs->SetClippable (false);
// Display prs
displayPreview( aPrs, append, update );
SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
if (aView)
- aView->Display( prs );
+ aView->Display( getDisplayer(), prs );
}
// Add prs to the preview list
// check view frame where the preview was displayed
bool vfOK = checkViewWindow() && myViewWindow;
// Iterate through presentations and delete them
- for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter ) {
+ for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter )
+ {
if ( vfOK )
+ {
+ SUIT_ViewManager* aViewManager = myViewWindow->getViewManager();
+ if ( aViewManager->getType() == OCCViewer_Viewer::Type() ||
+ aViewManager->getType() == SVTK_Viewer::Type() )
{
- 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_ViewModel* aViewModel = aViewManager->getViewModel();
+ SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
+ if (aView)
+ aView->Erase( getDisplayer(), *anIter, true );
}
+ }
delete *anIter;
}
myPreview.clear();
//================================================================
// Function : localSelection
// Purpose : Activate selection of sub-shapes in accordance with mode
-// theMode is from TopAbs_ShapeEnum
+// modes are from TopAbs_ShapeEnum
//================================================================
-void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode )
+void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const std::list<int> modes )
{
SALOME_ListIO aListOfIO;
anEntry.toLatin1().constData(), "GEOM", strdup( GEOMBase::GetName( anObj ).toLatin1().constData() ) ) );
}
- getDisplayer()->LocalSelection( aListOfIO, theMode );
+ getDisplayer()->LocalSelection( aListOfIO, modes );
}
//================================================================
// Purpose : Activate selection of sub-shapes in accordance with mode
// theMode is from TopAbs_ShapeEnum
//================================================================
-void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode )
+void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode )
+{
+ std::list<int> modes;
+ modes.push_back( theMode );
+ localSelection( theObjs, modes );
+}
+
+//================================================================
+// Function : localSelection
+// Purpose : Activate selection of sub-shapes in accordance with mode
+// modes are from TopAbs_ShapeEnum
+//================================================================
+void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const std::list<int> modes )
{
// If object is null local selection for all objects is activated
if ( obj->_is_nil() ) {
- getDisplayer()->LocalSelection( Handle(SALOME_InteractiveObject)(), mode );
+ getDisplayer()->LocalSelection( Handle(SALOME_InteractiveObject)(), modes );
return;
}
ObjectList objList;
objList.push_back( obj );
- localSelection( objList, mode );
+ localSelection( objList, modes );
+}
+
+//================================================================
+// Function : localSelection
+// Purpose : Activate selection of sub-shapes in accordance with mode
+// mode is from TopAbs_ShapeEnum
+//================================================================
+void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode )
+{
+ std::list<int> modes;
+ modes.push_back( mode );
+ localSelection( obj, modes );
+}
+
+//================================================================
+// Function : localSelection
+// Purpose : Activate selection of sub-shapes in accordance with mode
+// modes are from TopAbs_ShapeEnum
+//================================================================
+void GEOMBase_Helper::localSelection( const std::list<int> modes )
+{
+ localSelection( GEOM::GEOM_Object::_nil(), modes );
}
+//================================================================
+// Function : localSelection
+// Purpose : Activate selection of sub-shapes in accordance with mode
+// mode is from TopAbs_ShapeEnum
+//================================================================
+void GEOMBase_Helper::localSelection( const int mode )
+{
+ std::list<int> modes;
+ modes.push_back( mode );
+ localSelection( modes );
+}
//================================================================
// Function : globalSelection
getGeomEngine()->AddInStudy(aStudyDS, theObj, theName, aFatherObj);
QString anEntry;
- if ( !aSO->_is_nil() )
- anEntry = aSO->GetID();
-
+ if ( !aSO->_is_nil() ) {
+ CORBA::String_var entry = aSO->GetID();
+ anEntry = entry.in();
+ }
// Each dialog is responsible for this method implementation,
// default implementation does nothing
restoreSubShapes(aStudyDS, aSO);
//================================================================
void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
{
- if ( CORBA::is_nil( theObj ) )
- return;
-
- CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
- TCollection_AsciiString asciiIOR( (char *)IOR.in() );
- GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
-
- if ( !getStudy() || !getStudy()->studyDS() )
- return;
-
- _PTR(Study) aStudy = getStudy()->studyDS();
- _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
- if ( !aSObj )
- return;
-
- _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
- for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
- _PTR(GenericAttribute) anAttr;
- if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
- _PTR(AttributeIOR) anIOR ( anAttr );
- TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
- GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
- }
- }
+ GeometryGUI::ClearShapeBuffer(theObj);
}
//================================================================
//================================================================
bool GEOMBase_Helper::hasCommand() const
{
- bool res = (bool) myCommand;
return (bool)myCommand;
}
//================================================================
// Function : onAccept
// Purpose : This method should be called from dialog's slots onOk() and onApply()
-// It perfroms user input validation, then it
+// It performs user input validation, then it
// performs a proper operation and manages transactions, etc.
//================================================================
bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction, bool erasePreviewFlag )
showError();
}
else {
+ QList<GEOM::GeomObjPtr> anObjectList = getSourceObjects( );
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 ) {
+ int currObj = 1, aNumber = 1;
+ for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it, currObj++ ) {
GEOM::GEOM_Object_var obj=*it;
if ( publish ) {
- QString aName = getNewObjectName();
- if ( nbObjs > 1 ) {
- if (aName.isEmpty())
- aName = getPrefix(obj);
- if (nbObjs <= 30) {
- // Try to find a unique name
- aName = GEOMBase::GetDefaultName(aName, extractPrefix());
- } else {
- // Don't check name uniqueness in case of numerous objects
- aName = aName + "_" + QString::number(aNumber++);
- }
- } else {
- // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName()
- if ( aName.isEmpty() )
- aName = GEOMBase::GetDefaultName( getPrefix( obj ) );
+ QString aName = getObjectName(obj);
+ if (aName.isEmpty()) {
+ aName = getNewObjectName(currObj);
+ if ( nbObjs > 1 ) {
+ if (aName.isEmpty())
+ aName = getPrefix(obj);
+ if (nbObjs <= 30) {
+ // Try to find a unique name
+ aName = GEOMBase::GetDefaultName(aName, extractPrefix());
+ } else {
+ // Don't check name uniqueness in case of numerous objects
+ aName = aName + "_" + QString::number(aNumber++);
+ }
+ } else {
+ // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName()
+ if ( aName.isEmpty() )
+ aName = GEOMBase::GetDefaultName( getPrefix( obj ) );
+ }
}
anEntryList << addInStudy( obj, aName.toLatin1().constData() );
// updateView=false
- display( obj, false );
+ if( isDisplayResult() )
+ display( obj, false );
#ifdef WITHGENERICOBJ
// obj has been published in study. Its refcount has been incremented.
// It is safe to decrement its refcount
// was modified, and need to be re-cached in GEOM_Client before redisplay
clearShapeBuffer( obj );
// withChildren=true, updateView=false
- redisplay( obj, true, false );
+ if( isDisplayResult() )
+ redisplay( obj, true, false );
}
}
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() );
+ if(aLightApp) {
+ QString anOpName( typeid(*this).name() );
+ aLightApp->emitOperationFinished( "Geometry", anOpName, anEntryList );
+
+ if ( !isDisableBrowsing() )
+ aLightApp->browseObjects( anEntryList, isApplyAndClose(), isOptimizedBrowsing() );
+ }
anApp->putInfo( QObject::tr("GEOM_PRP_DONE") );
}
+ if ( anObjectList.count() > 0 )
+ hideSourceObjects( anObjectList );
result = true;
}
else
catch( const SALOME::SALOME_Exception& e ) {
SalomeApp_Tools::QtCatchCorbaException( e );
abortCommand();
- MESSAGE("Exception catched")
+ MESSAGE("Exception caught")
}
updateViewer();
return GEOM::GEOM_Object::_nil();
}
+//================================================================
+// Function : getObjectName
+// Purpose : Redefine this method to return proper name for the given object
+//================================================================
+QString GEOMBase_Helper::getObjectName(GEOM::GEOM_Object_ptr object) const
+{
+ return QString();
+}
+
//================================================================
// Function : getNewObjectName
// Purpose : Redefine this method to return proper name for a new object
//================================================================
-QString GEOMBase_Helper::getNewObjectName() const
+QString GEOMBase_Helper::getNewObjectName (int) const
{
- return QString::null;
+ return QString();
}
//================================================================
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(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;
- }
- }
- }
+ for ( ; it->More(); it->Next() ) {
+ GEOM::GEOM_Object_var cobject = GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( it->Value() ) );
+ if ( !CORBA::is_nil( cobject ) ) {
+ GEOM::ListOfLong_var indices = cobject->GetSubShapeIndices();
+ int length = indices->length();
+ // VSR 18/03/2014: we need only sub-shapes with single sub-shape index (to exclude groups, etc)
+ if ( length == 1 && indices[0] == theIndex ) {
+ object = cobject;
+ break;
+ }
+ }
}
}
}
//Impemented in Dialogs, called from Accept method
}
+//================================================================
+// Function : getSourceObjects
+// Purpose : Virtual method to get source objects
+//================================================================
+QList<GEOM::GeomObjPtr> GEOMBase_Helper::getSourceObjects()
+{
+ //Impemented in Dialogs, called from Accept method
+ QList<GEOM::GeomObjPtr> res;
+ return res;
+}
+
//================================================================
// Function : getSelected
// Purpose : Get selected object by specified type
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;
- }
- }
- }
- }
+ 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;
+ }
+ }
+ }
+ }
}
}
}
return result;
}
+//================================================================
+// Function : hideSourceObject
+// Purpose :
+//================================================================
+void GEOMBase_Helper::hideSourceObjects( QList<GEOM::GeomObjPtr> theObject )
+{
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+ if ( resMgr->booleanValue( "Geometry", "hide_input_object", true) ) {
+ GEOM_Displayer* aDisplayer = getDisplayer();
+ for ( int i = 0; i < theObject.count(); i++ )
+ aDisplayer->Erase( theObject[i].get() );
+ }
+}
//================================================================
// Function : setIsApplyAndClose