#include <SALOMEDS_Study.hxx>
#include <SALOMEDS_SObject.hxx>
#include "utilities.h"
+#include <SALOME_LifeCycleCORBA.hxx>
// OCCT includes
#include <Standard_ErrorHandler.hxx>
}
}
+ // Break link with Shaper model
+ void breakShaperLink()
+ {
+ LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+ SALOME_ListIO selected;
+ if (aSel) {
+ aSel->selectedObjects(selected);
+ if (selected.Extent()) {
+ Handle(SALOME_InteractiveObject) anIObject = selected.First();
+ _PTR(Study) aStudy = SMESH::getStudy();
+ std::string aEntry = anIObject->getEntry();
+ _PTR(SObject) aSObj = aStudy->FindObjectID(aEntry);
+ if (aSObj) {
+ std::string aName = aSObj->GetName();
+ QMessageBox::StandardButton aRes = SUIT_MessageBox::warning(SMESHGUI::desktop(),
+ QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("MSG_BREAK_SHAPER_LINK").arg(aName.c_str()),
+ SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No);
+ if (aRes == SUIT_MessageBox::Yes) {
+ SUIT_DataOwnerPtrList aList;
+ aSel->selected(aList, "ObjectBrowser", true);
+ SUIT_DataOwner* aOwn = aList.first();
+ LightApp_DataOwner* sowner = dynamic_cast<LightApp_DataOwner*>(aOwn);
+ QString aREntry = sowner->entry();
+
+ static GEOM::GEOM_Gen_var geomGen;
+ if (CORBA::is_nil(geomGen)) {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ (SUIT_Session::session()->activeApplication());
+ if (app) {
+ SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA(app->namingService());
+ Engines::EngineComponent_var comp =
+ ls->FindOrLoad_Component("FactoryServer", "SHAPERSTUDY");
+ geomGen = GEOM::GEOM_Gen::_narrow(comp);
+ }
+ }
+ if (!CORBA::is_nil(geomGen))
+ {
+ geomGen->BreakLink(aREntry.toStdString().c_str());
+ SMESHGUI::GetSMESHGUI()->updateObjBrowser();
+
+ // remove actors whose objects are removed by BreakLink()
+ QList<SUIT_ViewWindow*> wndList = SMESHGUI::desktop()->windows();
+ SUIT_ViewWindow* wnd;
+ foreach(wnd, wndList)
+ SMESH::UpdateActorsAfterUpdateStudy(wnd);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //================================================================================
+ /*!
+ * \brief Return true if a mesh icon == ICON_SMESH_TREE_GEOM_MODIF
+ * which means that the mesh can't be modified. It should be either re-computed
+ * or breakShaperLink()'ed. Warn the user about it.
+ */
+ //================================================================================
+
+ bool warnOnGeomModif()
+ {
+ SALOME_ListIO selected;
+ if ( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
+ aSel->selectedObjects(selected,"",/*convertReferences=*/false);
+
+ SALOME_ListIteratorOfListIO It( selected );
+ for ( ; It.More(); It.Next() )
+ {
+ Handle(SALOME_InteractiveObject) io = It.Value();
+ if ( !io->hasEntry() ) continue;
+ _PTR(SObject) so = SMESH::getStudy()->FindObjectID( io->getEntry() );
+ SMESH::SMESH_Mesh_var mesh;
+ while ( mesh->_is_nil() && so && so->GetID() != "0:" )
+ {
+ CORBA::Object_var obj = SMESH::SObjectToObject( so );
+ SMESH::SMESH_IDSource_var isrc = SMESH::SMESH_IDSource::_narrow( obj );
+ if ( isrc->_is_nil() )
+ so = so->GetFather();
+ else
+ mesh = isrc->GetMesh();
+ }
+ if ( mesh->_is_nil() ) continue;
+ so = SMESH::FindSObject( mesh );
+ if ( !so ) continue;
+ _PTR(GenericAttribute) attr;
+ so->FindAttribute( attr, "AttributePixMap" );
+ _PTR(AttributePixMap) pixmap = attr;
+ if ( !pixmap ) continue;
+
+ if ( pixmap->GetPixMap() == "ICON_SMESH_TREE_GEOM_MODIF" )
+ {
+ SUIT_MessageBox::warning(SMESHGUI::desktop(),
+ QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("MSG_WARN_ON_GEOM_MODIF"));
+ return true;
+ }
+ }
+ return false;
+ }
+
void SetDisplayMode(int theCommandID, VTK::MarkerMap& theMarkerMap)
{
SALOME_ListIO selected;
int anEntitiesCount = anActor->GetNumberControlEntities();
if (anEntitiesCount >= 0)
functorName = functorName + ": " + QString::number(anEntitiesCount);
- anActor->GetScalarBarActor()->SetTitle( functorName.toLatin1().constData() );
+ anActor->GetScalarBarActor()->SetTitle( functorName.toUtf8().constData() );
SMESH::RepaintCurrentView();
#ifndef DISABLE_PLOT2DVIEWER
if ( anActor->GetPlot2Histogram() ) {
break;
}
- case SMESHOp::OpCreateMesh:
- case SMESHOp::OpCreateSubMesh:
case SMESHOp::OpEditMeshOrSubMesh:
case SMESHOp::OpEditMesh:
case SMESHOp::OpEditSubMesh:
+ case SMESHOp::OpMeshOrder:
+ case SMESHOp::OpCreateSubMesh:
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
+
+ case SMESHOp::OpCreateMesh:
case SMESHOp::OpCompute:
case SMESHOp::OpComputeSubMesh:
case SMESHOp::OpPreCompute:
case SMESHOp::OpEvaluate:
- case SMESHOp::OpMeshOrder:
startOperation( theCommandID );
break;
case SMESHOp::OpCopyMesh:
if ( isStudyLocked() )
break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
/*Standard_Boolean aRes;
SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IObject);
if ( isStudyLocked() )
break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
EmitSignalDeactivateDialog();
SMESHGUI_MultiEditDlg* aDlg = NULL;
case SMESHOp::OpSmoothing:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_SmoothingDlg( this ) )->show();
case SMESHOp::OpExtrusion:
{
if (isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if (vtkwnd) {
EmitSignalDeactivateDialog();
( new SMESHGUI_ExtrusionDlg ( this ) )->show();
case SMESHOp::OpExtrusionAlongAPath:
{
if (isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if (vtkwnd) {
EmitSignalDeactivateDialog();
( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show();
case SMESHOp::OpRevolution:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_RevolutionDlg( this ) )->show();
{
if ( isStudyLocked() )
break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd )
{
EmitSignalDeactivateDialog();
case SMESHOp::OpReorientFaces:
case SMESHOp::OpCreateGeometryGroup:
{
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
startOperation( theCommandID );
break;
}
}
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
EmitSignalDeactivateDialog();
SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil();
}
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
EmitSignalDeactivateDialog();
LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
}
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
EmitSignalDeactivateDialog();
LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
if ( isStudyLocked() )
break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
EmitSignalDeactivateDialog();
{
if ( isStudyLocked() )
break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
EmitSignalDeactivateDialog();
SMESHGUI_GroupOpDlg* aDlg = new SMESHGUI_DimGroupDlg( this );
{
if ( isStudyLocked() )
break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
EmitSignalDeactivateDialog();
SMESHGUI_FaceGroupsSeparatedByEdgesDlg* aDlg = new SMESHGUI_FaceGroupsSeparatedByEdgesDlg( this );
case SMESHOp::OpEditHypothesis:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
SALOME_ListIO selected;
case SMESHOp::OpUnassign: // REMOVE HYPOTHESIS / ALGORITHMS
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
SUIT_OverrideCursor wc;
LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
case SMESHOp::OpHexagonalPrism:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
SMDSAbs_EntityType type = SMDSEntity_Edge;
case SMESHOp::OpPolyhedron:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show();
case SMESHOp::OpTriQuadraticHexahedron:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
SMDSAbs_EntityType type = SMDSEntity_Last;
case SMESHOp::OpRemoveNodes:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_RemoveNodesDlg( this ) )->show();
case SMESHOp::OpRemoveElements: // REMOVES ELEMENTS
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_RemoveElementsDlg( this ) )->show();
case SMESHOp::OpClearMesh: {
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
SALOME_ListIO selected;
if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
case SMESHOp::OpRemoveOrphanNodes:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
SALOME_ListIO selected;
if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
aSel->selectedObjects( selected );
case SMESHOp::OpRenumberingNodes:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_RenumberingDlg( this, 0 ) )->show();
case SMESHOp::OpRenumberingElements:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_RenumberingDlg( this, 1 ) )->show();
case SMESHOp::OpTranslation:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_TranslationDlg( this ) )->show();
case SMESHOp::OpRotation:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_RotationDlg( this ) )->show();
case SMESHOp::OpSymmetry:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if(vtkwnd) {
EmitSignalDeactivateDialog();
( new SMESHGUI_SymmetryDlg( this ) )->show();
case SMESHOp::OpScale:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_ScaleDlg( this ) )->show();
case SMESHOp::OpOffset:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_OffsetDlg( this ) )->show();
case SMESHOp::OpSewing:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if(vtkwnd) {
EmitSignalDeactivateDialog();
( new SMESHGUI_SewingDlg( this ) )->show();
case SMESHOp::OpMergeNodes:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if(vtkwnd) {
EmitSignalDeactivateDialog();
( new SMESHGUI_MergeDlg( this, 0 ) )->show();
case SMESHOp::OpMergeElements:
{
if (isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if (vtkwnd) {
EmitSignalDeactivateDialog();
( new SMESHGUI_MergeDlg( this, 1 ) )->show();
}
case SMESHOp::OpMoveNode: // MAKE MESH PASS THROUGH POINT
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
startOperation( SMESHOp::OpMoveNode );
break;
case SMESHOp::OpDuplicateNodes:
{
if(isStudyLocked()) break;
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
if ( vtkwnd ) {
EmitSignalDeactivateDialog();
( new SMESHGUI_DuplicateNodesDlg( this ) )->show();
}
case SMESHOp::OpElem0DOnElemNodes: // 0D_ON_ALL_NODES
+ if ( warnOnGeomModif() )
+ break; // action forbiden as geometry modified
startOperation( SMESHOp::OpElem0DOnElemNodes );
break;
case SMESHOp::OpSortChild:
::sortChildren();
break;
+ case SMESHOp::OpBreakLink:
+ ::breakShaperLink();
+ break;
}
createSMESHAction( SMESHOp::OpSortChild, "SORT_CHILD_ITEMS" );
+ createSMESHAction( SMESHOp::OpBreakLink, "BREAK_SHAPER_LINK" );
+
QList<int> aCtrlActions;
aCtrlActions << SMESHOp::OpFreeNode << SMESHOp::OpEqualNode
<< SMESHOp::OpNodeConnectivityNb // node controls
popupMgr()->setRule( action( SMESHOp::OpSortChild ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule );
popupMgr()->insert( separator(), -1, -1 );
+ popupMgr()->insert( action( SMESHOp::OpBreakLink), -1, -1 );
+ popupMgr()->setRule( action( SMESHOp::OpBreakLink), "$component={'SHAPERSTUDY'} and client='ObjectBrowser' and canBreakLink", QtxPopupMgr::VisibleRule );
+
connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ),
this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
QList<SUIT_ViewWindow*> wndList = aDesk->windows();
SUIT_ViewWindow* wnd;
foreach ( wnd, wndList )
+ {
connectView( wnd );
+
+ // remove actors whose objects are removed in GetSMESHGen()->UpdateStudy()
+ SMESH::UpdateActorsAfterUpdateStudy(wnd);
+
+ wnd->update();
+ }
}
Py_XDECREF(pluginsmanager);
"SMESH", "nb_segments_per_edge" );
setPreferenceProperty( nbSeg, "min", 1 );
setPreferenceProperty( nbSeg, "max", 10000000 );
+ addPreference( tr( "PREF_USE_MESHGEMS_HYPOSET" ), segGroup, LightApp_Preferences::Bool, "SMESH", "use-meshgems-hypo-sets" );
int loadGroup = addPreference( tr( "SMESH_PREF_MESH_LOADING" ), genTab );
addPreference( tr( "PREF_FORGET_MESH_AT_HYP_MODIF" ), loadGroup, LightApp_Preferences::Bool,