From a1f7d40f97801e5d25ec0ff839a9ef2a025160f8 Mon Sep 17 00:00:00 2001 From: jiayulong Date: Mon, 22 Dec 2025 18:22:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E4=BA=95=E5=A3=81=E5=8F=96?= =?UTF-8?q?=E5=BF=83=E7=BB=98=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logPlus/TransparentDraggableGeoLith.cpp | 766 +++++++++++++++++++++ logPlus/TransparentDraggableGeoLith.h | 780 +--------------------- logPlus/TransparentDraggableRect.cpp | 427 ++++++++++++ logPlus/TransparentDraggableRect.h | 433 +----------- logPlus/TransparentDraggableResult.cpp | 696 +++++++++++++++++++ logPlus/TransparentDraggableResult.h | 704 +------------------ logPlus/TransparentDraggableSwallCore.cpp | 729 ++++++++++++++++++++ logPlus/TransparentDraggableSwallCore.h | 97 +++ logPlus/formdraw.cpp | 462 ++++++++----- logPlus/formdraw.h | 4 + logPlus/forminfo.cpp | 3 +- logPlus/formtrack.cpp | 3 +- logPlus/logPlus.pro | 5 + logPlus/qmycustomplot.cpp | 30 + logPlus/qmycustomplot.h | 3 + 15 files changed, 3146 insertions(+), 1996 deletions(-) create mode 100644 logPlus/TransparentDraggableGeoLith.cpp create mode 100644 logPlus/TransparentDraggableRect.cpp create mode 100644 logPlus/TransparentDraggableResult.cpp create mode 100644 logPlus/TransparentDraggableSwallCore.cpp create mode 100644 logPlus/TransparentDraggableSwallCore.h diff --git a/logPlus/TransparentDraggableGeoLith.cpp b/logPlus/TransparentDraggableGeoLith.cpp new file mode 100644 index 0000000..425ed92 --- /dev/null +++ b/logPlus/TransparentDraggableGeoLith.cpp @@ -0,0 +1,766 @@ +#include "TransparentDraggableGeoLith.h" + +extern double g_dPixelPerCm;//每厘米像素数 +//static GeoIndicatorGenerator m_drawGeo; + +TransparentDraggableGeoLith::TransparentDraggableGeoLith(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QString strTitle) + : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) + { + m_strUuid = strUuid; + // + initRect(); + } + + TransparentDraggableGeoLith::~TransparentDraggableGeoLith() + { + if(mPlot) { +// mPlot->removeItem(mRect); +// mPlot->removeItem(mLeftHandle); +// mPlot->removeItem(mRightHandle); + } + } + + void TransparentDraggableGeoLith::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 TransparentDraggableGeoLith::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 TransparentDraggableGeoLith::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 TransparentDraggableGeoLith::setMinWidth(double minWidth) + { + mMinWidth = minWidth; + } + + //设置标题 + void TransparentDraggableGeoLith::setTitle(QString strTitle) + { + mstrTitle = strTitle; + mItemTitle->setText(mstrTitle); + mPlot->replot(); + } + + //设置解释结论 + void TransparentDraggableGeoLith::setLith(QString filePath, QString colorPath) + { + m_Lith = filePath; + m_Color = colorPath; + } + + void TransparentDraggableGeoLith::drawLith(double left_Low, double right_Hight, double lY1, double lY2) + { + if(m_Lith=="") + { + return; + } + + double x1 = mPlot->xAxis->coordToPixel(left_Low); + double x2 = mPlot->xAxis->coordToPixel(right_Hight); + double y1 = mPlot->yAxis->coordToPixel(lY1+(lY2-lY1)/4); + double y2 = mPlot->yAxis->coordToPixel(lY2); + double newWidth = y2-y1; + double newHeight = x1-x2; + + // + QString filePath = m_Lith; + QString strLast = filePath.right(4); + if(strLast.toLower()==".svg") + { + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(newWidth, newHeight, QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0,newWidth, newHeight); + painter.fillRect(fillRect,Qt::white); + // + //painter.setBrush(QBrush(QPixmap(colorPath))); + //颜色 + QString strLastColor = m_Color.right(4); + if(strLastColor.toLower()==".svg") + { + //拉伸 + DrawSVGSteched(&painter,m_Color,fillRect,0); + } + +// bool isStrech=false; +// QSvgRenderer m_SvgRenderer; +// m_SvgRenderer.load(filePath); +// if(!isStrech){ +// float oil_h = fillRect.width(); +// oil_h = (oil_h / 2 >= fillRect.height() / 2) ? fillRect.height() : oil_h; +// float rect_y = fillRect.y() + fillRect.height() / 2 - oil_h / 2; +// fillRect.setY(rect_y); +// fillRect.setHeight(oil_h); +// } +// fillRect.setX(fillRect.x() + 1); +// m_SvgRenderer.render(&painter, fillRect); + + //拉伸 + 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_Lith->setPixmap(QPixmap(val)); // 设置图片 + + +// QSvgRenderer* svgRender = new QSvgRenderer(); +// svgRender->load(result); +// // +// QPixmap* pixmap = new QPixmap(10, 10); +// pixmap->fill(Qt::transparent);//设置背景透明 +// QPainter p(pixmap); +// svgRender->render(&p); +// // +// mPixmap->setPixmap(*pixmap); // 设置图片 + } + else + { +// QString val=filePath; +// QImage image(47,16,QImage::Format_RGB32); +// QPainter painter(&image); +// QRectF fillRect(0,0,47,16); +// painter.fillRect(fillRect, QColor(0, 0, 0, 0)); +// // +// painter.setBrush(QBrush(QPixmap(colorPath))); + +// QPixmap* pixmap = new QPixmap(filePath); +// pixmap->fill(Qt::transparent);//设置背景透明 +// mPixmap_Lith->setPixmap(*pixmap); // 设置图片 + + //mPixmap_Lith->setPixmap(QPixmap(filePath)); // 设置图片 + + + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(newWidth, newHeight, QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0,newWidth, newHeight); + painter.fillRect(fillRect,Qt::white); + //颜色 + QString strLastColor = m_Color.right(4); + if(strLastColor.toLower()==".svg") + { + //拉伸 + DrawSVGSteched(&painter,m_Color,fillRect,0); + } + // + bool isOne=true; + bool isStech=true; + bool isHorizon=false; + float cm = g_dPixelPerCm;//一厘米对应的像素个数 + QColor bkColor = QColor(255,255,255,0); + + float GeoResult = m_drawGeo.seleGeo("岩性符号库", basename, &painter, fillRect, isOne, isStech, isHorizon, cm, bkColor); + + val=GetImagePath()+"TempNew"; + QDir ss; + if(!ss.exists(val)) { + ss.mkdir(val); + } + val+=QDir::separator(); + val+=basename+".png"; + image.save(val); + + // + mPixmap_Lith->setPixmap(QPixmap(val)); // 设置图片 + } + mPixmap_Lith->topLeft->setCoords(mPlot->xAxis->pixelToCoord(x2+1), mPlot->yAxis->pixelToCoord(y1+1));//right_Hight + mPixmap_Lith->bottomRight->setCoords(mPlot->xAxis->pixelToCoord(x1-1), mPlot->yAxis->pixelToCoord(y2-1));//left_Low + +// mPixmap_Lith->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); +// mPixmap_Lith->bottomRight->setCoords(left_Low, lY2); + + //mPlot->replot(); + } + + //设置m_Oil + void TransparentDraggableGeoLith::setOil(QString filePath) + { + m_Oil = filePath; + } + + void TransparentDraggableGeoLith::drawOil(double left_Low, double right_Hight, double lY1, double lY2) + { + if(m_Oil=="") + { + 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(lY1+(lY2-lY1)/4); + + bool bWidthBig = false; + double newWidth = y2-y1; + double newHeight = x1-x2; + if(newWidth>newHeight) + { + //取小,画正方形框 + newWidth = newHeight; + bWidthBig = true; + } + + float rect_xRight = x2 + newHeight/ 2 - newWidth/ 2; + double xNewRight = mPlot->xAxis->pixelToCoord(rect_xRight+1); + // + float rect_xLeft = rect_xRight + newWidth; + double xNewLeft = mPlot->xAxis->pixelToCoord(rect_xLeft-1); + + // + QString filePath = m_Oil; + // + QString strLast = filePath.right(4); + if(strLast.toLower()==".svg") + { + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(newWidth, newWidth,QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0, newWidth, newWidth); + 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_Oil->setPixmap(QPixmap(val)); // 设置图片 + } + else + { + mPixmap_Oil->setPixmap(QPixmap(filePath)); // 设置图片 + } + + mPixmap_Oil->topLeft->setCoords(xNewRight, mPlot->yAxis->pixelToCoord(y1+1)); //right_Hight, lY1 + mPixmap_Oil->bottomRight->setCoords(xNewLeft, mPlot->yAxis->pixelToCoord(y2-1)); //left_Low + + //mPlot->replot(); + } + + //设置Color + void TransparentDraggableGeoLith::setColor(QString filePath) + { + m_Color = filePath; + // + QString strLast = filePath.right(4); + if(strLast.toLower()==".svg") + { + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(320,160,QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0,320,160); + 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_Color->setPixmap(QPixmap(val)); // 设置图片 + } + else + { + mPixmap_Color->setPixmap(QPixmap(filePath)); // 设置图片 + } + + //mPlot->replot(); + } + + // 设置矩形范围 + void TransparentDraggableGeoLith::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); + mRect->bottomRight->setCoords(right_Hight, lY2); + + //位置与rect不一样,否则图像反转 + mPixmap_Color->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); + mPixmap_Color->bottomRight->setCoords(left_Low, lY2); + // + //mPixmap_Lith->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); + //mPixmap_Lith->bottomRight->setCoords(left_Low, lY2); + drawLith(left_Low, right_Hight, lY1, lY2); + + //位置与rect不一样,否则图像反转 + //mPixmap_Oil->topLeft->setCoords(right_Hight, lY1); + //mPixmap_Oil->bottomRight->setCoords(left_Low, lY1+(lY2-lY1)/4); + drawOil(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 TransparentDraggableGeoLith::getRange() + { + return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); + } + + // 设置矩形颜色 + void TransparentDraggableGeoLith::setColor(const QColor &color) + { + mRect->setBrush(QBrush(color)); + mRect->setPen(QPen(color.darker())); + mPlot->replot(); + } + + // 删除框图 + void TransparentDraggableGeoLith::deleteRect() + { + if(mPlot) { + +// mRect->deleteLater(); +// mLeftHandle->deleteLater(); +// mRightHandle->deleteLater(); +// mPixmap->deleteLater(); + + mPlot->m_mapDraggable_GeoLith.remove(m_strUuid); + + mPlot->removeItem(mRect); + mPlot->removeItem(mLeftHandle); + mPlot->removeItem(mRightHandle); + mPlot->removeItem(mPixmap_Lith); + mPlot->removeItem(mPixmap_Oil); + mPlot->removeItem(mPixmap_Color); + mPlot->removeItem(mItemTitle); + + mPlot->replot(); + this->deleteLater(); + + // +// //避免二次绘制框图 +// mPlot->m_bDrawRect = false; +// mDragMode = DragNone; +// //取消选中框 +// mPlot->selectionRect()->cancel(); +// mPlot->replot(); +// mPlot->selectionRect()->mActive=true; + } + } + + + void TransparentDraggableGeoLith::initRect() + { + // 创建透明矩形 + mRect = new QCPItemRect(mPlot); + mRect->setLayer("overlay"); // 确保在最上层 + mRect->setBrush(QBrush(QColor(255, 255, 255, 50))); // 半透明蓝色100, 100, 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, &TransparentDraggableGeoLith::onMousePress); + connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableGeoLith::onMouseMove); + connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableGeoLith::onMouseRelease); + + mPixmap_Lith = new QCPItemPixmap(mPlot); + //mPixmap->setPixmap(QPixmap(":/image/file.png")); // 设置图片 + mPixmap_Lith->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio + mPixmap_Lith->setLayer("overlay"); // 确保在最上层 + + mPixmap_Oil = new QCPItemPixmap(mPlot); + //mPixmap_Oil->setPixmap(QPixmap(":/image/file.png")); // 设置图片 + mPixmap_Oil->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio + mPixmap_Oil->setLayer("overlay"); // 确保在最上层 + + mPixmap_Color = new QCPItemPixmap(mPlot); + //mPixmap_Color->setPixmap(QPixmap(":/image/file.png")); // 设置图片 + mPixmap_Color->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio + mPixmap_Color->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 TransparentDraggableGeoLith::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 TransparentDraggableGeoLith::onDelRect() + { + //mDragMode = DragNone; + //删除框图 + deleteRect(); + } + + void TransparentDraggableGeoLith::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(x >= currentRange.lower && x <= currentRange.upper) { +// 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, &TransparentDraggableResult::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 TransparentDraggableGeoLith::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 TransparentDraggableGeoLith::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 TransparentDraggableGeoLith::getMyLower() + { + double dLower = mPlot->xAxis->range().lower; + double proposedLeft = mDragStartRange.lower; + + TransparentDraggableGeoLith *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_GeoLith.begin(); + while( it != mPlot->m_mapDraggable_GeoLith.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableGeoLith*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) + { + dLower = tmpRange.upper; + } + it++; + } + } + + return dLower; + } + + double TransparentDraggableGeoLith::getMyUpper() + { + double dUpper = mPlot->xAxis->range().upper; + double proposedRight = mDragStartRange.upper; + + TransparentDraggableGeoLith *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_GeoLith.begin(); + while( it != mPlot->m_mapDraggable_GeoLith.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableGeoLith*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) + { + dUpper = tmpRange.lower; + } + it++; + } + } + + return dUpper; + } + diff --git a/logPlus/TransparentDraggableGeoLith.h b/logPlus/TransparentDraggableGeoLith.h index 9dee0d0..2e5ce28 100644 --- a/logPlus/TransparentDraggableGeoLith.h +++ b/logPlus/TransparentDraggableGeoLith.h @@ -10,784 +10,62 @@ #include "GeoIndicatorGenerator.h" #pragma execution_character_set("utf-8") // 强制指定执行字符集为 UTF-8 - -extern double g_dPixelPerCm;//每厘米像素数 -//static GeoIndicatorGenerator m_drawGeo; + class TransparentDraggableGeoLith : public QObject { Q_OBJECT public: - explicit TransparentDraggableGeoLith(QMyCustomPlot *parentPlot, QString strUuid="", double minWidth = 1.0, QString strTitle = "") - : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) - { - m_strUuid = strUuid; - // - initRect(); - } + explicit TransparentDraggableGeoLith(QMyCustomPlot *parentPlot, QString strUuid="", double minWidth = 1.0, QString strTitle = ""); - ~TransparentDraggableGeoLith() { - if(mPlot) { -// mPlot->removeItem(mRect); -// mPlot->removeItem(mLeftHandle); -// mPlot->removeItem(mRightHandle); - } - } + ~TransparentDraggableGeoLith(); - void 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 DrawSVGNormal(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); //拉伸 - void 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 DrawSVGSteched(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); //平铺 - void 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 DrawSVGTiled(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); //设置最小宽度 - void setMinWidth(double minWidth){ - mMinWidth = minWidth; - } - + void setMinWidth(double minWidth); //设置标题 - void setTitle(QString strTitle){ - mstrTitle = strTitle; - mItemTitle->setText(mstrTitle); - mPlot->replot(); - } + void setTitle(QString strTitle); //设置解释结论 - void setLith(QString filePath, QString colorPath){ - m_Lith = filePath; - m_Color = colorPath; - } - - void drawLith(double left_Low, double right_Hight, double lY1, double lY2) - { - if(m_Lith=="") - { - return; - } - - double x1 = mPlot->xAxis->coordToPixel(left_Low); - double x2 = mPlot->xAxis->coordToPixel(right_Hight); - double y1 = mPlot->yAxis->coordToPixel(lY1+(lY2-lY1)/4); - double y2 = mPlot->yAxis->coordToPixel(lY2); - double newWidth = y2-y1; - double newHeight = x1-x2; - - // - QString filePath = m_Lith; - QString strLast = filePath.right(4); - if(strLast.toLower()==".svg") - { - QString path,filename; - GetWellNameAndPath(filePath, filename, path); - QString basename = filename; - - QString val=filePath; - QImage image(newWidth, newHeight, QImage::Format_RGB32); - QPainter painter(&image); - QRectF fillRect(0,0,newWidth, newHeight); - painter.fillRect(fillRect,Qt::white); - // - //painter.setBrush(QBrush(QPixmap(colorPath))); - //颜色 - QString strLastColor = m_Color.right(4); - if(strLastColor.toLower()==".svg") - { - //拉伸 - DrawSVGSteched(&painter,m_Color,fillRect,0); - } - -// bool isStrech=false; -// QSvgRenderer m_SvgRenderer; -// m_SvgRenderer.load(filePath); -// if(!isStrech){ -// float oil_h = fillRect.width(); -// oil_h = (oil_h / 2 >= fillRect.height() / 2) ? fillRect.height() : oil_h; -// float rect_y = fillRect.y() + fillRect.height() / 2 - oil_h / 2; -// fillRect.setY(rect_y); -// fillRect.setHeight(oil_h); -// } -// fillRect.setX(fillRect.x() + 1); -// m_SvgRenderer.render(&painter, fillRect); - - //拉伸 - 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_Lith->setPixmap(QPixmap(val)); // 设置图片 - - -// QSvgRenderer* svgRender = new QSvgRenderer(); -// svgRender->load(result); -// // -// QPixmap* pixmap = new QPixmap(10, 10); -// pixmap->fill(Qt::transparent);//设置背景透明 -// QPainter p(pixmap); -// svgRender->render(&p); -// // -// mPixmap->setPixmap(*pixmap); // 设置图片 - } - else - { -// QString val=filePath; -// QImage image(47,16,QImage::Format_RGB32); -// QPainter painter(&image); -// QRectF fillRect(0,0,47,16); -// painter.fillRect(fillRect, QColor(0, 0, 0, 0)); -// // -// painter.setBrush(QBrush(QPixmap(colorPath))); - -// QPixmap* pixmap = new QPixmap(filePath); -// pixmap->fill(Qt::transparent);//设置背景透明 -// mPixmap_Lith->setPixmap(*pixmap); // 设置图片 - - //mPixmap_Lith->setPixmap(QPixmap(filePath)); // 设置图片 - - - QString path,filename; - GetWellNameAndPath(filePath, filename, path); - QString basename = filename; - - QString val=filePath; - QImage image(newWidth, newHeight, QImage::Format_RGB32); - QPainter painter(&image); - QRectF fillRect(0,0,newWidth, newHeight); - painter.fillRect(fillRect,Qt::white); - //颜色 - QString strLastColor = m_Color.right(4); - if(strLastColor.toLower()==".svg") - { - //拉伸 - DrawSVGSteched(&painter,m_Color,fillRect,0); - } - // - bool isOne=true; - bool isStech=true; - bool isHorizon=false; - float cm = g_dPixelPerCm;//一厘米对应的像素个数 - QColor bkColor = QColor(255,255,255,0); - - float GeoResult = m_drawGeo.seleGeo("岩性符号库", basename, &painter, fillRect, isOne, isStech, isHorizon, cm, bkColor); - - val=GetImagePath()+"TempNew"; - QDir ss; - if(!ss.exists(val)) { - ss.mkdir(val); - } - val+=QDir::separator(); - val+=basename+".png"; - image.save(val); - - // - mPixmap_Lith->setPixmap(QPixmap(val)); // 设置图片 - } - mPixmap_Lith->topLeft->setCoords(mPlot->xAxis->pixelToCoord(x2+1), mPlot->yAxis->pixelToCoord(y1+1));//right_Hight - mPixmap_Lith->bottomRight->setCoords(mPlot->xAxis->pixelToCoord(x1-1), mPlot->yAxis->pixelToCoord(y2-1));//left_Low - -// mPixmap_Lith->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); -// mPixmap_Lith->bottomRight->setCoords(left_Low, lY2); - - //mPlot->replot(); - } + void setLith(QString filePath, QString colorPath); + void drawLith(double left_Low, double right_Hight, double lY1, double lY2); + + void setColor(QString filePath); //设置m_Oil - void setOil(QString filePath){ - m_Oil = filePath; - } - - void drawOil(double left_Low, double right_Hight, double lY1, double lY2) - { - if(m_Oil=="") - { - 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(lY1+(lY2-lY1)/4); - - bool bWidthBig = false; - double newWidth = y2-y1; - double newHeight = x1-x2; - if(newWidth>newHeight) - { - //取小,画正方形框 - newWidth = newHeight; - bWidthBig = true; - } - - float rect_xRight = x2 + newHeight/ 2 - newWidth/ 2; - double xNewRight = mPlot->xAxis->pixelToCoord(rect_xRight+1); - // - float rect_xLeft = rect_xRight + newWidth; - double xNewLeft = mPlot->xAxis->pixelToCoord(rect_xLeft-1); - - // - QString filePath = m_Oil; - // - QString strLast = filePath.right(4); - if(strLast.toLower()==".svg") - { - QString path,filename; - GetWellNameAndPath(filePath, filename, path); - QString basename = filename; - - QString val=filePath; - QImage image(newWidth, newWidth,QImage::Format_RGB32); - QPainter painter(&image); - QRectF fillRect(0,0, newWidth, newWidth); - 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_Oil->setPixmap(QPixmap(val)); // 设置图片 - } - else - { - mPixmap_Oil->setPixmap(QPixmap(filePath)); // 设置图片 - } - - mPixmap_Oil->topLeft->setCoords(xNewRight, mPlot->yAxis->pixelToCoord(y1+1)); //right_Hight, lY1 - mPixmap_Oil->bottomRight->setCoords(xNewLeft, mPlot->yAxis->pixelToCoord(y2-1)); //left_Low - - //mPlot->replot(); - } - - //设置Color - void setColor(QString filePath){ - m_Color = filePath; - // - QString strLast = filePath.right(4); - if(strLast.toLower()==".svg") - { - QString path,filename; - GetWellNameAndPath(filePath, filename, path); - QString basename = filename; - - QString val=filePath; - QImage image(320,160,QImage::Format_RGB32); - QPainter painter(&image); - QRectF fillRect(0,0,320,160); - 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_Color->setPixmap(QPixmap(val)); // 设置图片 - } - else - { - mPixmap_Color->setPixmap(QPixmap(filePath)); // 设置图片 - } - - //mPlot->replot(); - } - + void setOil(QString filePath); + void drawOil(double left_Low, double right_Hight, double lY1, double lY2); + // 设置矩形范围 - void 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); - mRect->bottomRight->setCoords(right_Hight, lY2); - - //位置与rect不一样,否则图像反转 - mPixmap_Color->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); - mPixmap_Color->bottomRight->setCoords(left_Low, lY2); - // - //mPixmap_Lith->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); - //mPixmap_Lith->bottomRight->setCoords(left_Low, lY2); - drawLith(left_Low, right_Hight, lY1, lY2); - - //位置与rect不一样,否则图像反转 - //mPixmap_Oil->topLeft->setCoords(right_Hight, lY1); - //mPixmap_Oil->bottomRight->setCoords(left_Low, lY1+(lY2-lY1)/4); - drawOil(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(); - } - + void setRange(double left_Low, double right_Hight); // 获取当前范围 - QCPRange getRange() const { - return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); - } + QCPRange getRange(); // 设置矩形颜色 - void setColor(const QColor &color) { - mRect->setBrush(QBrush(color)); - mRect->setPen(QPen(color.darker())); - mPlot->replot(); - } - + void setColor(const QColor &color); + // 删除框图 - void deleteRect() { - if(mPlot) { - -// mRect->deleteLater(); -// mLeftHandle->deleteLater(); -// mRightHandle->deleteLater(); -// mPixmap->deleteLater(); - - mPlot->m_mapDraggable_GeoLith.remove(m_strUuid); - - mPlot->removeItem(mRect); - mPlot->removeItem(mLeftHandle); - mPlot->removeItem(mRightHandle); - mPlot->removeItem(mPixmap_Lith); - mPlot->removeItem(mPixmap_Oil); - mPlot->removeItem(mPixmap_Color); - mPlot->removeItem(mItemTitle); - - mPlot->replot(); - this->deleteLater(); - - // -// //避免二次绘制框图 -// mPlot->m_bDrawRect = false; -// mDragMode = DragNone; -// //取消选中框 -// mPlot->selectionRect()->cancel(); -// mPlot->replot(); -// mPlot->selectionRect()->mActive=true; - } - } + void deleteRect(); signals: void rangeChanged(QCPRange newRange); private: - void initRect() { - // 创建透明矩形 - mRect = new QCPItemRect(mPlot); - mRect->setLayer("overlay"); // 确保在最上层 - mRect->setBrush(QBrush(QColor(255, 255, 255, 50))); // 半透明蓝色100, 100, 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, &TransparentDraggableGeoLith::onMousePress); - connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableGeoLith::onMouseMove); - connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableGeoLith::onMouseRelease); - - mPixmap_Lith = new QCPItemPixmap(mPlot); - //mPixmap->setPixmap(QPixmap(":/image/file.png")); // 设置图片 - mPixmap_Lith->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio - mPixmap_Lith->setLayer("overlay"); // 确保在最上层 - - mPixmap_Oil = new QCPItemPixmap(mPlot); - //mPixmap_Oil->setPixmap(QPixmap(":/image/file.png")); // 设置图片 - mPixmap_Oil->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio - mPixmap_Oil->setLayer("overlay"); // 确保在最上层 - - mPixmap_Color = new QCPItemPixmap(mPlot); - //mPixmap_Color->setPixmap(QPixmap(":/image/file.png")); // 设置图片 - mPixmap_Color->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio - mPixmap_Color->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 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 initRect(); + void updateHandles() ; private slots: - void onDelRect() - { - //mDragMode = DragNone; - //删除框图 - deleteRect(); - } - - // 事件过滤器处理函数 -// bool eventFilter(QObject* object, QEvent* event) { -// if (event->type() == QEvent::MouseButtonPress) { -// // 拦截操作 -// return true; // 阻止事件传递 - -//// if (object == action) { -//// // 验证权限 -//// if (1) { -//// // 允许操作 -//// action->trigger(); -//// } else { -//// // 拦截操作 -//// return true; // 阻止事件传递 -//// } -//// } -// } -// return false; // 默认不拦截其他事件 -// } - - void 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(x >= currentRange.lower && x <= currentRange.upper) { -// 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, &TransparentDraggableResult::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 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 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 getMyLower() - { - double dLower = mPlot->xAxis->range().lower; - double proposedLeft = mDragStartRange.lower; - - TransparentDraggableGeoLith *pDraggableRect =NULL; - { - QMap::Iterator it = mPlot->m_mapDraggable_GeoLith.begin(); - while( it != mPlot->m_mapDraggable_GeoLith.end() ) - { - if(it.key() == m_strUuid) - { - it++; - continue; - } - pDraggableRect = (TransparentDraggableGeoLith*)it.value(); - // - QCPRange tmpRange = pDraggableRect->getRange(); - if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) - { - dLower = tmpRange.upper; - } - it++; - } - } - - return dLower; - } - - double getMyUpper() - { - double dUpper = mPlot->xAxis->range().upper; - double proposedRight = mDragStartRange.upper; - - TransparentDraggableGeoLith *pDraggableRect =NULL; - { - QMap::Iterator it = mPlot->m_mapDraggable_GeoLith.begin(); - while( it != mPlot->m_mapDraggable_GeoLith.end() ) - { - if(it.key() == m_strUuid) - { - it++; - continue; - } - pDraggableRect = (TransparentDraggableGeoLith*)it.value(); - // - QCPRange tmpRange = pDraggableRect->getRange(); - if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) - { - dUpper = tmpRange.lower; - } - it++; - } - } - - return dUpper; - } - + void onDelRect(); + void onMousePress(QMouseEvent *event); + void onMouseMove(QMouseEvent *event); + void onMouseRelease(QMouseEvent *event); + double getMyLower(); + double getMyUpper(); + private: QMyCustomPlot *mPlot; QCPItemRect *mRect; diff --git a/logPlus/TransparentDraggableRect.cpp b/logPlus/TransparentDraggableRect.cpp new file mode 100644 index 0000000..3d7182e --- /dev/null +++ b/logPlus/TransparentDraggableRect.cpp @@ -0,0 +1,427 @@ +#include "TransparentDraggableRect.h" + +extern double g_dPixelPerCm;//每厘米像素数 +//static GeoIndicatorGenerator m_drawGeo; + +TransparentDraggableRect::TransparentDraggableRect(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QString strTitle) + : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) +{ + m_strUuid = strUuid; + // + initRect(); +} + +TransparentDraggableRect::~TransparentDraggableRect() +{ + if(mPlot) { +// mPlot->removeItem(mRect); +// mPlot->removeItem(mLeftHandle); +// mPlot->removeItem(mRightHandle); + } +} + +//设置最小宽度 +void TransparentDraggableRect::setMinWidth(double minWidth) +{ + mMinWidth = minWidth; +} + +//设置标题 +void TransparentDraggableRect::setTitle(QString strTitle) +{ + mstrTitle = strTitle; + mItemTitle->setText(mstrTitle); + mPlot->replot(); +} + +// 设置矩形范围 +void TransparentDraggableRect::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); + mRect->bottomRight->setCoords(right_Hight, lY2); + + //位置与rect不一样,否则图像反转 + mPixmap->topLeft->setCoords(right_Hight, lY1); + mPixmap->bottomRight->setCoords(left_Low, 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 TransparentDraggableRect::getRange() +{ + return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); +} + +// 设置矩形颜色 +void TransparentDraggableRect::setColor(const QColor &color) +{ + mRect->setBrush(QBrush(color)); + mRect->setPen(QPen(color.darker())); + mPlot->replot(); +} + +// 删除框图 +void TransparentDraggableRect::deleteRect() +{ + if(mPlot) { + +// mRect->deleteLater(); +// mLeftHandle->deleteLater(); +// mRightHandle->deleteLater(); +// mPixmap->deleteLater(); + + mPlot->m_mapDraggableRect.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 TransparentDraggableRect::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, &TransparentDraggableRect::onMousePress); + connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableRect::onMouseMove); + connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableRect::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 TransparentDraggableRect::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 TransparentDraggableRect::onDelRect() +{ + //mDragMode = DragNone; + //删除框图 + deleteRect(); +} + + +void TransparentDraggableRect::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(x >= currentRange.lower && x <= currentRange.upper) { + 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, &TransparentDraggableRect::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 TransparentDraggableRect::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 TransparentDraggableRect::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 TransparentDraggableRect::getMyLower() +{ + double dLower = mPlot->xAxis->range().lower; + double proposedLeft = mDragStartRange.lower; + + TransparentDraggableRect *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggableRect.begin(); + while( it != mPlot->m_mapDraggableRect.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableRect*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) + { + dLower = tmpRange.upper; + } + it++; + } + } + + return dLower; +} + +double TransparentDraggableRect::getMyUpper() +{ + double dUpper = mPlot->xAxis->range().upper; + double proposedRight = mDragStartRange.upper; + + TransparentDraggableRect *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggableRect.begin(); + while( it != mPlot->m_mapDraggableRect.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableRect*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) + { + dUpper = tmpRange.lower; + } + it++; + } + } + + return dUpper; +} + diff --git a/logPlus/TransparentDraggableRect.h b/logPlus/TransparentDraggableRect.h index 30f6ff5..fc9cfad 100644 --- a/logPlus/TransparentDraggableRect.h +++ b/logPlus/TransparentDraggableRect.h @@ -12,439 +12,42 @@ class TransparentDraggableRect : public QObject { Q_OBJECT public: - explicit TransparentDraggableRect(QMyCustomPlot *parentPlot, QString strUuid="", double minWidth = 1.0, QString strTitle = "") - : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) - { - m_strUuid = strUuid; - // - initRect(); - } + explicit TransparentDraggableRect(QMyCustomPlot *parentPlot, QString strUuid="", double minWidth = 1.0, QString strTitle = ""); + - ~TransparentDraggableRect() { - if(mPlot) { -// mPlot->removeItem(mRect); -// mPlot->removeItem(mLeftHandle); -// mPlot->removeItem(mRightHandle); - } - } + ~TransparentDraggableRect(); //设置最小宽度 - void setMinWidth(double minWidth){ - mMinWidth = minWidth; - } - + void setMinWidth(double minWidth); //设置标题 - void setTitle(QString strTitle){ - mstrTitle = strTitle; - mItemTitle->setText(mstrTitle); - mPlot->replot(); - } + void setTitle(QString strTitle); // 设置矩形范围 - void 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); - mRect->bottomRight->setCoords(right_Hight, lY2); - - //位置与rect不一样,否则图像反转 - mPixmap->topLeft->setCoords(right_Hight, lY1); - mPixmap->bottomRight->setCoords(left_Low, 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(); - } - + void setRange(double left_Low, double right_Hight); // 获取当前范围 - QCPRange getRange() const { - return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); - } + QCPRange getRange(); // 设置矩形颜色 - void setColor(const QColor &color) { - mRect->setBrush(QBrush(color)); - mRect->setPen(QPen(color.darker())); - mPlot->replot(); - } + void setColor(const QColor &color); // 删除框图 - void deleteRect() { - if(mPlot) { - -// mRect->deleteLater(); -// mLeftHandle->deleteLater(); -// mRightHandle->deleteLater(); -// mPixmap->deleteLater(); - - mPlot->m_mapDraggableRect.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 deleteRect(); signals: void rangeChanged(QCPRange newRange); private: - void 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, &TransparentDraggableRect::onMousePress); - connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableRect::onMouseMove); - connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableRect::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 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 initRect(); + void updateHandles() ; private slots: - void onDelRect() - { - //mDragMode = DragNone; - //删除框图 - deleteRect(); - } - - // 事件过滤器处理函数 -// bool eventFilter(QObject* object, QEvent* event) { -// if (event->type() == QEvent::MouseButtonPress) { -// // 拦截操作 -// return true; // 阻止事件传递 - -//// if (object == action) { -//// // 验证权限 -//// if (1) { -//// // 允许操作 -//// action->trigger(); -//// } else { -//// // 拦截操作 -//// return true; // 阻止事件传递 -//// } -//// } -// } -// return false; // 默认不拦截其他事件 -// } - - void 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(x >= currentRange.lower && x <= currentRange.upper) { - 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, &TransparentDraggableRect::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 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 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 getMyLower() - { - double dLower = mPlot->xAxis->range().lower; - double proposedLeft = mDragStartRange.lower; - - TransparentDraggableRect *pDraggableRect =NULL; - { - QMap::Iterator it = mPlot->m_mapDraggableRect.begin(); - while( it != mPlot->m_mapDraggableRect.end() ) - { - if(it.key() == m_strUuid) - { - it++; - continue; - } - pDraggableRect = (TransparentDraggableRect*)it.value(); - // - QCPRange tmpRange = pDraggableRect->getRange(); - if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) - { - dLower = tmpRange.upper; - } - it++; - } - } - - return dLower; - } - - double getMyUpper() - { - double dUpper = mPlot->xAxis->range().upper; - double proposedRight = mDragStartRange.upper; - - TransparentDraggableRect *pDraggableRect =NULL; - { - QMap::Iterator it = mPlot->m_mapDraggableRect.begin(); - while( it != mPlot->m_mapDraggableRect.end() ) - { - if(it.key() == m_strUuid) - { - it++; - continue; - } - pDraggableRect = (TransparentDraggableRect*)it.value(); - // - QCPRange tmpRange = pDraggableRect->getRange(); - if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) - { - dUpper = tmpRange.lower; - } - it++; - } - } - - return dUpper; - } - + void onDelRect(); + void onMousePress(QMouseEvent *event); + void onMouseMove(QMouseEvent *event); + void onMouseRelease(QMouseEvent *event); + double getMyLower(); + double getMyUpper(); + private: QMyCustomPlot *mPlot; QCPItemRect *mRect; diff --git a/logPlus/TransparentDraggableResult.cpp b/logPlus/TransparentDraggableResult.cpp new file mode 100644 index 0000000..14283b2 --- /dev/null +++ b/logPlus/TransparentDraggableResult.cpp @@ -0,0 +1,696 @@ +#include "TransparentDraggableResult.h" + +extern double g_dPixelPerCm;//每厘米像素数 +//static GeoIndicatorGenerator m_drawGeo; + +TransparentDraggableResult::TransparentDraggableResult(QMyCustomPlot *parentPlot, TransparentDraggableResult *upDraggableResult, QString strUuid, double minWidth, QString strTitle) + : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) +{ + m_upDraggableResult = upDraggableResult; + m_strUuid = strUuid; + // + initRect(); + + //将自己,设置为上方rect的下方 + if(m_upDraggableResult) + { + m_upDraggableResult->m_downDraggableResult = this; + } +} + +TransparentDraggableResult::~TransparentDraggableResult() +{ + if(mPlot) { +// mPlot->removeItem(mRect); +// mPlot->removeItem(mLeftHandle); +// mPlot->removeItem(mRightHandle); + } +} + +void TransparentDraggableResult::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 TransparentDraggableResult::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 TransparentDraggableResult::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 TransparentDraggableResult::setMinWidth(double minWidth) +{ + mMinWidth = minWidth; +} + +//设置标题 +void TransparentDraggableResult::setTitle(QString strTitle) +{ + mstrTitle = strTitle; + mItemTitle->setText(mstrTitle); + mPlot->replot(); +} + +//设置解释结论 +void TransparentDraggableResult::setResult(QString filePath) +{ + m_Result = filePath; +} + +void TransparentDraggableResult::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)); // 设置图片 + + +// QSvgRenderer* svgRender = new QSvgRenderer(); +// svgRender->load(result); +// // +// QPixmap* pixmap = new QPixmap(10, 10); +// pixmap->fill(Qt::transparent);//设置背景透明 +// QPainter p(pixmap); +// svgRender->render(&p); +// // +// mPixmap->setPixmap(*pixmap); // 设置图片 + } + else + { + mPixmap->setPixmap(QPixmap(filePath)); // 设置图片 + } + + + mPlot->replot(); +} + +// 设置矩形范围 +void TransparentDraggableResult::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-mPlot->yAxis->range().lower)/4; + mRect->topLeft->setCoords(left_Low, lY1); + mRect->bottomRight->setCoords(right_Hight, lY2); + + //位置与rect不一样,否则图像反转 +// double dbCenterX = (right_Hight+left_Low)/2.0; //right_Hight; // +// double dbCenterY = (lY1+lY2)/2.0; //lY2; // +// double x1 = mPlot->xAxis->coordToPixel(dbCenterX); +// double y1 = mPlot->yAxis->coordToPixel(dbCenterY); +// mPixmap->topLeft->setCoords(mPlot->xAxis->pixelToCoord(x1), mPlot->yAxis->pixelToCoord(y1)); +// mPixmap->topLeft->setCoords(right_Hight, lY2); +// mPixmap->bottomRight->setCoords(left_Low, lY1); + mPixmap->topLeft->setCoords(right_Hight, lY1); + mPixmap->bottomRight->setCoords(left_Low, lY2); + drawResult(left_Low, right_Hight, lY1, lY2); + +// mPixmap->topLeft->setCoords(right_Hight, lY1); +// mPixmap->bottomRight->setCoords(left_Low, lY1); + + //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); // 设置文本在矩形中心位置 + + mItemTitle->position->setCoords((mRect->topLeft->coords().x() + mRect->bottomRight->coords().x())/2, + lY2 + lY2/2); + + //mRect->topLeft->setCoords(left, mPlot->yAxis->range().upper); + //mRect->bottomRight->setCoords(right, mPlot->yAxis->range().lower); + + updateHandles(); + //后面统一刷新上方和下方rect + //mPlot->replot(); +} + +// 获取当前范围 +QCPRange TransparentDraggableResult::getRange() +{ + return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); +} + +// 设置矩形颜色 +void TransparentDraggableResult::setColor(const QColor &color) { + mRect->setBrush(QBrush(color)); + mRect->setPen(QPen(color.darker())); + mPlot->replot(); +} + +// 删除框图 +void TransparentDraggableResult::deleteRect() +{ + if(mPlot) { + +// mRect->deleteLater(); +// mLeftHandle->deleteLater(); +// mRightHandle->deleteLater(); +// mPixmap->deleteLater(); + + mPlot->m_mapDraggable_Result.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 TransparentDraggableResult::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, &TransparentDraggableResult::onMousePress); + connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableResult::onMouseMove); + connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableResult::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 TransparentDraggableResult::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); // 矩形大小 + +// if(m_upDraggableResult) +// { +// // 右边界矩形控制点 +// m_upDraggableResult->mLeftHandle->topLeft->setParentAnchor(mRect->bottomLeft); +// m_upDraggableResult->mLeftHandle->bottomRight->setParentAnchor(mRect->bottomRight); +// m_upDraggableResult->mLeftHandle->topLeft->setCoords(-5, 5); // 矩形大小 +// m_upDraggableResult->mLeftHandle->bottomRight->setCoords(5, -5); // 矩形大小 + +// // 右边界矩形控制点 +// //mRect->topLeft->setParentAnchor(m_upDraggableResult->mRect->bottomLeft); +// //m_upDraggableResult->mRect->topRight->setParentAnchor(mRect->bottomRight); + +// // mRect->topLeft->setParentAnchor(m_upDraggableResult->mRect->bottomLeft); +// // mRect->bottomRight->setParentAnchor(m_upDraggableResult->mRect->bottomRight); +// } +} + + +void TransparentDraggableResult::onDelRect() +{ + //mDragMode = DragNone; + //删除框图 + deleteRect(); +} + +void TransparentDraggableResult::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(x >= currentRange.lower && x <= currentRange.upper) { +// 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, &TransparentDraggableResult::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; + + //上方rect同步动 + if(m_upDraggableResult) + { + if(mDragMode==DragRight || mDragMode==DragRect) + { + m_upDraggableResult->mDragMode = DragLeft; + m_upDraggableResult->mDragStartY = y; + m_upDraggableResult->mDragStartRange = m_upDraggableResult->getRange(); + } + } + + //下方rect同步动 + if(m_downDraggableResult) + { + if(mDragMode==DragLeft || mDragMode==DragRect) + { + m_downDraggableResult->mDragMode = DragRight; + m_downDraggableResult->mDragStartY = y; + m_downDraggableResult->mDragStartRange = m_downDraggableResult->getRange(); + } + } +} + +void TransparentDraggableResult::onMouseMove_in(QMouseEvent *event) +{ + //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 TransparentDraggableResult::onMouseMove_in_DragLeft(QMouseEvent *event) +{ + double y = mPlot->xAxis->pixelToCoord(event->pos().y()); + double dy = y - mDragStartY; + + QCPRange newRange = mDragStartRange; + double proposedLeft = mDragStartRange.lower + dy; + // 确保不超出轴范围且不使宽度小于最小值 + newRange.lower = qBound( + getMyLower(), + proposedLeft, + mDragStartRange.upper - mMinWidth); + + + // 最终确保宽度不小于最小值(针对整体拖动的情况) + if(newRange.size() < mMinWidth) { + newRange.lower = newRange.upper - mMinWidth; + } + + setRange(newRange.lower, newRange.upper); +} + + +void TransparentDraggableResult::onMouseMove_in_DragRight(QMouseEvent *event) +{ + double y = mPlot->xAxis->pixelToCoord(event->pos().y()); + double dy = y - mDragStartY; + + QCPRange newRange = mDragStartRange; + double proposedRight = mDragStartRange.upper + dy; + // 确保不超出轴范围且不使宽度小于最小值 + newRange.upper = qBound( + mDragStartRange.lower + mMinWidth, + proposedRight, + getMyUpper()); + + // 最终确保宽度不小于最小值(针对整体拖动的情况) + if(newRange.size() < mMinWidth) { + newRange.upper = newRange.lower + mMinWidth; + } + setRange(newRange.lower, newRange.upper); +} + +void TransparentDraggableResult::onMouseMove(QMouseEvent *event) +{ + if(mDragMode == DragNone) return; + + event->accept(); + + onMouseMove_in(event); + + //上方rect同步动 + if(m_upDraggableResult) + { + if(mDragMode==DragRight || mDragMode==DragRect) + { + //m_upDraggableResult->mDragMode = DragLeft; + m_upDraggableResult->onMouseMove_in_DragLeft(event); + } + } + + //下方rect同步动 + if(m_downDraggableResult) + { + if(mDragMode==DragLeft || mDragMode==DragRect) + { + //m_downDraggableResult->mDragMode = DragRight; + m_downDraggableResult->onMouseMove_in_DragRight(event); + } + } + + //后面统一刷新上方和下方rect + mPlot->replot(); +} + +void TransparentDraggableResult::onMouseRelease_in(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; + } +} + +void TransparentDraggableResult::onMouseRelease(QMouseEvent *event) +{ + + if(event->button() == Qt::LeftButton && mDragMode != DragNone) { + //上方rect同步动 + if(m_upDraggableResult) + { + if(mDragMode==DragRight || mDragMode==DragRect) + { + m_upDraggableResult->onMouseRelease_in(event); + } + } + + //下方rect同步动 + if(m_downDraggableResult) + { + if(mDragMode==DragLeft || mDragMode==DragRect) + { + m_downDraggableResult->onMouseRelease_in(event); + } + } + } + + onMouseRelease_in(event); +} + +double TransparentDraggableResult::getMyLower() +{ + double dLower = mPlot->xAxis->range().lower; + double proposedLeft = mDragStartRange.lower; + + TransparentDraggableResult *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_Result.begin(); + while( it != mPlot->m_mapDraggable_Result.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableResult*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) + { + dLower = tmpRange.upper; + } + it++; + } + } + + return dLower; +} + +double TransparentDraggableResult::getMyUpper() +{ + double dUpper = mPlot->xAxis->range().upper; + double proposedRight = mDragStartRange.upper; + + TransparentDraggableResult *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_Result.begin(); + while( it != mPlot->m_mapDraggable_Result.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableResult*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) + { + dUpper = tmpRange.lower; + } + it++; + } + } + + return dUpper; +} + diff --git a/logPlus/TransparentDraggableResult.h b/logPlus/TransparentDraggableResult.h index a62d93c..4b965e4 100644 --- a/logPlus/TransparentDraggableResult.h +++ b/logPlus/TransparentDraggableResult.h @@ -14,705 +14,57 @@ class TransparentDraggableResult : public QObject { Q_OBJECT public: - explicit TransparentDraggableResult(QMyCustomPlot *parentPlot, TransparentDraggableResult *upDraggableResult=nullptr, QString strUuid="", double minWidth = 1.0, QString strTitle = "") - : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) - { - m_upDraggableResult = upDraggableResult; - m_strUuid = strUuid; - // - initRect(); - - //将自己,设置为上方rect的下方 - if(m_upDraggableResult) - { - m_upDraggableResult->m_downDraggableResult = this; - } - } + explicit TransparentDraggableResult(QMyCustomPlot *parentPlot, TransparentDraggableResult *upDraggableResult=nullptr, QString strUuid="", double minWidth = 1.0, QString strTitle = ""); - ~TransparentDraggableResult() { - if(mPlot) { -// mPlot->removeItem(mRect); -// mPlot->removeItem(mLeftHandle); -// mPlot->removeItem(mRightHandle); - } - } + ~TransparentDraggableResult(); - void 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 DrawSVGNormal(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); //拉伸 - void 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 DrawSVGSteched(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); //平铺 - void 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 DrawSVGTiled(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); //设置最小宽度 - void setMinWidth(double minWidth){ - mMinWidth = minWidth; - } - + void setMinWidth(double minWidth); //设置标题 - void setTitle(QString strTitle){ - mstrTitle = strTitle; - mItemTitle->setText(mstrTitle); - mPlot->replot(); - } + void setTitle(QString strTitle); //设置解释结论 - void setResult(QString filePath) - { - m_Result = filePath; - } - - void 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)); // 设置图片 - - -// QSvgRenderer* svgRender = new QSvgRenderer(); -// svgRender->load(result); -// // -// QPixmap* pixmap = new QPixmap(10, 10); -// pixmap->fill(Qt::transparent);//设置背景透明 -// QPainter p(pixmap); -// svgRender->render(&p); -// // -// mPixmap->setPixmap(*pixmap); // 设置图片 - } - else - { - mPixmap->setPixmap(QPixmap(filePath)); // 设置图片 - } - - - mPlot->replot(); - } + void setResult(QString filePath); + void drawResult(double left_Low, double right_Hight, double lY1, double lY2); // 设置矩形范围 - void 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-mPlot->yAxis->range().lower)/4; - mRect->topLeft->setCoords(left_Low, lY1); - mRect->bottomRight->setCoords(right_Hight, lY2); - - //位置与rect不一样,否则图像反转 -// double dbCenterX = (right_Hight+left_Low)/2.0; //right_Hight; // -// double dbCenterY = (lY1+lY2)/2.0; //lY2; // -// double x1 = mPlot->xAxis->coordToPixel(dbCenterX); -// double y1 = mPlot->yAxis->coordToPixel(dbCenterY); -// mPixmap->topLeft->setCoords(mPlot->xAxis->pixelToCoord(x1), mPlot->yAxis->pixelToCoord(y1)); -// mPixmap->topLeft->setCoords(right_Hight, lY2); -// mPixmap->bottomRight->setCoords(left_Low, lY1); - mPixmap->topLeft->setCoords(right_Hight, lY1); - mPixmap->bottomRight->setCoords(left_Low, lY2); - drawResult(left_Low, right_Hight, lY1, lY2); - -// mPixmap->topLeft->setCoords(right_Hight, lY1); -// mPixmap->bottomRight->setCoords(left_Low, lY1); - - //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); // 设置文本在矩形中心位置 - - mItemTitle->position->setCoords((mRect->topLeft->coords().x() + mRect->bottomRight->coords().x())/2, - lY2 + lY2/2); - - //mRect->topLeft->setCoords(left, mPlot->yAxis->range().upper); - //mRect->bottomRight->setCoords(right, mPlot->yAxis->range().lower); - - updateHandles(); - //后面统一刷新上方和下方rect - //mPlot->replot(); - } - + void setRange(double left_Low, double right_Hight); // 获取当前范围 - QCPRange getRange() const { - return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); - } + QCPRange getRange(); // 设置矩形颜色 - void setColor(const QColor &color) { - mRect->setBrush(QBrush(color)); - mRect->setPen(QPen(color.darker())); - mPlot->replot(); - } + void setColor(const QColor &color); // 删除框图 - void deleteRect() { - if(mPlot) { - -// mRect->deleteLater(); -// mLeftHandle->deleteLater(); -// mRightHandle->deleteLater(); -// mPixmap->deleteLater(); - - mPlot->m_mapDraggable_Result.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 deleteRect(); signals: void rangeChanged(QCPRange newRange); private: - void 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, &TransparentDraggableResult::onMousePress); - connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableResult::onMouseMove); - connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableResult::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 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); // 矩形大小 - -// if(m_upDraggableResult) -// { -// // 右边界矩形控制点 -// m_upDraggableResult->mLeftHandle->topLeft->setParentAnchor(mRect->bottomLeft); -// m_upDraggableResult->mLeftHandle->bottomRight->setParentAnchor(mRect->bottomRight); -// m_upDraggableResult->mLeftHandle->topLeft->setCoords(-5, 5); // 矩形大小 -// m_upDraggableResult->mLeftHandle->bottomRight->setCoords(5, -5); // 矩形大小 - -// // 右边界矩形控制点 -// //mRect->topLeft->setParentAnchor(m_upDraggableResult->mRect->bottomLeft); -// //m_upDraggableResult->mRect->topRight->setParentAnchor(mRect->bottomRight); - -// // mRect->topLeft->setParentAnchor(m_upDraggableResult->mRect->bottomLeft); -// // mRect->bottomRight->setParentAnchor(m_upDraggableResult->mRect->bottomRight); -// } - } + void initRect(); + void updateHandles() ; private slots: - void onDelRect() - { - //mDragMode = DragNone; - //删除框图 - deleteRect(); - } - - // 事件过滤器处理函数 -// bool eventFilter(QObject* object, QEvent* event) { -// if (event->type() == QEvent::MouseButtonPress) { -// // 拦截操作 -// return true; // 阻止事件传递 - -//// if (object == action) { -//// // 验证权限 -//// if (1) { -//// // 允许操作 -//// action->trigger(); -//// } else { -//// // 拦截操作 -//// return true; // 阻止事件传递 -//// } -//// } -// } -// return false; // 默认不拦截其他事件 -// } - - void 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(x >= currentRange.lower && x <= currentRange.upper) { -// 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, &TransparentDraggableResult::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; - - //上方rect同步动 - if(m_upDraggableResult) - { - if(mDragMode==DragRight || mDragMode==DragRect) - { - m_upDraggableResult->mDragMode = DragLeft; - m_upDraggableResult->mDragStartY = y; - m_upDraggableResult->mDragStartRange = m_upDraggableResult->getRange(); - } - } - - //下方rect同步动 - if(m_downDraggableResult) - { - if(mDragMode==DragLeft || mDragMode==DragRect) - { - m_downDraggableResult->mDragMode = DragRight; - m_downDraggableResult->mDragStartY = y; - m_downDraggableResult->mDragStartRange = m_downDraggableResult->getRange(); - } - } - } - - void onMouseMove_in(QMouseEvent *event) { - //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 onMouseMove_in_DragLeft(QMouseEvent *event) { - double y = mPlot->xAxis->pixelToCoord(event->pos().y()); - double dy = y - mDragStartY; - - QCPRange newRange = mDragStartRange; - double proposedLeft = mDragStartRange.lower + dy; - // 确保不超出轴范围且不使宽度小于最小值 - newRange.lower = qBound( - getMyLower(), - proposedLeft, - mDragStartRange.upper - mMinWidth); - - - // 最终确保宽度不小于最小值(针对整体拖动的情况) - if(newRange.size() < mMinWidth) { - newRange.lower = newRange.upper - mMinWidth; - } - - setRange(newRange.lower, newRange.upper); - } - - - void onMouseMove_in_DragRight(QMouseEvent *event) { - double y = mPlot->xAxis->pixelToCoord(event->pos().y()); - double dy = y - mDragStartY; - - QCPRange newRange = mDragStartRange; - double proposedRight = mDragStartRange.upper + dy; - // 确保不超出轴范围且不使宽度小于最小值 - newRange.upper = qBound( - mDragStartRange.lower + mMinWidth, - proposedRight, - getMyUpper()); - - // 最终确保宽度不小于最小值(针对整体拖动的情况) - if(newRange.size() < mMinWidth) { - newRange.upper = newRange.lower + mMinWidth; - } - setRange(newRange.lower, newRange.upper); - } - - void onMouseMove(QMouseEvent *event) { - if(mDragMode == DragNone) return; - - event->accept(); - - onMouseMove_in(event); - - //上方rect同步动 - if(m_upDraggableResult) - { - if(mDragMode==DragRight || mDragMode==DragRect) - { - //m_upDraggableResult->mDragMode = DragLeft; - m_upDraggableResult->onMouseMove_in_DragLeft(event); - } - } - - //下方rect同步动 - if(m_downDraggableResult) - { - if(mDragMode==DragLeft || mDragMode==DragRect) - { - //m_downDraggableResult->mDragMode = DragRight; - m_downDraggableResult->onMouseMove_in_DragRight(event); - } - } - - //后面统一刷新上方和下方rect - mPlot->replot(); - } - - void onMouseRelease_in(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; - } - } - - void onMouseRelease(QMouseEvent *event) { - - if(event->button() == Qt::LeftButton && mDragMode != DragNone) { - //上方rect同步动 - if(m_upDraggableResult) - { - if(mDragMode==DragRight || mDragMode==DragRect) - { - m_upDraggableResult->onMouseRelease_in(event); - } - } - - //下方rect同步动 - if(m_downDraggableResult) - { - if(mDragMode==DragLeft || mDragMode==DragRect) - { - m_downDraggableResult->onMouseRelease_in(event); - } - } - } - - onMouseRelease_in(event); - } - - double getMyLower() - { - double dLower = mPlot->xAxis->range().lower; - double proposedLeft = mDragStartRange.lower; - - TransparentDraggableResult *pDraggableRect =NULL; - { - QMap::Iterator it = mPlot->m_mapDraggable_Result.begin(); - while( it != mPlot->m_mapDraggable_Result.end() ) - { - if(it.key() == m_strUuid) - { - it++; - continue; - } - pDraggableRect = (TransparentDraggableResult*)it.value(); - // - QCPRange tmpRange = pDraggableRect->getRange(); - if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) - { - dLower = tmpRange.upper; - } - it++; - } - } - - return dLower; - } - - double getMyUpper() - { - double dUpper = mPlot->xAxis->range().upper; - double proposedRight = mDragStartRange.upper; - - TransparentDraggableResult *pDraggableRect =NULL; - { - QMap::Iterator it = mPlot->m_mapDraggable_Result.begin(); - while( it != mPlot->m_mapDraggable_Result.end() ) - { - if(it.key() == m_strUuid) - { - it++; - continue; - } - pDraggableRect = (TransparentDraggableResult*)it.value(); - // - QCPRange tmpRange = pDraggableRect->getRange(); - if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) - { - dUpper = tmpRange.lower; - } - it++; - } - } - - return dUpper; - } + void onDelRect(); + void onMousePress(QMouseEvent *event); + void onMouseMove(QMouseEvent *event); + void onMouseRelease(QMouseEvent *event); + // + void onMouseMove_in(QMouseEvent *event); + void onMouseMove_in_DragLeft(QMouseEvent *event); + void onMouseMove_in_DragRight(QMouseEvent *event); + void onMouseRelease_in(QMouseEvent *event); + double getMyLower(); + double getMyUpper(); + private: QMyCustomPlot *mPlot; QCPItemRect *mRect; diff --git a/logPlus/TransparentDraggableSwallCore.cpp b/logPlus/TransparentDraggableSwallCore.cpp new file mode 100644 index 0000000..0ccaea4 --- /dev/null +++ b/logPlus/TransparentDraggableSwallCore.cpp @@ -0,0 +1,729 @@ +#include "TransparentDraggableSwallCore.h" + +extern double g_dPixelPerCm;//每厘米像素数 +//static GeoIndicatorGenerator m_drawGeo; + +TransparentDraggableSwallCore::TransparentDraggableSwallCore(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QString strTitle) + : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) +{ + m_strUuid = strUuid; + // + initRect(); +} + +TransparentDraggableSwallCore::~TransparentDraggableSwallCore() +{ + if(mPlot) { +// mPlot->removeItem(mRect); +// mPlot->removeItem(mLeftHandle); +// mPlot->removeItem(mRightHandle); + } +} + +void TransparentDraggableSwallCore::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 TransparentDraggableSwallCore::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 TransparentDraggableSwallCore::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 TransparentDraggableSwallCore::setMinWidth(double minWidth) +{ + mMinWidth = minWidth; +} + +//设置标题 +void TransparentDraggableSwallCore::setTitle(QString strTitle) +{ + mstrTitle = strTitle; + mItemTitle->setText(mstrTitle); + mPlot->replot(); +} + +//设置解释结论 +void TransparentDraggableSwallCore::setLith(QString filePath) +{ + m_Lith = filePath; +} + +void TransparentDraggableSwallCore::drawLith(double left_Low, double right_Hight, double lY1, double lY2) +{ + if(m_Lith=="") + { + return; + } + + double x1 = mPlot->xAxis->coordToPixel(left_Low); + double x2 = mPlot->xAxis->coordToPixel((left_Low+right_Hight)/2); + double y1 = mPlot->yAxis->coordToPixel(lY1); + double y2 = mPlot->yAxis->coordToPixel(lY1+(lY2-lY1)/5); + + bool bWidthBig = false; + double newWidth = y2-y1; + double newHeight = x1-x2; +// if(newWidth>newHeight) +// { +// //取小,画正方形框 +// newWidth = newHeight; +// bWidthBig = true; +// } + + // + QString filePath = m_Lith; + QString strLast = filePath.right(4); + if(strLast.toLower()==".svg") + { + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(newWidth, newHeight, QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0,newWidth, newHeight); + painter.fillRect(fillRect,Qt::white); + // + //painter.setBrush(QBrush(QPixmap(colorPath))); +// //颜色 +// QString strLastColor = m_Color.right(4); +// if(strLastColor.toLower()==".svg") +// { +// //拉伸 +// DrawSVGSteched(&painter,m_Color,fillRect,0); +// } + +// bool isStrech=false; +// QSvgRenderer m_SvgRenderer; +// m_SvgRenderer.load(filePath); +// if(!isStrech){ +// float oil_h = fillRect.width(); +// oil_h = (oil_h / 2 >= fillRect.height() / 2) ? fillRect.height() : oil_h; +// float rect_y = fillRect.y() + fillRect.height() / 2 - oil_h / 2; +// fillRect.setY(rect_y); +// fillRect.setHeight(oil_h); +// } +// fillRect.setX(fillRect.x() + 1); +// m_SvgRenderer.render(&painter, fillRect); + + //拉伸 + 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_Lith->setPixmap(QPixmap(val)); // 设置图片 + + +// QSvgRenderer* svgRender = new QSvgRenderer(); +// svgRender->load(result); +// // +// QPixmap* pixmap = new QPixmap(10, 10); +// pixmap->fill(Qt::transparent);//设置背景透明 +// QPainter p(pixmap); +// svgRender->render(&p); +// // +// mPixmap->setPixmap(*pixmap); // 设置图片 + } + else + { +// QString val=filePath; +// QImage image(47,16,QImage::Format_RGB32); +// QPainter painter(&image); +// QRectF fillRect(0,0,47,16); +// painter.fillRect(fillRect, QColor(0, 0, 0, 0)); +// // +// painter.setBrush(QBrush(QPixmap(colorPath))); + +// QPixmap* pixmap = new QPixmap(filePath); +// pixmap->fill(Qt::transparent);//设置背景透明 +// mPixmap_Lith->setPixmap(*pixmap); // 设置图片 + + //mPixmap_Lith->setPixmap(QPixmap(filePath)); // 设置图片 + + + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(newWidth, newHeight, QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0,newWidth, newHeight); + painter.fillRect(fillRect,Qt::white); +// //颜色 +// QString strLastColor = m_Color.right(4); +// if(strLastColor.toLower()==".svg") +// { +// //拉伸 +// DrawSVGSteched(&painter,m_Color,fillRect,0); +// } + // + bool isOne=true; + bool isStech=true; + bool isHorizon=false; + float cm = g_dPixelPerCm;//一厘米对应的像素个数 + QColor bkColor = QColor(255,255,255,0); + + float GeoResult = m_drawGeo.seleGeo("岩性符号库", basename, &painter, fillRect, isOne, isStech, isHorizon, cm, bkColor); + + val=GetImagePath()+"TempNew"; + QDir ss; + if(!ss.exists(val)) { + ss.mkdir(val); + } + val+=QDir::separator(); + val+=basename+".png"; + image.save(val); + + // + mPixmap_Lith->setPixmap(QPixmap(val)); // 设置图片 + } + mPixmap_Lith->topLeft->setCoords(mPlot->xAxis->pixelToCoord(x2+1), mPlot->yAxis->pixelToCoord(y1+1));//right_Hight + mPixmap_Lith->bottomRight->setCoords(mPlot->xAxis->pixelToCoord(x1-1), mPlot->yAxis->pixelToCoord(y2-1));//left_Low + +// mPixmap_Lith->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); +// mPixmap_Lith->bottomRight->setCoords(left_Low, lY2); + + //mPlot->replot(); +} + +//设置m_Oil +void TransparentDraggableSwallCore::setOil(QString filePath) +{ + m_Oil = filePath; +} + +void TransparentDraggableSwallCore::drawOil(double left_Low, double right_Hight, double lY1, double lY2) +{ + if(m_Oil=="") + { + return; + } + + double x1 = mPlot->xAxis->coordToPixel((left_Low+right_Hight)/2); + double x2 = mPlot->xAxis->coordToPixel(right_Hight); + double y1 = mPlot->yAxis->coordToPixel(lY1); + double y2 = mPlot->yAxis->coordToPixel(lY1+(lY2-lY1)/5); + + bool bWidthBig = false; + double newWidth = y2-y1; + double newHeight = x1-x2; + if(newWidth>newHeight) + { + //取小,画正方形框 + newWidth = newHeight; + bWidthBig = true; + } + + float rect_xRight = x2 + newHeight/ 2 - newWidth/ 2; + double xNewRight = mPlot->xAxis->pixelToCoord(rect_xRight+1); + // + float rect_xLeft = rect_xRight + newWidth; + double xNewLeft = mPlot->xAxis->pixelToCoord(rect_xLeft-1); + + // + QString filePath = m_Oil; + // + QString strLast = filePath.right(4); + if(strLast.toLower()==".svg") + { + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(newWidth, newWidth,QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0, newWidth, newWidth); + 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_Oil->setPixmap(QPixmap(val)); // 设置图片 + } + else + { + mPixmap_Oil->setPixmap(QPixmap(filePath)); // 设置图片 + } + + mPixmap_Oil->topLeft->setCoords(xNewRight, mPlot->yAxis->pixelToCoord(y1+1)); //right_Hight, lY1 + mPixmap_Oil->bottomRight->setCoords(xNewLeft, mPlot->yAxis->pixelToCoord(y2-1)); //left_Low + + //mPlot->replot(); +} + + +// 设置矩形范围 +void TransparentDraggableSwallCore::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); + mRect->bottomRight->setCoords(right_Hight, lY1+(lY2-lY1)/3); + + //位置与rect不一样,否则图像反转 + mPixmap_Color->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); + mPixmap_Color->bottomRight->setCoords(left_Low, lY2); + // + //mPixmap_Lith->topLeft->setCoords(right_Hight, lY1+(lY2-lY1)/4); + //mPixmap_Lith->bottomRight->setCoords(left_Low, lY2); + drawLith(left_Low, right_Hight, lY1, lY2); + + //位置与rect不一样,否则图像反转 + //mPixmap_Oil->topLeft->setCoords(right_Hight, lY1); + //mPixmap_Oil->bottomRight->setCoords(left_Low, lY1+(lY2-lY1)/4); + drawOil(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 TransparentDraggableSwallCore::getRange() +{ + return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); +} + +// 设置矩形颜色 +void TransparentDraggableSwallCore::setColor(const QColor &color) +{ + mRect->setBrush(QBrush(color)); + mRect->setPen(QPen(color.darker())); + mPlot->replot(); +} + +// 删除框图 +void TransparentDraggableSwallCore::deleteRect() +{ + if(mPlot) { + +// mRect->deleteLater(); +// mLeftHandle->deleteLater(); +// mRightHandle->deleteLater(); +// mPixmap->deleteLater(); + + mPlot->m_mapDraggable_SwallCore.remove(m_strUuid); + + mPlot->removeItem(mRect); +// mPlot->removeItem(mLeftHandle); +// mPlot->removeItem(mRightHandle); + mPlot->removeItem(mPixmap_Lith); + mPlot->removeItem(mPixmap_Oil); + mPlot->removeItem(mPixmap_Color); + mPlot->removeItem(mItemTitle); + + mPlot->replot(); + this->deleteLater(); + + // +// //避免二次绘制框图 +// mPlot->m_bDrawRect = false; +// mDragMode = DragNone; +// //取消选中框 +// mPlot->selectionRect()->cancel(); +// mPlot->replot(); +// mPlot->selectionRect()->mActive=true; + } +} + + +void TransparentDraggableSwallCore::initRect() +{ + // 创建透明矩形 + mRect = new QCPItemRect(mPlot); + mRect->setLayer("overlay"); // 确保在最上层 + mRect->setBrush(QBrush(QColor(255, 255, 255, 50))); // 半透明蓝色100, 100, 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, &TransparentDraggableSwallCore::onMousePress); + connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableSwallCore::onMouseMove); + connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableSwallCore::onMouseRelease); + + mPixmap_Lith = new QCPItemPixmap(mPlot); + //mPixmap->setPixmap(QPixmap(":/image/file.png")); // 设置图片 + mPixmap_Lith->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio + mPixmap_Lith->setLayer("overlay"); // 确保在最上层 + + mPixmap_Oil = new QCPItemPixmap(mPlot); + //mPixmap_Oil->setPixmap(QPixmap(":/image/file.png")); // 设置图片 + mPixmap_Oil->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio + mPixmap_Oil->setLayer("overlay"); // 确保在最上层 + + mPixmap_Color = new QCPItemPixmap(mPlot); + //mPixmap_Color->setPixmap(QPixmap(":/image/file.png")); // 设置图片 + mPixmap_Color->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 KeepAspectRatio + mPixmap_Color->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 TransparentDraggableSwallCore::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 TransparentDraggableSwallCore::onDelRect() +{ + //mDragMode = DragNone; + //删除框图 + deleteRect(); +} + +void TransparentDraggableSwallCore::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(x >= currentRange.lower && x <= currentRange.upper) { +// 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, &TransparentDraggableResult::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 TransparentDraggableSwallCore::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 TransparentDraggableSwallCore::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 TransparentDraggableSwallCore::getMyLower() +{ + double dLower = mPlot->xAxis->range().lower; + double proposedLeft = mDragStartRange.lower; + + TransparentDraggableSwallCore *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_SwallCore.begin(); + while( it != mPlot->m_mapDraggable_SwallCore.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableSwallCore*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) + { + dLower = tmpRange.upper; + } + it++; + } + } + + return dLower; +} + +double TransparentDraggableSwallCore::getMyUpper() +{ + double dUpper = mPlot->xAxis->range().upper; + double proposedRight = mDragStartRange.upper; + + TransparentDraggableSwallCore *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_SwallCore.begin(); + while( it != mPlot->m_mapDraggable_SwallCore.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableSwallCore*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) + { + dUpper = tmpRange.lower; + } + it++; + } + } + + return dUpper; +} diff --git a/logPlus/TransparentDraggableSwallCore.h b/logPlus/TransparentDraggableSwallCore.h new file mode 100644 index 0000000..2f93fa5 --- /dev/null +++ b/logPlus/TransparentDraggableSwallCore.h @@ -0,0 +1,97 @@ +#ifndef TRANSPARENTDRAGGABLESWALLCORE_H +#define TRANSPARENTDRAGGABLESWALLCORE_H + +#include +#include "qmycustomplot.h" +#include +#include +#include "geometryutils.h" +#include +#include "GeoIndicatorGenerator.h" + +#pragma execution_character_set("utf-8") // 强制指定执行字符集为 UTF-8 + + +class TransparentDraggableSwallCore : public QObject +{ + Q_OBJECT +public: + explicit TransparentDraggableSwallCore(QMyCustomPlot *parentPlot, QString strUuid="", double minWidth = 1.0, QString strTitle = ""); + + ~TransparentDraggableSwallCore(); + + void DrawSVGNormal(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); + //拉伸 + void DrawSVGSteched(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); + //平铺 + void DrawSVGTiled(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout); + //设置最小宽度 + void setMinWidth(double minWidth); + //设置标题 + void setTitle(QString strTitle); + + //设置解释结论 + void setLith(QString filePath); + void drawLith(double left_Low, double right_Hight, double lY1, double lY2); + + //设置m_Oil + void setOil(QString filePath); + void drawOil(double left_Low, double right_Hight, double lY1, double lY2); + + // 设置矩形范围 + void setRange(double left_Low, double right_Hight); + // 获取当前范围 + QCPRange getRange(); + + // 设置矩形颜色 + void setColor(const QColor &color); + + // 删除框图 + void deleteRect(); + +signals: + void rangeChanged(QCPRange newRange); + +private: + void initRect(); + void updateHandles() ; + +private slots: + void onDelRect(); + void onMousePress(QMouseEvent *event); + void onMouseMove(QMouseEvent *event); + void onMouseRelease(QMouseEvent *event); + double getMyLower(); + double getMyUpper(); + +private: + QMyCustomPlot *mPlot; + QCPItemRect *mRect; +// QCPItemRect *mLeftHandle; +// QCPItemRect *mRightHandle; + + QCPItemPixmap *mPixmap_Lith; + QCPItemPixmap *mPixmap_Oil; + QCPItemPixmap *mPixmap_Color; + QCPItemText *mItemTitle; + QString mstrTitle=""; + QString m_strUuid = ""; + + QString m_Lith; + QString m_Oil; + //QString m_Color; + int m_ind; + + GeoIndicatorGenerator m_drawGeo; + + enum DragMode { DragNone, DragLeft, DragRight, DragRect }; + DragMode mDragMode = DragNone; + //double mDragStartX = 0; + double mDragStartY = 0; + QCPRange mDragStartRange; + + // 添加最小宽度成员变量 + double mMinWidth; +}; + +#endif // TRANSPARENTDRAGGABLESWALLCORE_H diff --git a/logPlus/formdraw.cpp b/logPlus/formdraw.cpp index e06a5aa..93a4b48 100644 --- a/logPlus/formdraw.cpp +++ b/logPlus/formdraw.cpp @@ -283,7 +283,8 @@ void FormDraw::s_addWave(QString strUuid, QString strSlfName, QString strWellNam void FormDraw::s_addTableLine(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) { - if(strLineName == "FRAC_HOLE.TABLE" || strLineName == "WORDS_RELUST" || strLineName == "RESULT"|| strLineName == "GEO_LITH") + if(strLineName == "FRAC_HOLE.TABLE" || strLineName == "WORDS_RELUST" || strLineName == "RESULT" + || strLineName == "GEO_LITH" || strLineName == "SWALL_CORE") { } @@ -366,6 +367,11 @@ void FormDraw::s_addTableLine(QString strUuid, QString strSlfName, QString strWe //录井剖面 initGeoLith(curv, strSlfName, strLineName); } + else if(strLineName == "SWALL_CORE") + { + //井壁取心 + initSwallCore(curv, strSlfName, strLineName); + } connect(curv, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(s_mouseWheel(QWheelEvent*))); @@ -1926,157 +1932,6 @@ void FormDraw::initResult(QMyCustomPlot *widget, QString strSlfName, QString str } -//录井剖面 -void FormDraw::initGeoLith(QMyCustomPlot *widget, QString strSlfName, QString strLineName) -{ - - int iMyWidth = widget->axisRect(0)->width(); - float vmax = iMyWidth; - float vmin = 0; - widget->m_iX1 = vmin; - widget->m_iX2 = iMyWidth; - widget->m_iY1 = g_iY1; - widget->m_iY2 = g_iY2; - // - widget->xAxis->setRange(vmin, vmax); - widget->yAxis->setRange(g_iY1, g_iY2); - widget->axisRect()->setupFullAxesBox(); - // - widget->xAxis->ticker()->setTickCount(10);//x个主刻度 - widget->yAxis->ticker()->setTickCount(60);//y个主刻度 - - //对调XY轴,在最前面设置 - QCPAxis *yAxis = widget->yAxis; - QCPAxis *xAxis = widget->xAxis; - widget->xAxis = yAxis; - widget->yAxis = xAxis; - - - m_LeftVal = 0; - m_RightVal = 90; - //隐藏刻度 - widget->xAxis->setTicks(false); - widget->yAxis->setTicks(false); - widget->xAxis2->setTicks(false); - widget->yAxis2->setTicks(false); - // - LoadFromSLF_GeoLith(widget, strSlfName, strLineName); - - QString strAliasName = ""; - QString strUnit = ""; - QColor newlineColor=QColor(0,0,0); - double width=2; - QString strScaleType = ""; - //道-对象 - m_formTrack->Add(strSlfName, m_strWellName, m_strTrackName, strLineName, strAliasName, strUnit, newlineColor, width, m_RightVal, m_LeftVal, strScaleType, "tableObject"); - -} - -bool FormDraw::LoadFromSLF_GeoLith(QMyCustomPlot *widget, QString strSlfName, QString strLineName) -{ - CMemRdWt *logio=new CMemRdWt(); - if(!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead)) - { - delete logio; - return false; - } - int iIndex=logio->OpenTable(strLineName.toStdString().c_str()); - if(iIndex>-1) { - int len=logio->GetTableRecordLength(iIndex); - int sl=sizeof(GeoLith_DATA); - if(sl>len) len=sl; - GeoLith_DATA *m_Result; - m_Result=(GeoLith_DATA *)new char[len+1]; - int count=logio->GetTableRecordCount(iIndex); - for(int i=0;iReadTable(iIndex,i+1,m_Result); - // - QMap OilOrder; - QMap LithOrder; - QMap ColorOrder; - QMap ColorInds; - // - LithOrder=GetZoneOrder(QString("GeoLith")); - OilOrder=GetZoneOrder(QString("CoreOil")); - ColorOrder=GetZoneOrder(QString("CoreColor")); - ColorInds=GetZoneOrder(QString("ColorInd")); - - QString iconshotname=""; - QString IntLith = QString::number(m_Result->Lith); - if(IntLith=="0") { - iconshotname=""; - } - else - { - iconshotname=LithOrder.key(IntLith); - } - - // - QString Lith = ""; - if(iconshotname!="") - Lith=::GetMudSymbolDir()+""+iconshotname+".svg"; - int len=2; - int pos=Lith.indexOf(".//"); - if(pos<0) pos=Lith.indexOf("./"); - else len=3; - QString svg; - if(pos==0) - { - svg=QCoreApplication::applicationDirPath()+ QDir::separator(); - svg+=Lith.mid(len-1); - } - else svg=Lith; - QDir ss; - if(!ss.exists(svg)) - { - QString path=svg.left(svg.lastIndexOf('.')+1); - svg=path+"png"; - } - Lith=svg; - - // - QString Oil = ""; - iconshotname=OilOrder.key(QString::number(m_Result->Oil)); - if(iconshotname!="") - Oil=::GetGasSymbolDir()+""+iconshotname+".svg"; - len=2; - pos=Oil.indexOf(".//"); - if(pos<0) pos=Oil.indexOf("./"); - else len=3; - if(pos==0) - { - svg=QCoreApplication::applicationDirPath()+ QDir::separator(); - svg+=Oil.mid(len-1); - } - else svg=Oil; - if(!ss.exists(svg)) - { - QString path=svg.left(svg.lastIndexOf('.')+1); - svg=path+"png"; - } - Oil=svg; - - // - QString Color = ""; - int ind=ColorInds.value(QString::number(m_Result->Color)).toInt(); - if (ind>-1&&indaddGeoLithToPlot(-m_Result->EDEP, -m_Result->SDEP, Lith, Oil, Color); - } - logio->CloseTable(iIndex); - delete m_Result; - } - delete logio; - return true; -} bool FormDraw::LoadFromSLF_Result(QMyCustomPlot *widget, QString strSlfName, QString strLineName) { @@ -2395,6 +2250,309 @@ bool FormDraw::LoadFromSLF_Result(QMyCustomPlot *widget, QString strSlfName, QSt return true; } +//录井剖面 +void FormDraw::initGeoLith(QMyCustomPlot *widget, QString strSlfName, QString strLineName) +{ + + int iMyWidth = widget->axisRect(0)->width(); + float vmax = iMyWidth; + float vmin = 0; + widget->m_iX1 = vmin; + widget->m_iX2 = iMyWidth; + widget->m_iY1 = g_iY1; + widget->m_iY2 = g_iY2; + // + widget->xAxis->setRange(vmin, vmax); + widget->yAxis->setRange(g_iY1, g_iY2); + widget->axisRect()->setupFullAxesBox(); + // + widget->xAxis->ticker()->setTickCount(10);//x个主刻度 + widget->yAxis->ticker()->setTickCount(60);//y个主刻度 + + //对调XY轴,在最前面设置 + QCPAxis *yAxis = widget->yAxis; + QCPAxis *xAxis = widget->xAxis; + widget->xAxis = yAxis; + widget->yAxis = xAxis; + + + m_LeftVal = 0; + m_RightVal = 90; + //隐藏刻度 + widget->xAxis->setTicks(false); + widget->yAxis->setTicks(false); + widget->xAxis2->setTicks(false); + widget->yAxis2->setTicks(false); + // + LoadFromSLF_GeoLith(widget, strSlfName, strLineName); + + QString strAliasName = ""; + QString strUnit = ""; + QColor newlineColor=QColor(0,0,0); + double width=2; + QString strScaleType = ""; + //道-对象 + m_formTrack->Add(strSlfName, m_strWellName, m_strTrackName, strLineName, strAliasName, strUnit, newlineColor, width, m_RightVal, m_LeftVal, strScaleType, "tableObject"); + +} + +bool FormDraw::LoadFromSLF_GeoLith(QMyCustomPlot *widget, QString strSlfName, QString strLineName) +{ + CMemRdWt *logio=new CMemRdWt(); + if(!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead)) + { + delete logio; + return false; + } + int iIndex=logio->OpenTable(strLineName.toStdString().c_str()); + if(iIndex>-1) { + int len=logio->GetTableRecordLength(iIndex); + int sl=sizeof(GeoLith_DATA); + if(sl>len) len=sl; + GeoLith_DATA *m_Result; + m_Result=(GeoLith_DATA *)new char[len+1]; + int count=logio->GetTableRecordCount(iIndex); + for(int i=0;iReadTable(iIndex,i+1,m_Result); + // + QMap OilOrder; + QMap LithOrder; + QMap ColorOrder; + QMap ColorInds; + // + LithOrder=GetZoneOrder(QString("GeoLith")); + OilOrder=GetZoneOrder(QString("CoreOil")); + ColorOrder=GetZoneOrder(QString("CoreColor")); + ColorInds=GetZoneOrder(QString("ColorInd")); + + QString iconshotname=""; + QString IntLith = QString::number(m_Result->Lith); + if(IntLith=="0") { + iconshotname=""; + } + else + { + iconshotname=LithOrder.key(IntLith); + } + + // + QString Lith = ""; + if(iconshotname!="") + Lith=::GetMudSymbolDir()+""+iconshotname+".svg"; + int len=2; + int pos=Lith.indexOf(".//"); + if(pos<0) pos=Lith.indexOf("./"); + else len=3; + QString svg; + if(pos==0) + { + svg=QCoreApplication::applicationDirPath()+ QDir::separator(); + svg+=Lith.mid(len-1); + } + else svg=Lith; + QDir ss; + if(!ss.exists(svg)) + { + QString path=svg.left(svg.lastIndexOf('.')+1); + svg=path+"png"; + } + Lith=svg; + + // + QString Oil = ""; + iconshotname=OilOrder.key(QString::number(m_Result->Oil)); + if(iconshotname!="") + Oil=::GetGasSymbolDir()+""+iconshotname+".svg"; + len=2; + pos=Oil.indexOf(".//"); + if(pos<0) pos=Oil.indexOf("./"); + else len=3; + if(pos==0) + { + svg=QCoreApplication::applicationDirPath()+ QDir::separator(); + svg+=Oil.mid(len-1); + } + else svg=Oil; + if(!ss.exists(svg)) + { + QString path=svg.left(svg.lastIndexOf('.')+1); + svg=path+"png"; + } + Oil=svg; + + // + QString Color = ""; + int ind=ColorInds.value(QString::number(m_Result->Color)).toInt(); + if (ind>-1&&indaddGeoLithToPlot(-m_Result->EDEP, -m_Result->SDEP, Lith, Oil, Color); + } + logio->CloseTable(iIndex); + delete m_Result; + } + delete logio; + return true; +} + +//井壁取心 +void FormDraw::initSwallCore(QMyCustomPlot *widget, QString strSlfName, QString strLineName) +{ + + int iMyWidth = widget->axisRect(0)->width(); + float vmax = iMyWidth; + float vmin = 0; + widget->m_iX1 = vmin; + widget->m_iX2 = iMyWidth; + widget->m_iY1 = g_iY1; + widget->m_iY2 = g_iY2; + // + widget->xAxis->setRange(vmin, vmax); + widget->yAxis->setRange(g_iY1, g_iY2); + widget->axisRect()->setupFullAxesBox(); + // + widget->xAxis->ticker()->setTickCount(10);//x个主刻度 + widget->yAxis->ticker()->setTickCount(60);//y个主刻度 + + //对调XY轴,在最前面设置 + QCPAxis *yAxis = widget->yAxis; + QCPAxis *xAxis = widget->xAxis; + widget->xAxis = yAxis; + widget->yAxis = xAxis; + + + m_LeftVal = 0; + m_RightVal = 90; + //隐藏刻度 + widget->xAxis->setTicks(false); + widget->yAxis->setTicks(false); + widget->xAxis2->setTicks(false); + widget->yAxis2->setTicks(false); + // + LoadFromSLF_SwallCore(widget, strSlfName, strLineName); + + QString strAliasName = ""; + QString strUnit = ""; + QColor newlineColor=QColor(0,0,0); + double width=2; + QString strScaleType = ""; + //道-对象 + m_formTrack->Add(strSlfName, m_strWellName, m_strTrackName, strLineName, strAliasName, strUnit, newlineColor, width, m_RightVal, m_LeftVal, strScaleType, "tableObject"); + +} + +bool FormDraw::LoadFromSLF_SwallCore(QMyCustomPlot *widget, QString strSlfName, QString strLineName) +{ + WALLCORE_DATA m_Result; + CMemRdWt *logio=new CMemRdWt(); + if(strSlfName==""||!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead)) + { + delete logio; +// QMessageBox::information(NULL,"提示","SLF文件打开失败,请检查!!",QMessageBox::Yes); + return false; + } + + QStringList liths; + QStringList oils; + QStringList colors; + QStringList colorinds; + + QString cs=GetConfPath(); + QString color; + for(int j=0;j<4;j++) + { + if(j==0) color=cs+"corecolor.ini"; + else if(j==1) color=cs+"corelith.ini"; + else if(j==2) color=cs+"coreoil.ini"; + else color=cs+"colorind.ini"; + FILE *fp=fopen(color.toStdString().c_str(),"rt"); + QStringList ss; + char buf[100]; + if(fp) { + while(!feof(fp)) { + fscanf(fp,"%s",buf); + ss.append(buf); + } + fclose(fp); + } + if(j==0) colors=ss; + else if(j==1) liths=ss; + else if(j==2) oils=ss; + else colorinds=ss; + } + + // + int iIndex=logio->OpenTable(strLineName.toStdString().c_str()); + if(iIndex>-1) { + int count=logio->GetTableRecordCount(iIndex); + for(int i=0;iReadTable(iIndex,i+1,&m_Result); + double top=m_Result.Depth; + double bottom=m_Result.Depth; + + QString LithologyImage=""; + QString OilGasImage=""; + QString ColorImage=""; + + // + if(m_Result.CoreLith<1) { + LithologyImage=""; + } + else if (liths.size()>=m_Result.CoreLith) + { + LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths[m_Result.CoreLith-1]+".svg"; + QDir ss(LithologyImage); + if(!ss.exists()) { + LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths[m_Result.CoreLith-1]+".png"; + } + } + if (m_Result.CoreOil>0&&oils.size()>=m_Result.CoreOil) + { + OilGasImage=::GetGasSymbolDir()+""+oils[m_Result.CoreOil-1]+".svg"; + } + else { + OilGasImage=""; + } + int ind=colorinds.indexOf(QString::number(m_Result.CoreColor)); + if (ind>-1&&indaddSwallCoreToPlot(-m_Result.Depth, LithologyImage, OilGasImage, ColorImage, Sideleft, width, ind); + } + logio->CloseTable(iIndex); + } + delete logio; + return true; +} + void FormDraw::CalcDipWidth(int nColumn,float *flWidth,float factor,int x1,int x2,float flHoriRatio) { float scale ; diff --git a/logPlus/formdraw.h b/logPlus/formdraw.h index bb0d6f2..2089f26 100644 --- a/logPlus/formdraw.h +++ b/logPlus/formdraw.h @@ -147,6 +147,10 @@ public: void initGeoLith(QMyCustomPlot *widget, QString strSlfName, QString strLineName); bool LoadFromSLF_GeoLith(QMyCustomPlot *widget, QString strSlfName, QString strLineName); + //井壁取心 + void initSwallCore(QMyCustomPlot *widget, QString strSlfName, QString strLineName); + bool LoadFromSLF_SwallCore(QMyCustomPlot *widget, QString strSlfName, QString strLineName); + signals: //void sig_AddLine(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName); diff --git a/logPlus/forminfo.cpp b/logPlus/forminfo.cpp index ca1296b..cb7e9a3 100644 --- a/logPlus/forminfo.cpp +++ b/logPlus/forminfo.cpp @@ -215,7 +215,8 @@ void FormInfo::paintEvent(QPaintEvent* event) painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3, Qt::AlignCenter, m_strUnit); } - if(m_strType=="tableObject" && (m_strLineName=="WORDS_RELUST" || m_strLineName == "RESULT" || m_strLineName == "GEO_LITH")) + if(m_strType=="tableObject" && (m_strLineName=="WORDS_RELUST" || m_strLineName == "RESULT" + || m_strLineName == "GEO_LITH"|| m_strLineName == "SWALL_CORE") ) { //文字结论,不绘制左右范围 } diff --git a/logPlus/formtrack.cpp b/logPlus/formtrack.cpp index 0db5840..a2662ab 100644 --- a/logPlus/formtrack.cpp +++ b/logPlus/formtrack.cpp @@ -193,7 +193,8 @@ void FormTrack::s_addWave(QString strSlfName, QString strWellName, QString strTr void FormTrack::s_AddTableLine(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QString strAliasName, QString strUnit, QColor lineColor, double dWidth, float vmax, float vmin, QString strScaleType) { - if(strLineName == "FRAC_HOLE.TABLE" || strLineName == "WORDS_RELUST" || strLineName == "RESULT" || strLineName == "GEO_LITH") + if(strLineName == "FRAC_HOLE.TABLE" || strLineName == "WORDS_RELUST" || strLineName == "RESULT" + || strLineName == "GEO_LITH" || strLineName == "SWALL_CORE") { } diff --git a/logPlus/logPlus.pro b/logPlus/logPlus.pro index 3dadf04..706c6f2 100644 --- a/logPlus/logPlus.pro +++ b/logPlus/logPlus.pro @@ -36,6 +36,10 @@ SOURCES += \ PropertyWidget.cpp \ QCPSizeHandle.cpp \ QCPSizeHandleManager.cpp \ + TransparentDraggableGeoLith.cpp \ + TransparentDraggableRect.cpp \ + TransparentDraggableResult.cpp \ + TransparentDraggableSwallCore.cpp \ backgrounddelegate.cpp \ customtabbar.cpp \ customtabwidget.cpp \ @@ -75,6 +79,7 @@ HEADERS += \ TransparentDraggableGeoLith.h \ TransparentDraggableRect.h \ TransparentDraggableResult.h \ + TransparentDraggableSwallCore.h \ backgrounddelegate.h \ customtabbar.h \ customtabwidget.h \ diff --git a/logPlus/qmycustomplot.cpp b/logPlus/qmycustomplot.cpp index ea8b016..aca86fe 100644 --- a/logPlus/qmycustomplot.cpp +++ b/logPlus/qmycustomplot.cpp @@ -4,6 +4,7 @@ #include "TransparentDraggableRect.h" #include "TransparentDraggableResult.h" #include "TransparentDraggableGeoLith.h" +#include "TransparentDraggableSwallCore.h" #include "qtcommonclass.h" //是否隐藏刻度 @@ -294,6 +295,35 @@ void QMyCustomPlot::addResultToPlot(double left_Low, double right_Hight, QStrin m_mapDraggable_Result[strUuid] = dragRect; } +void QMyCustomPlot::addSwallCoreToPlot(double Depth, QString LithologyImage, QString OilGasImage, QString ColorImage, double Sideleft, double width, int ind) +{ + QtCommonClass *qtCommon = new QtCommonClass(this); + QString strUuid = qtCommon->getUUid(); + + // 在初始化代码中 + TransparentDraggableSwallCore *dragRect = new TransparentDraggableSwallCore(this, strUuid); + //图片,提前设值,后面setRange改变 + dragRect->setOil(OilGasImage); + dragRect->setLith(LithologyImage); + + // 设置初始范围 + double h = 40; + double x1 = this->xAxis->coordToPixel(Depth); + // + double Depth2 = this->xAxis->pixelToCoord(x1-h); + dragRect->setRange(Depth, Depth2); + // 可选:设置颜色 + dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色255, 100, 100, 80 + //最小宽度 + dragRect->setMinWidth(0.1); + //dragRect->setColor(myColor); + + m_mapDraggable_SwallCore[strUuid] = dragRect; + + //刷新 + this->replot(); +} + void QMyCustomPlot::addGeoLithToPlot(double left_Low, double right_Hight, const QString myLith, const QString myOil, const QString myColor) { QtCommonClass *qtCommon = new QtCommonClass(this); diff --git a/logPlus/qmycustomplot.h b/logPlus/qmycustomplot.h index 247d041..24e47d4 100644 --- a/logPlus/qmycustomplot.h +++ b/logPlus/qmycustomplot.h @@ -62,6 +62,7 @@ public: QMap m_mapDraggableRect; QMap m_mapDraggable_Result; QMap m_mapDraggable_GeoLith; + QMap m_mapDraggable_SwallCore; public slots: void slot_time(); @@ -78,6 +79,8 @@ public: void addGeoLithToPlot(double left_Low, double right_Hight, const QString myLith, const QString myOil, const QString myColor); + void addSwallCoreToPlot(double Depth, QString LithologyImage, QString OilGasImage, QString ColorImage, double Sideleft, double width, int ind); + public slots: void s_LineClicked(int index); void onResetZoom();