X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FSMDS_VtkFace.cxx;h=80644c7e2ab6b2f9869d7755b043da4876fb52fc;hb=9f2f0a0c1aee7625e2fe7a5a848f6f076fd1f638;hp=79a087709d43857ffb2a97618b225385f24eb62d;hpb=8fa039a796957b302d86d90b22afc0a998573f83;p=modules%2Fsmesh.git diff --git a/src/SMDS/SMDS_VtkFace.cxx b/src/SMDS/SMDS_VtkFace.cxx index 79a087709..80644c7e2 100644 --- a/src/SMDS/SMDS_VtkFace.cxx +++ b/src/SMDS/SMDS_VtkFace.cxx @@ -1,3 +1,22 @@ +// Copyright (C) 2010-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 +// + #include "SMDS_VtkFace.hxx" #include "SMDS_MeshNode.hxx" #include "SMDS_Mesh.hxx" @@ -13,7 +32,7 @@ SMDS_VtkFace::SMDS_VtkFace() { } -SMDS_VtkFace::SMDS_VtkFace(std::vector nodeIds, SMDS_Mesh* mesh) +SMDS_VtkFace::SMDS_VtkFace(const std::vector& nodeIds, SMDS_Mesh* mesh) { init(nodeIds, mesh); } @@ -22,10 +41,10 @@ SMDS_VtkFace::~SMDS_VtkFace() { } -void SMDS_VtkFace::init(std::vector nodeIds, SMDS_Mesh* mesh) +void SMDS_VtkFace::init(const std::vector& nodeIds, SMDS_Mesh* mesh) { + SMDS_MeshFace::init(); vtkUnstructuredGrid* grid = mesh->getGrid(); - myIdInShape = -1; myMeshId = mesh->getMeshId(); vtkIdType aType = VTK_TRIANGLE; switch (nodeIds.size()) @@ -42,21 +61,24 @@ void SMDS_VtkFace::init(std::vector nodeIds, SMDS_Mesh* mesh) case 8: aType = VTK_QUADRATIC_QUAD; break; + case 9: + aType = VTK_BIQUADRATIC_QUAD; + break; default: aType = VTK_POLYGON; break; } - myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), &nodeIds[0]); + myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), (vtkIdType*) &nodeIds[0]); mesh->setMyModified(); //MESSAGE("SMDS_VtkFace::init myVtkID " << myVtkID); } -void SMDS_VtkFace::initPoly(std::vector nodeIds, SMDS_Mesh* mesh) +void SMDS_VtkFace::initPoly(const std::vector& nodeIds, SMDS_Mesh* mesh) { + SMDS_MeshFace::init(); vtkUnstructuredGrid* grid = mesh->getGrid(); - myIdInShape = -1; myMeshId = mesh->getMeshId(); - myVtkID = grid->InsertNextLinkedCell(VTK_POLYGON, nodeIds.size(), &nodeIds[0]); + myVtkID = grid->InsertNextLinkedCell(VTK_POLYGON, nodeIds.size(), (vtkIdType*) &nodeIds[0]); mesh->setMyModified(); } @@ -98,6 +120,7 @@ int SMDS_VtkFace::NbEdges() const break; case VTK_QUAD: case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: nbEdges = 4; break; case VTK_POLYGON: @@ -128,7 +151,10 @@ int SMDS_VtkFace::NbNodes() const const SMDS_MeshNode* SMDS_VtkFace::GetNode(const int ind) const { - return SMDS_MeshElement::GetNode(ind); // --- a optimiser ! + vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); + vtkIdType npts, *pts; + grid->GetCellPoints( this->myVtkID, npts, pts ); + return SMDS_Mesh::_meshList[myMeshId]->FindNodeVtk( pts[ ind ]); } bool SMDS_VtkFace::IsQuadratic() const @@ -140,6 +166,7 @@ bool SMDS_VtkFace::IsQuadratic() const { case VTK_QUADRATIC_TRIANGLE: case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: return true; break; default: @@ -165,6 +192,7 @@ bool SMDS_VtkFace::IsMediumNode(const SMDS_MeshNode* node) const rankFirstMedium = 3; // medium nodes are of rank 3,4,5 break; case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: rankFirstMedium = 4; // medium nodes are of rank 4,5,6,7 break; default: @@ -193,29 +221,40 @@ bool SMDS_VtkFace::IsMediumNode(const SMDS_MeshNode* node) const return false; } +int SMDS_VtkFace::NbCornerNodes() const +{ + vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); + int nbPoints = grid->GetCell(myVtkID)->GetNumberOfPoints(); + vtkIdType aVtkType = grid->GetCellType(myVtkID); + if ( aVtkType != VTK_POLYGON ) + return nbPoints <= 4 ? nbPoints : nbPoints / 2; + return nbPoints; +} + SMDSAbs_EntityType SMDS_VtkFace::GetEntityType() const { vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); vtkIdType aVtkType = grid->GetCellType(this->myVtkID); - SMDSAbs_EntityType aType = SMDSEntity_Polygon; - switch (aVtkType) - { - case VTK_TRIANGLE: - aType = SMDSEntity_Triangle; - break; - case VTK_QUAD: - aType = SMDSEntity_Quadrangle; - break; - case VTK_QUADRATIC_TRIANGLE: - aType = SMDSEntity_Quad_Triangle; - break; - case VTK_QUADRATIC_QUAD: - aType = SMDSEntity_Quad_Quadrangle; - break; - default: - aType = SMDSEntity_Polygon; + return SMDS_MeshCell::toSmdsType( VTKCellType( aVtkType )); +} + +SMDSAbs_GeometryType SMDS_VtkFace::GetGeomType() const +{ + vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); + vtkIdType aVtkType = grid->GetCellType(this->myVtkID); + switch ( aVtkType ) { + case VTK_TRIANGLE: + case VTK_QUADRATIC_TRIANGLE: + return SMDSGeom_TRIANGLE; + case VTK_QUAD: + case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: + return SMDSGeom_QUADRANGLE; + case VTK_POLYGON: + return SMDSGeom_POLYGON; + default:; } - return aType; + return SMDSGeom_NONE; } vtkIdType SMDS_VtkFace::GetVtkType() const @@ -249,7 +288,7 @@ SMDS_ElemIteratorPtr SMDS_VtkFace::interlacedNodesElemIterator() const } //! change only the first node, used for temporary triangles in quadrangle to triangle adaptor -void SMDS_VtkFace::ChangeApex(const SMDS_MeshNode* node) +void SMDS_VtkFace::ChangeApex(SMDS_MeshNode* node) { vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); vtkIdType npts = 0; @@ -257,6 +296,6 @@ void SMDS_VtkFace::ChangeApex(const SMDS_MeshNode* node) grid->GetCellPoints(myVtkID, npts, pts); grid->RemoveReferenceToCell(pts[0], myVtkID); pts[0] = node->getVtkId(); - grid->AddReferenceToCell(pts[0], myVtkID); + node->AddInverseElement(this), SMDS_Mesh::_meshList[myMeshId]->setMyModified(); }