1 #include "SMDS_VtkFace.hxx"
2 #include "SMDS_MeshNode.hxx"
3 #include "SMDS_Mesh.hxx"
4 #include "SMDS_VtkCellIterator.hxx"
12 SMDS_VtkFace::SMDS_VtkFace()
16 SMDS_VtkFace::SMDS_VtkFace(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
21 SMDS_VtkFace::~SMDS_VtkFace()
25 void SMDS_VtkFace::init(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
27 SMDS_MeshFace::init();
28 vtkUnstructuredGrid* grid = mesh->getGrid();
29 myMeshId = mesh->getMeshId();
30 vtkIdType aType = VTK_TRIANGLE;
31 switch (nodeIds.size())
40 aType = VTK_QUADRATIC_TRIANGLE;
43 aType = VTK_QUADRATIC_QUAD;
49 myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), &nodeIds[0]);
50 mesh->setMyModified();
51 //MESSAGE("SMDS_VtkFace::init myVtkID " << myVtkID);
54 void SMDS_VtkFace::initPoly(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
56 SMDS_MeshFace::init();
57 vtkUnstructuredGrid* grid = mesh->getGrid();
58 myMeshId = mesh->getMeshId();
59 myVtkID = grid->InsertNextLinkedCell(VTK_POLYGON, nodeIds.size(), &nodeIds[0]);
60 mesh->setMyModified();
63 bool SMDS_VtkFace::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes)
65 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
68 grid->GetCellPoints(myVtkID, npts, pts);
71 MESSAGE("ChangeNodes problem: not the same number of nodes " << npts << " -> " << nbNodes);
74 for (int i = 0; i < nbNodes; i++)
76 pts[i] = nodes[i]->getVtkId();
78 SMDS_Mesh::_meshList[myMeshId]->setMyModified();
82 void SMDS_VtkFace::Print(std::ostream & OS) const
84 OS << "face <" << GetID() << "> : ";
87 int SMDS_VtkFace::NbEdges() const
89 // TODO quadratic polygons ?
90 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
91 vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
96 case VTK_QUADRATIC_TRIANGLE:
100 case VTK_QUADRATIC_QUAD:
105 nbEdges = grid->GetCell(myVtkID)->GetNumberOfPoints();
111 int SMDS_VtkFace::NbFaces() const
116 int SMDS_VtkFace::NbNodes() const
118 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
119 int nbPoints = grid->GetCell(myVtkID)->GetNumberOfPoints();
124 * \brief Return node by its index
125 * \param ind - node index
126 * \retval const SMDS_MeshNode* - the node
129 SMDS_VtkFace::GetNode(const int ind) const
131 return SMDS_MeshElement::GetNode(ind); // --- a optimiser !
134 bool SMDS_VtkFace::IsQuadratic() const
136 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
137 vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
138 // TODO quadratic polygons ?
141 case VTK_QUADRATIC_TRIANGLE:
142 case VTK_QUADRATIC_QUAD:
150 bool SMDS_VtkFace::IsPoly() const
152 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
153 vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
154 return (aVtkType == VTK_POLYGON);
157 bool SMDS_VtkFace::IsMediumNode(const SMDS_MeshNode* node) const
159 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
160 vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
161 int rankFirstMedium = 0;
164 case VTK_QUADRATIC_TRIANGLE:
165 rankFirstMedium = 3; // medium nodes are of rank 3,4,5
167 case VTK_QUADRATIC_QUAD:
168 rankFirstMedium = 4; // medium nodes are of rank 4,5,6,7
171 //MESSAGE("wrong element type " << aVtkType);
176 grid->GetCellPoints(myVtkID, npts, pts);
177 vtkIdType nodeId = node->getVtkId();
178 for (int rank = 0; rank < npts; rank++)
180 if (pts[rank] == nodeId)
182 //MESSAGE("rank " << rank << " is medium node " << (rank < rankFirstMedium));
183 if (rank < rankFirstMedium)
189 //throw SALOME_Exception(LOCALIZED("node does not belong to this element"));
190 MESSAGE("======================================================");
191 MESSAGE("= IsMediumNode: node does not belong to this element =");
192 MESSAGE("======================================================");
196 SMDSAbs_EntityType SMDS_VtkFace::GetEntityType() const
198 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
199 vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
200 SMDSAbs_EntityType aType = SMDSEntity_Polygon;
204 aType = SMDSEntity_Triangle;
207 aType = SMDSEntity_Quadrangle;
209 case VTK_QUADRATIC_TRIANGLE:
210 aType = SMDSEntity_Quad_Triangle;
212 case VTK_QUADRATIC_QUAD:
213 aType = SMDSEntity_Quad_Quadrangle;
216 aType = SMDSEntity_Polygon;
221 vtkIdType SMDS_VtkFace::GetVtkType() const
223 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
224 vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
228 SMDS_ElemIteratorPtr SMDS_VtkFace::elementsIterator(SMDSAbs_ElementType type) const
233 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIterator(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
235 MESSAGE("ERROR : Iterator not implemented")
237 return SMDS_ElemIteratorPtr((SMDS_ElemIterator*) NULL);
241 SMDS_ElemIteratorPtr SMDS_VtkFace::nodesIteratorToUNV() const
243 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
246 SMDS_ElemIteratorPtr SMDS_VtkFace::interlacedNodesElemIterator() const
248 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
251 //! change only the first node, used for temporary triangles in quadrangle to triangle adaptor
252 void SMDS_VtkFace::ChangeApex(SMDS_MeshNode* node)
254 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
257 grid->GetCellPoints(myVtkID, npts, pts);
258 grid->RemoveReferenceToCell(pts[0], myVtkID);
259 pts[0] = node->getVtkId();
260 node->AddInverseElement(this),
261 SMDS_Mesh::_meshList[myMeshId]->setMyModified();