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=2441aa14c69c31f570f5d1778631f8d3435121a0;hp=4e50171a648b0b8e3008c47a33cff4e9d063c95e;hb=333415e6c9f744a167d1779d9e74e073f122e88c;hpb=ed456586bfb1411c5bff73b221658766689a6253 diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx index 4e50171a6..2441aa14c 100644 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ b/src/SMESH_I/SMESH_Gen_i_1.cxx @@ -1,39 +1,38 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// Copyright (C) 2007-2008 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. // -// Copyright (C) 2003 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. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_Gen_i_1.cxx // Created : Thu Oct 21 17:24:06 2004 // Author : Edward AGAPOV (eap) // Module : SMESH // $Header: - +// #include "SMESH_Gen_i.hxx" #include "SMESH_Mesh_i.hxx" #include "SMESH_Hypothesis_i.hxx" #include "SMESH_Algo_i.hxx" #include "SMESH_Group_i.hxx" - -#include "SMESH.hxx" +#include "SMESH_subMesh_i.hxx" #include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) @@ -44,8 +43,10 @@ #ifdef _DEBUG_ static int MYDEBUG = 0; +static int VARIABLE_DEBUG = 0; #else static int MYDEBUG = 0; +static int VARIABLE_DEBUG = 0; #endif //============================================================================= @@ -58,82 +59,82 @@ static int MYDEBUG = 0; long SMESH_Gen_i::GetHypothesisRootTag() { - return Tag_HypothesisRoot; + return SMESH::Tag_HypothesisRoot; } long SMESH_Gen_i::GetAlgorithmsRootTag() { - return Tag_AlgorithmsRoot; + return SMESH::Tag_AlgorithmsRoot; } long SMESH_Gen_i::GetRefOnShapeTag() { - return Tag_RefOnShape; + return SMESH::Tag_RefOnShape; } long SMESH_Gen_i::GetRefOnAppliedHypothesisTag() { - return Tag_RefOnAppliedHypothesis; + return SMESH::Tag_RefOnAppliedHypothesis; } long SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag() { - return Tag_RefOnAppliedAlgorithms; + return SMESH::Tag_RefOnAppliedAlgorithms; } long SMESH_Gen_i::GetSubMeshOnVertexTag() { - return Tag_SubMeshOnVertex; + return SMESH::Tag_SubMeshOnVertex; } long SMESH_Gen_i::GetSubMeshOnEdgeTag() { - return Tag_SubMeshOnEdge; + return SMESH::Tag_SubMeshOnEdge; } long SMESH_Gen_i::GetSubMeshOnFaceTag() { - return Tag_SubMeshOnFace; + return SMESH::Tag_SubMeshOnFace; } long SMESH_Gen_i::GetSubMeshOnSolidTag() { - return Tag_SubMeshOnSolid; + return SMESH::Tag_SubMeshOnSolid; } long SMESH_Gen_i::GetSubMeshOnCompoundTag() { - return Tag_SubMeshOnCompound; + return SMESH::Tag_SubMeshOnCompound; } long SMESH_Gen_i::GetSubMeshOnWireTag() { - return Tag_SubMeshOnWire; + return SMESH::Tag_SubMeshOnWire; } long SMESH_Gen_i::GetSubMeshOnShellTag() { - return Tag_SubMeshOnShell; + return SMESH::Tag_SubMeshOnShell; } long SMESH_Gen_i::GetNodeGroupsTag() { - return Tag_NodeGroups; + return SMESH::Tag_NodeGroups; } long SMESH_Gen_i::GetEdgeGroupsTag() { - return Tag_EdgeGroups; + return SMESH::Tag_EdgeGroups; } long SMESH_Gen_i::GetFaceGroupsTag() { - return Tag_FaceGroups; + return SMESH::Tag_FaceGroups; } long SMESH_Gen_i::GetVolumeGroupsTag() { - return Tag_VolumeGroups; + return SMESH::Tag_VolumeGroups; } //============================================================================= @@ -146,7 +147,10 @@ long SMESH_Gen_i::GetVolumeGroupsTag() bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) { - if(MYDEBUG) MESSAGE("CanPublishInStudy"); + if(MYDEBUG) MESSAGE("CanPublishInStudy - "<_is_nil() ) return true; @@ -177,7 +181,10 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::ObjectToSObject(SALOMEDS::Study_ptr theStudy, { SALOMEDS::SObject_var aSO; if ( !CORBA::is_nil( theStudy ) && !CORBA::is_nil( theObject )) - aSO = theStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( theObject ) ); + { + CORBA::String_var objStr = SMESH_Gen_i::GetORB()->object_to_string( theObject ); + aSO = theStudy->FindObjectIOR( objStr.in() ); + } return aSO._retn(); } @@ -203,8 +210,10 @@ GEOM::GEOM_Object_ptr SMESH_Gen_i::ShapeToGeomObject (const TopoDS_Shape& theSha GEOM_Client* aClient = GetShapeReader(); TCollection_AsciiString IOR; if ( aClient && aClient->Find( theShape, IOR )) - aShapeObj = GEOM::GEOM_Object::_narrow - ( GetORB()->string_to_object( IOR.ToCString() ) ); + { + CORBA::Object_var obj = GetORB()->string_to_object( IOR.ToCString() ); + aShapeObj = GEOM::GEOM_Object::_narrow ( obj ); + } } return aShapeObj._retn(); } @@ -219,7 +228,7 @@ TopoDS_Shape SMESH_Gen_i::GeomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject) TopoDS_Shape S; if ( !theGeomObject->_is_nil() ) { GEOM_Client* aClient = GetShapeReader(); - GEOM::GEOM_Gen_var aGeomEngine = GetGeomEngine(); + GEOM::GEOM_Gen_ptr aGeomEngine = GetGeomEngine(); if ( aClient && !aGeomEngine->_is_nil () ) S = aClient->GetShape( aGeomEngine, theGeomObject ); } @@ -250,12 +259,13 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy, SALOMEDS::GenericAttribute_var anAttr; if ( !CORBA::is_nil( theIOR )) { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeIOR" ); - SALOMEDS::AttributeIOR::_narrow(anAttr)->SetValue - ( SMESH_Gen_i::GetORB()->object_to_string( theIOR ) ); + CORBA::String_var objStr = SMESH_Gen_i::GetORB()->object_to_string( theIOR ); + SALOMEDS::AttributeIOR::_narrow(anAttr)->SetValue( objStr.in() ); } if ( thePixMap ) { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributePixMap" ); - SALOMEDS::AttributePixMap::_narrow( anAttr )->SetPixMap( thePixMap ); + SALOMEDS::AttributePixMap_var pm = SALOMEDS::AttributePixMap::_narrow( anAttr ); + pm->SetPixMap( thePixMap ); } if ( !theSelectable ) { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeSelectable" ); @@ -291,6 +301,25 @@ void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject, } } +//======================================================================= +//function : SetPixMap +//purpose : +//======================================================================= + +void SMESH_Gen_i::SetPixMap(SALOMEDS::SObject_ptr theSObject, + const char* thePixMap) +{ + if ( !theSObject->_is_nil() && thePixMap && strlen( thePixMap )) + { + SALOMEDS::Study_var aStudy = theSObject->GetStudy(); + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::GenericAttribute_var anAttr = + aStudyBuilder->FindOrCreateAttribute( theSObject, "AttributePixMap" ); + SALOMEDS::AttributePixMap_var aPMAttr = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPMAttr->SetPixMap( thePixMap ); + } +} + //======================================================================= //function : addReference //purpose : @@ -306,23 +335,30 @@ static void addReference (SALOMEDS::Study_ptr theStudy, SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); SALOMEDS::SObject_var aReferenceSO; if ( !theTag ) { + // check if the reference to theToObject already exists + // and find a free label for the reference object bool isReferred = false; + int tag = 1; SALOMEDS::ChildIterator_var anIter = theStudy->NewChildIterator( theSObject ); - for ( ; !isReferred && anIter->More(); anIter->Next() ) { - if ( anIter->Value()->ReferencedObject( aReferenceSO ) && - strcmp( aReferenceSO->GetID(), aToObjSO->GetID() ) == 0 ) - isReferred = true; + for ( ; !isReferred && anIter->More(); anIter->Next(), ++tag ) { + if ( anIter->Value()->ReferencedObject( aReferenceSO )) { + if ( strcmp( aReferenceSO->GetID(), aToObjSO->GetID() ) == 0 ) + isReferred = true; + } + else if ( !theTag ) { + SALOMEDS::GenericAttribute_var anAttr; + if ( !anIter->Value()->FindAttribute( anAttr, "AttributeIOR" )) + theTag = tag; + } } - if ( !isReferred ) { - aReferenceSO = aStudyBuilder->NewObject( theSObject ); - aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); - } - } - else { - if ( !theSObject->FindSubObject( theTag, aReferenceSO )) - aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag ); - aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); + if ( isReferred ) + return; + if ( !theTag ) + theTag = tag; } + if ( !theSObject->FindSubObject( theTag, aReferenceSO )) + aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag ); + aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); } } @@ -335,9 +371,9 @@ static void addReference (SALOMEDS::Study_ptr theStudy, //============================================================================= SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theIOR, - const char* theName) + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theIOR, + const char* theName) throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -432,9 +468,9 @@ static long findMaxChildTag( SALOMEDS::SObject_ptr theSObject ) if ( !aStudy->_is_nil() ) { SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( theSObject ); for ( ; anIter->More(); anIter->Next() ) { - long nTag = anIter->Value()->Tag(); - if ( nTag > aTag ) - aTag = nTag; + long nTag = anIter->Value()->Tag(); + if ( nTag > aTag ) + aTag = nTag; } } } @@ -471,7 +507,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, else aTag++; - aMeshSO = publish (theStudy, theMesh, father, aTag, "ICON_SMESH_TREE_MESH" ); + aMeshSO = publish (theStudy, theMesh, father, aTag, "ICON_SMESH_TREE_MESH_WARN" ); if ( aMeshSO->_is_nil() ) return aMeshSO._retn(); } @@ -485,13 +521,12 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, // Publish global hypotheses - SMESH::ListOfHypothesis * hypList = theMesh->GetHypothesisList( aShapeObject ); - if ( hypList ) - for ( int i = 0; i < hypList->length(); i++ ) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( (*hypList)[ i ]); - PublishHypothesis( theStudy, aHyp ); - AddHypothesisToShape( theStudy, theMesh, aShapeObject, aHyp ); - } + SMESH::ListOfHypothesis_var hypList = theMesh->GetHypothesisList( aShapeObject ); + for ( int i = 0; i < hypList->length(); i++ ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( hypList[ i ]); + PublishHypothesis( theStudy, aHyp ); + AddHypothesisToShape( theStudy, theMesh, aShapeObject, aHyp ); + } } // Publish submeshes @@ -525,6 +560,10 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, } } + // Update string attribute (to display used variables) + if( SMESH_Mesh_i* aServant = dynamic_cast( GetServant( theMesh ).in() ) ) + aServant->UpdateStringAttribute(); + if(MYDEBUG) MESSAGE("PublishMesh_END"); return aMeshSO._retn(); } @@ -555,7 +594,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishSubMesh (SALOMEDS::Study_ptr theS } // Find submesh sub-tree tag long aRootTag; - char* aRootName = ""; + const char* aRootName = ""; switch ( theShapeObject->GetShapeType() ) { case GEOM::VERTEX: aRootTag = GetSubMeshOnVertexTag(); @@ -593,7 +632,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishSubMesh (SALOMEDS::Study_ptr theS SetName( aRootSO, aRootName ); // Add new submesh to corresponding sub-tree - aSubMeshSO = publish (theStudy, theSubMesh, aRootSO, 0, "ICON_SMESH_TREE_MESH"); + aSubMeshSO = publish (theStudy, theSubMesh, aRootSO, 0, "ICON_SMESH_TREE_MESH_WARN"); if ( aSubMeshSO->_is_nil() ) return aSubMeshSO._retn(); } @@ -641,8 +680,8 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy } int aType = (int)theGroup->GetType(); const char* aRootNames[] = { - "Compound Groups", "Groups of Nodes", - "Groups of Edges", "Groups of Faces", "Groups of Volumes" }; + "Compound Groups", "Groups of Nodes", "Groups of Edges", + "Groups of Faces", "Groups of Volumes", "Groups of 0D Elements" }; // Currently, groups with heterogenous content are not supported if ( aType != SMESH::ALL ) { @@ -651,7 +690,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy // Find or create groups root SALOMEDS::SObject_var aRootSO = publish (theStudy, CORBA::Object::_nil(), aMeshSO, aRootTag, 0, false ); - if ( aType < 5 ) + if ( aType < 6 ) SetName( aRootSO, aRootNames[aType] ); // Add new group to corresponding sub-tree @@ -702,6 +741,10 @@ SALOMEDS::SObject_ptr // Add New Hypothesis string aPmName = isAlgo ? "ICON_SMESH_TREE_ALGO_" : "ICON_SMESH_TREE_HYPO_"; aPmName += theHyp->GetName(); + // prepend plugin name to pixmap name + string pluginName = myHypCreatorMap[string(theHyp->GetName())]->GetModuleName(); + if ( pluginName != "StdMeshers" ) + aPmName = pluginName + "::" + aPmName; aHypSO = publish( theStudy, theHyp, aRootSO, 0, aPmName.c_str() ); } @@ -710,6 +753,10 @@ SALOMEDS::SObject_ptr SetName( aHypSO, theName, aHypName ); } + // Update string attribute (to display used variables) + if( SMESH_Hypothesis_i* aServant = dynamic_cast( GetServant( theHyp ).in() ) ) + aServant->UpdateStringAttribute(); + if(MYDEBUG) MESSAGE("PublishHypothesis--END") return aHypSO._retn(); } @@ -726,10 +773,15 @@ SALOMEDS::SObject_ptr { if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape") SALOMEDS::SObject_var aMeshOrSubMesh; - if ( theShape->_is_nil() || theMesh->_is_nil() ) + if (theMesh->_is_nil() || ( theShape->_is_nil() && theMesh->HasShapeToMesh())) return aMeshOrSubMesh._retn(); + + TopoDS_Shape aShape; + if(theMesh->HasShapeToMesh()) + aShape = GeomObjectToShape( theShape ); + else + aShape = SMESH_Mesh::PseudoShape(); - TopoDS_Shape aShape = GeomObjectToShape( theShape ); SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { @@ -759,7 +811,8 @@ bool SMESH_Gen_i::AddHypothesisToShape(SALOMEDS::Study_ptr theStudy, { if(MYDEBUG) MESSAGE("AddHypothesisToShape") if (theStudy->_is_nil() || theMesh->_is_nil() || - theHyp->_is_nil() || theShape->_is_nil() ) + theHyp->_is_nil() || (theShape->_is_nil() + && theMesh->HasShapeToMesh()) ) return false; SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); @@ -773,7 +826,19 @@ bool SMESH_Gen_i::AddHypothesisToShape(SALOMEDS::Study_ptr theStudy, SALOMEDS::SObject_var aMeshOrSubMesh = GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); if ( aMeshOrSubMesh->_is_nil() ) - return false; + { + // publish submesh + TopoDS_Shape aShape = GeomObjectToShape( theShape ); + SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); + if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { + SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS(); + int shapeID = meshDS->ShapeToIndex( aShape ); + SMESH::SMESH_subMesh_var aSubMesh = mesh_i->getSubMesh(shapeID); + aMeshOrSubMesh = PublishSubMesh( theStudy, theMesh, aSubMesh, theShape ); + } + if ( aMeshOrSubMesh->_is_nil() ) + return false; + } //Find or Create Applied Hypothesis root bool aIsAlgo = !SMESH::SMESH_Algo::_narrow( theHyp )->_is_nil(); @@ -801,7 +866,8 @@ bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy SMESH::SMESH_Hypothesis_ptr theHyp) { if (theStudy->_is_nil() || theMesh->_is_nil() || - theHyp->_is_nil() || theShape->_is_nil() ) + theHyp->_is_nil() || (theShape->_is_nil() + && theMesh->HasShapeToMesh())) return false; SALOMEDS::SObject_var aHypSO = ObjectToSObject( theStudy, theHyp ); @@ -827,4 +893,3 @@ bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy } return true; } -