RINGMesh  Version 5.0.0
A programming library for geological model meshes
mesh_builder.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 
39 
41 
42 namespace
43 {
44  using namespace RINGMesh;
45 
46  template < index_t DIMENSION >
47  std::unique_ptr< PointSetMeshBuilder< DIMENSION > >
48  create_point_mesh_builder( PointSetMesh< DIMENSION >& mesh )
49  {
51  mesh.type_name(), mesh );
52  }
53 
54  template < index_t DIMENSION >
55  std::unique_ptr< LineMeshBuilder< DIMENSION > > create_line_mesh_builder(
56  LineMesh< DIMENSION >& mesh )
57  {
59  mesh.type_name(), mesh );
60  }
61 
62  template < index_t DIMENSION >
63  std::unique_ptr< SurfaceMeshBuilder< DIMENSION > >
64  create_surface_mesh_builder( SurfaceMesh< DIMENSION >& mesh )
65  {
67  mesh.type_name(), mesh );
68  }
69 
70  template < index_t DIMENSION >
71  std::unique_ptr< VolumeMeshBuilder< DIMENSION > >
72  create_volume_mesh_builder( VolumeMesh< DIMENSION >& mesh )
73  {
75  mesh.type_name(), mesh );
76  }
77 
78  template < index_t DIMENSION >
79  std::unique_ptr< MeshBaseBuilder< DIMENSION > > create_pointset_builder(
80  MeshBase< DIMENSION >& mesh )
81  {
82  auto point_set = dynamic_cast< PointSetMesh< DIMENSION >* >( &mesh );
83  if( point_set )
84  {
85  return create_point_mesh_builder( *point_set );
86  }
87  else
88  {
89  auto line = dynamic_cast< LineMesh< DIMENSION >* >( &mesh );
90  if( line )
91  {
92  return create_line_mesh_builder( *line );
93  }
94  else
95  {
96  auto surface =
97  dynamic_cast< SurfaceMesh< DIMENSION >* >( &mesh );
98  if( surface )
99  {
100  return create_surface_mesh_builder( *surface );
101  }
102  }
103  }
104  return {};
105  }
106 } // namespace
107 
108 namespace RINGMesh
109 {
110  template <>
111  std::unique_ptr< MeshBaseBuilder< 2 > >
113  {
114  auto builder = create_pointset_builder( mesh );
115  if( !builder )
116  {
117  throw RINGMeshException( "MeshBaseBuilder",
118  "Could not create mesh builder of data structure: ",
119  mesh.type_name() );
120  }
121  return builder;
122  }
123 
124  template <>
125  std::unique_ptr< MeshBaseBuilder< 3 > >
127  {
128  auto builder = create_pointset_builder( mesh );
129  if( !builder )
130  {
131  auto volume = dynamic_cast< VolumeMesh< 3 >* >( &mesh );
132  if( volume )
133  {
134  builder = create_volume_mesh_builder( *volume );
135  }
136  }
137  if( !builder )
138  {
139  throw RINGMeshException( "MeshBaseBuilder",
140  "Could not create mesh builder of data structure: ",
141  mesh.type_name() );
142  }
143  return builder;
144  }
145 
146  template < index_t DIMENSION >
147  std::unique_ptr< PointSetMeshBuilder< DIMENSION > >
150  {
151  auto builder = create_point_mesh_builder( mesh );
152  if( !builder )
153  {
154  throw RINGMeshException( "PointSet",
155  "Could not create mesh builder of data structure: ",
156  mesh.type_name() );
157  }
158  return builder;
159  }
160 
161  template < index_t DIMENSION >
162  std::unique_ptr< LineMeshBuilder< DIMENSION > >
164  LineMesh< DIMENSION >& mesh )
165  {
166  auto builder = create_line_mesh_builder( mesh );
167  if( !builder )
168  {
169  Logger::warn( "LineMeshBuilder",
170  "Could not create mesh builder of data structure: ",
171  mesh.type_name() );
172  }
173  return builder;
174  }
175 
176  template < index_t DIMENSION >
177  std::unique_ptr< SurfaceMeshBuilder< DIMENSION > >
180  {
181  auto builder = create_surface_mesh_builder( mesh );
182  if( !builder )
183  {
184  Logger::warn( "SurfaceMeshBuilder",
185  "Could not create mesh builder of data structure: ",
186  mesh.type_name() );
187  }
188  return builder;
189  }
190 
191  template < index_t DIMENSION >
192  std::unique_ptr< VolumeMeshBuilder< DIMENSION > >
195  {
196  auto builder = create_volume_mesh_builder( mesh );
197  if( !builder )
198  {
199  Logger::warn( "VolumeMeshBuilder",
200  "Could not create mesh builder of data structure: ",
201  mesh.type_name() );
202  }
203  return builder;
204  }
205 
206  template std::unique_ptr< PointSetMeshBuilder< 2 > > RINGMESH_API
208  template std::unique_ptr< LineMeshBuilder< 2 > >
210  template std::unique_ptr< SurfaceMeshBuilder< 2 > > RINGMESH_API
212 
213  template std::unique_ptr< PointSetMeshBuilder< 3 > > RINGMESH_API
215  template std::unique_ptr< LineMeshBuilder< 3 > >
217  template std::unique_ptr< SurfaceMeshBuilder< 3 > > RINGMESH_API
219  template std::unique_ptr< VolumeMeshBuilder< 3 > >
221 } // namespace RINGMesh
static std::unique_ptr< LineMeshBuilder > create_builder(LineMesh< DIMENSION > &mesh)
static std::unique_ptr< BaseClass > create(const Key &key, const Args &... args)
Definition: factory.h:85
static std::unique_ptr< PointSetMeshBuilder< DIMENSION > > create_builder(PointSetMesh< DIMENSION > &mesh)
static void warn(const std::string &feature, const Args &... args)
Definition: logger.h:75
static std::unique_ptr< VolumeMeshBuilder< DIMENSION > > create_builder(VolumeMesh< DIMENSION > &mesh)
static std::unique_ptr< MeshBaseBuilder< DIMENSION > > create_builder(MeshBase< DIMENSION > &mesh)
virtual MeshType type_name() const =0
encapsulate adimensional mesh functionalities in order to provide an API on which we base the RINGMes...
Definition: mesh.h:138
Classes to build GeoModel from various inputs.
Definition: algorithm.h:48
static std::unique_ptr< SurfaceMeshBuilder< DIMENSION > > create_builder(SurfaceMesh< DIMENSION > &mesh)