moldyn.h 2.99 KB
Newer Older
Tobias WEBER's avatar
Tobias WEBER committed
1
/**
Tobias WEBER's avatar
Tobias WEBER committed
2
 * atom dynamics
Tobias WEBER's avatar
Tobias WEBER committed
3
4
5
6
7
 * @author Tobias Weber <tweber@ill.fr>
 * @date Dec-2019
 * @license GPLv3, see 'LICENSE' file
 */

Tobias WEBER's avatar
Tobias WEBER committed
8
9
#ifndef __MOLDYN_GUI_H__
#define __MOLDYN_GUI_H__
Tobias WEBER's avatar
Tobias WEBER committed
10

Tobias WEBER's avatar
Tobias WEBER committed
11
#include <QtWidgets/QMainWindow>
Tobias WEBER's avatar
Tobias WEBER committed
12
#include <QtWidgets/QMenu>
Tobias WEBER's avatar
Tobias WEBER committed
13
14
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
Tobias WEBER's avatar
Tobias WEBER committed
15
#include <QtWidgets/QSlider>
Tobias WEBER's avatar
Tobias WEBER committed
16
#include <QtWidgets/QLabel>
Tobias WEBER's avatar
Tobias WEBER committed
17
#include <QtWidgets/QDoubleSpinBox>
Tobias WEBER's avatar
Tobias WEBER committed
18
#include <QtCore/QSettings>
Tobias WEBER's avatar
Tobias WEBER committed
19
20

#include <vector>
Tobias WEBER's avatar
Tobias WEBER committed
21
#include <tuple>
Tobias WEBER's avatar
Tobias WEBER committed
22

Tobias WEBER's avatar
Tobias WEBER committed
23
#include "libs/glplot.h"
Tobias WEBER's avatar
Tobias WEBER committed
24
#include "libs/math20.h"
Tobias WEBER's avatar
Tobias WEBER committed
25

Tobias WEBER's avatar
Tobias WEBER committed
26
27
#include "moldyn-loader.h"

Tobias WEBER's avatar
Tobias WEBER committed
28

Tobias WEBER's avatar
Tobias WEBER committed
29
using t_real = double;
Tobias WEBER's avatar
Tobias WEBER committed
30
using t_vec = tl2::vec<t_real, std::vector>;
Tobias WEBER's avatar
Tobias WEBER committed
31
using t_mat = tl2::mat<t_real, std::vector>;
Tobias WEBER's avatar
Tobias WEBER committed
32
33


Tobias WEBER's avatar
Tobias WEBER committed
34
35
36
37
38
39
40
41
42
/**
 * atom indices for convex hull calculation
 */
struct HullIndices
{
	std::vector<std::tuple<std::size_t, std::size_t>> vertices;
};


