#include "FITKCGNSReader.h" #include "FITK_Interface/FITKInterfaceMesh/FITKUnstructuredFluidMeshVTK.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Interface/FITKInterfaceMesh/FITKUnstructuredMeshVTK.h" #include "FITK_Interface/FITKInterfaceModel/FITKElementFactory.h" #include "FITK_Interface/FITKInterfaceModel/FITKAbstractElement.h" #include namespace IO { void FITKCGNSReader::run() { *_resultMark = false; m_Mesh = dynamic_cast(_data); if (!m_Mesh)return; *_resultMark = read(); if (m_index_file != -1) cg_close(m_index_file); } void FITKCGNSReader::consoleMessage(int level, const QString& str) { } bool FITKCGNSReader::read() { //检查有效的 CGNS 文件 2:hdf5 int file_type = 0; if (CG_OK != cg_is_cgns(_fileName.toStdString().c_str(), &file_type))return false; //打开 CGNS 文件 if (CG_OK != cg_open(_fileName.toStdString().c_str(), CG_MODE_READ, &m_index_file))return false; //获取 文件的CGNS 版本 float fileVersion = -1; if (CG_OK != cg_version(m_index_file, &fileVersion))return false; //获取 CGNS文件精度 int precision = -1; if (CG_OK != cg_precision(m_index_file, &precision))return false; // 获取文件中的 CGNS 基节点数 int nbases = 0; if (CG_OK != cg_nbases(m_index_file, &nbases))return false; for (int iBase = 0; iBase < nbases; ++iBase) { //获取基本信息标识 m_index_base = iBase + 1; //读取族 int nfamily = 0; cg_nfamilies(m_index_file, m_index_base, &nfamily); for (int i = 1; i <= nfamily; ++i) { int nBoco = 0, nGeos = 0; char name[64] = { 0 }; cg_family_read(m_index_file, m_index_base, i, name, &nBoco, &nGeos); } //获取基本信息 char base_name[33]; int cell_dim = -1, phys_dim = -1; if (CG_OK != cg_base_read(m_index_file, m_index_base, base_name, &cell_dim, &phys_dim))return false; //获取 base 中的区域数 int nzones = 0; if (CG_OK != cg_nzones(m_index_file, m_index_base, &nzones))return false; //获取区域数据 for (int iZone = 0; iZone < nzones; ++iZone) { m_index_zone = iZone + 1; if (!readZone()) return false; //获取单元数据 if (!this->readSections()) return false; } } return true; } bool FITKCGNSReader::readZone() { //获取区域名称 char zone_name[33] = { 0 }; /*int*/ cgsize_t zone_ijk[3][3] = { 0 }; ///< MG get Zone_t node 's name and every direction vertex cell number if (CG_OK != cg_zone_read(m_index_file, m_index_base, m_index_zone, zone_name, zone_ijk[0])) return false; //获取 CGNS 区域的索引维度 int dim = 3; if (CG_OK != cg_index_dim(m_index_file, m_index_base, m_index_zone, &dim)) return false; //获取节点数量 int vertex_number = 0; /*int*/ cgsize_t read_range[2][3] = { 0 }; cgsize_t rmax_cell[3]{}; //获取区域类型(结构化或非结构化) CGNS_ENUMT(ZoneType_t) zonetype; if (CG_OK != cg_zone_type(m_index_file, m_index_base, m_index_zone, &zonetype)) return false; if (zonetype == CGNS_ENUMV(Structured)) { //结构 vertex_number = zone_ijk[0][0] * zone_ijk[0][1] * zone_ijk[0][2]; for (int n = 0; n < 3; n++) { read_range[0][n] = 1; read_range[1][n] = zone_ijk[0][n]; rmax_cell[n] = zone_ijk[1][n]; } } else if (zonetype == CGNS_ENUMV(Unstructured)) { //非结构 vertex_number = zone_ijk[0][0]; for (int ijk = 0; ijk < 3; ++ijk) { read_range[0][ijk] = 1; read_range[1][ijk] = vertex_number; rmax_cell[ijk] = zone_ijk[0][1]; } } else return false; //读取节点数据 if (!this->readCoordinate(vertex_number, read_range[0], read_range[1]) || m_verlist.size() != vertex_number) return false; if (!readZoneFlowSolution(vertex_number, 0, read_range[1], rmax_cell)) return false; // Read Boundary Condition Count int bcCount = 0; if (CG_OK != cg_nbocos(m_index_file, m_index_base, m_index_zone, &bcCount)) return false; // Read Boundary Conditions' Info for (int iBc = 1; iBc <= bcCount; ++iBc) { if (!readBoundaryCond(iBc)) return false; } //this->readBC(zone_ijk[0][0], zone_ijk[0][1], zone_ijk[0][2]); return true; } bool FITKCGNSReader::readCoordinate(int vertext_num, /*int*/ cgsize_t range_from[3], /*int*/ cgsize_t range_to[3]) { //清理点的数据链表 m_verlist.clear(); //开辟数据空间 m_verlist.fill(VertexDataInfo(), vertext_num); //获取方向轴数量 int coordinate_number = 0; if (CG_OK != cg_ncoords(m_index_file, m_index_base, m_index_zone, &coordinate_number)) return false; //获取节点坐标 for (int coor_index = 1; coor_index <= coordinate_number; ++coor_index) { //获取方向轴信息 char coordinate_name[33] = { 0 }; CGNS_ENUMV(DataType_t) datatype; if (CG_OK != cg_coord_info(m_index_file, m_index_base, m_index_zone, coor_index, &datatype, coordinate_name)) return false; //获取坐标轴参数 double *xyz = new double[vertext_num]; if (CG_OK != cg_coord_read(m_index_file, m_index_base, m_index_zone, coordinate_name, CGNS_ENUMV(RealDouble), range_from, range_to, xyz)) { delete[] xyz; return false; } if (!strcmp(coordinate_name, "CoordinateX")) { for (int ipt = 0; ipt < vertext_num; ++ipt) { m_verlist[ipt].x = xyz[ipt]; } } else if (!strcmp(coordinate_name, "CoordinateY")) { for (int ipt = 0; ipt < vertext_num; ++ipt) { m_verlist[ipt].y = xyz[ipt]; } } else if (!strcmp(coordinate_name, "CoordinateZ")) { for (int ipt = 0; ipt < vertext_num; ++ipt) { m_verlist[ipt].z = xyz[ipt]; } } delete[] xyz; } //插入节点数据 Interface::FITKUnstructuredMeshVTK* fieldMesh = m_Mesh->getFieldMesh(); for (int i = 0; i < vertext_num; ++i) { VertexDataInfo v = m_verlist[i]; fieldMesh->addNode(v.x, v.y, v.z); } return true; } bool FITKCGNSReader::readBC(int zonei, int zonej, int zonek) { //#ifdef Q_OS_WIN int nbocos = 0; if (cg_nbocos(m_index_file, m_index_base, m_index_zone, &nbocos)) return false; for (int bc_index = 1; bc_index <= nbocos; ++bc_index) { CGNS_ENUMT(BCType_t) bctype; CGNS_ENUMT(PointSetType_t) ptype; CGNS_ENUMT(GridLocation_t) location; CGNS_ENUMT(DataType_t) datatype; char bc_name[33] = { 0 }; // int np = 0; int nrmlindex[3] = { 0 }; // int is = 0, ib = 0; cgsize_t np = 0, is = 0; int ib = 0; if (cg_boco_info(m_index_file, m_index_base, m_index_zone, bc_index, bc_name, &bctype, &ptype, &np, nrmlindex, &is, &datatype, &ib)) return false; cg_goto(m_index_file, m_index_base, "Zone_t", m_index_zone, "ZoneBC_t", 1, "BC_t", bc_index, "end"); char cName[64] = { 0 }; cg_famname_read(cName); int indexDeimension = 0; cg_index_dim(m_index_file, m_index_base, m_index_zone, &indexDeimension); int npnts = np * indexDeimension; assert(6 == npnts); cgsize_t *pnpnts = new cgsize_t[npnts]; cgsize_t *plist = NULL; if (is) plist = new cgsize_t[is]; if (cg_boco_read(m_index_file, m_index_base, m_index_zone, bc_index, pnpnts, plist)) return false; int rang[6]; for (int iCnt = 0; iCnt < 6; ++iCnt) rang[iCnt] = pnpnts[iCnt]; int i_range[2] = { 0 }, j_range[2] = { 0 }, k_range[2] = { 0 }; i_range[0] = pnpnts[0] - 1, i_range[1] = pnpnts[3] - 1, j_range[0] = pnpnts[1] - 1; j_range[1] = pnpnts[4] - 1, k_range[0] = pnpnts[2] - 1, k_range[1] = pnpnts[5] - 1; delete[] pnpnts; int xd = i_range[1] - i_range[0] + 1; int yd = j_range[1] - j_range[0] + 1; int zd = k_range[1] - k_range[0] + 1; for (int k = k_range[0]; k <= k_range[1]; ++k) { for (int j = j_range[0]; j <= j_range[1]; ++j) { for (int i = i_range[0]; i <= i_range[1]; ++i) { int index = i + (j * zonei) + (k * zonei * zonej); VertexDataInfo v = m_verlist.at(index); /* points->InsertNextPoint(v.x, v.y, v.z);*/ } } } } return true; } bool FITKCGNSReader::readZoneFlowSolution(int pointLen, int cellLen, cgsize_t* rmax_pt, cgsize_t* rmax_cell) { int solCount = 0; if (CG_OK != cg_nsols(m_index_file, m_index_base, m_index_zone, &solCount)) return false; for (int iSol = 1; iSol <= solCount; ++iSol) { char solName[33]{}; CGNS_ENUMT(GridLocation_t) location; if (CG_OK != cg_sol_info(m_index_file, m_index_base, m_index_zone, iSol, solName, &location)) return false; int fieldCount = 0; if (CG_OK != cg_nfields(m_index_file, m_index_base, m_index_zone, iSol, &fieldCount)) return false; for (int iField = 1; iField <= fieldCount; ++iField) { DataType_t dataType; char varName[33]{}; if (CG_OK != cg_field_info(m_index_file, m_index_base, m_index_zone, iSol, iField, &dataType, varName)) return false; cgsize_t rmin[3]{ 1, 1, 1 }; cgsize_t rmax[3]{}; int len = 0; if (location == CGNS_ENUMV(Vertex)) { len = pointLen; rmax[0] = rmax_pt[0]; rmax[1] = rmax_pt[1]; rmax[2] = rmax_pt[2]; } else if (location == CGNS_ENUMV(CellCenter)) { len = cellLen; rmax[0] = rmax_cell[0]; rmax[1] = rmax_cell[1]; rmax[2] = rmax_cell[2]; } else return false; void* var{ nullptr }; if (dataType == RealSingle) { var = new float[len]; } else if (dataType == RealDouble) { var = new double[len]; } else return false; if (CG_OK != cg_field_read(m_index_file, m_index_base, m_index_zone, iSol, varName, dataType, rmin, rmax, var)) { delete[] var; return false; } QVector valueVec; if (dataType == RealSingle) { float* fVar = static_cast(var); for (int k = 0; k < len; k++) { valueVec.push_back(fVar[k]); } delete[] fVar; } else if (dataType == RealDouble) { double* dVar = static_cast(var); for (int k = 0; k < len; k++) { valueVec.push_back(dVar[k]); } delete[] dVar; } switch (location) { case Vertex: { m_pointScalars.insert(varName, valueVec); break; } case CellCenter: { m_cellScalars.insert(varName, valueVec); break; } default: return false; } } } return true; } bool FITKCGNSReader::readBoundaryCond(int index_bc) { //获取boundary信息 char bcName[33]{}; BCType_t type; CGNS_ENUMT(PointSetType_t) ptType; cgsize_t eleCount; int NormalIndex; cgsize_t NormalListSize; DataType_t dataType; int dataSetCount; if (CG_OK != cg_boco_info(m_index_file, m_index_base, m_index_zone, index_bc, bcName, &type, &ptType, &eleCount, &NormalIndex, &NormalListSize, &dataType, &dataSetCount)) return false; //获取区域类型 CGNS_ENUMT(ZoneType_t) zonetype; if (CG_OK != cg_zone_type(m_index_file, m_index_base, m_index_zone, &zonetype)) return false; bool flag = false; if (ptType == CGNS_ENUMV(PointList)) { flag = readZoneBCs(index_bc, eleCount); } else if (ptType == CGNS_ENUMV(PointRange)) { if (zonetype == CGNS_ENUMV(Structured)) { flag = readUnstructZoneBCs(index_bc); } else if (zonetype == CGNS_ENUMV(Unstructured)) { flag = readStructZoneBCs(index_bc); } } if (flag) { //zone.BCs.push_back(bc); } return flag; } bool FITKCGNSReader::readZoneBCs(int index_bc, int cellCount) { cgsize_t *pnts = new cgsize_t[cellCount]; if (CG_OK != cg_boco_read(m_index_file, m_index_base, m_index_zone, index_bc, pnts, nullptr)) { delete[] pnts; return false; } CGNS_ENUMT(GridLocation_t) gridType; if (CG_OK != cg_boco_gridlocation_read(m_index_file, m_index_base, m_index_zone, index_bc, &gridType)) { delete[] pnts; return false; } if (gridType == CGNS_ENUMV(Vertex)) { } else if (gridType == CGNS_ENUMV(CellCenter)) { } else { for (int i = 0; i < cellCount; i++) { qDebug() << i << pnts[i] - 1; } delete[] pnts; return true; } //边界id //for (int i = 0; i < cellCount; i++) //{ // qDebug() << pnts[i] - 1; //} delete[] pnts; return true; } bool FITKCGNSReader::readUnstructZoneBCs(int index_bc) { cgsize_t *pnts = new cgsize_t[2]; if (CG_OK != cg_boco_read(m_index_file, m_index_base, m_index_zone, index_bc, pnts, nullptr)) { delete[] pnts; return false; } int min = pnts[0]; int max = pnts[1]; CGNS_ENUMT(GridLocation_t) gridType; if (CG_OK != cg_boco_gridlocation_read(m_index_file, m_index_base, m_index_zone, index_bc, &gridType)) { delete[] pnts; return false; } if (gridType == Vertex) { } else if (gridType == CellCenter || gridType == FaceCenter || gridType == IFaceCenter || gridType == JFaceCenter || gridType == KFaceCenter) { } else { qDebug() << "---Invalid gridType!---" << gridType; for (int i = 0; i < 2; i++) { qDebug() << i << pnts[i] - 1; } delete[] pnts; return true; } //for (int i = min; i <= max; i++) //{ // bc.Ids.push_back(i - 1); //} delete[] pnts; return true; } bool FITKCGNSReader::readStructZoneBCs(int index_bc) { cgsize_t range[2][3]; if (CG_OK != cg_boco_read(m_index_file, m_index_base, m_index_zone, index_bc, range[0], range[1])) { return false; } CGNS_ENUMT(GridLocation_t) gridType; if (CG_OK != cg_boco_gridlocation_read(m_index_file, m_index_base, m_index_zone, index_bc, &gridType)) { return false; } //bc.Start.I = range[0][0]; //bc.Start.J = range[0][1]; //bc.Start.K = range[0][2]; //bc.End.I = range[1][0]; //bc.End.J = range[1][1]; //bc.End.K = range[1][2]; if (gridType == Vertex) { } else if (gridType == CellCenter || gridType == FaceCenter || gridType == IFaceCenter || gridType == JFaceCenter || gridType == KFaceCenter) { } else { qDebug() << "---Invalid gridType!---" << gridType; // for(int i = 0 ; i < 2 ; i ++) // { // qDebug() << i << pnts[i] - 1; // } return true; } return true; } bool FITKCGNSReader::readSections() { Interface::FITKBoundaryMeshVTKManager* boundaryMeshMgr = m_Mesh->getBoundaryMeshManager(); if (!boundaryMeshMgr)return false; //获取元素集数量 int nsections = 0; cg_nsections(m_index_file, m_index_base, m_index_zone, &nsections); //获取元素 for (int section_index = 1; section_index <= nsections; section_index++) { //获取元素信息 char section_name[33] = { 0 }; /*int*/ cgsize_t istart = 0, iend = 0; int nbndry = 0, iparent_flag = 0; CGNS_ENUMT(ElementType_t) itype; if (cg_section_read(m_index_file, m_index_base, m_index_zone, section_index, section_name, &itype, &istart, &iend, &nbndry, &iparent_flag)) return false; //获取元素数量 /*int*/ cgsize_t element_data_size = 0; if (cg_ElementDataSize(m_index_file, m_index_base, m_index_zone, section_index, &element_data_size)) return false; if (element_data_size == 0) continue; int size = 4 * (iend - istart + 1); cgsize_t *elements = new cgsize_t[element_data_size]; cgsize_t *element_parent = nullptr; if (iparent_flag) { element_parent = new cgsize_t[size]; } if (cg_elements_read(m_index_file, m_index_base, m_index_zone, section_index, elements, element_parent)) { delete[] elements; if (element_parent) delete[] element_parent; return false; } if (cg_poly_elements_read(m_index_file, m_index_base, m_index_zone, section_index, elements, 0, element_parent)) { delete[] elements; if (element_parent) delete[] element_parent; return false; } //创建边界网格 m_boundaryMesh = new Interface::FITKBoundaryMeshVTK(m_Mesh->getFieldMesh()); m_boundaryMesh->setDataObjectName(section_name); //读取单元数据 this->readCells(istart, iend, itype, elements, element_data_size); //插入边界网格 boundaryMeshMgr->appendDataObj(m_boundaryMesh); m_boundaryMesh = nullptr; delete[] elements; if (element_parent)delete[] element_parent; } return true; } void FITKCGNSReader::readCells(int start_index, int end_index, int type, cgsize_t *elements /*int* elements*/, int element_data_size) { if (CGNS_ENUMT(TRI_3) == type) //三角形 { int cell_number = element_data_size / 3; assert(0 == element_data_size % 3); assert(end_index - start_index + 1 == cell_number); for (int iCnt = 0; iCnt < cell_number; ++iCnt) { QList nodes; nodes.append(elements[iCnt * 3 + 0]); nodes.append(elements[iCnt * 3 + 1]); nodes.append(elements[iCnt * 3 + 2]); Interface::FITKAbstractElement* element = Interface::FITKElementFactory::createElement(Interface::FITKModelEnum::FITKEleType::Tri3); element->setNodeID(nodes); m_boundaryMesh->appendElement(element); } } else if (CGNS_ENUMT(BAR_2) == type) //二节点梁单元 { Interface::FITKBoundaryMeshVTK* boundary = new Interface::FITKBoundaryMeshVTK(m_Mesh->getFieldMesh()); int cell_number = element_data_size / 2; assert(0 == element_data_size % 2); assert(end_index - start_index + 1 == cell_number); for (int iCnt = 0; iCnt < cell_number; ++iCnt) { QList nodes; nodes.append(elements[iCnt * 2 + 0]); nodes.append(elements[iCnt * 2 + 1]); Interface::FITKAbstractElement* element = Interface::FITKElementFactory::createElement(Interface::FITKModelEnum::FITKEleType::Line2); element->setNodeID(nodes); m_boundaryMesh->appendElement(element); } } else if (CGNS_ENUMT(TETRA_4) == type) //四节点四面体 { int cell_number = element_data_size / 4; assert(0 == element_data_size % 4); assert(end_index - start_index + 1 == cell_number); for (int iCnt = 0; iCnt < cell_number; ++iCnt) { QList nodes; nodes.append(elements[iCnt * 4 + 0]); nodes.append(elements[iCnt * 4 + 1]); nodes.append(elements[iCnt * 4 + 2]); nodes.append(elements[iCnt * 4 + 3]); Interface::FITKAbstractElement* element = Interface::FITKElementFactory::createElement(Interface::FITKModelEnum::FITKEleType::Tet4); element->setNodeID(nodes); m_boundaryMesh->appendElement(element); } } else if (CGNS_ENUMT(QUAD_4) == type) //四节点四边形 { int cell_number = element_data_size / 4; assert(0 == element_data_size % 4); assert(end_index - start_index + 1 == cell_number); for (int iCnt = 0; iCnt < cell_number; ++iCnt) { QList nodes; nodes.append(elements[iCnt * 4 + 0]); nodes.append(elements[iCnt * 4 + 1]); nodes.append(elements[iCnt * 4 + 2]); nodes.append(elements[iCnt * 4 + 3]); Interface::FITKAbstractElement* element = Interface::FITKElementFactory::createElement(Interface::FITKModelEnum::FITKEleType::Quad4); element->setNodeID(nodes); m_boundaryMesh->appendElement(element); } } else if (CGNS_ENUMT(HEXA_8) == type) //八节点六面体 { int cell_number = element_data_size / 8; assert(0 == element_data_size % 8); assert(end_index - start_index + 1 == cell_number); for (int iCnt = 0; iCnt < cell_number; ++iCnt) { QList nodes; nodes.append(elements[iCnt * 8 + 0]); nodes.append(elements[iCnt * 8 + 1]); nodes.append(elements[iCnt * 8 + 2]); nodes.append(elements[iCnt * 8 + 3]); nodes.append(elements[iCnt * 8 + 4]); nodes.append(elements[iCnt * 8 + 5]); nodes.append(elements[iCnt * 8 + 6]); nodes.append(elements[iCnt * 8 + 7]); Interface::FITKAbstractElement* element = Interface::FITKElementFactory::createElement(Interface::FITKModelEnum::FITKEleType::Hex8); element->setNodeID(nodes); m_boundaryMesh->appendElement(element); } } else if (CGNS_ENUMT(PENTA_6) == type) //六节点三棱柱 { int cell_number = element_data_size / 6; assert(0 == element_data_size % 6); assert(end_index - start_index + 1 == cell_number); for (int iCnt = 0; iCnt < cell_number; ++iCnt) { QList nodes; nodes.append(elements[iCnt * 6 + 0]); nodes.append(elements[iCnt * 6 + 1]); nodes.append(elements[iCnt * 6 + 2]); nodes.append(elements[iCnt * 6 + 3]); nodes.append(elements[iCnt * 6 + 4]); nodes.append(elements[iCnt * 6 + 5]); Interface::FITKAbstractElement* element = Interface::FITKElementFactory::createElement(Interface::FITKModelEnum::FITKEleType::Wedge6); element->setNodeID(nodes); m_boundaryMesh->appendElement(element); } } else if (CGNS_ENUMV(PYRA_5) == type) //金字塔类型 { int cell_number = element_data_size / 5; assert(0 == element_data_size % 5); assert(end_index - start_index + 1 == cell_number); for (int iCnt = 0; iCnt < cell_number; ++iCnt) { //QList nodes; //nodes.append(elements[iCnt * 5 + 0]); //nodes.append(elements[iCnt * 5 + 1]); //nodes.append(elements[iCnt * 5 + 2]); //nodes.append(elements[iCnt * 5 + 3]); //nodes.append(elements[iCnt * 5 + 4]); //Interface::FITKAbstractElement* element = Interface::FITKElementFactory::createElement(Interface::FITKModelEnum::FITKEleType::Polygon); //element->setNodeID(nodes); //m_boundaryMesh->appendElement(element); } } else if (CGNS_ENUMV(MIXED) == type) { // qDebug() << "mix"; int index = 0; while (index < element_data_size) { int eleType = elements[index]; if (eleType == CGNS_ENUMT(PENTA_6)) { /*vtkSmartPointer idlist = vtkSmartPointer::New(); idlist->InsertNextId(elements[index + 1] - 1); idlist->InsertNextId(elements[index + 2] - 1); idlist->InsertNextId(elements[index + 3] - 1); idlist->InsertNextId(elements[index + 4] - 1); idlist->InsertNextId(elements[index + 5] - 1); idlist->InsertNextId(elements[index + 6] - 1); ungird->InsertNextCell(VTK_WEDGE, idlist);*/ index += 7; } else if (eleType == CGNS_ENUMT(HEXA_8)) { /*vtkSmartPointer idlist = vtkSmartPointer::New(); idlist->InsertNextId(elements[index + 1] - 1); idlist->InsertNextId(elements[index + 2] - 1); idlist->InsertNextId(elements[index + 3] - 1); idlist->InsertNextId(elements[index + 4] - 1); idlist->InsertNextId(elements[index + 5] - 1); idlist->InsertNextId(elements[index + 6] - 1); idlist->InsertNextId(elements[index + 7] - 1); idlist->InsertNextId(elements[index + 8] - 1); ungird->InsertNextCell(VTK_HEXAHEDRON, idlist);*/ index += 9; } else if (eleType == CGNS_ENUMT(TRI_3)) { /* vtkSmartPointer idlist = vtkSmartPointer::New(); idlist->InsertNextId(elements[index + 1] - 1); idlist->InsertNextId(elements[index + 2] - 1); idlist->InsertNextId(elements[index + 3] - 1); ungird->InsertNextCell(VTK_TRIANGLE, idlist);*/ index += 4; } else if (eleType == CGNS_ENUMT(QUAD_4)) { /* vtkSmartPointer idlist = vtkSmartPointer::New(); idlist->InsertNextId(elements[index + 1] - 1); idlist->InsertNextId(elements[index + 2] - 1); idlist->InsertNextId(elements[index + 3] - 1); idlist->InsertNextId(elements[index + 4] - 1); ungird->InsertNextCell(VTK_QUAD, idlist);*/ index += 5; } else if (eleType == CGNS_ENUMT(TETRA_4)) { /*vtkSmartPointer idlist = vtkSmartPointer::New(); idlist->InsertNextId(elements[index + 1] - 1); idlist->InsertNextId(elements[index + 2] - 1); idlist->InsertNextId(elements[index + 3] - 1); idlist->InsertNextId(elements[index + 4] - 1); ungird->InsertNextCell(VTK_TETRA, idlist);*/ index += 5; } else if (eleType == CGNS_ENUMT(BAR_2)) //二节点梁单元 { /* vtkSmartPointer idlist = vtkSmartPointer::New(); idlist->InsertNextId(elements[index + 1] - 1); idlist->InsertNextId(elements[index + 2] - 1); ungird->InsertNextCell(VTK_LINE, idlist);*/ index += 3; } else index += element_data_size; } } //#endif } }