23#ifndef VCL_LOAD_SAVE_PLY_LOAD_H
24#define VCL_LOAD_SAVE_PLY_LOAD_H
26#include "detail/edge.h"
27#include "detail/extra.h"
28#include "detail/face.h"
29#include "detail/tristrip.h"
30#include "detail/vertex.h"
32#include <vclib/load_save/settings.h>
33#include <vclib/misc/logger.h>
34#include <vclib/space/complex/mesh_info.h>
40template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
44 const std::string& filename,
47 const LoadSettings& settings = LoadSettings())
49 PlyHeader header(file, filename);
50 if (header.errorWhileLoading())
51 throw MalformedFileException(
"Header not valid: " + filename);
55 loadedInfo = header.getInfo();
57 if (settings.enableOptionalComponents)
58 enableOptionalComponentsFromInfo(loadedInfo, m);
60 if constexpr (HasName<MeshType>) {
63 if constexpr (HasTexturePaths<MeshType>) {
68 std::vector<uint> eln;
70 for (
const PlyElement& el : header) {
71 eln.push_back(el.numberElements);
72 sum += el.numberElements;
78 for (
const PlyElement& el : header) {
79 double beginPerc = double(currElems) / sum * 100.0;
80 double endPerc = double(currElems + eln[i]) / sum * 100.0;
84 log.startNewTask(beginPerc, endPerc,
"Reading vertices");
85 readPlyVertices(file, header, m, log);
86 log.endTask(
"Reading vertices");
89 log.startNewTask(beginPerc, endPerc,
"Reading faces");
90 if constexpr (HasFaces<MeshType>)
91 readPlyFaces(file, header, m, loadedInfo, log);
93 readPlyUnknownElement(file, header, el, log);
94 log.endTask(
"Reading faces");
97 log.startNewTask(beginPerc, endPerc,
"Reading tristrips");
98 if constexpr (HasFaces<MeshType>) {
99 loadedInfo.setTriangleMesh();
100 readPlyTriStrips(file, header, m, log);
103 readPlyUnknownElement(file, header, el, log);
104 log.endTask(
"Reading tristrips");
107 log.startNewTask(beginPerc, endPerc,
"Reading edges");
108 if constexpr (HasEdges<MeshType>)
109 readPlyEdges(file, header, m, log);
111 readPlyUnknownElement(file, header, el, log);
112 log.endTask(
"Reading edges");
116 beginPerc, endPerc,
"Reading unknown elements");
117 readPlyUnknownElement(file, header, el, log);
118 log.endTask(
"Reading unknown elements");
124 readPlyTextures(header, m, log, settings);
126 catch (
const std::runtime_error& err) {
158template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
188template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
223template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
254template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
287template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
318template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
353template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
384template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
static std::string fileNameWithoutExtension(const std::string &fullpath)
Get the file name without extension of a file.
Definition file_info.h:217
static std::string pathWithoutFileName(const std::string &fullpath)
Get the path of a file.
Definition file_info.h:197
A simple class that allows to store which elements and their components have been imported/loaded or ...
Definition mesh_info.h:76
A class representing a line segment in n-dimensional space. The class is parameterized by a PointConc...
Definition segment.h:43
void loadPly(MeshType &m, std::istream &inputPlyStream, MeshInfo &loadedInfo, LogType &log=nullLogger, const LoadSettings &settings=LoadSettings())
Loads from the given input ply stream and puts the content into the mesh m.
Definition load.h:159
NullLogger nullLogger
The nullLogger object is an object of type NullLogger that is used as default argument in the functio...
Definition null_logger.h:125
The LoadSettings structure contains the settings that can be used to load a mesh from a stream/file.
Definition settings.h:35