Tobias WEBER's avatar
Tobias WEBER committed
43
class MolDynDlg : public QMainWindow
Tobias WEBER's avatar
Tobias WEBER committed
44
{
Tobias WEBER's avatar
Tobias WEBER committed
45
46
47
public:
	MolDynDlg(QWidget* pParent = nullptr);
	~MolDynDlg() = default;
Tobias WEBER's avatar
Tobias WEBER committed
48

Tobias WEBER's avatar
Tobias WEBER committed
49
protected:
Tobias WEBER's avatar
Tobias WEBER committed
50
51
	std::size_t Add3DAtom(const t_vec& vec, const t_vec& col, t_real scale, const std::string& typelabel, int atomindex=-1);
	void Change3DAtom(std::size_t obj, const t_vec* vec, const t_vec* col=nullptr, const t_real *scale=nullptr, 
52
		const std::string *typelabel=nullptr, int atomindex=-1);
Tobias WEBER's avatar
Tobias WEBER committed
53

Tobias WEBER's avatar
Tobias WEBER committed
54
	void SetStatusMsg(const std::string& msg);
Tobias WEBER's avatar
Tobias WEBER committed
55
	void UpdateAtomsStatusMsg();
Tobias WEBER's avatar
Tobias WEBER committed
56

Tobias WEBER's avatar
Tobias WEBER committed
57
58
	void New();
	void Load();
Tobias WEBER's avatar
Tobias WEBER committed
59
	void SaveAs();
Tobias WEBER's avatar
Tobias WEBER committed
60

Tobias WEBER's avatar
Tobias WEBER committed
61
62
	void PlotMouseDown(bool left, bool mid, bool right);
	void PlotMouseUp(bool left, bool mid, bool right);
Tobias WEBER's avatar
Tobias WEBER committed
63
	void PlotMouseClick(bool left, bool mid, bool right);
Tobias WEBER's avatar
Tobias WEBER committed
64
65
	void PickerIntersection(const t_vec3_gl* pos, std::size_t objIdx, const t_vec3_gl* posSphere);
	void AfterGLInitialisation();
Tobias WEBER's avatar
Tobias WEBER committed
66
	void GLInitialisationFailed();
Tobias WEBER's avatar
Tobias WEBER committed
67

Tobias WEBER's avatar
Tobias WEBER committed
68
	std::tuple<bool, std::size_t, std::size_t, std::size_t> GetAtomIndexFromHandle(std::size_t handle) const;
69
	std::tuple<std::string, int> SplitDataString(const std::string&) const;
Tobias WEBER's avatar
Tobias WEBER committed
70

Tobias WEBER's avatar
Tobias WEBER committed
71
	void CalculateDistanceBetweenAtoms();
Tobias WEBER's avatar
Tobias WEBER committed
72
73
	void CalculatePositionsOfAtoms();
	void CalculateDeltaDistancesOfAtoms();
Tobias WEBER's avatar
Tobias WEBER committed
74
75
76
	void CalculateConvexHullOfAtoms();

	void CalculateConvexHulls();
Tobias WEBER's avatar
Tobias WEBER committed
77

Tobias WEBER's avatar
Tobias WEBER committed
78
79
80
81
82
	void SliderValueChanged(int val);

	void SelectAll();
	void SelectNone();

Tobias WEBER's avatar
Tobias WEBER committed
83
84
	std::vector<std::tuple<std::size_t, std::size_t>> GetSelectedAtoms();

85
86
    void DeleteSelectedAtoms();
    void OnlyKeepSelectedAtoms();
Tobias WEBER's avatar
Tobias WEBER committed
87
	void SelectAtomsOfSameType();
Tobias WEBER's avatar
Tobias WEBER committed
88
89
90
91
	void DeleteAtomUnderCursor();
	void DeleteAllAtomsOfSameType();
	void KeepAtomsOfSameType();

Tobias WEBER's avatar
Tobias WEBER committed
92
	virtual void closeEvent(QCloseEvent *evt) override;
Tobias WEBER's avatar
Tobias WEBER committed
93
	virtual void keyPressEvent(QKeyEvent *evt) override;
Tobias WEBER's avatar
Tobias WEBER committed
94

95
96
97

protected:
	MolDyn<t_real, t_vec> m_mol;
Tobias WEBER's avatar
Tobias WEBER committed
98
99
	t_mat m_crystA = tl2::unit<t_mat>(3);
	t_mat m_crystB = tl2::unit<t_mat>(3);
100
101
102

	QSettings *m_sett = nullptr;
	QMenuBar *m_menu = nullptr;
Tobias WEBER's avatar
Tobias WEBER committed
103

104
	QStatusBar *m_status = nullptr;
Tobias WEBER's avatar
Tobias WEBER committed
105
	QLabel *m_statusCurAtom = nullptr;
Tobias WEBER's avatar
Tobias WEBER committed
106
	QLabel *m_statusAtoms = nullptr;
Tobias WEBER's avatar
Tobias WEBER committed
107

Tobias WEBER's avatar
Tobias WEBER committed
108
	QSlider *m_sliderFrame = nullptr;
Tobias WEBER's avatar
Tobias WEBER committed
109
	QDoubleSpinBox *m_spinScale = nullptr;
Tobias WEBER's avatar
Tobias WEBER committed
110
	QMenu *m_atomContextMenu = nullptr;
111
112
113
114
115

	GlPlot *m_plot = nullptr;
	std::size_t m_sphere = 0;
	std::vector<std::size_t> m_sphereHandles;

Tobias WEBER's avatar
Tobias WEBER committed
116
117
	std::vector<HullIndices> m_hulls;

118

Tobias WEBER's avatar
Tobias WEBER committed
119
120
121
private:
	long m_curPickedObj = -1;
	bool m_ignoreChanges = 1;
Tobias WEBER's avatar
Tobias WEBER committed
122
123
124
125
};


#endif