File size: 5,596 Bytes
985c397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// SPDX-License-Identifier: LGPL-2.1-or-later

/***************************************************************************
 *   Copyright (c) 2023 David Carter <dcarter@david.carter.ca>             *
 *                                                                         *
 *   This file is part of FreeCAD.                                         *
 *                                                                         *
 *   FreeCAD is free software: you can redistribute it and/or modify it    *
 *   under the terms of the GNU Lesser General Public License as           *
 *   published by the Free Software Foundation, either version 2.1 of the  *
 *   License, or (at your option) any later version.                       *
 *                                                                         *
 *   FreeCAD is distributed in the hope that it will be useful, but        *
 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      *
 *   Lesser General Public License for more details.                       *
 *                                                                         *
 *   You should have received a copy of the GNU Lesser General Public      *
 *   License along with FreeCAD. If not, see                               *
 *   <https://www.gnu.org/licenses/>.                                      *
 *                                                                         *
 **************************************************************************/

#ifndef MATERIAL_MATERIALLOADER_H
#define MATERIAL_MATERIALLOADER_H

#include <memory>

#include <QDir>
#include <QString>
#include <yaml-cpp/yaml.h>

#include "Materials.h"
#include "trim.h"

namespace Materials
{
class MaterialLibrary;
class MaterialLibraryLocal;

class MaterialEntry
{
public:
    MaterialEntry() = default;
    MaterialEntry(const std::shared_ptr<MaterialLibraryLocal>& library,
                  const QString& modelName,
                  const QString& dir,
                  const QString& modelUuid);
    virtual ~MaterialEntry() = default;

    virtual void
    addToTree(std::shared_ptr<std::map<QString, std::shared_ptr<Material>>> materialMap) = 0;

    std::shared_ptr<MaterialLibraryLocal> getLibrary() const
    {
        return _library;
    }
    QString getName() const
    {
        return _name;
    }
    QString getDirectory() const
    {
        return _directory;
    }
    QString getUUID() const
    {
        return _uuid;
    }

protected:
    std::shared_ptr<MaterialLibraryLocal> _library;
    QString _name;
    QString _directory;
    QString _uuid;
};

class MaterialYamlEntry: public MaterialEntry
{
public:
    MaterialYamlEntry(const std::shared_ptr<MaterialLibraryLocal>& library,
                      const QString& modelName,
                      const QString& dir,
                      const QString& modelUuid,
                      const YAML::Node& modelData);
    ~MaterialYamlEntry() override = default;

    void
    addToTree(std::shared_ptr<std::map<QString, std::shared_ptr<Material>>> materialMap) override;

    const YAML::Node& getModel() const
    {
        return _model;
    }
    YAML::Node* getModelPtr()
    {
        return &_model;
    }

private:
    MaterialYamlEntry();

    static QString
    yamlValue(const YAML::Node& node, const std::string& key, const std::string& defaultValue);
    static std::shared_ptr<QList<QVariant>> readList(const YAML::Node& node,
                                                     bool isImageList = false);
    static std::shared_ptr<QList<QVariant>> readImageList(const YAML::Node& node);
    static std::shared_ptr<Array2D> read2DArray(const YAML::Node& node, int columns);
    static std::shared_ptr<Array3D> read3DArray(const YAML::Node& node, int columns);

    YAML::Node _model;
};

class MaterialLoader
{
public:
    MaterialLoader(const std::shared_ptr<std::map<QString, std::shared_ptr<Material>>>& materialMap,
                   const std::shared_ptr<std::list<std::shared_ptr<MaterialLibrary>>>& libraryList);
    ~MaterialLoader() = default;

    static std::shared_ptr<std::list<QString>>
    getMaterialFolders(const MaterialLibraryLocal& library);
    static void showYaml(const YAML::Node& yaml);
    static void
    dereference(const std::shared_ptr<std::map<QString, std::shared_ptr<Material>>>& materialMap,
                const std::shared_ptr<Material>& material);
    static std::shared_ptr<MaterialEntry>
    getMaterialFromYAML(const std::shared_ptr<MaterialLibraryLocal>& library,
                        YAML::Node& yamlroot,
                        const QString& path);

private:
    MaterialLoader();

    void addToTree(std::shared_ptr<MaterialEntry> model);
    void dereference(const std::shared_ptr<Material>& material);
    std::shared_ptr<MaterialEntry>
    getMaterialFromPath(const std::shared_ptr<MaterialLibraryLocal>& library, const QString& path) const;
    void addLibrary(const std::shared_ptr<MaterialLibraryLocal>& model);
    void loadLibrary(const std::shared_ptr<MaterialLibraryLocal>& library);
    void loadLibraries(
        const std::shared_ptr<std::list<std::shared_ptr<MaterialLibrary>>>& libraryList);

    static std::unique_ptr<std::map<QString, std::shared_ptr<MaterialEntry>>> _materialEntryMap;
    std::shared_ptr<std::map<QString, std::shared_ptr<Material>>> _materialMap;
    std::shared_ptr<std::list<std::shared_ptr<MaterialLibrary>>> _libraryList;
};

}  // namespace Materials

#endif  // MATERIAL_MATERIALLOADER_H