git-svn-id: svn://db.shs.com.ru/libs@36 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2015-10-08 12:34:42 +00:00
parent 995ff5ab3b
commit 9d505ef323
3 changed files with 125 additions and 34 deletions

View File

@@ -79,6 +79,12 @@ Graphic::Graphic(QWidget * parent): QFrame(parent), line_x_min(this), line_x_max
connect(ui->canvas_gl, SIGNAL(wheelEvent(QWheelEvent * )), this, SLOT(canvasWheelEvent(QWheelEvent * ))); connect(ui->canvas_gl, SIGNAL(wheelEvent(QWheelEvent * )), this, SLOT(canvasWheelEvent(QWheelEvent * )));
connect(ui->canvas_gl, SIGNAL(leaveEvent(QEvent * )), this, SLOT(canvasLeaveEvent(QEvent * ))); connect(ui->canvas_gl, SIGNAL(leaveEvent(QEvent * )), this, SLOT(canvasLeaveEvent(QEvent * )));
connect(ui->canvas_gl, SIGNAL(keyPressEvent(QKeyEvent * )), this, SLOT(canvasKeyPressEvent(QKeyEvent * ))); connect(ui->canvas_gl, SIGNAL(keyPressEvent(QKeyEvent * )), this, SLOT(canvasKeyPressEvent(QKeyEvent * )));
ui->canvas_raster->grabGesture(Qt::PinchGesture);
ui->canvas_raster->grabGesture(Qt::PanGesture);
ui->canvas_raster->installEventFilter(this);
ui->canvas_gl->grabGesture(Qt::PinchGesture);
ui->canvas_gl->grabGesture(Qt::PanGesture);
ui->canvas_gl->installEventFilter(this);
icon_exp_x = QIcon(":/icons/expand_x.png"); icon_exp_x = QIcon(":/icons/expand_x.png");
icon_exp_y = QIcon(":/icons/expand_y.png"); icon_exp_y = QIcon(":/icons/expand_y.png");
icon_exp_sx = QIcon(":/icons/expand_s_x.png"); icon_exp_sx = QIcon(":/icons/expand_s_x.png");
@@ -93,12 +99,12 @@ Graphic::Graphic(QWidget * parent): QFrame(parent), line_x_min(this), line_x_max
eminx = eminy = DBL_MAX; eminx = eminy = DBL_MAX;
emaxx = emaxy = DBL_MIN; emaxx = emaxy = DBL_MIN;
grad_x = grad_y = Auto; grad_x = grad_y = Auto;
axis_type_x = Numeric;
min_repaint_int = 25; min_repaint_int = 25;
inc_x = 1.; inc_x = 1.;
legy = 0; legy = 0;
buffer = 0; buffer = 0;
gridx = 70.; gridx = gridy = 1.;
gridy = 40.;
history = 5.; history = 5.;
min_int = 1; min_int = 1;
max_int = 200; max_int = 200;
@@ -155,13 +161,38 @@ void Graphic::timerEvent(QTimerEvent * ) {
} }
bool Graphic::eventFilter(QObject * o, QEvent * e) {
//qDebug() << "event" << o << e;
if (o == canvas) {
switch (e->type()) {
case QEvent::Gesture:
foreach (QGesture * g, ((QGestureEvent*)e)->gestures())
procGesture(g);
break;
default: break;
}
}
return QFrame::eventFilter(o, e);
}
void Graphic::procGesture(QGesture * g) {
if (!g) return;
qDebug() << g;
}
void Graphic::canvasPaintEvent(QPaintEvent * ) { void Graphic::canvasPaintEvent(QPaintEvent * ) {
if (is_lines_update) return; if (is_lines_update) return;
QMutexLocker ml(&mutex_); QMutexLocker ml(&mutex_);
static int pwid = 0, phei = 0; //static int pwid = 0, phei = 0;
int wid = canvas->width(), hei = canvas->height(); int wid = canvas->width(), hei = canvas->height();
lastw = wid; lastw = wid;
lasth = hei; lasth = hei;
font_sz = fontMetrics().size(0, "0");
font_sz.setHeight(font_sz.height() * 1.);
font_sz.setWidth(font_sz.width() * 7);
thick = qMax<int>(qRound(font_sz.height() / 15.), 1);
if (buffer != 0) if (buffer->width() != wid || buffer->height() != hei) {delete buffer; buffer = 0;} if (buffer != 0) if (buffer->width() != wid || buffer->height() != hei) {delete buffer; buffer = 0;}
if (buffer == 0) buffer = new QImage(wid, hei, QImage::Format_RGB32); if (buffer == 0) buffer = new QImage(wid, hei, QImage::Format_RGB32);
if (bufferActive) { if (bufferActive) {
@@ -183,8 +214,8 @@ void Graphic::canvasPaintEvent(QPaintEvent * ) {
line_x_max.setVisible(grid); line_x_max.setVisible(grid);
line_y_min.setVisible(grid); line_y_min.setVisible(grid);
line_y_max.setVisible(grid);*/ line_y_max.setVisible(grid);*/
pwid = wid; //pwid = wid;
phei = hei; //phei = hei;
QPainter p; QPainter p;
if (isOGL) { if (isOGL) {
glClearColor(0.f, 0.f, 0.f, 0.f); glClearColor(0.f, 0.f, 0.f, 0.f);
@@ -192,13 +223,14 @@ void Graphic::canvasPaintEvent(QPaintEvent * ) {
} else p.begin(buffer); } else p.begin(buffer);
p.fillRect(canvas->rect(), back_color); p.fillRect(canvas->rect(), back_color);
painter = &p; painter = &p;
p.setFont(font());
gridborder = QPoint(5, 5);
if (grid) { if (grid) {
if (hasLblY) gridborder.setX(65); gridborder += QPoint(font_sz.width(), font_sz.height());
else gridborder.setX(50); if (hasLblY) gridborder += QPoint(font_sz.height(), 0);
if (hasLblX) gridborder.setY(30); if (hasLblX) gridborder += QPoint(0, font_sz.height());
else gridborder.setY(15);
drawGrid(); drawGrid();
} else gridborder = QPoint(5, 5); }
p.setRenderHint(QPainter::Antialiasing, aalias); p.setRenderHint(QPainter::Antialiasing, aalias);
if (isOGL) { if (isOGL) {
if (aalias) glEnable(GL_MULTISAMPLE); if (aalias) glEnable(GL_MULTISAMPLE);
@@ -803,17 +835,20 @@ void Graphic::drawGrid() {
int gbx = gridborder.x(), gby = gridborder.y(), cwid = painter->viewport().width(), chei = painter->viewport().height() - legy; int gbx = gridborder.x(), gby = gridborder.y(), cwid = painter->viewport().width(), chei = painter->viewport().height() - legy;
double px, py, range, step, start; double px, py, range, step, start;
int wid = cwid - gbx - 5, hei = chei - gby - 5, cx, cy, cnt; int wid = cwid - gbx - 5, hei = chei - gby - 5, cx, cy, cnt;
QFontMetrics fm(font());
QRect rect; QRect rect;
QString str; QPair<QString, QString> str;
range = selrect.bottom() - selrect.top(); range = selrect.bottom() - selrect.top();
if (grad_y == Graphic::Auto) step = splitRange(range, hei / gridy); if (grad_y == Graphic::Auto) step = splitRange(range, hei / gridy / font_sz.height() / 1.4);
else step = gridy;//range / hei * gridy; else step = gridy;//range / hei * gridy;
start = roundTo(canvas2realY(-hei), step) - step; start = roundTo(canvas2realY(-hei), step) - step;
py = start + step; py = start + step;
cy = 0; cy = 0;
cx = gbx - 5; cx = gbx - 5;
grid_pen.setWidth(qMax<int>(qRound(thick / 1.4), 1));
QFont nf = font(), sf = font();
sf.setPointSizeF(sf.pointSizeF() / 1.6);
QFontMetrics fm(nf), sfm(sf);
if (step > 0.) { if (step > 0.) {
cnt = 1000; cnt = 1000;
while (cnt-- > 0) { while (cnt-- > 0) {
@@ -822,14 +857,21 @@ void Graphic::drawGrid() {
cy = real2canvasY(py); cy = real2canvasY(py);
if (cy < 0) continue; if (cy < 0) continue;
if (cy > hei + 5) break; if (cy > hei + 5) break;
/*if (agrid)*/ str.setNum(py * grid_numbers_y);
//else str.setNum(py * grid_numbers_y, 'g', 3);
rect = fm.boundingRect(str);
painter->setPen(grid_pen); painter->setPen(grid_pen);
painter->drawLine(gbx, cy, cwid, cy); painter->drawLine(gbx, cy, cwid, cy);
cy += 3; str = gridMark(py * grid_numbers_y);
painter->setPen(text_color); painter->setPen(text_color);
painter->drawText(cx - rect.width(), cy, str); cy += font_sz.height() / 4.;
int dx = font_sz.height() / 8.;
if (!str.second.isEmpty()) {
rect = sfm.boundingRect(str.second);
painter->setFont(sf);
painter->drawText(cx - rect.width() - dx, cy - font_sz.height() / 2.5, str.second);
dx += rect.width() + font_sz.height() / 6.;
}
rect = fm.boundingRect(str.first);
painter->setFont(nf);
painter->drawText(cx - rect.width() - dx, cy, str.first);
} }
} }
if (hasLblY) { if (hasLblY) {
@@ -837,14 +879,14 @@ void Graphic::drawGrid() {
painter->save(); painter->save();
painter->translate(5, hei); painter->translate(5, hei);
painter->rotate(-90.); painter->rotate(-90.);
painter->drawText(0, 0, hei, 15, Qt::AlignCenter, label_y); painter->drawText(0, 0, hei, font_sz.height(), Qt::AlignCenter, label_y);
painter->restore(); painter->restore();
} }
cy = chei - 2; cy = chei - font_sz.height() / 4;
if (hasLblX) cy -= 15; if (hasLblX) cy -= font_sz.height();
range = selrect.right() - selrect.left(); range = selrect.right() - selrect.left();
if (grad_x == Graphic::Auto) step = splitRange(range, wid / gridx); if (grad_x == Graphic::Auto) step = splitRange(range, wid / gridx / font_sz.width() * 1.4);
else step = gridx;//range / wid * gridx; else step = gridx;//range / wid * gridx;
start = roundTo(canvas2realX(wid), step) + step; start = roundTo(canvas2realX(wid), step) + step;
px = start + step; px = start + step;
@@ -856,24 +898,55 @@ void Graphic::drawGrid() {
cx = real2canvasX(px); cx = real2canvasX(px);
if (cx > cwid) continue; if (cx > cwid) continue;
if (cx < gbx) break; if (cx < gbx) break;
/*if (agrid)*/ str.setNum(px * grid_numbers_x);
//else str.setNum(px * grid_numbers_x, 'g', 3);
painter->setPen(text_color);
painter->drawText(cx, cy, str);
painter->setPen(grid_pen); painter->setPen(grid_pen);
painter->drawLine(cx, hei + 5, cx, 0); painter->drawLine(cx, hei + 5, cx, 0);
painter->setPen(text_color);
if (axis_type_x == Graphic::Numeric) {
int dx = -font_sz.height() / 4.;
str = gridMark(px * grid_numbers_x);
rect = fm.boundingRect(str.first);
painter->setFont(nf);
painter->drawText(cx + dx, cy, str.first);
dx += rect.width() + font_sz.height() / 6.;
if (!str.second.isEmpty()) {
rect = sfm.boundingRect(str.second);
painter->setFont(sf);
painter->drawText(cx + dx, cy - font_sz.height() / 2.5, str.second);
}
} else {
} }
} }
}
painter->setPen(text_color);
painter->setFont(nf);
if (hasLblX) { if (hasLblX) {
painter->setPen(text_color); painter->setPen(text_color);
painter->drawText(gbx, chei - 15, wid, 15, Qt::AlignCenter, label_x); painter->drawText(gbx, chei - font_sz.height(), wid, font_sz.height(), Qt::AlignCenter, label_x);
} }
painter->setPen(QPen(grid_pen.color())); painter->setPen(QPen(grid_pen.color(), thick));
painter->drawRect(gbx, -1, wid + 6, hei + 6); painter->drawRect(gbx, -1, wid + 6, hei + 6);
} }
QPair<QString, QString> Graphic::gridMark(double v) const {
QPair<QString, QString> ret;
if ((qAbs(v) >= 1E+4 || qAbs(v) <= 1E-4) && v != 0.) {
int p = qFloor(qLn(qAbs(v)) / LN10);
v /= qPow(10., p);
if (v == 10.) {
v = 1.;
p += 1;
}
ret.first = QString::fromUtf8("%1·10").arg(v);
ret.second = QString::number(p);
} else
ret.first = QString::number(v);
return ret;
}
void Graphic::drawGraphics() { void Graphic::drawGraphics() {
if (isHover) if (isHover)
ui->status->setText(tr("Cursor: ") + pointCoords(canvas2real(QPointF(curpos)))); ui->status->setText(tr("Cursor: ") + pointCoords(canvas2real(QPointF(curpos))));
@@ -961,7 +1034,13 @@ double Graphic::splitRange(double range, int count) {
//bool neg = range < 0; //bool neg = range < 0;
//if (neg) range = -range; //if (neg) range = -range;
range = qAbs<double>(range); range = qAbs<double>(range);
tln = floor(qLn(range) / LN10); tln = qFloor(qLn(range) / LN10);
/*double mul = 1.;
if (tln >= 4) {
mul = qPow(10, tln);
tln = 2;
range /= mul;
}*/
for (int i = 0; i <= 5; ++i) { for (int i = 0; i <= 5; ++i) {
digits = qPow(10., tln - i); digits = qPow(10., tln - i);
step = qRound(range / count / digits); step = qRound(range / count / digits);
@@ -977,7 +1056,7 @@ double Graphic::splitRange(double range, int count) {
double err5 = qAbs<double>(step - step5), err10 = qAbs<double>(step - step10); double err5 = qAbs<double>(step - step5), err10 = qAbs<double>(step - step10);
step = (err5 < err10 ? step5 : step10) * digits; step = (err5 < err10 ? step5 : step10) * digits;
//qDebug() << step; //qDebug() << step;
return step; return step;// * mul;
} }

View File

@@ -12,11 +12,15 @@
#include <QFileDialog> #include <QFileDialog>
#include <QTime> #include <QTime>
#include <QTranslator> #include <QTranslator>
#include <QGestureEvent>
#include <qmath.h> #include <qmath.h>
#include <float.h> #include <float.h>
#include "graphic_conf.h" #include "graphic_conf.h"
#include "clineedit.h" #include "clineedit.h"
#include "qpievaluator.h" #include "qpievaluator.h"
#if QT_VERSION >= 0x050100
# include <QSensorGestureManager>
#endif
QT_BEGIN_HEADER QT_BEGIN_HEADER
@@ -53,8 +57,7 @@ class Graphic: public QFrame
{ {
Q_OBJECT Q_OBJECT
Q_FLAGS(Buttons) Q_FLAGS(Buttons)
Q_ENUMS(Alignment) Q_ENUMS(Alignment Graduation AxisType)
Q_ENUMS(Graduation)
Q_PROPERTY(QString caption READ caption WRITE setCaption) Q_PROPERTY(QString caption READ caption WRITE setCaption)
Q_PROPERTY(QString labelX READ labelX WRITE setLabelX) Q_PROPERTY(QString labelX READ labelX WRITE setLabelX)
@@ -111,6 +114,7 @@ class Graphic: public QFrame
Q_PROPERTY(Graduation graduationY READ graduationY WRITE setGraduationY) Q_PROPERTY(Graduation graduationY READ graduationY WRITE setGraduationY)
Q_PROPERTY(double graduationStepX READ graduationStepX WRITE setGraduationStepX) Q_PROPERTY(double graduationStepX READ graduationStepX WRITE setGraduationStepX)
Q_PROPERTY(double graduationStepY READ graduationStepY WRITE setGraduationStepY) Q_PROPERTY(double graduationStepY READ graduationStepY WRITE setGraduationStepY)
Q_PROPERTY(AxisType axisType READ axisType WRITE setAxisType)
Q_PROPERTY(int histogramMinIntervals READ histogramMinIntervals WRITE setHistogramMinIntervals) Q_PROPERTY(int histogramMinIntervals READ histogramMinIntervals WRITE setHistogramMinIntervals)
Q_PROPERTY(int histogramMaxIntervals READ histogramMaxIntervals WRITE setHistogramMaxIntervals) Q_PROPERTY(int histogramMaxIntervals READ histogramMaxIntervals WRITE setHistogramMaxIntervals)
@@ -142,6 +146,7 @@ public:
}; };
enum Alignment {Left, Right}; enum Alignment {Left, Right};
enum Graduation {Auto, Fixed}; enum Graduation {Auto, Fixed};
enum AxisType {Numeric, DateTime};
Q_DECLARE_FLAGS(Buttons, Button) Q_DECLARE_FLAGS(Buttons, Button)
QString caption() const; QString caption() const;
@@ -198,6 +203,7 @@ public:
Graduation graduationY() const {return grad_y;} Graduation graduationY() const {return grad_y;}
double graduationStepX() const {return gridx;} double graduationStepX() const {return gridx;}
double graduationStepY() const {return gridy;} double graduationStepY() const {return gridy;}
AxisType axisType() const {return axis_type_x;}
QVector<QPointF> graphicData(const int index = 0) const {return graphics[index].polyline;} QVector<QPointF> graphicData(const int index = 0) const {return graphics[index].polyline;}
GraphicsData graphicsData() const; GraphicsData graphicsData() const;
QWidget * viewport() const {return canvas;} QWidget * viewport() const {return canvas;}
@@ -278,6 +284,7 @@ public slots:
void setGraduationStepX(double sx) {gridx = sx; if (aupdate) update();} void setGraduationStepX(double sx) {gridx = sx; if (aupdate) update();}
void setGraduationStepY(double sy) {gridy = sy; if (aupdate) update();} void setGraduationStepY(double sy) {gridy = sy; if (aupdate) update();}
void setGraduationSteps(double sx, double sy) {gridx = sx; gridy = sy; if (aupdate) update();} void setGraduationSteps(double sx, double sy) {gridx = sx; gridy = sy; if (aupdate) update();}
void setAxisType(AxisType t) {axis_type_x = t; if (aupdate) update();}
void addPoint(const QPointF & p, int graphic, bool update_ = true); void addPoint(const QPointF & p, int graphic, bool update_ = true);
void addPoint(const QPointF & p, bool update = true) {addPoint(p, curGraphic, update);} void addPoint(const QPointF & p, bool update = true) {addPoint(p, curGraphic, update);}
@@ -322,7 +329,9 @@ protected:
virtual void resizeEvent(QResizeEvent * ) {if (leg_update) updateLegend();} virtual void resizeEvent(QResizeEvent * ) {if (leg_update) updateLegend();}
virtual QSize sizeHint() const {return QSize(400, 300);} virtual QSize sizeHint() const {return QSize(400, 300);}
virtual void timerEvent(QTimerEvent * ); virtual void timerEvent(QTimerEvent * );
virtual bool eventFilter(QObject * o, QEvent * e);
void procGesture(QGesture * g);
void setCurrentAction(GraphicAction action); void setCurrentAction(GraphicAction action);
void findGraphicsRect(double start_x = 0., double end_x = 0., double start_y = 0., double end_y = 0.); void findGraphicsRect(double start_x = 0., double end_x = 0., double start_y = 0., double end_y = 0.);
void tick(int index, bool slide = true, bool update = true); void tick(int index, bool slide = true, bool update = true);
@@ -342,6 +351,7 @@ protected:
double roundTo(double value, double round_to); double roundTo(double value, double round_to);
QPointF absPoint(QPointF point) {return QPointF(qAbs(point.x()), qAbs(point.y()));} QPointF absPoint(QPointF point) {return QPointF(qAbs(point.x()), qAbs(point.y()));}
QString pointCoords(QPointF point) {return "(" + QString::number(point.x(), 'f', 3) + " ; " + QString::number(point.y(), 'f', 3) + ")";} QString pointCoords(QPointF point) {return "(" + QString::number(point.x(), 'f', 3) + " ; " + QString::number(point.y(), 'f', 3) + ")";}
QPair<QString, QString> gridMark(double v) const;
Ui::Graphic * ui; Ui::Graphic * ui;
QMutex mutex, mutex_; QMutex mutex, mutex_;
@@ -356,6 +366,7 @@ protected:
GraphicAction curaction, prevaction; GraphicAction curaction, prevaction;
QRectF grect, rrect, selrect, limit_; QRectF grect, rrect, selrect, limit_;
QRect margins_; QRect margins_;
QSize font_sz;
QPoint startpos, curpos, prevpos, gridborder; QPoint startpos, curpos, prevpos, gridborder;
QString label_x, label_y, ppath; QString label_x, label_y, ppath;
Graphic::Buttons buttons_; Graphic::Buttons buttons_;
@@ -366,9 +377,10 @@ protected:
QIcon icon_exp_x, icon_exp_y, icon_exp_sx, icon_exp_sy; QIcon icon_exp_x, icon_exp_y, icon_exp_sx, icon_exp_sy;
QImage icon_pause_b, icon_pause_f; QImage icon_pause_b, icon_pause_f;
Graduation grad_x, grad_y; Graduation grad_x, grad_y;
AxisType axis_type_x;
double gridx, gridy, history, visible_time, inc_x, mdm, grid_numbers_x, grid_numbers_y, LN2, LN5, LN10; double gridx, gridy, history, visible_time, inc_x, mdm, grid_numbers_x, grid_numbers_y, LN2, LN5, LN10;
double eminx, eminy, emaxx, emaxy, pause_phase; double eminx, eminy, emaxx, emaxy, pause_phase;
int legy, lastw, lasth, min_repaint_int, min_int, max_int, timer_pause; int legy, lastw, lasth, min_repaint_int, min_int, max_int, timer_pause, thick;
bool aalias, aupdate, mupdate, grid, guides, isFit, isEmpty, isOGL, isHover, bufferActive, cancel, pause_, isPrinting; bool aalias, aupdate, mupdate, grid, guides, isFit, isEmpty, isOGL, isHover, bufferActive, cancel, pause_, isPrinting;
bool hasLblX, hasLblY, navigation, only_expand_y, only_expand_x, is_lines_update, leg_update, visible_update, fullscr; bool hasLblX, hasLblY, navigation, only_expand_y, only_expand_x, is_lines_update, leg_update, visible_update, fullscr;

View File

@@ -87,7 +87,7 @@ void RendererSimple::renderScene() {
//renderObjects(GLObjectBase::Solid, l, 0, true, true, view.isFogEnabled()); //renderObjects(GLObjectBase::Solid, l, 0, true, true, view.isFogEnabled());
//renderObjects(GLObjectBase::Transparent, l, 0, true, true, view.isFogEnabled()); renderObjects(GLObjectBase::Transparent, l, 0, true, true, view.isFogEnabled());
if (passes > 1) { if (passes > 1) {
glSetLightEnabled(false); glSetLightEnabled(false);
glSetCapEnabled(GL_BLEND); glSetCapEnabled(GL_BLEND);