Files
qad/libs/graphic3d/scatter3d.cpp
2023-10-23 19:06:25 +03:00

135 lines
3.3 KiB
C++

#include "scatter3d.h"
#include <QBoxLayout>
#include <QtDataVisualization/Q3DScatter>
#include <QtDataVisualization/QScatter3DSeries>
#include <QtDataVisualization/QScatterDataArray>
#include <QtDataVisualization/QScatterDataProxy>
Scatter3D::Scatter3D(QWidget * parent): QWidget{parent} {
curGraphic = 0;
canvas = new QtDataVisualization::Q3DScatter();
canvas->setFlag(Qt::FramelessWindowHint);
canvas->axisZ()->setReversed(true);
canvas->setShadowQuality(QtDataVisualization::QAbstract3DGraph::ShadowQualityNone);
container = QWidget::createWindowContainer(canvas);
setLayout(new QVBoxLayout(this));
layout()->addWidget(container);
}
Scatter3D::~Scatter3D() {
clear();
canvas->setParent(nullptr);
canvas->deleteLater();
}
QColor Scatter3D::graphicColor(int index) const {
return graphics[index].series->baseColor();
}
float Scatter3D::graphicPointSize(int index) const {
return graphics[index].series->itemSize();
}
Scatter3D::Mesh Scatter3D::graphicMesh(int index) const {
return graphics[index].series->mesh();
}
bool Scatter3D::labelAutoRotation() const {
return canvas->axisX()->labelAutoRotation() == 0;
}
void Scatter3D::setCurrentGraphic(int arg) {
if (arg < 0 || arg >= graphics.size()) return;
curGraphic = arg;
}
void Scatter3D::setGraphicsCount(int count) {
if (count < 0) return;
while (graphics.size() < count) {
addGraphic();
}
while (graphics.size() > count) {
auto sg = graphics.takeLast();
canvas->removeSeries(sg.series);
delete sg.series;
}
container->update();
}
void Scatter3D::setGraphicColor(const QColor & color, int index) {
graphics[index].series->setBaseColor(color);
container->update();
}
void Scatter3D::setGraphicPointSize(float sz, int index) {
graphics[index].series->setItemSize(sz);
container->update();
}
void Scatter3D::setGraphicMesh(Mesh mesh, int index) {
graphics[index].series->setMesh(mesh);
container->update();
}
void Scatter3D::addGraphic(const QColor & color, float pointSize, Mesh mesh) {
Scatter3DGraphic sg;
sg.data = new QtDataVisualization::QScatterDataProxy();
sg.series = new QtDataVisualization::QScatter3DSeries(sg.data);
sg.series->setItemSize(pointSize);
sg.series->setBaseColor(color);
sg.series->setMesh(mesh);
sg.series->setMeshSmooth(true);
graphics.append(sg);
canvas->addSeries(sg.series);
container->update();
}
void Scatter3D::setLabelAutoRotation(bool on) {
if (on) {
canvas->axisX()->setLabelAutoRotation(90);
canvas->axisY()->setLabelAutoRotation(90);
canvas->axisZ()->setLabelAutoRotation(90);
} else {
canvas->axisX()->setLabelAutoRotation(0);
canvas->axisY()->setLabelAutoRotation(0);
canvas->axisZ()->setLabelAutoRotation(0);
}
container->update();
}
void Scatter3D::setGraphicData(const QVector<QVector3D> & points, int index) {
auto arr = new DataArray();
arr->reserve(points.size());
for (const auto & p: points) {
arr->append(p);
}
graphics[index].data->resetArray(arr);
container->update();
}
void Scatter3D::setGraphicData(DataArray * newArray, int index) {
graphics[index].data->resetArray(newArray);
container->update();
}
void Scatter3D::addPoint(const QVector3D & point, int index) {
graphics[index].data->addItem(point);
}