logplus/logPlus/transparentdraggableGuan.cpp

571 lines
18 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "transparentdraggableGuan.h"
extern double g_dPixelPerCm;//每厘米像素数
//static GeoIndicatorGenerator m_drawGeo;
TransparentDraggableGuan::TransparentDraggableGuan(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QString strTitle)
: QObject(parentPlot), mPlot(parentPlot), /*mstrTitle(strTitle),*/ mMinWidth(minWidth)
{
m_strUuid = strUuid;
//
initRect();
}
TransparentDraggableGuan::~TransparentDraggableGuan()
{
if(mPlot) {
// mPlot->removeItem(mRect);
// mPlot->removeItem(mLeftHandle);
// mPlot->removeItem(mRightHandle);
}
}
void TransparentDraggableGuan::DrawSVGNormal(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout)
{
QString svg=svgFileName;
QRectF boundingRect = painter->transform().mapRect(borderRect);
painter->save();
QTransform transform;
transform.reset();
if (!IsWellSectonHorizonLayout)
{
painter->setWorldTransform(transform);
}
else
{
}
QPixmap tiledmap(svg);
QRect border(boundingRect.left(),boundingRect.top(),boundingRect.width(),boundingRect.height());
painter->drawPixmap(border,tiledmap);
painter->restore();
}
//拉伸
void TransparentDraggableGuan::DrawSVGSteched(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout)
{
QString svg=svgFileName;
QSvgRenderer m_SvgRenderer;
m_SvgRenderer.load(svg);
m_SvgRenderer.render(painter,borderRect);
}
//平铺
void TransparentDraggableGuan::DrawSVGTiled(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout)
{
QString svg=svgFileName;
QRectF boundingRect = painter->transform().mapRect(borderRect);
painter->save();
QTransform transform;
transform.reset();
if (!IsWellSectonHorizonLayout)
{
painter->setWorldTransform(transform);
}
else
{
}
QPixmap tiledmap(svg);
painter->drawTiledPixmap(boundingRect,tiledmap);
painter->restore();
}
//设置最小宽度
void TransparentDraggableGuan::setMinWidth(double minWidth)
{
mMinWidth = minWidth;
}
//设置外径长
void TransparentDraggableGuan::setOin(float in)
{
mIn = in;
}
////设置标题
//void TransparentDraggableGuan::setTitle(QString strTitle)
//{
// mstrTitle = strTitle;
// mItemTitle->setText(mstrTitle);
// //mPlot->replot();
//}
//设置解释结论
void TransparentDraggableGuan::setResult(QString filePath)
{
m_Result = filePath;
mPixmap->setPixmap(QPixmap(filePath)); // 设置图片
}
void TransparentDraggableGuan::drawResult(double left_Low, double right_Hight, double lY1, double lY2)
{
if(m_Result=="")
{
return;
}
double x1 = mPlot->xAxis->coordToPixel(left_Low);
double x2 = mPlot->xAxis->coordToPixel(right_Hight);
double y1 = mPlot->yAxis->coordToPixel(lY1);
double y2 = mPlot->yAxis->coordToPixel(lY2);
//
QString filePath = m_Result;
//
QString strLast = filePath.right(4);
if(strLast.toLower()==".svg")
{
QString path,filename;
GetWellNameAndPath(filePath, filename, path);
QString basename = filename;
QString val=filePath;
QImage image(y2-y1, x1-x2,QImage::Format_RGB32);
QPainter painter(&image);
QRectF fillRect(0,0, y2-y1, x1-x2);
painter.fillRect(fillRect,Qt::white);
//拉伸
DrawSVGSteched(&painter,filePath,fillRect,0);
//平铺
//DrawSVGTiled(&painter,filePath,fillRect,0);
//正常
//DrawSVGNormal(&painter,filePath,fillRect,0);
val=GetImagePath()+"TempNew";
QDir ss;
if(!ss.exists(val)) {
ss.mkdir(val);
}
val+=QDir::separator();
val+=basename+".png";
image.save(val);
//
mPixmap->setPixmap(QPixmap(val)); // 设置图片
}
else
{
mPixmap->setPixmap(QPixmap(filePath)); // 设置图片
// QString path,filename;
// GetWellNameAndPath(filePath, filename, path);
// QString basename = filename;
// QString val=filePath;
// QImage image(y2-y1, x1-x2,QImage::Format_RGB32);
// QPainter painter(&image);
// QRectF fillRect(0,0, y2-y1, x1-x2);
// painter.fillRect(fillRect,Qt::white);
// //平铺
// DrawSVGNormal(&painter,filePath,fillRect,0);
// val=GetImagePath()+"TempNew";
// QDir ss;
// if(!ss.exists(val)) {
// ss.mkdir(val);
// }
// val+=QDir::separator();
// val+=basename+".png";
// image.save(val);
// //
// mPixmap->setPixmap(QPixmap(val)); // 设置图片
}
//mPlot->replot();
}
// 设置矩形范围
void TransparentDraggableGuan::setRange(double left_Low, double right_Hight)
{
if(left_Low >= right_Hight) return;
double lY1 = mPlot->yAxis->range().lower;//+10
double lY2 = mPlot->yAxis->range().upper;
mRect->topLeft->setCoords(left_Low, lY1 + (lY2-lY1-mIn)/2.0);
mRect->bottomRight->setCoords(right_Hight, lY2 - (lY2-lY1-mIn)/2.0);
//位置与rect不一样否则图像反转
mPixmap->topLeft->setCoords(right_Hight, lY1 + (lY2-lY1-mIn)/2.0);
mPixmap->bottomRight->setCoords(left_Low, lY2 - (lY2-lY1-mIn)/2.0);
//drawResult(left_Low, right_Hight, lY1, lY2);
//mItemTitle->position->setCoords(0.5, 0.5);
// 设置父锚点,定位点
//mItemTitle->position->setParentAnchor(mRect->bottom);
// mItemTitle->position->setCoords((mRect->topLeft->coords().x() + mRect->bottomRight->coords().x())/2,
// (mRect->topLeft->coords().y() + mRect->bottomRight->coords().y())/2); // 设置文本在矩形中心位置
//mRect->topLeft->setCoords(left, mPlot->yAxis->range().upper);
//mRect->bottomRight->setCoords(right, mPlot->yAxis->range().lower);
updateHandles();
mPlot->replot();
}
// 获取当前范围
QCPRange TransparentDraggableGuan::getRange()
{
return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x());
}
// 设置矩形颜色
void TransparentDraggableGuan::setColor(const QColor &color)
{
mRect->setBrush(QBrush(color));
mRect->setPen(QPen(color.darker()));
//mPlot->replot();
}
// 删除框图
void TransparentDraggableGuan::deleteRect()
{
if(mPlot) {
// mRect->deleteLater();
// mLeftHandle->deleteLater();
// mRightHandle->deleteLater();
// mPixmap->deleteLater();
mPlot->m_mapDraggable_Guan.remove(m_strUuid);
mPlot->removeItem(mRect);
// mPlot->removeItem(mLeftHandle);
// mPlot->removeItem(mRightHandle);
mPlot->removeItem(mPixmap);
// mPlot->removeItem(mItemTitle);
mPlot->replot();
this->deleteLater();
//
// //避免二次绘制框图
// mPlot->m_bDrawRect = false;
// mDragMode = DragNone;
// //取消选中框
// mPlot->selectionRect()->cancel();
// mPlot->replot();
// mPlot->selectionRect()->mActive=true;
}
}
void TransparentDraggableGuan::initRect()
{
// 创建透明矩形
mRect = new QCPItemRect(mPlot);
mRect->setLayer("overlay"); // 确保在最上层
mRect->setBrush(QBrush(QColor(255, 255, 255, 50))); // 半透明蓝色
mRect->setPen(QPen(QColor(70, 70, 255, 200)));
// // 创建左右边界控制点
// mLeftHandle = new QCPItemRect(mPlot);
// mLeftHandle->setLayer("overlay");
// mLeftHandle->setBrush(QBrush(Qt::red));
// mLeftHandle->setPen(QPen(Qt::darkRed));
// mRightHandle = new QCPItemRect(mPlot);
// mRightHandle->setLayer("overlay");
// mRightHandle->setBrush(QBrush(Qt::red));
// mRightHandle->setPen(QPen(Qt::darkRed));
// 设置初始位置
//double center = mPlot->xAxis->range().center();
// setRange(center - 10, center + 10);
// 连接鼠标事件
connect(mPlot, &QCustomPlot::mousePress, this, &TransparentDraggableGuan::onMousePress);
connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableGuan::onMouseMove);
connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableGuan::onMouseRelease);
mPixmap = new QCPItemPixmap(mPlot);
//mPixmap->setPixmap(QPixmap(":/image/file.png")); // 设置图片
mPixmap->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式
mPixmap->setLayer("overlay"); // 确保在最上层
// mItemTitle = new QCPItemText(mPlot);
// mItemTitle->setText(mstrTitle);
// //mItemTitle->setBrush(QBrush(Qt::red));
// mItemTitle->setFont(QFont("Arial", 12, QFont::Bold));
// mItemTitle->setColor(Qt::black);
// mItemTitle->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);
// mItemTitle->position->setType(QCPItemPosition::ptPlotCoords);
// //mItemTitle->position->setType(QCPItemPosition::ptAxisRectRatio);
// mItemTitle->position->setCoords(0.5, 0);
// mItemTitle->setLayer("overlay");
}
void TransparentDraggableGuan::updateHandles()
{
// 左边界矩形控制点
// mLeftHandle->topLeft->setParentAnchor(mRect->topLeft);
// mLeftHandle->bottomRight->setParentAnchor(mRect->topRight);//(mRect->bottomLeft);
// mLeftHandle->topLeft->setCoords(-0.5, 0.5); // 矩形大小
// mLeftHandle->bottomRight->setCoords(0.5, -0.5); // 矩形大小
// // 右边界矩形控制点
// mRightHandle->topLeft->setParentAnchor(mRect->bottomLeft);
// mRightHandle->bottomRight->setParentAnchor(mRect->bottomRight);
// mRightHandle->topLeft->setCoords(-0.5, 0.5); // 矩形大小
// mRightHandle->bottomRight->setCoords(0.5, -0.5); // 矩形大小
}
void TransparentDraggableGuan::onDelRect()
{
//mDragMode = DragNone;
//删除框图
deleteRect();
}
void TransparentDraggableGuan::onMousePress(QMouseEvent *event)
{
if(event->button() != Qt::LeftButton)//右键
{
double y = mPlot->xAxis->pixelToCoord(event->pos().y());//x轴展示深度
QCPRange currentRange = getRange();
// if(mLeftHandle->selectTest(event->pos(), false) < 5) {
// mDragMode = DragNone;
// }
// else if(mRightHandle->selectTest(event->pos(), false) < 5) {
// mDragMode = DragNone;
// }
//else
if(y >= currentRange.lower && y <= currentRange.upper) {
mDragMode = DragNone;
}
else {
mDragMode = DragNone;
return;
}
//event->accept();
QMenu menu(nullptr);
QAction *delAction = menu.addAction("删除框图");
//delAction->installEventFilter(this);
connect(delAction, &QAction::triggered, this, &TransparentDraggableGuan::onDelRect);
// QAction* pItem = menu.exec(event->globalPos());
// if(pItem == delAction)
// {
// //event->accept();
// int ii=0;
// ii++;
// }
menu.exec(event->globalPos());
return;
}
event->accept();
// 检查点击了哪个部分
//double x = mPlot->xAxis->pixelToCoord(event->pos().x());
//double y = mPlot->yAxis->pixelToCoord(event->pos().y());
double y = mPlot->xAxis->pixelToCoord(event->pos().y());//x轴展示深度
QCPRange currentRange = getRange();
// if(mLeftHandle->selectTest(event->pos(), false) < 5) {
// mDragMode = DragLeft;
// }
// else if(mRightHandle->selectTest(event->pos(), false) < 5) {
// mDragMode = DragRight;
// }
// //else if(x >= currentRange.lower && x <= currentRange.upper) {
// else
if(y >= currentRange.lower && y <= currentRange.upper) {
mDragMode = DragRect;
}
else {
mDragMode = DragNone;
return;
}
//mDragStartX = x;
mDragStartY = y;
mDragStartRange = currentRange;
}
void TransparentDraggableGuan::onMouseMove(QMouseEvent *event)
{
if(mDragMode == DragNone) return;
event->accept();
//double x = mPlot->xAxis->pixelToCoord(event->pos().x());
//double dx = x - mDragStartX;
double y = mPlot->xAxis->pixelToCoord(event->pos().y());
double dy = y - mDragStartY;
QCPRange newRange = mDragStartRange;
switch(mDragMode) {
// case DragLeft: {
// //double proposedLeft = mDragStartRange.lower + dx;
// double proposedLeft = mDragStartRange.lower + dy;
// // 确保不超出轴范围且不使宽度小于最小值
// newRange.lower = qBound(
// //mPlot->xAxis->range().lower,
// getMyLower(),
// proposedLeft,
// mDragStartRange.upper - mMinWidth);
// break;
// }
// case DragRight: {
// //double proposedRight = mDragStartRange.upper + dx;
// double proposedRight = mDragStartRange.upper + dy;
// // 确保不超出轴范围且不使宽度小于最小值
// newRange.upper = qBound(
// mDragStartRange.lower + mMinWidth,
// proposedRight,
// getMyUpper());
// //mPlot->xAxis->range().upper);
// break;
// }
case DragRect: {
double width = mDragStartRange.size();
//double center = mDragStartRange.center() + dx;
double center = mDragStartRange.center() + dy;
newRange.lower = center - width/2;
newRange.upper = center + width/2;
// 检查是否超出轴范围
if(newRange.lower < getMyLower()) {
newRange.lower = getMyLower();
newRange.upper = newRange.lower + width;
}
else if(newRange.upper > getMyUpper()) {
newRange.upper = getMyUpper();
newRange.lower = newRange.upper - width;
}
// QCPRange axisRange = mPlot->xAxis->range();
// if(newRange.lower < axisRange.lower) {
// newRange.lower = axisRange.lower;
// newRange.upper = newRange.lower + width;
// }
// else if(newRange.upper > axisRange.upper) {
// newRange.upper = axisRange.upper;
// newRange.lower = newRange.upper - width;
// }
break;
}
default:
break;
}
// //取整数(方便显示统计,左右边界整数显示。)
// newRange.lower = (int)newRange.lower;
// QCPRange rangeByFile = mPlot->xAxis->range();
// if (std::fabs(rangeByFile.upper - (int)newRange.upper) >= 1.0)
// {
// newRange.upper = (int)newRange.upper;
// }
// 最终确保宽度不小于最小值(针对整体拖动的情况)
if(newRange.size() < mMinWidth) {
if(mDragMode == DragRect) {
// 如果是整体拖动,保持中心点不变
double center = newRange.center();
newRange.lower = center - mMinWidth/2;
newRange.upper = center + mMinWidth/2;
} else {
// 如果是边界拖动,强制设置最小宽度
// if(mDragMode == DragLeft) {
// newRange.lower = newRange.upper - mMinWidth;
// } else if(mDragMode == DragRight) {
// newRange.upper = newRange.lower + mMinWidth;
// }
}
}
setRange(newRange.lower, newRange.upper);
}
void TransparentDraggableGuan::onMouseRelease(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton && mDragMode != DragNone) {
event->accept();
//避免二次绘制框图
mPlot->m_bDrawRect = false;
//emit rangeChanged(getRange());
mDragMode = DragNone;
//取消选中状态
// QCPDataSelection emptySelection;
// mPlot->graph(0)->setSelection(emptySelection);
// mPlot->replot();
//取消选中框
mPlot->selectionRect()->cancel();
mPlot->replot();
mPlot->selectionRect()->mActive=true;
}
}
double TransparentDraggableGuan::getMyLower()
{
double dLower = mPlot->xAxis->range().lower;
// double proposedLeft = mDragStartRange.lower;
// TransparentDraggableGuan *pDraggableRect =NULL;
// {
// QMap<QString,QObject *>::Iterator it = mPlot->m_mapDraggable_Guan.begin();
// while( it != mPlot->m_mapDraggable_Guan.end() )
// {
// if(it.key() == m_strUuid)
// {
// it++;
// continue;
// }
// pDraggableRect = (TransparentDraggableGuan*)it.value();
// //
// QCPRange tmpRange = pDraggableRect->getRange();
// if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft)
// {
// dLower = tmpRange.upper;
// }
// it++;
// }
// }
return dLower;
}
double TransparentDraggableGuan::getMyUpper()
{
double dUpper = mPlot->xAxis->range().upper;
// double proposedRight = mDragStartRange.upper;
// TransparentDraggableGuan *pDraggableRect =NULL;
// {
// QMap<QString,QObject *>::Iterator it = mPlot->m_mapDraggable_Guan.begin();
// while( it != mPlot->m_mapDraggable_Guan.end() )
// {
// if(it.key() == m_strUuid)
// {
// it++;
// continue;
// }
// pDraggableRect = (TransparentDraggableGuan*)it.value();
// //
// QCPRange tmpRange = pDraggableRect->getRange();
// if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight)
// {
// dUpper = tmpRange.lower;
// }
// it++;
// }
// }
return dUpper;
}