File size: 6,060 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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// SPDX-License-Identifier: LGPL-2.1-or-later

/***************************************************************************

 *   Copyright (c) 2004 Werner Mayer <wmayer[at]users.sourceforge.net>     *

 *                                                                         *

 *   This file is part of the FreeCAD CAx development system.              *

 *                                                                         *

 *   This library is free software; you can redistribute it and/or         *

 *   modify it under the terms of the GNU Library General Public           *

 *   License as published by the Free Software Foundation; either          *

 *   version 2 of the License, or (at your option) any later version.      *

 *                                                                         *

 *   This library  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 Library General Public License for more details.                  *

 *                                                                         *

 *   You should have received a copy of the GNU Library General Public     *

 *   License along with this library; see the file COPYING.LIB. If not,    *

 *   write to the Free Software Foundation, Inc., 59 Temple Place,         *

 *   Suite 330, Boston, MA  02111-1307, USA                                *

 *                                                                         *

 ***************************************************************************/

#ifndef POINTSGUI_VIEWPROVIDERPOINTS_H
#define POINTSGUI_VIEWPROVIDERPOINTS_H

#include <Inventor/SbVec2f.h>

#include <Gui/ViewProviderBuilder.h>
#include <Gui/ViewProviderGeometryObject.h>
#include <Gui/ViewProviderFeaturePython.h>
#include <Mod/Points/PointsGlobal.h>


class SoSwitch;
class SoPointSet;
class SoIndexedPointSet;
class SoLocateHighlight;
class SoCoordinate3;
class SoNormal;
class SoEventCallback;

namespace App
{
class PropertyColorList;
}

namespace Gui
{
class SoFCSelection;
}

namespace Points
{
class PropertyGreyValueList;
class PropertyNormalList;
class PointKernel;
class Feature;
}  // namespace Points

namespace PointsGui
{

class ViewProviderPointsBuilder: public Gui::ViewProviderBuilder
{
public:
    ViewProviderPointsBuilder() = default;
    ~ViewProviderPointsBuilder() override = default;
    void buildNodes(const App::Property*, std::vector<SoNode*>&) const override;
    void createPoints(const App::Property*, SoCoordinate3*, SoPointSet*) const;
    void createPoints(const App::Property*, SoCoordinate3*, SoIndexedPointSet*) const;
};

/**

 * The ViewProviderPoints class creates

 * a node representing the point data structure.

 * @author Werner Mayer

 */
class PointsGuiExport ViewProviderPoints: public Gui::ViewProviderGeometryObject
{
    PROPERTY_HEADER_WITH_OVERRIDE(PointsGui::ViewProviderPoints);

public:
    ViewProviderPoints();
    ~ViewProviderPoints() override;

    App::PropertyFloatConstraint PointSize;

    /// set the viewing mode
    void setDisplayMode(const char* ModeName) override;
    /// returns a list of all possible modes
    std::vector<std::string> getDisplayModes() const override;
    QIcon getIcon() const override;

    /// Sets the edit mnode
    bool setEdit(int ModNum) override;
    /// Unsets the edit mode
    void unsetEdit(int ModNum) override;

public:
    static void clipPointsCallback(void* ud, SoEventCallback* n);

protected:
    void onChanged(const App::Property* prop) override;
    void setVertexColorMode(App::PropertyColorList*);
    void setVertexGreyvalueMode(Points::PropertyGreyValueList*);
    void setVertexNormalMode(Points::PropertyNormalList*);
    virtual void cut(const std::vector<SbVec2f>& picked, Gui::View3DInventorViewer& Viewer) = 0;

protected:
    Gui::SoFCSelection* pcHighlight;
    SoCoordinate3* pcPointsCoord;
    SoMaterial* pcColorMat;
    SoNormal* pcPointsNormal;
    SoDrawStyle* pcPointStyle;

private:
    static App::PropertyFloatConstraint::Constraints floatRange;
};

/**

 * The ViewProviderScattered class creates

 * a node representing the scattered point cloud.

 * @author Werner Mayer

 */
class PointsGuiExport ViewProviderScattered: public ViewProviderPoints
{
    PROPERTY_HEADER_WITH_OVERRIDE(PointsGui::ViewProviderScattered);

public:
    ViewProviderScattered();
    ~ViewProviderScattered() override;

    /**

     * Extracts the point data from the feature \a pcFeature and creates

     * an Inventor node \a SoNode with these data.

     */
    void attach(App::DocumentObject*) override;
    /// Update the point representation
    void updateData(const App::Property*) override;

protected:
    void cut(const std::vector<SbVec2f>& picked, Gui::View3DInventorViewer& Viewer) override;

protected:
    SoPointSet* pcPoints;
};

/**

 * The ViewProviderStructured class creates

 * a node representing the structured points.

 * @author Werner Mayer

 */
class PointsGuiExport ViewProviderStructured: public ViewProviderPoints
{
    PROPERTY_HEADER_WITH_OVERRIDE(PointsGui::ViewProviderStructured);

public:
    ViewProviderStructured();
    ~ViewProviderStructured() override;

    /**

     * Extracts the point data from the feature \a pcFeature and creates

     * an Inventor node \a SoNode with these data.

     */
    void attach(App::DocumentObject*) override;
    /// Update the point representation
    void updateData(const App::Property*) override;

protected:
    void cut(const std::vector<SbVec2f>& picked, Gui::View3DInventorViewer& Viewer) override;

protected:
    SoIndexedPointSet* pcPoints;
};

using ViewProviderPython = Gui::ViewProviderFeaturePythonT<ViewProviderScattered>;

}  // namespace PointsGui


#endif  // POINTSGUI_VIEWPROVIDERPOINTS_H