X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Gen_i_1.cxx;h=5a82382d6b1905b033738566dbb925dbf49a0ae0;hb=d8f644ca3d4ce62f2ef41d4aacb52f5bb1221df3;hp=2021f22e2df7a4c43c62934b4ee3757577eb3a6e;hpb=c63ee099ad2b149bd70136839c973e8910137bc5;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx index 2021f22e2..5a82382d6 100644 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ b/src/SMESH_I/SMESH_Gen_i_1.cxx @@ -1,30 +1,31 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// Copyright (C) 2007-2010 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. +// +// 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. // -// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com +// 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 // -// File : SMESH_Gen_i_1.cxx -// Created : Thu Oct 21 17:24:06 2004 -// Author : Edward AGAPOV (eap) -// Module : SMESH -// $Header: +// 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" @@ -32,8 +33,7 @@ #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 +44,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 +60,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; } //============================================================================= @@ -180,7 +182,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(); } @@ -206,8 +211,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(); } @@ -222,7 +229,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 ); } @@ -253,12 +260,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" ); @@ -294,6 +302,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 : @@ -345,9 +372,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); @@ -442,9 +469,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; } } } @@ -495,13 +522,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 @@ -565,7 +591,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(); @@ -651,8 +677,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 ) { @@ -661,7 +687,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 @@ -712,6 +738,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() ); } @@ -736,10 +766,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() ) { @@ -769,7 +804,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 ); @@ -823,7 +859,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 ); @@ -850,3 +887,147 @@ bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy return true; } +//======================================================================= +//function : UpdateParameters +//purpose : +//======================================================================= +void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theParameters) +{ + + if(VARIABLE_DEBUG) + cout<<"UpdateParameters : "<_is_nil() || CORBA::is_nil(theObject)) + return; + + SALOMEDS::SObject_var aSObj = ObjectToSObject(aStudy,theObject); + if(aSObj->_is_nil()) + return; + + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + + SALOMEDS::GenericAttribute_var aFindAttr; + bool hasAttr = aSObj->FindAttribute(aFindAttr, "AttributeString"); + if(VARIABLE_DEBUG) + cout<<"Find Attribute "<FindOrCreateAttribute( aSObj, "AttributeString"); + SALOMEDS::AttributeString_var aStringAttr = SALOMEDS::AttributeString::_narrow(anAttr); + + CORBA::String_var oldparVar = aStringAttr->Value(); + CORBA::String_var inpparVar = ParseParameters(theParameters); + TCollection_AsciiString aNewParams; + TCollection_AsciiString aOldParameters(oldparVar.inout()); + TCollection_AsciiString anInputParams(inpparVar.inout()); + if(!hasAttr) + aNewParams = anInputParams; + else + { + int pos = aOldParameters.SearchFromEnd("|"); + if(pos==-1) pos = 0; + TCollection_AsciiString previousParamFull(aOldParameters.Split(pos)); + TCollection_AsciiString previousParam(previousParamFull); + TCollection_AsciiString theRepet("1"); + pos = previousParam.SearchFromEnd(";*="); + if(pos >= 0) + { + theRepet = previousParam.Split(pos+2); + pos = pos-1; + if(pos==-1) pos = 0; + previousParam.Split(pos); + } + if(previousParam == anInputParams) + { + theRepet = theRepet.IntegerValue()+1; + aNewParams = aOldParameters + previousParam + ";*=" + theRepet; + } + else + { + aNewParams = aOldParameters + previousParamFull + "|" + anInputParams; + } + } + + if(VARIABLE_DEBUG) + { + cout<<"Input Parameters : "<SetValue( aNewParams.ToCString() ); +} + +//======================================================================= +//function : ParseParameters +//purpose : +//======================================================================= +char* SMESH_Gen_i::ParseParameters(const char* theParameters) +{ + //const char* aParameters = theParameters; +// const char* aParameters = CORBA::string_dup(theParameters); + TCollection_AsciiString anInputParams; + SALOMEDS::Study_var aStudy = GetCurrentStudy(); + if( !aStudy->_is_nil() ) { +// SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(theParameters); +// for(int j=0;jlength();j++) { +// SALOMEDS::ListOfStrings aVars= aSections[j]; +// for(int i=0;iIsVariable(aVars[i].in()) ? +// TCollection_AsciiString(aVars[i].in()) : TCollection_AsciiString(""); +// if(i != aVars.length()-1) +// anInputParams+=":"; +// } +// if(j!=aSections->length()-1) +// anInputParams+="|"; +// } + TCollection_AsciiString paramStr( theParameters ); + static TCollection_AsciiString separators(":|"); + int beg = 0, end; + char sep, *pParams = (char*)paramStr.ToCString(); + while ( beg < paramStr.Length() ) + { + end = beg-1; + while ( ++end < paramStr.Length() ) + if ( pParams[end] == ':' || pParams[end] == '|') + break; + if ( end < paramStr.Length()) + { + sep = pParams[end]; + pParams[end] = '\0'; + } + if ( aStudy->IsVariable( pParams+beg )) + anInputParams += pParams+beg; + if ( end < paramStr.Length() ) + anInputParams += sep; + else + break; + beg = end + 1; + } + } + return CORBA::string_dup(anInputParams.ToCString()); +} + +//======================================================================= +//function : GetParameters +//purpose : +//======================================================================= +char* SMESH_Gen_i::GetParameters(CORBA::Object_ptr theObject) +{ + TCollection_AsciiString aResult; + + SALOMEDS::Study_ptr aStudy = GetCurrentStudy(); + SALOMEDS::SObject_var aSObj = ObjectToSObject(aStudy,theObject); + + if(!aStudy->_is_nil() && + !CORBA::is_nil(theObject) && + !aSObj->_is_nil()){ + + SALOMEDS::GenericAttribute_var anAttr; + if ( aSObj->FindAttribute(anAttr, "AttributeString")) { + aResult = TCollection_AsciiString(SALOMEDS::AttributeString::_narrow(anAttr)->Value()); + } + } + + return CORBA::string_dup( aResult.ToCString() ); +}