X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Object.cxx;h=ec37985d4371aab42422491b331deb95b55fd288;hp=30bef057940ff267aebc4eed6203d4e94baf83a5;hb=38a77c4a9810f4715212368ac53315689ba9150f;hpb=f5016d85b7b4b88623723027a1585c6414c4dc66 diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index 30bef0579..ec37985d4 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -30,6 +30,7 @@ #include "SMDS_Mesh.hxx" #include "SMDS_PolyhedralVolumeOfNodes.hxx" +#include "SMDS_BallElement.hxx" #include "SMESH_Actor.h" #include "SMESH_ControlsDef.hxx" #include "SalomeApp_Application.h" @@ -43,7 +44,7 @@ #include #include #include - +#include #include #include @@ -103,6 +104,7 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, else if ( theNbNodes == 6 ) return VTK_QUADRATIC_TRIANGLE; else if ( theNbNodes == 8 ) return VTK_QUADRATIC_QUAD; else if ( theNbNodes == 9 ) return VTK_BIQUADRATIC_QUAD; + else if ( theNbNodes == 7 ) return VTK_BIQUADRATIC_TRIANGLE; else return VTK_EMPTY_CELL; case SMDSAbs_Volume: @@ -149,48 +151,56 @@ SMESH_VisualObjDef::~SMESH_VisualObjDef() //================================================================================= vtkIdType SMESH_VisualObjDef::GetNodeObjId( int theVTKID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = myVTK2SMDSNodes.find(theVTKID); - return i == myVTK2SMDSNodes.end() ? -1 : i->second; - } - return this->GetMesh()->FindNodeVtk(theVTKID)->GetID(); + if (myLocalGrid) + { + TMapOfIds::const_iterator i = myVTK2SMDSNodes.find(theVTKID); + return i == myVTK2SMDSNodes.end() ? -1 : i->second; + } + const SMDS_MeshNode* aNode = 0; + if( this->GetMesh() ) + aNode = this->GetMesh()->FindNodeVtk( theVTKID ); + + return aNode ? aNode->GetID() : -1; } vtkIdType SMESH_VisualObjDef::GetNodeVTKId( int theObjID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = mySMDS2VTKNodes.find(theObjID); + if (myLocalGrid) + { + TMapOfIds::const_iterator i = mySMDS2VTKNodes.find(theObjID); return i == mySMDS2VTKNodes.end() ? -1 : i->second; - } + } - const SMDS_MeshNode* aNode = 0; - if( this->GetMesh() ) { - aNode = this->GetMesh()->FindNode(theObjID); - } - return aNode ? aNode->getVtkId() : -1; + const SMDS_MeshNode* aNode = 0; + if( this->GetMesh() ) { + aNode = this->GetMesh()->FindNode(theObjID); + } + return aNode ? aNode->getVtkId() : -1; } vtkIdType SMESH_VisualObjDef::GetElemObjId( int theVTKID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = myVTK2SMDSElems.find(theVTKID); - return i == myVTK2SMDSElems.end() ? -1 : i->second; - } + if (myLocalGrid) + { + TMapOfIds::const_iterator i = myVTK2SMDSElems.find(theVTKID); + return i == myVTK2SMDSElems.end() ? -1 : i->second; + } return this->GetMesh()->fromVtkToSmds(theVTKID); } vtkIdType SMESH_VisualObjDef::GetElemVTKId( int theObjID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = mySMDS2VTKElems.find(theObjID); - return i == mySMDS2VTKElems.end() ? -1 : i->second; - } - return this->GetMesh()->FindElement(theObjID)->getVtkId(); - //return this->GetMesh()->fromSmdsToVtk(theObjID); + if (myLocalGrid) + { + TMapOfIds::const_iterator i = mySMDS2VTKElems.find(theObjID); + return i == mySMDS2VTKElems.end() ? -1 : i->second; + } + + const SMDS_MeshElement* e = 0; + if ( this->GetMesh() ) + e = this->GetMesh()->FindElement(theObjID); + + return e ? e->getVtkId() : -1; } //================================================================================= @@ -278,7 +288,9 @@ void SMESH_VisualObjDef::buildPrs(bool buildGrid) //MESSAGE(myGrid->GetReferenceCount()); //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); //MESSAGE( "Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints() ); - if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"buildPrs.vtu" ); + if( MYDEBUGWITHFILES ) { + SMESH::WriteUnstructuredGrid( myGrid,"myPrs.vtu" ); + } } } @@ -416,7 +428,13 @@ void SMESH_VisualObjDef::buildElemPrs() aConnect.reserve(VTK_CELL_SIZE); SMDS_Mesh::CheckMemory(); // PAL16631 - + bool hasBalls = nbEnts[ SMDSAbs_Ball ] > 0; + vtkDataArray* aScalars = 0; + if(hasBalls) { + aScalars = vtkDataArray::CreateDataArray(VTK_DOUBLE); + aScalars->SetNumberOfComponents(1); + aScalars->SetNumberOfTuples(aNbCells); + } for ( int i = 0; i < nbTypes; i++ ) // iterate through all types of elements { if ( nbEnts[ aTypes[ i ] ] > 0 ) { @@ -474,8 +492,19 @@ void SMESH_VisualObjDef::buildElemPrs() } } } - aConnectivity->InsertNextCell( anIdList ); + vtkIdType aCurId = aConnectivity->InsertNextCell( anIdList ); aCellTypesArray->InsertNextValue( vtkElemType ); + + //Store diameters of the balls + if(aScalars) { + double aDiam = 0; + if(aType == SMDSAbs_Ball) { + if (const SMDS_BallElement* ball = dynamic_cast(anElem) ) { + aDiam = ball->GetDiameter(); + } + } + aScalars->SetTuple(aCurId,&aDiam); + } iElem++; } @@ -496,6 +525,7 @@ void SMESH_VisualObjDef::buildElemPrs() aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); myGrid->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); + myGrid->GetCellData()->SetScalars(aScalars); aCellLocationsArray->Delete(); aCellTypesArray->Delete(); @@ -522,7 +552,7 @@ bool SMESH_VisualObjDef::GetEdgeNodes( const int theElemId, if ( anElem == 0 ) return false; - int nbNodes = anElem->NbNodes(); + int nbNodes = anElem->NbCornerNodes(); if ( theEdgeNum < 0 || theEdgeNum > 3 || (nbNodes != 3 && nbNodes != 4) || theEdgeNum > nbNodes ) return false; @@ -530,7 +560,7 @@ bool SMESH_VisualObjDef::GetEdgeNodes( const int theElemId, vector anIds( nbNodes ); SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); int i = 0; - while( anIter->more() ) + while( anIter->more() && i < nbNodes ) anIds[ i++ ] = anIter->next()->GetID(); if ( theEdgeNum < nbNodes - 1 ) @@ -567,12 +597,12 @@ vtkUnstructuredGrid* SMESH_VisualObjDef::GetUnstructuredGrid() bool SMESH_VisualObjDef::IsValid() const { //MESSAGE("SMESH_VisualObjDef::IsValid"); - return GetNbEntities(SMDSAbs_Node) > 0 || - GetNbEntities(SMDSAbs_0DElement) > 0 || - GetNbEntities(SMDSAbs_Ball) > 0 || - GetNbEntities(SMDSAbs_Edge) > 0 || - GetNbEntities(SMDSAbs_Face) > 0 || - GetNbEntities(SMDSAbs_Volume) > 0 ; + return ( GetNbEntities(SMDSAbs_0DElement) > 0 || + GetNbEntities(SMDSAbs_Ball ) > 0 || + GetNbEntities(SMDSAbs_Edge ) > 0 || + GetNbEntities(SMDSAbs_Face ) > 0 || + GetNbEntities(SMDSAbs_Volume ) > 0 || + GetNbEntities(SMDSAbs_Node ) > 0 ); } //================================================================================= @@ -659,6 +689,8 @@ SMESH_MeshObj::~SMESH_MeshObj() { if ( MYDEBUG ) MESSAGE("SMESH_MeshObj - this = "<Delete(); } //================================================================================= @@ -995,11 +1027,16 @@ int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList.clear(); SMDS_Mesh* aMesh = myMeshObj->GetMesh(); - if ( myGroupServer->Size() == 0 || aMesh == 0 ) + if ( aMesh == 0 ) return 0; SMDSAbs_ElementType aGrpType = SMDSAbs_ElementType(myGroupServer->GetType()); + if ( aGrpType != theType && theType != SMDSAbs_Node ) + return 0; + SMESH::long_array_var anIds = myGroupServer->GetListOfID(); + if ( anIds->length() == 0 ) + return 0; if ( aGrpType == theType ) return getPointers( theType, anIds, aMesh, theResList ); @@ -1007,7 +1044,7 @@ int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& return getNodesFromElems( anIds, aMesh, theResList ); else return 0; -} +}