Developer Documentation
Netgen.hpp
1 /*
2  * Netgen.hpp
3  *
4  * Created on: Apr 16, 2012
5  * Author: kremer
6  */
7 
8 #ifndef NETGEN_HPP_
9 #define NETGEN_HPP_
10 
11 #include <boost/spirit/include/qi.hpp>
12 
13 #include <boost/bind.hpp>
14 
15 #include "../MeshGenerator.hpp"
16 
17 #include <iostream>
18 
19 namespace qi = boost::spirit::qi;
20 namespace spirit = boost::spirit;
21 
22 void print() {
23  static int c = 0;
24  std::cerr << "Hey there!" << c++ << std::endl;
25 }
26 
27 template <typename Iterator>
28 class netgen_grammar : public qi::grammar<Iterator/*, qi::space_type*/> {
29 public:
30  netgen_grammar(MeshGenerator& _generator) :
31  netgen_grammar::base_type(content),
32  generator_(_generator) {
33 
34  content = node_section_header >> *node >>
35  element_section_header >> *element >>
36  face_section_header >> *face;
37 
38  node_section_header = qi::int_ /* Number of vertices */ >> spirit::eol;
39 
40  node = *space >> qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >>
41  *space >> qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >>
42  *space >> qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >> spirit::eol;
43 
44  element_section_header = qi::int_[boost::bind(&MeshGenerator::set_num_cells, &generator_, ::_1)] /* Number of tetrahedra */ >>
45  spirit::eol;;
46 
47  element = *space >> qi::int_ >>
48  *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
49  *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
50  *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
51  *space >> qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
52  spirit::eol;
53 
54  face_section_header = qi::int_ /* Number of faces */ >> spirit::eol;
55 
56  face = *space >> qi::int_ >>
57  *space >> qi::int_ >>
58  *space >> qi::int_ >>
59  *space >> qi::int_ >>
60  spirit::eol;
61 
62  space = spirit::ascii::space - spirit::eol;
63  }
64 
65 private:
66 
67  qi::rule<Iterator/*, qi::space_type*/> node_section_header, element_section_header, face_section_header,
68  node, element, face, space, content;
69 
70  MeshGenerator& generator_;
71 };
72 
73 #endif /* NETGEN_HPP_ */
bool bind(osg::GeometryPtr &_geo, Mesh &_mesh)
Definition: bindT.hh:106