Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "SMDS_VtkEdge.hxx"
00021 #include "SMDS_MeshNode.hxx"
00022 #include "SMDS_Mesh.hxx"
00023 #include "SMDS_VtkCellIterator.hxx"
00024
00025 #include "utilities.h"
00026
00027 #include <vector>
00028 #include <cassert>
00029
00030 using namespace std;
00031
00032 SMDS_VtkEdge::SMDS_VtkEdge()
00033 {
00034 }
00035
00036 SMDS_VtkEdge::SMDS_VtkEdge(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
00037 {
00038 init(nodeIds, mesh);
00039 }
00040
00041 SMDS_VtkEdge::~SMDS_VtkEdge()
00042 {
00043 }
00044
00045 void SMDS_VtkEdge::init(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
00046 {
00047 SMDS_MeshEdge::init();
00048 vtkUnstructuredGrid* grid = mesh->getGrid();
00049 myMeshId = mesh->getMeshId();
00050 vtkIdType aType = VTK_LINE;
00051 if (nodeIds.size() == 3)
00052 aType = VTK_QUADRATIC_EDGE;
00053 myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), &nodeIds[0]);
00054 mesh->setMyModified();
00055
00056 }
00057
00058 bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode * node1, const SMDS_MeshNode * node2)
00059 {
00060 const SMDS_MeshNode* nodes[] = { node1, node2 };
00061 SMDS_Mesh::_meshList[myMeshId]->setMyModified();
00062 return ChangeNodes(nodes, 2);
00063 }
00064
00065 bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes)
00066 {
00067 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
00068 vtkIdType npts = 0;
00069 vtkIdType* pts = 0;
00070 grid->GetCellPoints(myVtkID, npts, pts);
00071 if (nbNodes != npts)
00072 {
00073 MESSAGE("ChangeNodes problem: not the same number of nodes " << npts << " -> " << nbNodes);
00074 return false;
00075 }
00076 for (int i = 0; i < nbNodes; i++)
00077 {
00078 pts[i] = nodes[i]->getVtkId();
00079 }
00080 SMDS_Mesh::_meshList[myMeshId]->setMyModified();
00081 return true;
00082 }
00083
00084 bool SMDS_VtkEdge::IsMediumNode(const SMDS_MeshNode* node) const
00085 {
00086 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
00087 vtkIdType npts = 0;
00088 vtkIdType* pts = 0;
00089 grid->GetCellPoints(myVtkID, npts, pts);
00090
00091 return ((npts == 3) && (node->getVtkId() == pts[2]));
00092 }
00093
00094 void SMDS_VtkEdge::Print(std::ostream & OS) const
00095 {
00096 OS << "edge <" << GetID() << "> : ";
00097 }
00098
00099 int SMDS_VtkEdge::NbNodes() const
00100 {
00101 vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
00102 int nbPoints = grid->GetCell(myVtkID)->GetNumberOfPoints();
00103 assert(nbPoints >= 2);
00104 return nbPoints;
00105 }
00106
00107 int SMDS_VtkEdge::NbEdges() const
00108 {
00109 return 1;
00110 }
00111
00112 SMDSAbs_EntityType SMDS_VtkEdge::GetEntityType() const
00113 {
00114 if (NbNodes() == 2)
00115 return SMDSEntity_Edge;
00116 else
00117 return SMDSEntity_Quad_Edge;
00118 }
00119
00120 vtkIdType SMDS_VtkEdge::GetVtkType() const
00121 {
00122 if (NbNodes() == 2)
00123 return VTK_LINE;
00124 else
00125 return VTK_QUADRATIC_EDGE;
00126
00127 }
00128
00134 const SMDS_MeshNode*
00135 SMDS_VtkEdge::GetNode(const int ind) const
00136 {
00137
00138 return SMDS_MeshElement::GetNode(ind);
00139 }
00140
00141 bool SMDS_VtkEdge::IsQuadratic() const
00142 {
00143 if (this->NbNodes() > 2)
00144 return true;
00145 else
00146 return false;
00147 }
00148
00149 SMDS_ElemIteratorPtr SMDS_VtkEdge::elementsIterator(SMDSAbs_ElementType type) const
00150 {
00151 switch (type)
00152 {
00153 case SMDSAbs_Node:
00154 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIterator(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
00155 default:
00156 MESSAGE("ERROR : Iterator not implemented")
00157 ;
00158 return SMDS_ElemIteratorPtr((SMDS_ElemIterator*) NULL);
00159 }
00160 }
00161
00162 SMDS_ElemIteratorPtr SMDS_VtkEdge::nodesIteratorToUNV() const
00163 {
00164 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
00165 }
00166
00167 SMDS_ElemIteratorPtr SMDS_VtkEdge::interlacedNodesElemIterator() const
00168 {
00169 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
00170 }