-// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// File : GEOMBase_Helper.cxx
// Author : Sergey ANIKIN, Open CASCADE S.A.S. (sergey.anikin@opencascade.com)
+#include <QRegExp>
+
#include "GEOMBase_Helper.h"
#include "GEOMBase.h"
#include "GEOM_Operation.h"
#include <LightApp_DataOwner.h>
#include <SalomeApp_Tools.h>
#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 : GEOMBase_Helper
// Purpose :
//================================================================
-GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop )
- : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false ),
+GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop, SUIT_ViewWindow* aVW )
+ : myDisplayer( 0 ), myCommand( 0 ), myViewWindow( aVW ), isPreview( false ), myDesktop( desktop ),
myIsApplyAndClose( false ), myIsOptimizedBrowsing( false ), myIsWaitCursorEnabled( true ),
myIsDisableBrowsing(false), myIsDisplayResult(true)
{
{
// 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())
+
+ MESSAGE("GEOMBase_Helper::display myTexture = "<<getDisplayer()->GetTexture());
// Enable activisation of selection
getDisplayer()->SetToActivate( true );
{
if ( !object->_is_nil() ) {
QString entry = getEntry( object );
- getDisplayer()->Erase( new SALOME_InteractiveObject(
- entry.toLatin1().constData(),
- "GEOM", strdup( GEOMBase::GetName( object ).toLatin1().constData() ) ), true, updateView );
+ QString name = GEOMBase::GetName( object );
+ getDisplayer()->Erase ( new SALOME_InteractiveObject(entry.toUtf8().constData(),
+ "GEOM",
+ name.toUtf8().constData() ),
+ true, updateView );
}
}
getDisplayer()->SetToActivate( true );
QString entry = getEntry( object );
- getDisplayer()->Redisplay(new SALOME_InteractiveObject
- (entry.toLatin1().constData(), "GEOM", strdup(GEOMBase::GetName(object).toLatin1().constData())), false);
+ QString name = GEOMBase::GetName( object );
+ getDisplayer()->Redisplay
+ (new SALOME_InteractiveObject (entry.toUtf8().constData(),
+ "GEOM",
+ name.toUtf8().constData()),
+ false);
}
if ( withChildren ) {
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 );
+ QString name = GEOMBase::GetName( aChild );
+ getDisplayer()->Redisplay
+ ( new SALOME_InteractiveObject( entry.toUtf8().constData(),
+ "GEOM",
+ name.toUtf8().constData() ),
+ false );
}
}
}
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->UnRegister();
+ obj->UnRegister();
}
}
}
const int displayMode,
const int color )
{
- SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
// Set color for preview shape
getDisplayer()->SetColor( color == -1 ? Quantity_NOC_VIOLET : color );
SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object );
if ( aPrs == 0 || aPrs->IsNull() )
return;
-
+
// Make preview not clippable
aPrs->SetClippable (false);
if ( myViewWindow == 0 )
return;
-
+
// Display prs
SUIT_ViewManager* aViewManager = myViewWindow->getViewManager();
if ( aViewManager->getType() == OCCViewer_Viewer::Type() ||
aViewManager->getType() == SVTK_Viewer::Type() )
- {
- SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
- SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
- if (aView)
- aView->Display( getDisplayer(), prs );
- }
+ {
+ SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
+ SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
+ if (aView)
+ aView->Display( getDisplayer(), prs );
+ }
// Add prs to the preview list
myPreview.push_back( (SALOME_Prs*)prs );
continue;
QString anEntry = getEntry( anObj );
if ( anEntry != "" )
- aListOfIO.Append( new SALOME_InteractiveObject(
- anEntry.toLatin1().constData(), "GEOM", strdup( GEOMBase::GetName( anObj ).toLatin1().constData() ) ) );
+ {
+ //MESSAGE("anEntry: "<< anEntry.toStdString().c_str());
+ QString aName = GEOMBase::GetName( anObj );
+ aListOfIO.Append( new SALOME_InteractiveObject( anEntry.toUtf8().constData(),
+ "GEOM", aName.toUtf8().constData() ));
+ }
}
getDisplayer()->LocalSelection( aListOfIO, modes );
localSelection( obj, modes );
}
+//================================================================
+// Function : localSelection
+// Purpose : Activate selection of sub-shapes in accordance with mode
+// mode is from TopAbs_ShapeEnum
+//================================================================
+void GEOMBase_Helper::localSelection( const std::string& entry, const std::string& name, const std::list<int> modes)
+{
+ SALOME_ListIO aListOfIO;
+ QString aName = name.c_str();
+ aListOfIO.Append( new SALOME_InteractiveObject( entry.c_str(),
+ "GEOM", aName.toUtf8().constData() ));
+ getDisplayer()->LocalSelection( aListOfIO, 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
// Purpose : Activate selection of sub-shapes. Set selection filters
if ( !aStudy || theObj->_is_nil() )
return QString();
- SALOMEDS::Study_var aStudyDS = GeometryGUI::ClientStudyToStudy(aStudy);
-
GEOM::GEOM_Object_ptr aFatherObj = getFather( theObj );
SALOMEDS::SObject_var aSO =
- getGeomEngine()->AddInStudy(aStudyDS, theObj, theName, aFatherObj);
+ getGeomEngine()->AddInStudy(theObj, theName, aFatherObj);
QString anEntry;
if ( !aSO->_is_nil() ) {
}
// Each dialog is responsible for this method implementation,
// default implementation does nothing
- restoreSubShapes(aStudyDS, aSO);
+ restoreSubShapes(aSO);
aSO->UnRegister();
return anEntry;
// Function : restoreSubShapes
// Purpose : restore tree of argument's sub-shapes under the resulting shape
//================================================================
-void GEOMBase_Helper::restoreSubShapes (SALOMEDS::Study_ptr /*theStudy*/,
- SALOMEDS::SObject_ptr /*theSObject*/)
+void GEOMBase_Helper::restoreSubShapes (SALOMEDS::SObject_ptr /*theSObject*/)
{
// do nothing by default
// example of implementation in particular dialog:
// GEOM::ListOfGO anArgs;
// anArgs.length(0); // empty list means that all arguments should be restored
- // getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, anArgs,
+ // getGeomEngine()->RestoreSubShapesSO(theSObject, anArgs,
// /*theFindMethod=*/GEOM::FSM_GetInPlace,
// /*theInheritFirstArg=*/false);
}
CAM_Module* module = app->module( "Geometry" );
SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>( module );
if ( appMod ) {
- appMod->updateObjBrowser( true );
+ appMod->updateObjBrowser();
}
}
}
getDisplayer()->UpdateViewer();
}
-//================================================================
-// Function : getStudyId
-// Purpose : Get study Id
-//================================================================
-int GEOMBase_Helper::getStudyId() const
-{
- int anId = -1;
- if ( getStudy() )
- anId = getStudy()->id();
- return anId;
-}
-
//================================================================
// Function : getStudy
// Purpose : Returns the active study. It is recommended to use
SUIT_Application* anApp = 0;
QListIterator<SUIT_Application*> it( anAppList );
while ( it.hasNext() )
- {
- anApp = it.next();
- if ( anApp && anApp->desktop() == aDesktop )
- break;
- }
+ {
+ anApp = it.next();
+ if ( anApp && anApp->desktop() == aDesktop )
+ break;
+ }
return dynamic_cast<SalomeApp_Study*>(anApp->activeStudy());
}
if ( study ) {
QString objIOR = GEOMBase::GetIORFromObject( object );
if ( objIOR != "" ) {
- _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( objIOR.toLatin1().constData() ) );
+ _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( objIOR.toUtf8().constData() ) );
if ( SO )
return QString::fromStdString(SO->GetID());
}
GEOM_Displayer* GEOMBase_Helper::getDisplayer()
{
if ( !myDisplayer )
- myDisplayer = new GEOM_Displayer( getStudy() );
+ myDisplayer = new GEOM_Displayer();
return myDisplayer;
}
bool res = false;
if ( !getStudy() || hasCommand() )
{
- MESSAGE("Getting out from openCommand()")
- return res;
+ MESSAGE("Getting out from openCommand()");
+ return res;
}
GEOM::GEOM_IOperations_var anOp = GEOM::GEOM_IOperations::_narrow( getOperation() );
}
else
{
- MESSAGE("anOp->_is_nil() = true")
+ MESSAGE("anOp->_is_nil() = true");
}
return res;
QList<SUIT_ViewWindow*> aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows();
QListIterator<SUIT_ViewWindow*> it( aViewWindowsList );
while ( it.hasNext() )
- {
- if ( myViewWindow == it.next() )
- return true;
- }
+ {
+ if ( myViewWindow == it.next() )
+ return true;
+ }
}
myViewWindow = 0;
return false;
//================================================================
// Function : onAccept
// Purpose : This method should be called from dialog's slots onOk() and onApply()
-// It perfroms user input validation, then it
+// It 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 )
{
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
- if ( !appStudy )
+ if ( !appStudy )
{
- MESSAGE("appStudy is empty")
- return false;
+ MESSAGE("appStudy is empty");
+ return false;
}
_PTR(Study) aStudy = appStudy->studyDS();
showError( msg );
return false;
}
-
+
if(erasePreviewFlag)
erasePreview( false );
showError();
}
else {
+ QList<GEOM::GeomObjPtr> anObjectList = getSourceObjects( );
addSubshapesToStudy(); // add Sub-shapes if local selection
const int nbObjs = objects.size();
QStringList anEntryList;
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 ) );
- }
+ 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() );
+ anEntryList << addInStudy( obj, aName.toUtf8().constData() );
// updateView=false
if( isDisplayResult() )
display( obj, false );
}
if ( nbObjs ) {
+ const QString anOpName( typeid(*this).name() );
+ // The operator name may have the following format: 24PrimitiveGUI_CylinderDlg
+ // clean it up to get the simple operator (here Cylinder) name into the log.
+ const QRegExp rx("^[^\w]*_(.*)Dlg$");
+ const int pos = rx.indexIn(anOpName);
+ SalomeApp_Application::logStructuredUserEvent( "Geom",
+ "geometry",
+ pos == -1 ? anOpName : rx.cap(1),
+ "applied" );
commitCommand();
updateObjBrowser();
if( SUIT_Application* anApp = SUIT_Session::session()->activeApplication() ) {
LightApp_Application* aLightApp = dynamic_cast<LightApp_Application*>( anApp );
if(aLightApp) {
- QString anOpName( typeid(*this).name() );
aLightApp->emitOperationFinished( "Geometry", anOpName, anEntryList );
if ( !isDisableBrowsing() )
}
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();
- MESSAGE("result ="<<result)
+ MESSAGE("result ="<<result);
return result;
}
//================================================================
// Function : showError
-// Purpose : Shows a message box with infromation about an error taken from getOperation()->GetErrorCode()
+// Purpose : Shows a message box with information about an error taken from getOperation()->GetErrorCode()
//================================================================
void GEOMBase_Helper::showError()
{
// It should perform the required operation and put all new or modified objects into
// <objects> argument.Should return <false> if some error occurs during its execution.
//================================================================
-bool GEOMBase_Helper::execute( ObjectList& objects )
+bool GEOMBase_Helper::execute( ObjectList& )
{
return false;
}
// for <theObj> or a nil reference if <theObj> should be published
// as a top-level object.
//================================================================
-GEOM::GEOM_Object_ptr GEOMBase_Helper::getFather( GEOM::GEOM_Object_ptr theObj )
+GEOM::GEOM_Object_ptr GEOMBase_Helper::getFather( GEOM::GEOM_Object_ptr )
{
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
+QString GEOMBase_Helper::getObjectName( GEOM::GEOM_Object_ptr ) const
{
return QString();
}
// Function : getNewObjectName
// Purpose : Redefine this method to return proper name for a new object
//================================================================
-QString GEOMBase_Helper::getNewObjectName (int) const
+QString GEOMBase_Helper::getNewObjectName( int ) const
{
return QString();
}
switch ( aType )
{
- 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 "";
+ 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 "";
}
}
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
_PTR(Study) aDStudy = appStudy->studyDS();
QString IOR = GEOMBase::GetIORFromObject( theFather );
- _PTR(SObject) SObj ( aDStudy->FindObjectIOR( IOR.toLatin1().constData() ) );
+ _PTR(SObject) SObj ( aDStudy->FindObjectIOR( IOR.toUtf8().constData() ) );
bool inStudy = false;
GEOM::GEOM_Object_var aReturnObject;
}
if (inStudy)
return aReturnObject._retn();
-
+
return GEOM::GEOM_Object::_nil();
}
int theIndex )
{
GEOM::GEOM_Object_var object;
-
+
SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
if ( study ) {
_PTR(Study) studyDS = study->studyDS();
}
}
}
-
+
return object._retn();
}
//================================================================
void GEOMBase_Helper::addSubshapesToStudy()
{
- //Impemented in Dialogs, called from Accept method
+ //Implemented in Dialogs, called from Accept method
+}
+
+//================================================================
+// Function : getSourceObjects
+// Purpose : Virtual method to get source objects
+//================================================================
+QList<GEOM::GeomObjPtr> GEOMBase_Helper::getSourceObjects()
+{
+ //Implemented in Dialogs, called from Accept method
+ QList<GEOM::GeomObjPtr> res;
+ return res;
}
//================================================================
// 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
//================================================================
// (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
//================================================================
//
// 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.
+// 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.
// 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
//
// 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.
+// 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.
// 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
GEOM::GeomObjPtr subShape = findObjectInFather( object.get(), idx );
if ( !subShape ) {
// sub-shape is not yet published in the study
- GEOM::ShapesOpPtr shapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
+ GEOM::ShapesOpPtr shapesOp = getGeomEngine()->GetIShapesOperations();
subShape.take( shapesOp->GetSubShape( object.get(), idx ) ); // take ownership!
}
if ( typeInList( (TopAbs_ShapeEnum)(subShape->GetShapeType()), types ) ) {
}
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