-// Copyright (C) 2007-2011 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
#include "SMESHGUI_TransparencyDlg.h"
#include "SMESHGUI_DuplicateNodesDlg.h"
#include "SMESHGUI_CopyMeshDlg.h"
+#include "SMESHGUI_ReorientFacesDlg.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_MeshUtils.h"
#include <SalomeApp_Study.h>
#include <SalomeApp_Application.h>
#include <SalomeApp_CheckFileDlg.h>
+#include <SalomeApp_DataObject.h>
#include <LightApp_DataOwner.h>
#include <LightApp_Preferences.h>
// Qt includes
// #define INCLUDE_MENUITEM_DEF // VSR commented ????????
+#include <QApplication>
#include <QMenu>
#include <QTextStream>
SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
- SALOME_ListIteratorOfListIO It(selected);
-
- aStudyBuilder->NewCommand(); // There is a transaction
- for( ; It.More(); It.Next()){ // loop on selected IO's
- Handle(SALOME_InteractiveObject) IObject = It.Value();
- if(IObject->hasEntry()) {
- _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
-
- // disable removal of "SMESH" component object
- if(aSO->FindAttribute(anAttr, "AttributeIOR")){
- anIOR = anAttr;
- if ( engineIOR() == anIOR->Value().c_str() )
- continue;
- }
- //Check the referenced object
- _PTR(SObject) aRefSObject;
- if ( aSO && aSO->ReferencedObject( aRefSObject ) )
- aSO = aRefSObject; // Delete main Object instead of reference
-
- // put the whole hierarchy of sub-objects of the selected SO into a list and
- // then treat them all starting from the deepest objects (at list back)
-
- std::list< _PTR(SObject) > listSO;
- listSO.push_back( aSO );
- std::list< _PTR(SObject) >::iterator itSO = listSO.begin();
- for ( ; itSO != listSO.end(); ++itSO ) {
- _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
- for (it->InitEx(false); it->More(); it->Next())
- listSO.push_back( it->Value() );
- }
-
- // treat SO's in the list starting from the back
-
- std::list< _PTR(SObject) >::reverse_iterator ritSO = listSO.rbegin();
- for ( ; ritSO != listSO.rend(); ++ritSO ) {
- _PTR(SObject) SO = *ritSO;
- if ( !SO ) continue;
- std::string anEntry = SO->GetID();
-
- /** Erase graphical object **/
- if(SO->FindAttribute(anAttr, "AttributeIOR")){
- ViewManagerList aViewMenegers = anApp->viewManagers();
- ViewManagerList::const_iterator it = aViewMenegers.begin();
- for( ; it != aViewMenegers.end(); it++) {
- SUIT_ViewManager* vm = *it;
- int nbSf = vm ? vm->getViewsCount() : 0;
- if(vm) {
- QVector<SUIT_ViewWindow*> aViews = vm->getViews();
- for(int i = 0; i < nbSf; i++){
- SUIT_ViewWindow *sf = aViews[i];
- if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){
- SMESH::RemoveActor(sf,anActor);
- }
- }
+ // Put the whole hierarchy of sub-objects of the selected SO's into a list and
+ // then treat them all starting from the deepest objects (at list back)
+ std::list< _PTR(SObject) > listSO;
+ SALOME_ListIteratorOfListIO It(selected);
+ for( ; It.More(); It.Next()) // loop on selected IO's
+ {
+ Handle(SALOME_InteractiveObject) IObject = It.Value();
+ if(IObject->hasEntry()) {
+ _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
+
+ // disable removal of "SMESH" component object
+ if(aSO->FindAttribute(anAttr, "AttributeIOR")){
+ anIOR = anAttr;
+ if ( engineIOR() == anIOR->Value().c_str() )
+ continue;
+ }
+ //Check the referenced object
+ _PTR(SObject) aRefSObject;
+ if ( aSO && aSO->ReferencedObject( aRefSObject ) )
+ aSO = aRefSObject; // Delete main Object instead of reference
+
+ listSO.push_back( aSO );
+ std::list< _PTR(SObject) >::iterator itSO = listSO.begin();
+ for ( ; itSO != listSO.end(); ++itSO ) {
+ _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
+ for (it->InitEx(false); it->More(); it->Next())
+ listSO.push_back( it->Value() );
+ }
+ }
+ }
+ // Check if none of objects to delete is referred from outside
+ std::list< _PTR(SObject) >::reverse_iterator ritSO;
+ for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
+ {
+ _PTR(SObject) SO = *ritSO;
+ if ( !SO ) continue;
+ std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO );
+ for (size_t i = 0; i < aReferences.size(); i++) {
+ _PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent();
+ std::string type = aComponent->ComponentDataType();
+ if ( type != "SMESH" )
+ {
+ SUIT_MessageBox::warning( anApp->desktop(),
+ QObject::tr("WRN_WARNING"),
+ QObject::tr("DEP_OBJECT") );
+ return; // outside SMESH, there is an object depending on a SMESH object
+ }
+ }
+ }
+
+ // Treat SO's in the list starting from the back
+ aStudyBuilder->NewCommand(); // There is a transaction
+ for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
+ {
+ _PTR(SObject) SO = *ritSO;
+ if ( !SO ) continue;
+ std::string anEntry = SO->GetID();
+
+ /** Erase graphical object **/
+ if(SO->FindAttribute(anAttr, "AttributeIOR")){
+ ViewManagerList aViewMenegers = anApp->viewManagers();
+ ViewManagerList::const_iterator it = aViewMenegers.begin();
+ for( ; it != aViewMenegers.end(); it++) {
+ SUIT_ViewManager* vm = *it;
+ int nbSf = vm ? vm->getViewsCount() : 0;
+ if(vm) {
+ QVector<SUIT_ViewWindow*> aViews = vm->getViews();
+ for(int i = 0; i < nbSf; i++){
+ SUIT_ViewWindow *sf = aViews[i];
+ if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){
+ SMESH::RemoveActor(sf,anActor);
}
}
}
- /** Remove an object from data structures **/
- SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
- SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
- if ( !aGroup->_is_nil() ) { // DELETE GROUP
- SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
- aMesh->RemoveGroup( aGroup );
- }
- else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH
- SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
- aMesh->RemoveSubMesh( aSubMesh );
-
- _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
- if (aMeshSO)
- SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
- }
- else {
- IObject = new SALOME_InteractiveObject
- ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
- QString objType = CheckTypeObject(IObject);
- if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
- SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
- aStudyBuilder->RemoveObjectWithChildren( SO );
- }
- else {// default action: remove SObject from the study
- // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
- //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
- //op->start();
- aStudyBuilder->RemoveObjectWithChildren( SO );
- //op->finish();
- }
- }
- } /* listSO back loop */
- } /* IObject->hasEntry() */
- } /* more/next */
-
+ }
+ }
+ /** Remove an object from data structures **/
+ SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
+ SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
+ if ( !aGroup->_is_nil() ) { // DELETE GROUP
+ SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
+ aMesh->RemoveGroup( aGroup );
+ }
+ else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH
+ SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
+ aMesh->RemoveSubMesh( aSubMesh );
+
+ _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
+ if (aMeshSO)
+ SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
+ }
+ else {
+ Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject
+ ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
+ QString objType = CheckTypeObject(IObject);
+ if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
+ SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
+ aStudyBuilder->RemoveObjectWithChildren( SO );
+ }
+ else {// default action: remove SObject from the study
+ // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
+ //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
+ //op->start();
+ aStudyBuilder->RemoveObjectWithChildren( SO );
+ //op->finish();
+ }
+ }
+ } /* listSO back loop */
+
aStudyBuilder->CommitCommand();
/* Clear any previous selection */
SMESHGUI::GetSMESHGUI()->updateObjBrowser();
}
-//}
+//} namespace
extern "C" {
SMESHGUI_EXPORT CAM_Module* createModule()
myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
myComponentSMESH->SetDefaultNbSegments( nbSeg );
- if ( aResourceMgr->hasValue( "SMESH", "historical_python_dump" ))
- {
- QString val = aResourceMgr->stringValue( "SMESH", "historical_python_dump" );
- myComponentSMESH->SetOption( "historical_python_dump", val.toLatin1().constData() );
- }
+
+ const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif" };
+ for ( size_t i = 0; i < sizeof(options)/sizeof(char*); ++i )
+ if ( aResourceMgr->hasValue( "SMESH", options[i] ))
+ {
+ QString val = aResourceMgr->stringValue( "SMESH", options[i] );
+ myComponentSMESH->SetOption( options[i], val.toLatin1().constData() );
+ }
}
myActiveDialogBox = 0;
case 1134: // Clipping
case 1133: // Tranparency
- case 1132: // Colors / Size
+ case 1132: // Display preferences (colors, shrink size, line width, ...)
// Display Mode
case 215: // Nodes
break;
}
- case 701: // COMPUTE MESH
- case 711: // PRECOMPUTE MESH
- case 712: // EVALUATE MESH
- case 713: // MESH ORDER
- {
- if (checkLock(aStudy)) break;
- startOperation( theCommandID );
- }
- break;
-
+ case 701: // COMPUTE MESH
+ case 711: // PRECOMPUTE MESH
+ case 712: // EVALUATE MESH
+ case 713: // MESH ORDER
case 702: // Create mesh
case 703: // Create sub-mesh
case 704: // Edit mesh/sub-mesh
break;
}
case 417: // Convert mesh to quadratic
- {
- startOperation( 417 );
- /* if (checkLock(aStudy)) break;
- if (vtkwnd) {
- EmitSignalDeactivateDialog();
- new SMESHGUI_ConvToQuadDlg();
- } else {
- SUIT_MessageBox::warning(desktop(),
- tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
- }*/
- break;
- }
case 418: // create 2D mesh from 3D
+ case 420: // Reorient faces
+ case 806: // CREATE GEO GROUP
{
- startOperation( 418 );
- break;
- }
- case 806: // CREATE GEO GROUP
- {
- startOperation( 806 );
+ startOperation( theCommandID );
break;
}
case 801: // CREATE GROUP
// ----- create actions --------------
- createSMESHAction( 111, "DAT", "", (Qt::CTRL+Qt::Key_B) );
- createSMESHAction( 112, "UNV", "", (Qt::CTRL+Qt::Key_U) );
- createSMESHAction( 113, "MED", "", (Qt::CTRL+Qt::Key_M) );
+ createSMESHAction( 111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
+ createSMESHAction( 112, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_U) );
+ createSMESHAction( 113, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
createSMESHAction( 114, "NUM" );
- createSMESHAction( 115, "STL" );
- createSMESHAction( 116, "CGNS" );
- createSMESHAction( 117, "SAUV" );
+ createSMESHAction( 115, "IMPORT_STL" );
+ createSMESHAction( 116, "IMPORT_CGNS" );
+ createSMESHAction( 117, "IMPORT_SAUV" );
createSMESHAction( 121, "DAT" );
createSMESHAction( 122, "MED" );
createSMESHAction( 123, "UNV" );
createSMESHAction( 417, "CONV_TO_QUAD", "ICON_CONV_TO_QUAD" );
createSMESHAction( 418, "2D_FROM_3D", "ICON_2D_FROM_3D" );
createSMESHAction( 419, "SPLIT_TO_TETRA", "ICON_SPLIT_TO_TETRA" );
+ createSMESHAction( 420, "REORIENT_2D", "ICON_REORIENT_2D" );
createSMESHAction( 200, "RESET" );
createSMESHAction( 201, "SCALAR_BAR_PROP" );
createSMESHAction( 2021, "SAVE_DISTRIBUTION" );
createSMESHAction( 501, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
createSMESHAction( 502, "MEASURE_BND_BOX", "ICON_MEASURE_BND_BOX" );
- createSMESHAction( 300, "ERASE" );
- createSMESHAction( 301, "DISPLAY" );
+ createSMESHAction( 300, "HIDE" );
+ createSMESHAction( 301, "SHOW" );
createSMESHAction( 302, "DISPLAY_ONLY" );
// ----- create menu --------------
createMenu( 407, modifyId, -1 );
createMenu( 408, modifyId, -1 );
createMenu( 409, modifyId, -1 );
+ createMenu( 420, modifyId, -1 );
createMenu( 410, modifyId, -1 );
createMenu( 411, modifyId, -1 );
createMenu( 419, modifyId, -1 );
createTool( 407, modifyTb );
createTool( 408, modifyTb );
createTool( 409, modifyTb );
+ createTool( 420, modifyTb );
createTool( 410, modifyTb );
createTool( 411, modifyTb );
createTool( 419, modifyTb );
#endif
createPopupItem( 145, OB, mesh_group, multiple_non_empty ); // EXPORT_SAUV
createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE
+ createPopupItem( 813, OB, group ); // DEL_GROUP with contents
popupMgr()->insert( separator(), -1, 0 );
// popup for viewer
setPreferenceProperty( nbSeg, "min", 1 );
setPreferenceProperty( nbSeg, "max", 10000000 );
+ int loadGroup = addPreference( tr( "SMESH_PREF_MESH_LOADING" ), genTab );
+ addPreference( tr( "PREF_FORGET_MESH_AT_HYP_MODIF" ), loadGroup, LightApp_Preferences::Bool,
+ "SMESH", "forget_mesh_on_hyp_modif" );
+
+
// Quantities with individual precision settings
int precGroup = addPreference( tr( "SMESH_PREF_GROUP_PRECISION" ), genTab );
setPreferenceProperty( precGroup, "columns", 2 );
int nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
myComponentSMESH->SetDefaultNbSegments( nbSeg );
}
- else if ( name == "historical_python_dump" ) {
- QString val = aResourceMgr->stringValue( "SMESH", "historical_python_dump" );
- myComponentSMESH->SetOption( "historical_python_dump", val.toLatin1().constData() );
+ else if ( name == "historical_python_dump" ||
+ name == "forget_mesh_on_hyp_modif") {
+ QString val = aResourceMgr->stringValue( "SMESH", name );
+ myComponentSMESH->SetOption( name.toLatin1().constData(), val.toLatin1().constData() );
}
if(aWarning.size() != 0){
case 418: // create 2D mesh as boundary on 3D
op = new SMESHGUI_Make2DFrom3DOp();
break;
+ case 420: // Reorient faces
+ op = new SMESHGUI_ReorientFacesOp();
+ break;
case 701: // Compute mesh
op = new SMESHGUI_ComputeOp();
break;
#endif
}
+void SMESHGUI::message( const QString& msg )
+{
+ // dispatch message
+ QStringList data = msg.split("/");
+ if ( data.count() > 0 ) {
+ if ( data.first() == "mesh_loading" ) {
+ // get mesh entry
+ QString entry = data.count() > 1 ? data[1] : QString();
+ if ( entry.isEmpty() )
+ return;
+ // get study
+ _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() )->studyDS();
+ // get mesh name
+ _PTR(SObject) obj = study->FindObjectID( entry.toLatin1().constData() );
+ QString name;
+ if ( obj )
+ name = obj->GetName().c_str();
+ if ( name.isEmpty() )
+ return;
+
+ if ( data.last() == "stop" )
+ application()->putInfo( tr( "MESH_LOADING_MSG_FINISHED" ).arg( name ) );
+ else
+ application()->putInfo( tr( "MESH_LOADING_MSG" ).arg( name ) );
+ QApplication::processEvents();
+ }
+ }
+}
+
/*!
\brief Connects or disconnects signals about activating and cloning view on the module slots
\param pview view which is connected/disconnected
if( !anApp )
return false;
- _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
- if( !aStudy )
+ SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
+ if( !appStudy )
return false;
- bool appRes = SalomeApp_Module::renameAllowed(entry);
- if( !appRes )
+ SalomeApp_DataObject* obj = dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry));
+
+ if(!obj)
+ return false;
+
+ if(appStudy->isComponent(entry) || obj->isReference())
return false;
// check type to prevent renaming of inappropriate objects
- int aType = SMESHGUI_Selection::type(qPrintable(entry), aStudy);
+ int aType = SMESHGUI_Selection::type(qPrintable(entry), SMESH::GetActiveStudyDocument());
if (aType == MESH || aType == GROUP ||
aType == SUBMESH || aType == SUBMESH_COMPOUND ||
aType == SUBMESH_SOLID || aType == SUBMESH_FACE ||
SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
if( !anApp )
return false;
+
+ SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
- _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
- if( !aStudy )
+ if(!appStudy)
return false;
-
- bool appRes = SalomeApp_Module::renameObject(entry,name);
- if( !appRes )
+
+ _PTR(Study) aStudy = appStudy->studyDS();
+
+ if(!aStudy)
+ return false;
+
+ bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
+ if ( aLocked ) {
+ SUIT_MessageBox::warning ( anApp->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
return false;
+ }
+
_PTR(SObject) obj = aStudy->FindObjectID( qPrintable(entry) );
_PTR(GenericAttribute) anAttr;
if ( obj->FindAttribute(anAttr, "AttributeName") ) {
aName = anAttr;
// check type to prevent renaming of inappropriate objects
- int aType = SMESHGUI_Selection::type( qPrintable(entry), aStudy );
+ int aType = SMESHGUI_Selection::type( qPrintable(entry), SMESH::GetActiveStudyDocument() );
if (aType == MESH || aType == GROUP ||
aType == SUBMESH || aType == SUBMESH_COMPOUND ||
aType == SUBMESH_SOLID || aType == SUBMESH_FACE ||