📄 xmlmesh.cpp
字号:
// Copyright (C) 2003-2006 Anders Logg.// Licensed under the GNU LGPL Version 2.1.//// First added: 2003-10-21// Last changed: 2006-06-22#include <dolfin/dolfin_log.h>#include <dolfin/CellType.h>#include <dolfin/Mesh.h>#include <dolfin/XMLMesh.h>using namespace dolfin;//-----------------------------------------------------------------------------XMLMesh::XMLMesh(Mesh& mesh) : XMLObject(), _mesh(mesh), state(OUTSIDE){ // Do nothing}//-----------------------------------------------------------------------------XMLMesh::~XMLMesh(){ // Do nothing}//-----------------------------------------------------------------------------void XMLMesh::startElement(const xmlChar *name, const xmlChar **attrs){ switch ( state ) { case OUTSIDE: if ( xmlStrcasecmp(name, (xmlChar *) "mesh") == 0 ) { readMesh(name, attrs); state = INSIDE_MESH; } break; case INSIDE_MESH: if ( xmlStrcasecmp(name, (xmlChar *) "vertices") == 0 ) { readVertices(name, attrs); state = INSIDE_VERTICES; } else if ( xmlStrcasecmp(name, (xmlChar *) "cells") == 0 ) { readCells(name, attrs); state = INSIDE_CELLS; } break; case INSIDE_VERTICES: if ( xmlStrcasecmp(name, (xmlChar *) "vertex") == 0 ) readVertex(name, attrs); break; case INSIDE_CELLS: if ( xmlStrcasecmp(name, (xmlChar *) "interval") == 0 ) readInterval(name, attrs); else if ( xmlStrcasecmp(name, (xmlChar *) "triangle") == 0 ) readTriangle(name, attrs); else if ( xmlStrcasecmp(name, (xmlChar *) "tetrahedron") == 0 ) readTetrahedron(name, attrs); break; default: ; }}//-----------------------------------------------------------------------------void XMLMesh::endElement(const xmlChar *name){ switch ( state ) { case INSIDE_MESH: if ( xmlStrcasecmp(name, (xmlChar *) "mesh") == 0 ) { closeMesh(); state = DONE; } break; case INSIDE_VERTICES: if ( xmlStrcasecmp(name, (xmlChar *) "vertices") == 0 ) state = INSIDE_MESH; break; case INSIDE_CELLS: if ( xmlStrcasecmp(name, (xmlChar *) "cells") == 0 ) state = INSIDE_MESH; break; default: ; }}//-----------------------------------------------------------------------------void XMLMesh::open(std::string filename){ // Do nothing}//-----------------------------------------------------------------------------bool XMLMesh::close(){ return state == DONE;}//-----------------------------------------------------------------------------void XMLMesh::readMesh(const xmlChar *name, const xmlChar **attrs){ // Parse values std::string type = parseString(name, attrs, "celltype"); uint gdim = parseUnsignedInt(name, attrs, "dim"); // Create cell type to get topological dimension CellType* cell_type = CellType::create(type); uint tdim = cell_type->dim(); delete cell_type; // Open mesh for editing editor.open(_mesh, CellType::string2type(type), tdim, gdim);}//-----------------------------------------------------------------------------void XMLMesh::readVertices(const xmlChar *name, const xmlChar **attrs){ // Parse values uint num_vertices = parseUnsignedInt(name, attrs, "size"); // Set number of vertices editor.initVertices(num_vertices);}//-----------------------------------------------------------------------------void XMLMesh::readCells(const xmlChar *name, const xmlChar **attrs){ // Parse values uint num_cells = parseUnsignedInt(name, attrs, "size"); // Set number of vertices editor.initCells(num_cells);}//-----------------------------------------------------------------------------void XMLMesh::readVertex(const xmlChar *name, const xmlChar **attrs){ // Read index uint v = parseUnsignedInt(name, attrs, "index"); // Handle differently depending on geometric dimension switch ( _mesh.geometry().dim() ) { case 1: { real x = parseReal(name, attrs, "x"); editor.addVertex(v, x); } break; case 2: { real x = parseReal(name, attrs, "x"); real y = parseReal(name, attrs, "y"); editor.addVertex(v, x, y); } break; case 3: { real x = parseReal(name, attrs, "x"); real y = parseReal(name, attrs, "y"); real z = parseReal(name, attrs, "z"); editor.addVertex(v, x, y, z); } break; default: error("Dimension of mesh must be 1, 2 or 3."); }}//-----------------------------------------------------------------------------void XMLMesh::readInterval(const xmlChar *name, const xmlChar **attrs){ // Check dimension if ( _mesh.topology().dim() != 1 ) error("Mesh entity (interval) does not match dimension of mesh (%d).", _mesh.topology().dim()); // Parse values uint c = parseUnsignedInt(name, attrs, "index"); uint v0 = parseUnsignedInt(name, attrs, "v0"); uint v1 = parseUnsignedInt(name, attrs, "v1"); // Add cell editor.addCell(c, v0, v1);}//-----------------------------------------------------------------------------void XMLMesh::readTriangle(const xmlChar *name, const xmlChar **attrs){ // Check dimension if ( _mesh.topology().dim() != 2 ) error("Mesh entity (triangle) does not match dimension of mesh (%d).", _mesh.topology().dim()); // Parse values uint c = parseUnsignedInt(name, attrs, "index"); uint v0 = parseUnsignedInt(name, attrs, "v0"); uint v1 = parseUnsignedInt(name, attrs, "v1"); uint v2 = parseUnsignedInt(name, attrs, "v2"); // Add cell editor.addCell(c, v0, v1, v2);}//-----------------------------------------------------------------------------void XMLMesh::readTetrahedron(const xmlChar *name, const xmlChar **attrs){ // Check dimension if ( _mesh.topology().dim() != 3 ) error("Mesh entity (tetrahedron) does not match dimension of mesh (%d).", _mesh.topology().dim()); // Parse values uint c = parseUnsignedInt(name, attrs, "index"); uint v0 = parseUnsignedInt(name, attrs, "v0"); uint v1 = parseUnsignedInt(name, attrs, "v1"); uint v2 = parseUnsignedInt(name, attrs, "v2"); uint v3 = parseUnsignedInt(name, attrs, "v3"); // Add cell editor.addCell(c, v0, v1, v2, v3);}//-----------------------------------------------------------------------------void XMLMesh::closeMesh(){ editor.close();}//-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -