forked from PeterS242/YARRH
-
Notifications
You must be signed in to change notification settings - Fork 2
/
stlobject.h
151 lines (140 loc) · 4.05 KB
/
stlobject.h
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
#ifndef STLOBJECT_H
#define STLOBJECT_H
#include <QObject>
#include <QtOpenGL>
#if defined(Q_WS_MAC)
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#elif defined(Q_WS_WIN)
#include <GL/gl.h>
#include <GL/glu.h>
#elif defined(Q_WS_X11)
#include <GL/gl.h>
#include <GL/glu.h>
#endif
#include <QVector3D>
#include <QHash>
#include <QCryptographicHash>
#include <QDebug>
#include <cmath>
//half edges
#include "vertex.h"
#include "halfedge.h"
#include "face.h"
//materials
#include "material.h"
//slicer
#include "slice.h"
//for sorting q list by angles
struct QPairFirstComparer
{
template<typename T1, typename T2>
bool operator()(const QPair<T1,T2> & a, const QPair<T1,T2> & b) const
{
return a.first < b.first;
}
};
//structure for holding data about created patch face
struct PatchFace
{
Vertex* middlePoint;
HalfEdge* edge1;
HalfEdge* edge2;
double angle;
};
class StlObject : public QObject
{
Q_OBJECT
protected:
QString fileName;
private:
double scaleValue;
double rotation;
QString nameString;
QVector3D offset;
bool selected;
bool colliding;
float width;
float lenght;
float height;
bool nonManifold;
bool mirrorX;
bool mirrorY;
bool mirrorZ;
bool show_angles;
bool show_support;
int list_index;
int angle_list_index;
int support_list_index;
bool preSelected;
Material* objectMaterial;
//object description
//list of verteces
QHash<QString,Vertex*> vertexes;
//list of edges
QHash<QString,HalfEdge*> edges;
//list of faces
QHash<QString,Face*> faces;
//here is list of edges connecting only one face E(p1,p2)==E(p2,p1)
QList<HalfEdge*> badEdges;
//function for adding verteces
Vertex* addVertex(float x, float y, float z, QHash<QString,Vertex*> &list);
//function for adding haledges
HalfEdge* addHalfEdge(Vertex *v1, Vertex *v2,QHash<QString,HalfEdge*> &list);
//function for adding faces
Face* addFace(HalfEdge *edge1, HalfEdge *edge2, HalfEdge *edge3, QHash<QString,Face*> &list);
//just a helper function
QList<HalfEdge*> intersectLists(QList<HalfEdge*> list1, QList<HalfEdge*> list2);
//make gl list
void render();
//calculating angle beetwen two QVector3D
double angle(QVector3D p1, QVector3D p2);
//slicer object, it stores info about each of layers
//Slice* slicer;
//things realeated to genereting support
//list of verteces
QHash<QString,Vertex*> support_vertexes;
//list of edges
QHash<QString,HalfEdge*> support_edges;
//list of faces
QHash<QString,Face*> support_faces;
public:
explicit StlObject(QString fileName, QObject *parent = 0);
explicit StlObject(QObject *parent = 0);
inline QHash<QString,Face*> getFaces() {return faces;}
void copy(StlObject *copyFrom);
void draw(bool,bool,int);
void select(bool);
void moveXY(double x, double y);
void rotate(double angle);
void setRotation(double angle);
void scale(double value);
void loadFile(QString fileName);
void set_showAngles(bool show);
void set_showSupport(bool show);
QVector3D getOffset();
QList<QVector3D> getTriangles();
double getRotation();
double getScale();
inline bool getIsManifold(){return nonManifold;}
void mirror(QChar axis);
void repairHoles();
void repairNormals();
inline void setMaterial(Material* material){ objectMaterial=material ;}
inline Material* getMaterial() { return objectMaterial; }
QString getFileName();
inline double getWidth(){ return width*scaleValue; }
inline double getLenght(){ return lenght*scaleValue; }
inline double getHeight(){ return height*scaleValue; }
inline bool isMirrored() { return mirrorX^mirrorY; }
inline bool isSelected() { return selected; }
inline bool get_showAngles() {return show_angles;}
inline bool get_showSupport() {return show_support;}
void freeList();
void generateSupport(qreal treshold);
signals:
void progress(int value, int max, QString text);
void doneProcessing(bool);
public slots:
};
#endif // STLOBJECT_H