Developer Documentation
Netgen.hpp
1#pragma once
2
3#include <boost/spirit/include/qi.hpp>
4
5#include <boost/bind.hpp>
6
7#include "../MeshGenerator.hpp"
8
9#include <iostream>
10
11namespace qi = boost::spirit::qi;
12namespace spirit = boost::spirit;
13
14void print() {
15 static int c = 0;
16 std::cerr << "Hey there!" << c++ << std::endl;
17}
18
19template <typename Iterator>
20class netgen_grammar : public qi::grammar<Iterator/*, qi::space_type*/> {
21public:
22 explicit netgen_grammar(MeshGenerator& _generator) :
23 netgen_grammar::base_type(content),
24 generator_(_generator)
25 {}
26
27private:
28 MeshGenerator& generator_;
29
30 using Rule = qi::rule<Iterator>;
31
32 Rule space {spirit::ascii::space - spirit::eol};
33 Rule node_section_header {qi::int_ /* Number of vertices */ >> spirit::eol};
34 Rule element_section_header {qi::int_[boost::bind(&MeshGenerator::set_num_cells, &generator_, ::_1)] /* Number of tetrahedra */ >> spirit::eol};
35 Rule face_section_header {qi::int_ /* Number of faces */ >> spirit::eol};
36 Rule node {*space >> qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >>
37 *space >> qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >>
38 *space >> qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >> spirit::eol};
39 Rule element {*space >> qi::int_ >>
40 *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
41 *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
42 *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
43 *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
44 spirit::eol};
45 Rule face {*space >> qi::int_ >>
46 *space >> qi::int_ >>
47 *space >> qi::int_ >>
48 *space >> qi::int_ >>
49 spirit::eol};
50 Rule content {node_section_header >> *node >>
51 element_section_header >> *element >>
52 face_section_header >> *face};
53
54};
bool bind(osg::GeometryPtr &_geo, Mesh &_mesh)
Definition: bindT.hh:101