X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVISU_I%2FVISU_CorbaMedConvertor.cxx;h=aea4b36ce887d7d6606dbe4c9d7f89e36c10d3fa;hb=716894d52739e56d77c5085e02b4cdfdbef60136;hp=29eab3d08e4e748c1b372e3cb42b1d4465c590b9;hpb=f10033167ad2bf02530bbc819cb8a766948519b2;p=modules%2Fvisu.git diff --git a/src/VISU_I/VISU_CorbaMedConvertor.cxx b/src/VISU_I/VISU_CorbaMedConvertor.cxx index 29eab3d0..aea4b36c 100644 --- a/src/VISU_I/VISU_CorbaMedConvertor.cxx +++ b/src/VISU_I/VISU_CorbaMedConvertor.cxx @@ -1,430 +1,1885 @@ -using namespace std; -// File: VISU_CorbaMedConvertor.cxx -// Created: Fri Jan 10 12:04:54 2003 -// Author: Alexey PETROV -// - +// VISU OBJECT : interactive object for VISU entities implementation +// +// 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 +// +// +// +// File : VISU_CorbaMedConvertor.cxx +// Author : Alexey PETROV +// Module : VISU +// $Header$ +// Copyright (C) 2003 CEA/DEN, EDF R&D #include "VISU_CorbaMedConvertor.hxx" -using namespace VISU; -#include +#include "VISU_ConvertorUtils.hxx" + #include +#include + +#include "ReceiverFactory.hxx" +#include "MED_SliceArray.hxx" + #define USER_INTERLACE MED_FULL_INTERLACE -#ifdef DEBUG -static int MYDEBUG = 1; +#ifdef _DEBUG_ +static int MYDEBUG = 0; #else static int MYDEBUG = 0; #endif -static med_err ret = 0; -/* -typedef map TVisu2MedEntity; -static TVisu2MedEntity aVisu2MedEntity; -static int INIT = ( - aVisu2MedEntity[VISU::CELL_ENTITY] = SALOME_MED::MED_CELL, - aVisu2MedEntity[VISU::FACE_ENTITY] = SALOME_MED::MED_FACE, - aVisu2MedEntity[VISU::EDGE_ENTITY] = SALOME_MED::MED_EDGE, - aVisu2MedEntity[VISU::NODE_ENTITY] = SALOME_MED::MED_NODE, - 1); -*/ -static int CELLGEOM[MED_NBR_GEOMETRIE_MAILLE] = { - SALOME_MED::MED_POINT1, - SALOME_MED::MED_SEG2, - SALOME_MED::MED_SEG3, - SALOME_MED::MED_TRIA3, - SALOME_MED::MED_QUAD4, - SALOME_MED::MED_TRIA6, - SALOME_MED::MED_QUAD8, - SALOME_MED::MED_TETRA4, - SALOME_MED::MED_PYRA5, - SALOME_MED::MED_PENTA6, - SALOME_MED::MED_TETRA10, - SALOME_MED::MED_HEXA8, - SALOME_MED::MED_PYRA13, - SALOME_MED::MED_PENTA15, - SALOME_MED::MED_HEXA20 -}; - -static const int VTKCELLGEOMEND = 8; -static int VTKCELLGEOM[VTKCELLGEOMEND] = { - SALOME_MED::MED_POINT1, - SALOME_MED::MED_SEG2, - SALOME_MED::MED_TRIA3, - SALOME_MED::MED_QUAD4, - SALOME_MED::MED_TETRA4, - SALOME_MED::MED_PYRA5, - SALOME_MED::MED_PENTA6, - SALOME_MED::MED_HEXA8 -}; - -static int FACEGEOM[MED_NBR_GEOMETRIE_FACE] = { - SALOME_MED::MED_TRIA3, - SALOME_MED::MED_QUAD4, - SALOME_MED::MED_TRIA6, - SALOME_MED::MED_QUAD8 -}; - -static int EDGEGEOM[MED_NBR_GEOMETRIE_ARETE] = { - SALOME_MED::MED_SEG2, - SALOME_MED::MED_SEG3 -}; - -static int NODEGEOM[1] = { - SALOME_MED::MED_POINT1, -}; - -void Entity2Geom(const VISU::TEntity& theEntity, int* theVector, int* theEnd) { - switch(theEntity){ - case VISU::CELL_ENTITY: theVector = CELLGEOM; *theEnd = MED_NBR_GEOMETRIE_MAILLE; break; - case VISU::FACE_ENTITY: theVector = FACEGEOM; *theEnd = MED_NBR_GEOMETRIE_FACE; break; - case VISU::EDGE_ENTITY: theVector = EDGEGEOM; *theEnd = MED_NBR_GEOMETRIE_ARETE; break; - case VISU::NODE_ENTITY: theVector = NODEGEOM; *theEnd = 1; break; + +extern "C" { + VISU_Convertor* + CreateMEDConvertor(SALOMEDS::SObject_ptr theMedSObject) + { + return new VISU_MEDConvertor(theMedSObject); } -} -typedef pair TEntity2Geom; -typedef map TEntity2GeomMap; -static TEntity2GeomMap anEntity2GeomMap; -static int INIT = ( - anEntity2GeomMap[SALOME_MED::MED_CELL] = TEntity2Geom(CELLGEOM,MED_NBR_GEOMETRIE_MAILLE), - anEntity2GeomMap[SALOME_MED::MED_FACE] = TEntity2Geom(FACEGEOM,MED_NBR_GEOMETRIE_FACE), - anEntity2GeomMap[SALOME_MED::MED_EDGE] = TEntity2Geom(EDGEGEOM,MED_NBR_GEOMETRIE_ARETE), - anEntity2GeomMap[SALOME_MED::MED_NODE] = TEntity2Geom(NODEGEOM,1), - 1 -); - -struct SalomeMed2vtk { - SALOME_MED::medGeometryElement medType; - char *medName; - int medNbNodes; - int vtkType; - char *vtkName; - int vtkNbNodes; -}; - -#define CORBAMED2VTK(MEDTYPE,VTKTYPE,VTKNBNODES) \ - {SALOME_MED::MEDTYPE,#MEDTYPE,getNbMedNodes(MEDTYPE),VTKTYPE,#VTKTYPE,VTKNBNODES} -static SalomeMed2vtk salome_med2vtk[SALOME_MED::MED_ALL_ELEMENTS] = { - {SALOME_MED::MED_NONE,"MED_NONE",0,VTK_EMPTY_CELL,"VTK_EMPTY_CELL",0}, - CORBAMED2VTK(MED_POINT1,VTK_VERTEX,1), - CORBAMED2VTK(MED_SEG2,VTK_LINE,2), - CORBAMED2VTK(MED_SEG3,VTK_LINE,2), - CORBAMED2VTK(MED_TRIA3,VTK_TRIANGLE,3), - CORBAMED2VTK(MED_QUAD4,VTK_QUAD,4), - CORBAMED2VTK(MED_TRIA6,VTK_TRIANGLE,3), - CORBAMED2VTK(MED_QUAD8,VTK_QUAD,4), - CORBAMED2VTK(MED_TETRA4,VTK_TETRA,4), - CORBAMED2VTK(MED_PYRA5,VTK_PYRAMID,5), - CORBAMED2VTK(MED_PENTA6,VTK_WEDGE,6), - CORBAMED2VTK(MED_TETRA10,VTK_TETRA,4), - CORBAMED2VTK(MED_HEXA8,VTK_HEXAHEDRON,8), - CORBAMED2VTK(MED_PYRA13,VTK_PYRAMID,5), - CORBAMED2VTK(MED_PENTA15,VTK_WEDGE,6), - CORBAMED2VTK(MED_HEXA20,VTK_HEXAHEDRON,8) -}; -#undef CORBAMED2VTK - -int FindIdMEDType(int medType){ - for(int i = 0; i < SALOME_MED::MED_ALL_ELEMENTS; i++) - if(salome_med2vtk[i].medType == medType) return i; - return -1; + VISU_Convertor* + CreateMEDFieldConvertor(SALOME_MED::FIELD_ptr theField) + { + return new VISU_MEDFieldConvertor(theField); + } } -void VISU_MedMeshConvertor::SetMedMesh(SALOME_MED::MESH_ptr theMedMesh) { - myMedMesh = SALOME_MED::MESH::_duplicate(theMedMesh); -} +namespace +{ + const int MED_NBR_GEOMETRIE_MAILLE = 17; + + SALOME_MED::medGeometryElement + CELLGEOM[MED_NBR_GEOMETRIE_MAILLE] = { + SALOME_MED::MED_POINT1, + SALOME_MED::MED_SEG2, + SALOME_MED::MED_SEG3, + SALOME_MED::MED_TRIA3, + SALOME_MED::MED_QUAD4, + SALOME_MED::MED_TRIA6, + SALOME_MED::MED_QUAD8, + SALOME_MED::MED_TETRA4, + SALOME_MED::MED_PYRA5, + SALOME_MED::MED_PENTA6, + SALOME_MED::MED_HEXA8, + SALOME_MED::MED_TETRA10, + SALOME_MED::MED_PYRA13, + SALOME_MED::MED_PENTA15, + SALOME_MED::MED_HEXA20, + SALOME_MED::MED_POLYGON, + SALOME_MED::MED_POLYHEDRA + }; + + const int MED_NBR_GEOMETRIE_FACE = 5; + + SALOME_MED::medGeometryElement + FACEGEOM[MED_NBR_GEOMETRIE_FACE] = { + SALOME_MED::MED_TRIA3, + SALOME_MED::MED_QUAD4, + SALOME_MED::MED_TRIA6, + SALOME_MED::MED_QUAD8, + SALOME_MED::MED_POLYGON + }; + + const int MED_NBR_GEOMETRIE_ARETE = 2; + + SALOME_MED::medGeometryElement + EDGEGEOM[MED_NBR_GEOMETRIE_ARETE] = { + SALOME_MED::MED_SEG2, + SALOME_MED::MED_SEG3 + }; + + const int MED_NBR_GEOMETRIE_NODE = 1; + + SALOME_MED::medGeometryElement + NODEGEOM[MED_NBR_GEOMETRIE_NODE] = { + SALOME_MED::MED_POINT1, + }; + -void VISU_CorbaMedConvertor::SetMedField(SALOME_MED::FIELD_ptr theMedField) { - myMedField = SALOME_MED::FIELD::_duplicate(theMedField); - if(!myMedField->_is_nil()) - myMedMesh = myMedField->getSupport()->getMesh(); -} + //--------------------------------------------------------------- + int + GetEntity2Geom(const VISU::TEntity& theEntity, + SALOME_MED::medGeometryElement*& theVector) + { + switch(theEntity){ + case VISU::CELL_ENTITY: + theVector = CELLGEOM; + return MED_NBR_GEOMETRIE_MAILLE; + case VISU::FACE_ENTITY: + theVector = FACEGEOM; + return MED_NBR_GEOMETRIE_FACE; + case VISU::EDGE_ENTITY: + theVector = EDGEGEOM; + return MED_NBR_GEOMETRIE_ARETE; + case VISU::NODE_ENTITY: + theVector = NODEGEOM; + return MED_NBR_GEOMETRIE_NODE; + } + return -1; + } + + + //--------------------------------------------------------------- + int + MEDGeom2NbNodes(int theMEDGeomType) + { + switch(theMEDGeomType){ + case SALOME_MED::MED_NONE: + return 0; + case SALOME_MED::MED_POINT1: + return 1; + case SALOME_MED::MED_SEG2: + return 2; + case SALOME_MED::MED_SEG3: + return 3; + case SALOME_MED::MED_TRIA3: + return 3; + case SALOME_MED::MED_TRIA6: + return 6; + case SALOME_MED::MED_QUAD4: + return 4; + case SALOME_MED::MED_QUAD8: + return 8; + case SALOME_MED::MED_TETRA4: + return 4; + case SALOME_MED::MED_TETRA10: + return 10; + case SALOME_MED::MED_HEXA8: + return 8; + case SALOME_MED::MED_HEXA20: + return 20; + case SALOME_MED::MED_PENTA6: + return 6; + case SALOME_MED::MED_PENTA15: + return 15; + case SALOME_MED::MED_PYRA5: + return 5; + case SALOME_MED::MED_PYRA13: + return 13; + } + return -1; + } + + + //--------------------------------------------------------------- + VISU::EGeometry + MEDGeom2VISU(SALOME_MED::medGeometryElement theGeom) + { + switch(theGeom){ + case SALOME_MED::MED_POINT1: + return VISU::ePOINT1; + case SALOME_MED::MED_SEG2: + return VISU::eSEG2; + case SALOME_MED::MED_SEG3: + return VISU::eSEG3; + case SALOME_MED::MED_TRIA3: + return VISU::eTRIA3; + case SALOME_MED::MED_TRIA6: + return VISU::eTRIA6; + case SALOME_MED::MED_QUAD4: + return VISU::eQUAD4; + case SALOME_MED::MED_QUAD8: + return VISU::eQUAD8; + case SALOME_MED::MED_TETRA4: + return VISU::eTETRA4; + case SALOME_MED::MED_TETRA10: + return VISU::eTETRA10; + case SALOME_MED::MED_HEXA8: + return VISU::eHEXA8; + case SALOME_MED::MED_HEXA20: + return VISU::eHEXA20; + case SALOME_MED::MED_PENTA6: + return VISU::ePENTA6; + case SALOME_MED::MED_PENTA15: + return VISU::ePENTA15; + case SALOME_MED::MED_PYRA5: + return VISU::ePYRA5; + case SALOME_MED::MED_PYRA13: + return VISU::ePYRA13; + case SALOME_MED::MED_POLYGON: + return VISU::ePOLYGONE; + case SALOME_MED::MED_POLYHEDRA: + return VISU::ePOLYEDRE; + } + return VISU::eNONE; + } + + //--------------------------------------------------------------- + SALOME_MED::medGeometryElement + VISUGeomToMED(int theGeom) + { + switch(theGeom){ + case VISU::ePOINT1: + return SALOME_MED::MED_POINT1; + case VISU::eSEG2: + return SALOME_MED::MED_SEG2; + case VISU::eTRIA3: + return SALOME_MED::MED_TRIA3; + case VISU::eQUAD4: + return SALOME_MED::MED_QUAD4; + case VISU::eTETRA4: + return SALOME_MED::MED_TETRA4; + case VISU::eHEXA8: + return SALOME_MED::MED_HEXA8; + case VISU::ePENTA6: + return SALOME_MED::MED_PENTA6; + case VISU::ePYRA5: + return SALOME_MED::MED_PYRA5; + + case VISU::eSEG3: + return SALOME_MED::MED_SEG3; + case VISU::eTRIA6: + return SALOME_MED::MED_TRIA6; + case VISU::eQUAD8: + return SALOME_MED::MED_QUAD8; + case VISU::eTETRA10: + return SALOME_MED::MED_TETRA10; + case VISU::eHEXA20: + return SALOME_MED::MED_HEXA20; + case VISU::ePENTA15: + return SALOME_MED::MED_PENTA15; + case VISU::ePYRA13: + return SALOME_MED::MED_PYRA13; + case VISU::ePOLYGONE: + return SALOME_MED::MED_POLYGON; + case VISU::ePOLYEDRE: + return SALOME_MED::MED_POLYHEDRA; + } + return SALOME_MED::medGeometryElement(-1); + } + + //--------------------------------------------------------------- + SALOME_MED::medGeometryElement + VTKGeomToMED(int theVTKGeomType) + { + switch(theVTKGeomType){ + case VTK_VERTEX: + return SALOME_MED::MED_POINT1; + case VTK_LINE: + return SALOME_MED::MED_SEG2; + case VTK_TRIANGLE: + return SALOME_MED::MED_TRIA3; + case VTK_QUAD: + return SALOME_MED::MED_QUAD4; + case VTK_TETRA: + return SALOME_MED::MED_TETRA4; + case VTK_HEXAHEDRON: + return SALOME_MED::MED_HEXA8; + case VTK_WEDGE: + return SALOME_MED::MED_PENTA6; + case VTK_PYRAMID: + return SALOME_MED::MED_PYRA5; + case VTK_POLYGON: + return SALOME_MED::MED_POLYGON; + } + return SALOME_MED::medGeometryElement(-1); + } + + //--------------------------------------------------------------- + VISU::TEntity + MEDEntityToVTK(SALOME_MED::medEntityMesh theMEDEntity) + { + switch(theMEDEntity){ + case SALOME_MED::MED_NODE: + return VISU::NODE_ENTITY; + case SALOME_MED::MED_EDGE: + return VISU::EDGE_ENTITY; + case SALOME_MED::MED_FACE: + return VISU::FACE_ENTITY; + case SALOME_MED::MED_CELL: + return VISU::CELL_ENTITY; + } + return VISU::TEntity(-1); + } + + //--------------------------------------------------------------- + SALOME_MED::medEntityMesh + VTKEntityToMED(VISU::TEntity theVTKEntity) + { + switch(theVTKEntity){ + case VISU::NODE_ENTITY: + return SALOME_MED::MED_NODE; + case VISU::EDGE_ENTITY: + return SALOME_MED::MED_EDGE; + case VISU::FACE_ENTITY: + return SALOME_MED::MED_FACE; + case VISU::CELL_ENTITY: + return SALOME_MED::MED_CELL; + } + return SALOME_MED::medEntityMesh(-1); + } + + + //--------------------------------------------------------------- + std::string + GetSObjectName(SALOMEDS::SObject_ptr aSObject) + { + SALOMEDS::GenericAttribute_var anAttr; + if (aSObject->FindAttribute(anAttr,"AttributeName")) { + SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr); + CORBA::String_var aString = aName->Value(); + return aString.in(); + } + return ""; + } + + + //--------------------------------------------------------------- + void + GetCellsSize(vtkIdType& theNbCells, + vtkIdType& theCellsSize, + SALOME_MED::MESH_ptr theMEDMesh, + const VISU::TEntity& theVEntity) + { + theNbCells = theCellsSize = 0; + if(MYDEBUG) MESSAGE("GetCellsSize - theVEntity = "<getConnectGlobal(aMEntity); + int iGeomEnd = connInfo->meshTypes.length(); + for(int iGeom = 0; iGeom < iGeomEnd; iGeom++){ + int iNumElemEnd = connInfo->numberOfElements[iGeom]; + if(iNumElemEnd > 0){ + if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<nodalConnectivityLength[iGeom]; + theNbCells += iNumElemEnd; + } + } + } + + + //--------------------------------------------------------------- + void + GetCellsSize(vtkIdType& theNbCells, + vtkIdType& theCellsSize, + SALOME_MED::FAMILY_ptr theMEDFamily) + { + theNbCells = theCellsSize = 0; + SALOME_MED::SUPPORT::supportInfos_var suppInfo=theMEDFamily->getSupportGlobal(); + int iGeomEnd = suppInfo->types.length(); + if(MYDEBUG) MESSAGE("GetCellsSize - iGeomEnd = "<nbEltTypes[iGeom]; + if(iNumElemEnd > 0){ + if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<nodalConnectivityLength[iGeom]; + } + } + } + + + //--------------------------------------------------------------- + void + GetCellsSize(VISU::PCMesh theMesh, + SALOME_MED::MESH_ptr theMEDMesh, + const VISU::TEntity& theEntity) + { + VISU::TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap; + VISU::PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMap[theEntity]; + if(theEntity == VISU::NODE_ENTITY){ + aMeshOnEntity->myNbCells = theMesh->myNbPoints; + aMeshOnEntity->myCellsSize = 2*theMesh->myNbPoints; + }else{ + GetCellsSize(aMeshOnEntity->myNbCells,aMeshOnEntity->myCellsSize,theMEDMesh,theEntity); + } + } + + + //--------------------------------------------------------------- + VISU::PCMeshOnEntity + InitMeshOnEntity(const VISU::PCMesh& theMesh, + const VISU::TEntity& theEntity, + const VISU::PCMeshOnEntity& theMeshOnEntity) + { + VISU::PCMeshOnEntity aMeshOnEntity; + VISU::TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap; + VISU::TMeshOnEntityMap::const_iterator anIter = aMeshOnEntityMap.find(theEntity); + if(anIter == aMeshOnEntityMap.end()){ + aMeshOnEntity.reset(new VISU::TCMeshOnEntity()); + *aMeshOnEntity = *theMeshOnEntity; + aMeshOnEntity->myEntity = theEntity; + aMeshOnEntityMap[theEntity] = aMeshOnEntity; + }else + aMeshOnEntity = anIter->second; + + GetCellsSize(theMesh,theMesh->myMesh,theEntity); + + return aMeshOnEntity; + } + + + VISU::PCSubProfile + CrSubProfile(const VISU::PCMesh theMesh, + const VISU::PCField theField, + const VISU::TCMeshOnEntity& theMeshOnEntity, + SALOME_MED::medGeometryElement theMGeom, + int theNbElems) + { + if (MYDEBUG) MESSAGE("CrSubProfile"); + VISU::EGeometry aEGeom = MEDGeom2VISU(theMGeom); + vtkIdType aVNbNodes = VISUGeom2NbNodes(aEGeom); + + VISU::PCSubProfile aSubProfile(new VISU::TCSubProfile()); + aSubProfile->myGeom = aEGeom; + aSubProfile->myMGeom = theMGeom; + aSubProfile->myStatus = VISU::eAddAll; + if(MYDEBUG) MESSAGE("theMGeom = "<myStatus = VISU::eRemoveAll; + else if(aTimeStampIter == aCellsFirstIndex.end() && theMGeom == SALOME_MED::MED_POINT1){ + if(theNbElems > 0){ + aSubProfile->myName = ""; + aSubProfile->myStatus = VISU::eAddPart; + + aSubProfile->myNbCells = theNbElems; + aSubProfile->myCellsSize = aSubProfile->myNbCells; + } + }else{ + if(theNbElems > 0){ + aSubProfile->myName = ""; + aSubProfile->myStatus = VISU::eAddPart; + + aSubProfile->myNbCells = theNbElems; + aSubProfile->myCellsSize = aSubProfile->myNbCells*aVNbNodes; + } + } + + if (MYDEBUG) MESSAGE("CrSubProfile done"); + return aSubProfile; + } + + VISU::TProfileKey + GetProfileKey(const VISU::PCMesh theMesh, + const VISU::PCField theField, + const VISU::PCValForTime theValForTime, + const VISU::TCMeshOnEntity& theMeshOnEntity) + { + if (MYDEBUG) MESSAGE("GetProfileKey"); + + VISU::TProfileKey aProfileKey; + + const VISU::TCellsFirstIndex& aFirstIndex = theMeshOnEntity.myCellsFirstIndex; + VISU::TCellsFirstIndex::const_iterator anIter = aFirstIndex.begin(); + SALOME_MED::SUPPORT_var aSupport = theValForTime->myField->getSupport(); + int aNbElems = 0; + if(anIter == aFirstIndex.end() && aSupport->getEntity() == SALOME_MED::MED_NODE){ + SALOME_MED::medGeometryElement aMGeom = SALOME_MED::MED_POINT1; + try{ + aNbElems = aSupport->getNumberOfElements(SALOME_MED::MED_NONE); + if(MYDEBUG)MESSAGE("aMGeom="<myField->getSupport()->getNumberOfElements(aMGeom);"); + } + + VISU::PCSubProfile aSubProfile = CrSubProfile(theMesh, + theField, + theMeshOnEntity, + aMGeom, + aNbElems); + aProfileKey.insert(aSubProfile); + } + + for(; anIter != aFirstIndex.end(); anIter++){ + SALOME_MED::medGeometryElement aMGeom = anIter->first; + try{ + aNbElems = aSupport->getNumberOfElements(aMGeom); + if(MYDEBUG)MESSAGE("aMGeom="<myField->getSupport()->getNumberOfElements(aMGeom);"); + continue; + } + VISU::PCSubProfile aSubProfile = CrSubProfile(theMesh, + theField, + theMeshOnEntity, + aMGeom, + aNbElems); + aProfileKey.insert(aSubProfile); + } + + if (MYDEBUG) MESSAGE("GetProfileKey done"); + return aProfileKey; + } + + void + InitProfile(VISU::PCMesh theMesh, + VISU::PCField theField, + VISU::PCValForTime theValForTime, + VISU::TCMeshOnEntity& theMeshOnEntity) + { + if (MYDEBUG) MESSAGE("InitProfile"); + + VISU::TProfileMap& aProfileMap = theMeshOnEntity.myProfileMap; + + VISU::TProfileKey aProfileKey = GetProfileKey(theMesh, + theField, + theValForTime, + theMeshOnEntity); + + VISU::TProfileMap::const_iterator anIter = aProfileMap.find(aProfileKey); + if(anIter != aProfileMap.end()){ + theValForTime->myProfile = anIter->second; + if(MYDEBUG) MESSAGE("aProfileMap.find(aProfileKey) aProfile->myGeom="); + }else{ + VISU::PCProfile aProfile(new VISU::TCProfile()); + VISU::TGeom2SubProfile& aGeom2SubProfile = aProfile->myGeom2SubProfile; + + VISU::TProfileKey::const_iterator anIter = aProfileKey.begin(); + for(; anIter != aProfileKey.end(); anIter++){ + VISU::PCSubProfile aSubProfile(*anIter); + + if(aProfile->myIsAll && aSubProfile->myStatus != VISU::eAddAll) + aProfile->myIsAll = false; + + VISU::EGeometry aEGeom = aSubProfile->myGeom; + aGeom2SubProfile[aEGeom] = aSubProfile; + } + + aProfileMap[aProfileKey] = aProfile; + theValForTime->myProfile = aProfile; + } + if (MYDEBUG) MESSAGE("InitProfile done"); + } -void VISU_CorbaMedSupportConvertor::SetSupport(SALOME_MED::SUPPORT_ptr theSupport) { - mySupport = SALOME_MED::SUPPORT::_duplicate(theSupport); - if(!mySupport->_is_nil()) - myMedMesh = mySupport->getMesh(); + void + LoadProfile(VISU::PCMesh theMesh, + VISU::PCField theField, + VISU::PCValForTime theValForTime, + VISU::PCMeshOnEntity theMeshOnEntity) + { + VISU::PCProfile aProfile = theValForTime->myProfile; + if (MYDEBUG) MESSAGE("LoadProfile aProfile->myIsDone="<myIsDone); + if(aProfile->myIsDone) + return; + + const VISU::TGeom2SubProfile& aGeom2SubProfile = aProfile->myGeom2SubProfile; + VISU::TGeom2SubProfile::const_iterator aGeom2SubProfileIter = aGeom2SubProfile.begin(); + if(aGeom2SubProfileIter == aGeom2SubProfile.end()){ + MESSAGE("Warning! No geom 2 sub profile"); + } + SALOME_MED::SUPPORT_var aSupport = theValForTime->myField->getSupport(); + for(; aGeom2SubProfileIter != aGeom2SubProfile.end(); aGeom2SubProfileIter++){ + VISU::EGeometry aEGeom = aGeom2SubProfileIter->first; + SALOME_MED::medGeometryElement aMGeom = VISUGeomToMED(aEGeom); + VISU::PCSubProfile aSubProfile = aGeom2SubProfileIter->second; + SALOME_MED::long_array_var aGeom2ProfileIds; + std::vector aGeom2Profile; + if(!aSupport->isOnAllElements()){ + try{ + if(aMGeom == SALOME_MED::MED_POINT1) + aGeom2ProfileIds = aSupport->getNumberFromFile(SALOME_MED::MED_NONE); + else + aGeom2ProfileIds = aSupport->getNumberFromFile(aMGeom); + int aLen = aGeom2ProfileIds->length(); + if(MYDEBUG) MESSAGE(" - aMGeom="<" << anId << endl; + } + if(MYDEBUG) cout << endl; + } catch(...) { + continue; + } + } else { + SALOME_MED::medEntityMesh aMEntity = aSupport->getEntity(); + int aNbElems = theMesh->myMesh->getNumberOfElements(aMEntity,aMGeom); + for(int i = 0; i < aNbElems; i++) + aGeom2Profile.push_back(i+1); + } + if(aGeom2Profile.size()>0){ + VISU::TSubMeshID& aSubMeshID = aSubProfile->mySubMeshID; + int aSize = aGeom2Profile.size(); + aSubMeshID.resize(aSize); + for(int anId = 0; anId < aSize; anId++){ + aSubMeshID[anId] = aGeom2Profile[anId] - 1; + } + } + } + + aProfile->myIsDone = true; + if (MYDEBUG) MESSAGE("LoadProfile done"); + } } -int ImportPoints(VISU::TMesh& theMesh, SALOME_MED::MESH_ptr theMESH) - throw (std::runtime_error&) + +//--------------------------------------------------------------- +VISU_Convertor* +VISU_MEDFieldConvertor +::Build() { -/* - if(MYDEBUG) MESSAGE("ImportPoints - beginning"); - theMesh.myDim = theMESH->getMeshDimension(); - int aNbPoints = theMESH->getNumberOfNodes(); - VISU::TMesh::TPointsCoord& aPointsCoord = theMesh.myPointsCoord; - aPointsCoord.resize(theMesh.myDim*aNbPoints,0.0); - Engines::double_array_var coord = theMESH->getCoordinates(SALOME_MED::MED_FULL_INTERLACE); - for (int i = 0 ; i < aNbPoints; i++) - for(int j = 0, ij = theMesh.myDim*i; j < theMesh.myDim; j++) - aPointsCoord[ij+j] = coord[ij+j]; + if(myField->_is_nil()) + throw std::runtime_error("VISU_MEDFieldConvertor::Build >> myField->_is_nil() !!!"); + + SALOME_MED::SUPPORT_var aMEDSupport = myField->getSupport(); + if(aMEDSupport->_is_nil()) + throw std::runtime_error("VISU_MEDFieldConvertor::Build >> aMEDSupport->_is_nil() !!!"); + + SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity(); + VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity); + SALOME_MED::MESH_var aMEDMesh = aMEDSupport->getMesh(); + if(aMEDMesh->_is_nil()) + throw std::runtime_error("VISU_MEDFieldConvertor::Build >> aMEDMesh->_is_nil() !!!"); + + CORBA::String_var aMeshName = aMEDMesh->getName(); + CORBA::String_var aFieldName = myField->getName(); + + VISU::PCMesh aMesh = myMeshMap[aMeshName.in()](new VISU::TCMesh()); + aMesh->myNamedPointCoords(new VISU::TNamedPointCoords()); + aMesh->myNbPoints = aMEDMesh->getNumberOfNodes(); + aMesh->myDim = aMEDMesh->getSpaceDimension(); + aMesh->myName = aMeshName.in(); + aMesh->myMesh = aMEDMesh; + + if(MYDEBUG) MESSAGE("VISU_MEDFieldConvertor::Build - aMeshName = "<Init(myField->getNumberOfComponents(), aDataType); + + if(MYDEBUG) MESSAGE("VISU_MEDFieldConvertor::Build - aMeshName = "<myField = myField; + if(MYDEBUG) - MESSAGE("ImportPoints - End : theDim = "<> mySObject->_is_nil() !!!"); + SALOMEDS::Study_var aStudy = mySObject->GetStudy(); + + CORBA::Object_var aMedObject = VISU::SObjectToObject(mySObject); + if(!CORBA::is_nil(aMedObject)){ + SALOME_MED::MED_var aMED = SALOME_MED::MED::_narrow(aMedObject); + return Build(aMED); + } + + SALOMEDS::ChildIterator_var aTimeStampIterator = aStudy->NewChildIterator(mySObject); + return Build(aTimeStampIterator); } -int ImportCells(VISU::TMesh& theMesh, SALOME_MED::MESH_ptr theMESH, - const SALOME_MED::medEntityMesh& theEntity) - throw (std::runtime_error&) + +namespace { -/* - if(MYDEBUG) MESSAGE("ImportCells - theEntity = "<first, iEnd = anEntity2Geom->second; - int *iArray, iEnd; - VISU::TEntity anEntity = MED2VISUEntity(theEntity); - Entity2Geom(anEntity,iArray,&iEnd); - int aNbPoints = theMesh.myPointsCoord.size(); - for (int i = 0; i < iEnd; i++) { - int medId = FindIdMEDType(iArray[i]); - int nbMedNodes = salome_med2vtk[medId].medNbNodes; - int nbVtkNodes = salome_med2vtk[medId].vtkNbNodes; - int aVtkType = salome_med2vtk[medId].vtkType; - SALOME_MED::medGeometryElement aMedType = salome_med2vtk[medId].medType; - int jEnd = theMESH->getNumberOfElements(theEntity,aMedType); - if(jEnd > 0){ - VISU::TMeshOnEntity& aMeshOnEntity = theMesh.myMeshOnEntityMap[anEntity]; - Engines::long_array_var conn = - theMESH->getConnectivity(SALOME_MED::MED_FULL_INTERLACE,SALOME_MED::MED_NODAL,theEntity,aMedType); - if(MYDEBUG) MESSAGE("ImportCells - medName = "<Value(); + theIsSuccess = (myName == aValue.in()); + if(theIsSuccess) + return TRet(SALOMEDS::SObject::_duplicate(theSObj)); + } + return TRet(); + } + + }; + + + //--------------------------------------------------------------- + struct TMeshByName + { + std::string myName; + typedef tuple TRet; + + TMeshByName(const std::string& theName): + myName(theName) + {} + + TRet operator()(SALOMEDS::SObject_ptr theSObj, bool& theIsSuccess) + { + CORBA::Object_var anObj = VISU::SObjectToObject(theSObj); + if(!CORBA::is_nil(anObj)){ + SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(anObj); + if(!CORBA::is_nil(aMesh)){ + CORBA::String_var aName = aMesh->getName(); + theIsSuccess = (myName == aName.in()); + if(theIsSuccess) + return TRet(aMesh,SALOMEDS::SObject::_duplicate(theSObj)); } - for (int k = 0; k < nbVtkNodes; k++) - if(anArray[k] < 0 || aNbPoints <= anArray[k]) - throw std::runtime_error("ImportCells >> anArray[k] < 0 || aNbPoints <= anArray[k]"); } - if(MYDEBUG) - MESSAGE("ImportCells - aMeshOnEntity.myCellsConn.size() = "< + typename TFun::TRet + Find(SALOMEDS::SObject_ptr theStartSObj, + SALOMEDS::Study_ptr theStudy, + TFun theFun, + bool& theIsSuccess, + bool theIsAllLevels = true) + { + SALOMEDS::ChildIterator_var anIter = theStudy->NewChildIterator(theStartSObj); + anIter->InitEx(theIsAllLevels); + for(; anIter->More(); anIter->Next()){ + SALOMEDS::SObject_var aSObj = anIter->Value(); + typename TFun::TRet aRet = theFun(aSObj,theIsSuccess); + if(theIsSuccess) + return aRet; + } + return typename TFun::TRet(); } -*/ -} -VISU_Convertor* VISU_MedMeshConvertor::Build() throw (std::runtime_error&) { -/* - if(myMedMesh->_is_nil()) - throw std::runtime_error("VISU_MedMeshConvertor::Build >> myMesh->_is_nil()"); - CORBA::String_var aName = myMedMesh->getName(); - myName = aName; - TMesh& aMesh = myMeshMap[myName]; - if(MYDEBUG) MESSAGE("MedInfo - aMeshName = "<first); - ::ImportPoints(aMesh,myMedMesh); - TVisu2MedEntity::const_iterator aVisu2MedEntityIter = aVisu2MedEntity.begin(); - for(; aVisu2MedEntityIter != aVisu2MedEntity.end(); aVisu2MedEntityIter++) - ::ImportCells(aMesh,myMedMesh,aVisu2MedEntityIter->second); - myIsDone = true; - return this; -*/ } -template int ImportField(TArray& theArray, - const VISU::TMeshOnEntity& theMeshOnEntity, - VISU::TField& theField, - const SALOME_MED::medEntityMesh& theEntity, - const VISU::TField::TTime& theTime) + +//--------------------------------------------------------------- +VISU_Convertor* +VISU_MEDConvertor +::Build(SALOME_MED::MED_ptr theMED) { -/* - if(MYDEBUG) MESSAGE("ImportField - IEnd = "<length()<<"; myNbComp = "< 0){ + if(MYDEBUG) + MESSAGE("VISU_MEDConvertor::Build - Support isOnAllElements = '"<myGroupMap; + aGroupMap[aSupportName.in()] = aGroup; + } + + } } } } -*/ -} -VISU_Convertor* VISU_CorbaMedConvertor::Build() throw (std::runtime_error&){ -/* - if(myMedField->_is_nil()) - throw std::runtime_error("VISU_CorbaMedConvertor::Build >> myField->_is_nil()"); - if(VISU_MedMeshConvertor::Build() == NULL) return NULL; - CORBA::String_var aName = myMedField->getName(); - myName = aName; - TMeshMap::const_iterator aMeshIter = myMeshMap.begin(); - const TMesh& aMesh = aMeshIter->second; - int aNbPoints = aMesh.myPointsCoord.size()/aMesh.myDim; - int aNbCells = aMesh.GetCellsDims().first; - aName = myMedField->getName(); - aMeshOnEntity.myEntity = theEntity; - aMeshOnEntity.myMeshName = theMesh.myName; - TField& aField = myFieldMap[aName.in()]; - aField.myMeshName = aMeshIter->first; - SALOME_MED::SUPPORT_var aSupport = myMedField->getSupport(); - SALOME_MED::medEntityMesh anEntity = aSupport->getEntity(); - int aSize; - if(anEntity == SALOME_MED::MED_NODE){ - aSize = aNbPoints; - aField.myTypeConn = POINT_DATA; - if(MYDEBUG) MESSAGE("VISU_CorbaMedConvertor::Build - POINT_DATA = "<_is_nil()){ - if(MYDEBUG) MESSAGE("VISU_CorbaMedConvertor::Build - There is FIELDDOUBLE"); - Engines::double_array_var anArray = aFieldDouble->getValue(SALOME_MED::MED_FULL_INTERLACE); - ::ImportField(anArray,aMesh,aField,anEntity,aTime); + anIsSuccess = false; + aSObjectByNameRet = Find(aMedCompSObj,aStudy,TSObjectByName("MEDFIELD"),anIsSuccess); + if(anIsSuccess){ + SALOMEDS::SObject_var aFieldsSObj = boost::get<0>(aSObjectByNameRet); + if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - MEDFIELD found."); + SALOMEDS::ChildIterator_var aFieldIterator = aStudy->NewChildIterator(aFieldsSObj); + for(int iField = 0; aFieldIterator->More(); aFieldIterator->Next(), iField++){ + SALOMEDS::SObject_var aFieldSObj = aFieldIterator->Value(); + if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aFieldName = '"<NewChildIterator(aFieldSObj); + for(; aTimeStampIterator->More(); aTimeStampIterator->Next()){ + SALOMEDS::SObject_var aTimeStampSObj = aTimeStampIterator->Value(); + if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aTimeStampSObj = '"<_is_nil()) + continue; + + SALOME_MED::SUPPORT_var aMEDSupport = aMEDField->getSupport(); + if(aMEDSupport->_is_nil()) + continue; + + SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity(); + VISU::TEntity anEntity = MEDEntityToVTK(aMEntity); + SALOME_MED::MESH_var aMEDMesh = aMEDSupport->getMesh(); + if(aMEDMesh->_is_nil()) + continue; + + CORBA::String_var aMeshName = aMEDMesh->getName(); + CORBA::String_var aFieldName = aMEDField->getName(); + + VISU::TMeshMap::iterator aMeshMapIter = myMeshMap.find(aMeshName.in()); + if(aMeshMapIter == myMeshMap.end()) + continue; + + VISU::PCMesh aMesh = aMeshMapIter->second; + VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap; + VISU::TMeshOnEntityMap::iterator aMeshOnEntityMapIter = aMeshOnEntityMap.find(anEntity); + if(aMeshOnEntityMapIter == aMeshOnEntityMap.end()) + continue; + + VISU::PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second; + VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap; + VISU::TFieldMap::iterator aFieldMapIter = aFieldMap.find(aFieldName.in()); + VISU::PCField aField; + if(aFieldMapIter == aFieldMap.end()){ + aField = aFieldMap[aFieldName.in()](new VISU::TCField()); + aField->myId = iField; + aField->myName = aFieldName.in(); + aField->myEntity = anEntity; + aField->myMeshName = aMeshName.in(); + aField->myDataSize = aMeshOnEntity->myNbCells * aField->myNbComp; + + vtkIdType aDataType = VTK_DOUBLE; + SALOME_MED::FIELDDOUBLE_ptr aFieldDouble = SALOME_MED::FIELDDOUBLE::_narrow(aMEDField); + if(aFieldDouble->_is_nil()) { + // PAL18313: Mandriva 64 porting: CRASH at creating presentation on "Import Structure". + if (sizeof(long) == 4 ) // Size of CORBA::Long is always 4 (see CORBA_basetypes.h) + aDataType = VTK_LONG; + else if (sizeof(int) == 4) + aDataType = VTK_INT; + else { + MESSAGE("Can't map CORBA::Long to a VTK type, for Field " << aFieldName); + continue; + } + } + aField->Init(aMEDField->getNumberOfComponents(), aDataType); + + if(MYDEBUG) + MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity->myNbCells = "<myNbCells); + }else + aField = aFieldMapIter->second; + + VISU::TValField& aValField = aField->myValField; + int anId = aMEDField->getIterationNumber(); + VISU::PCValForTime aValForTime = aValField[anId](new VISU::TCValForTime()); + aValForTime->myId = anId; + CORBA::Double aDT = aMEDField->getTime(); + aValForTime->myTime = VISU::TTime(aDT,""); + aValForTime->myField = aMEDField; + if(MYDEBUG) + MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<getValue(SALOME_MED::MED_FULL_INTERLACE); - ::ImportField(anArray,aMesh,aField,anEntity,aTime); + return this; +} + + +//--------------------------------------------------------------- +VISU_Convertor* +VISU_MEDConvertor +::Build(SALOMEDS::ChildIterator_ptr theTimeStampIterator) +{ + if(theTimeStampIterator->_is_nil()) return NULL; + for(; theTimeStampIterator->More(); theTimeStampIterator->Next()){ + SALOMEDS::SObject_var aTimeStampSObj = theTimeStampIterator->Value(); + if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aTimeStampSObj = '"<_is_nil()) + continue; + + SALOME_MED::SUPPORT_var aMEDSupport = aMEDField->getSupport(); + if(aMEDSupport->_is_nil()) + continue; + + SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity(); + VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity); + SALOME_MED::MESH_var aMEDMesh = aMEDSupport->getMesh(); + if(aMEDMesh->_is_nil()) continue; + CORBA::String_var aMeshName = aMEDMesh->getName(); + CORBA::String_var aFieldName = aMEDField->getName(); + + VISU::PCMesh aMesh; + VISU::TMeshMap::const_iterator aMeshMapIter = myMeshMap.find(aMeshName.in()); + if(aMeshMapIter == myMeshMap.end()){ + aMesh.reset(new VISU::TCMesh()); + aMesh->myNamedPointCoords(new VISU::TNamedPointCoords()); + aMesh->myNbPoints = aMEDMesh->getNumberOfNodes(); + aMesh->myDim = aMEDMesh->getSpaceDimension(); + aMesh->myName = aMeshName.in(); + aMesh->myMesh = aMEDMesh; + + myMeshMap[aMeshName.in()] = aMesh; + + if(MYDEBUG) + MESSAGE("VISU_MEDConvertor::Build "<< + "- aMeshName = '"<myNbCells = "<myNbCells); + }else + aField = aFieldMapIter->second; + + VISU::TValField& aValField = aField->myValField; + int anId = aMEDField->getIterationNumber(); + VISU::PCValForTime aValForTime = aValField[anId](new VISU::TCValForTime()); + aValForTime->myId = anId; + CORBA::Double aDT = aMEDField->getTime(); + aValForTime->myTime = VISU::TTime(aDT,""); + aValForTime->myField = aMEDField; + if(MYDEBUG) + MESSAGE("VISU_MEDConvertor::Build "<< + "- aMeshName = '"<getEntity(); - med_int nmailles[SALOME_MED::MED_ALL_ELEMENTS]; - if(MYDEBUG) MESSAGE("ImportCellsOfSupport - anEntity = "<isOnAllElements()){ - int jEnd = theMesh.myPointsCoord.size()/theMesh.myDim; - if(MYDEBUG) MESSAGE("ImportCellsOfSupport - isOnAllElements - "<(1,j); + //Main part of code + int anIsUpdated = LoadPoints(theMesh); + VISU::TFamilySet::const_iterator aFamilyIter = theFamilySet.begin(); + for(; aFamilyIter != theFamilySet.end(); aFamilyIter++){ + VISU::PCFamily aFamily = *aFamilyIter; + const VISU::TEntity& aVEntity = aFamily->myEntity; + VISU::PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[aVEntity]; + if(aVEntity == VISU::NODE_ENTITY){ + anIsUpdated |= LoadPointsOnFamily(theMesh,aFamily); }else{ - SALOME_MED::medGeometryElement_array_var aGeom = theSUPPORT->getTypes(); - Engines::long_array_var aCellNumForType = theSUPPORT->getNumber(aGeom[0]); - int jEnd = aCellNumForType->length(); - aConnForCellType.resize(jEnd); - for (int j = 0; j < jEnd; j++) - aConnForCellType[j] = vector(1,aCellNumForType[j]-1); + anIsUpdated |= LoadCellsOnEntity(theMesh,aMeshOnEntity); + anIsUpdated |= LoadCellsOnFamily(theMesh,aMeshOnEntity,aFamily); + } + } + + return anIsUpdated; +} + + +//--------------------------------------------------------------- +int +VISU_MEDConvertor +::LoadValForTimeOnMesh(VISU::PMeshImpl theMesh, + VISU::PMeshOnEntityImpl theMeshOnEntity, + VISU::PFieldImpl theField, + VISU::PValForTimeImpl theValForTime) +{ + //Main part of code + int anIsUpdated = LoadPoints(theMesh); + const VISU::TEntity& aVEntity = theMeshOnEntity->myEntity; + if(aVEntity != VISU::NODE_ENTITY) + anIsUpdated |= LoadCellsOnEntity(theMesh,theMeshOnEntity); + + anIsUpdated |= LoadField(theMesh,theMeshOnEntity,theField,theValForTime); + + return anIsUpdated; +} + + +//--------------------------------------------------------------- +int +VISU_MEDConvertor +::LoadPoints(VISU::PCMesh theMesh) +{ + //Check on existing family + VISU::PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[VISU::NODE_ENTITY]; + + //Check on loading already done + if(theMesh->myIsDone) + return 0; + + SALOME_MED::MESH_var& aMedMesh = theMesh->myMesh; + vtkIdType aDim = theMesh->GetDim(); + vtkIdType aNbElem = theMesh->GetNbPoints(); + + if(MYDEBUG) MESSAGE("LoadPoints - aNbElem = "<> There is no points in the mesh !!!"); + + SALOME_MED::double_array_var aCCoord = aMedMesh->getCoordinates(SALOME_MED::MED_FULL_INTERLACE); + VISU::TCMEDCoordHolder* aCoordHolder = new VISU::TCMEDCoordHolder(); + aCoordHolder->Init(aNbElem, aDim, aCCoord); + + VISU::TNamedPointCoords& aCoords = theMesh->myNamedPointCoords; + aCoords.Init(VISU::PCoordHolder(aCoordHolder)); + + if(MYDEBUG) MESSAGE("LoadPoints - Filling aMeshOnEntity with type NODE_ENTITY"); + + VISU::TGeom2SubMesh& aGeom2SubMesh = aMeshOnEntity->myGeom2SubMesh; + VISU::PSubMeshImpl aSubMesh = aGeom2SubMesh[VISU::ePOINT1](new VISU::TCSubMesh()); + + aSubMesh->myNbCells = theMesh->myNbPoints; + aSubMesh->myCellsSize = 2*theMesh->myNbPoints; + + VISU::TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect; + aCell2Connect.resize(aNbElem); + if(MYDEBUG) MESSAGE("LoadPoints - aNbElem="<myIsDone = true; + + return 1; +} + + +//--------------------------------------------------------------- +int +VISU_MEDConvertor +::LoadPointsOnFamily(VISU::PCMesh theMesh, + VISU::PCFamily theFamily) +{ + VISU::PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[VISU::NODE_ENTITY]; + + if(theFamily->myIsDone) + return 0; + + vtkIdType aNbElem = theMesh->GetNbPoints(); + SALOME_MED::FAMILY_var aMedFamily = theFamily->myFamily; + CORBA::Boolean anIsOnAllElements = aMedFamily->isOnAllElements(); + VISU::TSubMeshID& aSubMeshID = theFamily->myGeom2SubMeshID[VISU::ePOINT1]; + + if(!anIsOnAllElements){ + SALOME_MED::medGeometryElement_array_var aGeom = aMedFamily->getTypes(); + SALOME_MED::long_array_var aCellNumForType = aMedFamily->getNumber(aGeom[0]); + int aSize = aNbElem; + aNbElem = aCellNumForType->length(); + for(int iElem = 0; iElem < aNbElem; iElem++){ + int anID = aCellNumForType[iElem] - 1; + if(0 > anID || anID >= aSize){ + static QString aString; + aString.sprintf("LoadPointsOnFamily - aSize(%d) <= aCellNumForType[%d] = %d < 0",aSize,iElem,anID); + throw std::runtime_error(aString.latin1()); + } + aSubMeshID.push_back(anID); } }else{ - VISU::TMesh aBaseMesh; - SALOME_MED::MESH_var aMedMesh = theSUPPORT->getMesh(); - ::ImportPoints(aBaseMesh,aMedMesh); - ::ImportCells(aBaseMesh,aMedMesh,anEntity); - if(theSUPPORT->isOnAllElements()){ - if(MYDEBUG) MESSAGE("ImportCellsOfSupport - isOnAllElements"); - }else{ - SALOME_MED::medGeometryElement_array_var aGeom = theSUPPORT->getTypes(); - int iEnd = aGeom->length(); - if(MYDEBUG) MESSAGE("ImportCellsOfSupport - aGeom->length() = "<getNumber(aGeom[i]); - int medId = FindIdMEDType(aGeom[i]); - int aVtkType = salome_med2vtk[medId].vtkType; - med_int jEnd = aCellNumForType->length(); - if(MYDEBUG) MESSAGE("ImportCellsOfSupport - medName = "<> aNbPoints(%d) <= anArray[%d][%d]=%d < 0 !!!",aNbPoints,iElem,k,anArray[k]); + throw std::runtime_error(aString.latin1()); + } + aCell2Connect.push_back(anArray); + } // loop on elements + } + }} // switch( aMGeom ) + VISU::TGeom2SubMesh::iterator anIter = aGeom2SubMesh.find(aEGeom); + if(anIter != aGeom2SubMesh.end()){ + const VISU::PSubMeshImpl& aSubMesh = anIter->second; + const VISU::TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect; + int aSize = aCell2Connect.size(); + if(MYDEBUG) MESSAGE("LoadCellsOnEntity - aCounter = "<first << endl; +// PSubMeshImpl aSubMesh = geom_sm->second; +// TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect; +// TCell2Connect::iterator id_conn = aCell2Connect.begin(); +// for ( int i = 0; id_conn !=aCell2Connect.end(); ++id_conn ) { +// cout << "\t" << i++ << ": ["; +// TConnect& anArray = *id_conn; +// TConnect::iterator n = anArray.begin(); +// for ( ; n != anArray.end(); ++n ) +// cout << " " << *n + 1; +// cout << " ]"<< endl; +// } +// } +// #endif + + theMeshOnEntity->myIsDone = true; + + return 1; +} + + +//--------------------------------------------------------------- +int +VISU_MEDConvertor +::LoadCellsOnFamily(VISU::PCMesh theMesh, + VISU::PCMeshOnEntity theMeshOnEntity, + VISU::PCFamily theFamily) +{ + if(theFamily->myIsDone) + return 0; + + SALOME_MED::FAMILY_var aMedFamily = theFamily->myFamily; + CORBA::Boolean anIsOnAllElements = aMedFamily->isOnAllElements(); + if(!anIsOnAllElements){ + SALOME_MED::medGeometryElement_array_var aGeoms = aMedFamily->getTypes(); + int iGeomEnd = aGeoms->length(); + if(MYDEBUG) MESSAGE("LoadCellsOnFamily - iGeomEnd = "<getNumber(aMGeom); + VISU::EGeometry aEGeom = MEDGeom2VISU(aMGeom); + + int aNbElem = aCellNumForType->length(); + int aCounter = theMeshOnEntity->myCellsFirstIndex[aMGeom].first; + int aSize = theMeshOnEntity->myCellsFirstIndex[aMGeom].second; + VISU::TSubMeshID& aSubMeshID = theFamily->myGeom2SubMeshID[aEGeom]; + + if(MYDEBUG) + MESSAGE("LoadCellsOnFamily "<< + "- aMGeom = "<myGeom2SubMesh; + VISU::TGeom2SubMesh::const_iterator anIter = aGeom2SubMesh.begin(); + for(; anIter != aGeom2SubMesh.end(); anIter++){ + VISU::EGeometry aEGeom = anIter->first; + const VISU::TSubMeshImpl& aSubMesh = anIter->second; + const VISU::TCell2Connect& aCell2Connect = aSubMesh.myCell2Connect; + VISU::TSubMeshID& aSubMeshID = theFamily->myGeom2SubMeshID[aEGeom]; + int iNumElemEnd = aCell2Connect.size(); + for(int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++) + aSubMeshID.push_back(iNumElem); + } } + + theFamily->myIsDone = true; + return 1; -*/ } -VISU_Convertor* VISU_CorbaMedSupportConvertor::Build() throw (std::runtime_error&) { -/* - if(MYDEBUG) MESSAGE("BuildSupport - checking mySupport & mySupport->getMesh()"); - if(mySupport->_is_nil()) - throw std::runtime_error("VISU_CorbaMedConvertor::Build >> mySupport->_is_nil()"); - SALOME_MED::GROUP_var aGroup = SALOME_MED::GROUP::_narrow(mySupport); - int aNbCells = 0; - if(!aGroup->_is_nil()){ - CORBA::String_var aName = aGroup->getName(); - myName = aName; - if(MYDEBUG) MESSAGE("BuildSupport aGroup->getName() = "<getFamilies(); - med_int iEnd = anArray->length(); - TMesh& aMesh = myMeshMap[myName]; - if(MYDEBUG) MESSAGE("BuildSupport - aGroup->getFamilies()->length() = "<GetMeshValue(aEGeom); + TVMeshValue* aMeshValue = new TVMeshValue(); + aMeshValue->Init(aNbElem, aNbGauss, aNbComp, theContainer, aStart); + aVMeshValue.reset(aMeshValue); + } + } } - if(aNbCells == 0) - throw std::runtime_error("VISU_MedMeshConvertor::Build >> aNbCells == 0"); - if(MYDEBUG) MESSAGE("BuildSupport - aNbCells = "<myUnstructuredGridIDMapper; + if(anUnstructuredGridIDMapper->myIsVTKDone) + return 0; + + VISU::PCProfile aProfile(new VISU::TCProfile()); + aProfile->myIsAll = true; + theValForTime->myProfile = aProfile; + + SALOME_MED::FIELD_var aMEDField = theValForTime->myField; + + SALOME_MED::SUPPORT_var aMEDSupport = aMEDField->getSupport(); + + if(aMEDSupport->isOnAllElements()) aProfile->myIsDone = true; + + SALOME_MED::FIELDDOUBLE_ptr aFieldDouble = SALOME_MED::FIELDDOUBLE::_narrow(aMEDField); + if(!aFieldDouble->_is_nil()){ + SALOME_MED::double_array_var anArray = aFieldDouble->getValue(SALOME_MED::MED_FULL_INTERLACE); + if(MYDEBUG) MESSAGE("VISU_MEDConvertor::LoadField - There is FIELDDOUBLE = "<length()); + ImportField(anArray, + theMesh, + theField, + theValForTime, + theMeshOnEntity); + } + + SALOME_MED::FIELDINT_ptr aFieldInt = SALOME_MED::FIELDINT::_narrow(aMEDField); + if(!aFieldInt->_is_nil()){ + SALOME_MED::long_array_var anArray = aFieldInt->getValue(SALOME_MED::MED_FULL_INTERLACE); + if(MYDEBUG) MESSAGE("VISU_MEDConvertor::LoadField - There is FIELDINT = "<length()); + ImportField(anArray, + theMesh, + theField, + theValForTime, + theMeshOnEntity); + } + + anUnstructuredGridIDMapper->myIsVTKDone = true; + + MESSAGE("VISU_MEDConvertor::LoadField done"); + return 1; }