RINGMesh  Version 5.0.0
A programming library for geological model meshes
io_html.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2017, Association Scientifique pour la Geologie et ses
3  * Applications (ASGA). All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of ASGA nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ASGA BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  * http://www.ring-team.org
28  *
29  * RING Project
30  * Ecole Nationale Superieure de Geologie - GeoRessources
31  * 2 Rue du Doyen Marcel Roubault - TSA 70605
32  * 54518 VANDOEUVRE-LES-NANCY
33  * FRANCE
34  */
35 
36 #include <geologyjs/main_export.h>
37 
38 namespace {
39 
40  class HTMLIOHandler final: public GeoModelIOHandler< 3 > {
41  public:
42  void load( const std::string& filename, GeoModel& geomodel ) final
43  {
44  throw RINGMeshException( "I/O",
45  "Geological model loading of a from HTML mesh not yet implemented" );
46  return false;
47  }
48 
49  void save( const GeoModel& geomodel, const std::string& filename ) final
50  {
51  GEOLOGYJS::JSWriter js( filename );
52  js.build_js_gui_ = true;
53 
54  save_all_lines( geomodel, js );
55  save_interfaces( geomodel, js );
56 
57  // Check validity and write
58  std::string error_message;
59  if( js.check_validity( error_message ) ) {
60  js.write();
61  } else {
62  throw RINGMeshException( "I/O", error_message );
63  }
64  }
65 
66  private:
67  void save_all_lines(
68  const GeoModel& geomodel,
69  GEOLOGYJS::JSWriter& js ) const
70  {
71  std::vector< std::vector< double > > xyz;
72  xyz.resize( geomodel.nb_lines() );
73  for( const auto& line : geomodel.lines() ) {
74  index_t line_id = line.index();
75  xyz[line_id].reserve( 3 * line.nb_vertices() );
76  for( auto v_itr : range( line.nb_vertices() ) ) {
77  xyz[line_id].push_back( line.vertex( v_itr ).x );
78  xyz[line_id].push_back( line.vertex( v_itr ).y );
79  xyz[line_id].push_back( line.vertex( v_itr ).z );
80  }
81  }
82  js.add_lines( "all_lines", xyz );
83 
84  }
85 
86  void save_interfaces(
87  const GeoModel& geomodel,
88  GEOLOGYJS::JSWriter& js ) const
89  {
90  for( auto& cur_interface : geomodel.geol_entities(
91  Interface::type_name_static() ) ) {
92  if( !GeoModelGeologicalEntity::is_stratigraphic_limit(
93  cur_interface.geological_feature() )
94  && !GeoModelGeologicalEntity::is_fault(
95  cur_interface.geological_feature() ) ) {
96  continue;
97  }
98 
99  index_t nb_vertices = 0;
100  index_t nb_triangles = 0;
101  for( auto surf_itr : range( cur_interface.nb_children() ) ) {
102  const Surface& cur_surface = geomodel.surface(
103  cur_interface.child( surf_itr ).index() );
104  nb_vertices += cur_surface.nb_vertices();
105  nb_triangles += cur_surface.nb_mesh_elements();
106  }
107 
108  std::vector< double > xyz;
109  xyz.reserve( 3 * nb_vertices );
110  std::vector< index_t > indices;
111  indices.reserve( 3 * nb_triangles );
112 
113  index_t vertex_count = 0;
114  for( auto surf_itr : range( cur_interface.nb_children() ) ) {
115  const Surface& cur_surface = geomodel.surface(
116  cur_interface.child( surf_itr ).index() );
117 
118  for( auto v_itr : range( cur_surface.nb_vertices() ) ) {
119  xyz.push_back( cur_surface.vertex( v_itr ).x );
120  xyz.push_back( cur_surface.vertex( v_itr ).y );
121  xyz.push_back( cur_surface.vertex( v_itr ).z );
122  }
123 
124  for( auto p_itr : range( cur_surface.nb_mesh_elements() ) ) {
125  for( auto v_itr : range( 3 ) ) {
126  indices.push_back(
127  vertex_count
128  + cur_surface.mesh_element_vertex_index( p_itr,
129  v_itr ) );
130  }
131  }
132 
133  vertex_count += cur_surface.nb_vertices();
134  }
135  js.add_surface( cur_interface.name(), xyz, indices );
136  }
137  }
138  };
139 
140 }