X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Gen_i_1.cxx;h=b08b7e3e6d35d8b09a536a17ca8b5b5e75a68af5;hp=2dc8b31bbea2c7c8902fb5c69e48a96c503e12b5;hb=e5b4cc5b6e8acda597188ff4b6c8247283fb194c;hpb=bbcc474cc233788b6dfec02b134e5f0ec3710fb8 diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx index 2dc8b31bb..b08b7e3e6 100644 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ b/src/SMESH_I/SMESH_Gen_i_1.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 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 @@ -6,7 +6,7 @@ // 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 @@ -26,6 +26,7 @@ #include "SMESH_Gen_i.hxx" +#include "SMESHDS_Mesh.hxx" #include "SMESH_Algo_i.hxx" #include "SMESH_Comment.hxx" #include "SMESH_Group_i.hxx" @@ -43,14 +44,16 @@ #include #include +#include + #ifdef _DEBUG_ static int MYDEBUG = 0; -//static int VARIABLE_DEBUG = 0; #else static int MYDEBUG = 0; -//static int VARIABLE_DEBUG = 0; #endif +using namespace std; + //============================================================================= /*! * Get...Tag [ static ] @@ -160,7 +163,7 @@ long SMESH_Gen_i::GetBallElementsGroupsTag() bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) { if(MYDEBUG) MESSAGE("CanPublishInStudy - "<NewBuilder(); SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder(); - SALOMEDS::SObject_wrap objAfter; + bool isNewSO = false, isInUseCaseTree = false; if ( SO->_is_nil() ) { if ( theTag == 0 ) { SO = aStudyBuilder->NewObject( theFatherObject ); + isNewSO = true; } else if ( !theFatherObject->FindSubObject( theTag, SO.inout() )) { SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag ); - - // define the next tag after given one in the data tree to insert SObject - std::string anEntry; - int last2Pnt_pos = -1; - int tagAfter = -1; - CORBA::String_var entry; - SALOMEDS::SObject_wrap curObj; - SALOMEDS::UseCaseIterator_wrap anUseCaseIter = useCaseBuilder->GetUseCaseIterator(theFatherObject); - for ( ; anUseCaseIter->More(); anUseCaseIter->Next() ) { - curObj = anUseCaseIter->Value(); - entry = curObj->GetID(); - anEntry = entry.in(); - last2Pnt_pos = anEntry.rfind( ":" ); - tagAfter = atoi( anEntry.substr( last2Pnt_pos+1 ).c_str() ); - if ( tagAfter > theTag ) { - objAfter = curObj; - break; - } - } + isNewSO = true; + } + else + { + isInUseCaseTree = useCaseBuilder->IsUseCaseNode( SO ); } } + else + { + isInUseCaseTree = useCaseBuilder->IsUseCaseNode( SO ); + } SALOMEDS::GenericAttribute_wrap anAttr; - if ( !CORBA::is_nil( theIOR )) { + if ( !CORBA::is_nil( theIOR )) + { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeIOR" ); CORBA::String_var objStr = SMESH_Gen_i::GetORB()->object_to_string( theIOR ); SALOMEDS::AttributeIOR_wrap iorAttr = anAttr; - iorAttr->SetValue( objStr.in() ); - // UnRegister() !!! - SALOME::GenericObj_var genObj = SALOME::GenericObj::_narrow( theIOR ); - if ( !genObj->_is_nil() ) - genObj->UnRegister(); + CORBA::String_var objStrCur = iorAttr->Value(); + bool sameIOR = ( objStrCur.in() && strcmp( objStr.in(), objStrCur.in() ) == 0 ); + if ( !sameIOR ) + { + iorAttr->SetValue( objStr.in() ); + // UnRegister() !!! + SALOME::GenericObj_var genObj = SALOME::GenericObj::_narrow( theIOR ); + if ( !genObj->_is_nil() ) + genObj->UnRegister(); + } } + if ( thePixMap ) { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributePixMap" ); SALOMEDS::AttributePixMap_wrap pm = anAttr; pm->SetPixMap( thePixMap ); } + if ( !theSelectable ) { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeSelectable" ); SALOMEDS::AttributeSelectable_wrap selAttr = anAttr; selAttr->SetSelectable( false ); } + if ( !isNewSO ) + aStudyBuilder->RemoveReference( SO );// remove garbage reference (23336) + // add object to the use case tree // (to support tree representation customization and drag-n-drop) - if ( !CORBA::is_nil( objAfter ) ) { - useCaseBuilder->InsertBefore( SO, objAfter ); // insert at given tag - } else if ( !useCaseBuilder->IsUseCaseNode( SO ) ) { - useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list + if ( isNewSO || !isInUseCaseTree ) + { + // define the next tag after given one in the data tree to insert SObject + SALOMEDS::SObject_wrap curObj, objAfter; + if ( theFatherObject->GetLastChildTag() > theTag && theTag > 0 ) + { + SALOMEDS::UseCaseIterator_wrap + anUseCaseIter = useCaseBuilder->GetUseCaseIterator(theFatherObject); + for ( ; anUseCaseIter->More(); anUseCaseIter->Next() ) { + curObj = anUseCaseIter->Value(); + if ( curObj->Tag() > theTag ) { + objAfter = curObj; + break; + } + } + } + if ( !CORBA::is_nil( objAfter )) + useCaseBuilder->InsertBefore( SO, objAfter ); // insert at given tag + else if ( !isInUseCaseTree ) + useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list } - return SO._retn(); } //======================================================================= //function : setName -//purpose : +//purpose : //======================================================================= void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject, @@ -341,9 +361,15 @@ void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject, SALOMEDS::GenericAttribute_wrap anAttr = aStudyBuilder->FindOrCreateAttribute( theSObject, "AttributeName" ); SALOMEDS::AttributeName_wrap aNameAttr = anAttr; - if ( theName && strlen( theName ) != 0 ) - aNameAttr->SetValue( theName ); - else { + if ( theName && theName[0] ) { + std::string name( theName ); // trim trailing white spaces + for ( size_t i = name.size()-1; i > 0; --i ) + if ( isspace( name[i] )) name[i] = '\0'; + else break; + aNameAttr->SetValue( name.c_str() ); + } + else + { CORBA::String_var curName = aNameAttr->Value(); if ( strlen( curName.in() ) == 0 ) { SMESH_Comment aName(theDefaultName); @@ -355,7 +381,7 @@ void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject, //======================================================================= //function : SetPixMap -//purpose : +//purpose : //======================================================================= void SMESH_Gen_i::SetPixMap(SALOMEDS::SObject_ptr theSObject, @@ -413,11 +439,20 @@ static void addReference (SALOMEDS::Study_ptr theStudy, } if ( !theSObject->FindSubObject( theTag, aReferenceSO.inout() )) aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag ); + aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); + // add reference to the use case tree // (to support tree representation customization and drag-n-drop) - SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder(); - useCaseBuilder->AppendTo( aReferenceSO->GetFather(), aReferenceSO ); + SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder(); + SALOMEDS::UseCaseIterator_wrap useCaseIter = useCaseBuilder->GetUseCaseIterator(theSObject); + for ( ; useCaseIter->More(); useCaseIter->Next() ) + { + SALOMEDS::SObject_wrap curSO = useCaseIter->Value(); + if ( curSO->Tag() == theTag ) + return; + } + useCaseBuilder->AppendTo( theSObject, aReferenceSO ); } } @@ -524,32 +559,6 @@ SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent(SALOMEDS::Study_ptr theSt return father._retn(); } -//============================================================================= -/*! - * findMaxChildTag [ static internal ] - * - * Finds maximum child tag for the given object - */ -//============================================================================= - -static long findMaxChildTag( SALOMEDS::SObject_ptr theSObject ) -{ - long aTag = 0; - if ( !theSObject->_is_nil() ) { - SALOMEDS::Study_var aStudy = theSObject->GetStudy(); - if ( !aStudy->_is_nil() ) { - SALOMEDS::ChildIterator_wrap anIter = aStudy->NewChildIterator( theSObject ); - for ( ; anIter->More(); anIter->Next() ) { - SALOMEDS::SObject_wrap anSO = anIter->Value(); - long nTag = anSO->Tag(); - if ( nTag > aTag ) - aTag = nTag; - } - } - } - return aTag; -} - //======================================================================= //function : PublishMesh //purpose : @@ -574,7 +583,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, return aMeshSO._retn(); // Find correct free tag - long aTag = findMaxChildTag( father.in() ); + long aTag = father->GetLastChildTag(); if ( aTag <= GetAlgorithmsRootTag() ) aTag = GetAlgorithmsRootTag() + 1; else @@ -595,7 +604,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, // Publish global hypotheses SMESH::ListOfHypothesis_var hypList = theMesh->GetHypothesisList( aShapeObject ); - for ( int i = 0; i < hypList->length(); i++ ) + for ( CORBA::ULong i = 0; i < hypList->length(); i++ ) { SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( hypList[ i ]); SALOMEDS::SObject_wrap so = PublishHypothesis( theStudy, aHyp ); @@ -720,7 +729,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishSubMesh (SALOMEDS::Study_ptr theS // Publish hypothesis SMESH::ListOfHypothesis_var hypList = theMesh->GetHypothesisList( theShapeObject ); - for ( int i = 0; i < hypList->length(); i++ ) { + for ( CORBA::ULong i = 0; i < hypList->length(); i++ ) { SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( hypList[ i ]); SALOMEDS::SObject_wrap so = PublishHypothesis( theStudy, aHyp ); AddHypothesisToShape( theStudy, theMesh, theShapeObject, aHyp ); @@ -752,13 +761,13 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy if ( aMeshSO->_is_nil()) return SALOMEDS::SObject::_nil(); } - int aType = (int)theGroup->GetType(); + size_t aType = (int)theGroup->GetType(); const char* aRootNames[] = { "Compound Groups", "Groups of Nodes", "Groups of Edges", "Groups of Faces", "Groups of Volumes", "Groups of 0D Elements", "Groups of Balls" }; - // Currently, groups with heterogenous content are not supported + // Currently, groups with heterogeneous content are not supported if ( aType != SMESH::ALL ) { long aRootTag = GetNodeGroupsTag() + aType - 1; @@ -772,8 +781,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy SetName( aRootSO, aRootNames[aType] ); // Add new group to corresponding sub-tree - SMESH::array_of_ElementType_var elemTypes = theGroup->GetTypes(); - int isEmpty = ( elemTypes->length() == 0 ); + int isEmpty = false; std::string pm[2] = { "ICON_SMESH_TREE_GROUP", "ICON_SMESH_TREE_MESH_WARN" }; if ( SMESH::DownCast< SMESH_GroupOnFilter_i* > ( theGroup )) { @@ -781,9 +789,14 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy } else if ( SMESH::DownCast< SMESH_Group_i* > ( theGroup )) { - SMESH::array_of_ElementType_var allElemTypes = theMesh->GetTypes(); - for ( size_t i =0; i < allElemTypes->length() && isEmpty; ++i ) - isEmpty = ( allElemTypes[i] != theGroup->GetType() ); + if ( theGroup->GetType() == SMESH::NODE ) + isEmpty = ( theMesh->NbNodes() == 0 ); + else + { + SMESH::array_of_ElementType_var allElemTypes = theMesh->GetTypes(); + for ( size_t i =0; i < allElemTypes->length() && isEmpty; ++i ) + isEmpty = ( allElemTypes[i] != theGroup->GetType() ); + } } aGroupSO = publish (theStudy, theGroup, aRootSO, 0, pm[isEmpty].c_str() ); } @@ -908,7 +921,7 @@ bool SMESH_Gen_i::AddHypothesisToShape(SALOMEDS::Study_ptr theStudy, if ( aMeshSO->_is_nil() || aHypSO->_is_nil()) return false; - // Find a mesh or submesh refering to theShape + // Find a mesh or submesh referring to theShape SALOMEDS::SObject_wrap aMeshOrSubMesh = GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); if ( aMeshOrSubMesh->_is_nil() ) @@ -961,7 +974,7 @@ bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy CORBA::String_var hypEntry = aHypSO->GetID(); - // Find a mesh or submesh refering to theShape + // Find a mesh or sub-mesh referring to theShape SALOMEDS::SObject_wrap aMeshOrSubMesh = GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); if ( aMeshOrSubMesh->_is_nil() ) @@ -1084,7 +1097,7 @@ void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theP if ( pos < varStr.size() ) { varFound = ( varStr.compare( pos, myLastParameters[i].size(), myLastParameters[i] ) == 0 && - // same string begining but is length same? + // same string beginning but is length same? ( pos + myLastParameters[i].size() >= varStr.size() || separators.find( varStr[ pos+1 ]) != std::string::npos )); if ( varFound )