From ffa3925d233066fe12468a78db0dec076e03ff68 Mon Sep 17 00:00:00 2001 From: jiayulong <22806282@qq.com> Date: Mon, 2 Feb 2026 13:51:36 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=94=AF=E6=8C=81=E6=8B=96=E6=8B=89?= =?UTF-8?q?=E9=80=89=E4=B8=AD=E6=A1=86=E6=9D=A5=E4=BF=AE=E6=94=B9=E6=9B=B2?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logPlus/TransparentDraggableLine.cpp | 2 +- logPlus/logPlus.pro | 2 + logPlus/qmycustomplot.cpp | 76 ++- logPlus/qmycustomplot.h | 5 + logPlus/transparentdraggableSelectRect.cpp | 543 +++++++++++++++++++++ logPlus/transparentdraggableSelectRect.h | 89 ++++ 6 files changed, 712 insertions(+), 5 deletions(-) create mode 100644 logPlus/transparentdraggableSelectRect.cpp create mode 100644 logPlus/transparentdraggableSelectRect.h diff --git a/logPlus/TransparentDraggableLine.cpp b/logPlus/TransparentDraggableLine.cpp index 8ffb681..08d7f56 100644 --- a/logPlus/TransparentDraggableLine.cpp +++ b/logPlus/TransparentDraggableLine.cpp @@ -144,7 +144,7 @@ void TransparentDraggableLine::onMousePress(QMouseEvent *event) mPlot->m_SelectShiftLine = this; qcpItemLine->setPen(QPen(Qt::red)); - double delta = (m_lY1+lY2)/10.0; + double delta = (lY2-m_lY1)/10.0; if(x < m_lY1+delta) { mDragMode = DragLeft; diff --git a/logPlus/logPlus.pro b/logPlus/logPlus.pro index 8f5507d..06ee3ab 100644 --- a/logPlus/logPlus.pro +++ b/logPlus/logPlus.pro @@ -82,6 +82,7 @@ SOURCES += \ qtprojectwidgets.cpp \ totalTitleBar.cpp \ transparentdraggableGuan.cpp \ + transparentdraggableSelectRect.cpp \ transparentdraggableimage.cpp \ variantfactory.cpp \ variantmanager.cpp @@ -142,6 +143,7 @@ HEADERS += \ qtprojectwidgets.h \ totalTitleBar.h \ transparentdraggableGuan.h \ + transparentdraggableSelectRect.h \ transparentdraggableimage.h \ variantfactory.h \ variantmanager.h diff --git a/logPlus/qmycustomplot.cpp b/logPlus/qmycustomplot.cpp index 64d6254..8dd998b 100644 --- a/logPlus/qmycustomplot.cpp +++ b/logPlus/qmycustomplot.cpp @@ -13,6 +13,7 @@ #include "TransparentDraggableFac.h" #include "transparentdraggableGuan.h" #include "TransparentDraggableLine.h" +#include "transparentdraggableSelectRect.h" #include "qtcommonclass.h" //是否隐藏刻度 @@ -396,6 +397,12 @@ void QMyCustomPlot::onDelAllShiftLine() //右键--编辑曲线 void QMyCustomPlot::onEditLine() { + if(m_bEditRect) + { + QMessageBox::information(nullptr, "提示", "当前正在编辑曲线,请先完成编辑!"); + return; + } + this->setInteractions(QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables | QCP::iMultiSelect); // 轴、图例、图表可以被选择,并且是多选的方式 this->setSelectionRectMode(QCP::srmCustom); // 鼠标框选 @@ -413,6 +420,7 @@ void QMyCustomPlot::onEditLine() } // 当选择完成时,获取矩形范围并放大 QRectF rect = this->selectionRect()->rect(); // 获取选择的矩形区域(像素坐标) + m_bEditRect=true;//当前是否正在编辑曲线。 // 转换为坐标轴范围 double top = rect.top(); @@ -421,11 +429,51 @@ void QMyCustomPlot::onEditLine() double right_Hight = this->xAxis->pixelToCoord(top); double left_Low = this->xAxis->pixelToCoord(bottom); - if(right_Hight-left_Low>5) + float rlev=0; + if(m_x.size()>=2) { + rlev = abs(m_x[1] - m_x[0]); + } + // + int left_Low_Number=0; + int right_Hight_Number=0; + for(int i =0; i= (3*rlev) )//至少选中5个点 + { +// for (int j=right_Hight_Number; jsetPen(QPen(Qt::blue)); +// qcpItemLine->setLayer("overlay"); // 确保在最上层 +// qcpItemLine->start->setCoords(this->m_x[j], this->m_y[j]); +// qcpItemLine->end->setCoords(this->m_x[j+1], this->m_y[j+1]); +// } +// this->replot(); +// QPixmap p = this->grab(QRect(rect.x(), rect.y(), rect.width(), rect.height())); +// p.save("./Rectpicture.png", "png"); + //添加图形 - //emit CallManage::getInstance()->sig_addImageToPlot(customPlot, left_Low, right_Hight, ":/image/file.png"); - this->addImageToPlot(left_Low, right_Hight, ":/image/file.png"); + this->addSelectRectToPlot(m_x[left_Low_Number], m_x[right_Hight_Number], left_Low_Number, right_Hight_Number);//left_Low, right_Hight + + //取消框选 + this->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables); + this->setSelectionRectMode(QCP::srmNone); } }); @@ -491,8 +539,28 @@ void QMyCustomPlot::addImageToPlot(double left_Low, double right_Hight, const QS //dragRect->setTitle(strText); m_mapDraggable_Image[strUuid] = dragRect; - } + +void QMyCustomPlot::addSelectRectToPlot(double left_Low, double right_Hight, int left_Low_Number, int right_Hight_Number) +{ + QtCommonClass *qtCommon = new QtCommonClass(this); + QString strUuid = qtCommon->getUUid(); + + // 在初始化代码中 + TransparentDraggableSelectRect *dragRect = new TransparentDraggableSelectRect(this, strUuid); + //图片,提前设值,后面setRange改变 + dragRect->setNumber(left_Low_Number, right_Hight_Number); + // 设置初始范围 + dragRect->setRange(left_Low, right_Hight); + // 可选:设置颜色 + dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色 + //最小宽度 + dragRect->setMinWidth(0.1); + //dragRect->setTitle(strText); + + m_mapDraggable_Image[strUuid] = dragRect; +} + //校深线段 void QMyCustomPlot::s_AddShifLineToPlot(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double left_Low, double right_Hight) { diff --git a/logPlus/qmycustomplot.h b/logPlus/qmycustomplot.h index b6e0602..20b4051 100644 --- a/logPlus/qmycustomplot.h +++ b/logPlus/qmycustomplot.h @@ -69,6 +69,7 @@ public: int m_iCurNum=0; int m_iSplitNum=2000; //2000000; //2000; bool m_addRandomGraph=false;//当前是否绘制曲线 true:是。 + bool m_bEditRect=false; //当前是否正在编辑曲线。 QMap m_mapDraggable_Rect; QMap m_mapDraggable_Result; @@ -82,6 +83,7 @@ public: QMap m_mapDraggable_Guan; QMap m_mapDraggable_Jiegutext; QMap m_mapDraggable_Line; + QMap m_mapDraggable_SelectRect; QObject* m_SelectShiftLine=nullptr;//当前选中的分段线 @@ -114,6 +116,9 @@ public: void addLineToPlot(double left_Low, double right_Hight, const QString strText, QColor crColor=QColor(255, 255, 255, 80)); + //框选并编辑曲线 + void addSelectRectToPlot(double left_Low, double right_Hight, int left_Low_Number, int right_Hight_Number); + public slots: void s_LineClicked(int index); void onResetZoom(); diff --git a/logPlus/transparentdraggableSelectRect.cpp b/logPlus/transparentdraggableSelectRect.cpp new file mode 100644 index 0000000..031f1fe --- /dev/null +++ b/logPlus/transparentdraggableSelectRect.cpp @@ -0,0 +1,543 @@ +#include "transparentdraggableSelectRect.h" + + +extern double g_dPixelPerCm;//每厘米像素数 +//static GeoIndicatorGenerator m_drawGeo; + +TransparentDraggableSelectRect::TransparentDraggableSelectRect(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QString strTitle) + : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) +{ + m_strUuid = strUuid; + // + initRect(); +} + +TransparentDraggableSelectRect::~TransparentDraggableSelectRect() +{ + if(mPlot) { + // mPlot->removeItem(mRect); + // mPlot->removeItem(mLeftHandle); + // mPlot->removeItem(mRightHandle); + mPlot->m_bEditRect = false;//当前是否正在编辑曲线。 + } +} + + +void TransparentDraggableSelectRect::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 TransparentDraggableSelectRect::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 TransparentDraggableSelectRect::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 TransparentDraggableSelectRect::setMinWidth(double minWidth) +{ + mMinWidth = minWidth; +} + +//设置标题 +void TransparentDraggableSelectRect::setTitle(QString strTitle) +{ + mstrTitle = strTitle; + mItemTitle->setText(mstrTitle); + //mPlot->replot(); +} + +void TransparentDraggableSelectRect::setNumber(int left_Low_Number, int right_Hight_Number) +{ + m_left_Low_Number = left_Low_Number; + m_right_Hight_Number = right_Hight_Number; + + for (int j=right_Hight_Number; jsetPen(QPen(Qt::blue)); + qcpItemLine->setLayer("overlay"); // 确保在最上层 + qcpItemLine->start->setCoords(mPlot->m_x[j], mPlot->m_y[j]); + qcpItemLine->end->setCoords(mPlot->m_x[j+1], mPlot->m_y[j+1]); + + // + m_qcpItemLine_List.append(qcpItemLine); + } + +// // +// double lY1 = mPlot->yAxis->range().lower;//+10 +// double lY2 = mPlot->yAxis->range().upper; +// double left_Low = mPlot->m_x[left_Low_Number]; +// double right_Hight = mPlot->m_x[right_Hight_Number]; +// // +// 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); +// // +// QPixmap p = this->grab(QRect(x2, x1, y2-y1, x1-x2)); +// p.save("./Rectpicture.png","png"); +} + +//设置解释结论 +void TransparentDraggableSelectRect::setResult(QString filePath) +{ + m_Result = filePath; +} + +void TransparentDraggableSelectRect::drawResult(double left_Low, double right_Hight, double lY1, double lY2) +{ + if(m_Result=="") + { + return; + } + + double x1 = mPlot->xAxis->coordToPixel(left_Low); + double x2 = mPlot->xAxis->coordToPixel(right_Hight); + double y1 = mPlot->yAxis->coordToPixel(lY1); + double y2 = mPlot->yAxis->coordToPixel(lY2); + + // + QString filePath = m_Result; + // + QString strLast = filePath.right(4); + if(strLast.toLower()==".svg") + { + QString path,filename; + GetWellNameAndPath(filePath, filename, path); + QString basename = filename; + + QString val=filePath; + QImage image(y2-y1, x1-x2,QImage::Format_RGB32); + QPainter painter(&image); + QRectF fillRect(0,0, y2-y1, x1-x2); + painter.fillRect(fillRect,Qt::white); + //拉伸 + DrawSVGSteched(&painter,filePath,fillRect,0); + //平铺 + //DrawSVGTiled(&painter,filePath,fillRect,0); + //正常 + //DrawSVGNormal(&painter,filePath,fillRect,0); + + val=GetImagePath()+"TempNew"; + QDir ss; + if(!ss.exists(val)) { + ss.mkdir(val); + } + val+=QDir::separator(); + val+=basename+".png"; + image.save(val); + + // + mPixmap->setPixmap(QPixmap(val)); // 设置图片 + } + else + { + mPixmap->setPixmap(QPixmap(filePath)); // 设置图片 + +// QString path,filename; +// GetWellNameAndPath(filePath, filename, path); +// QString basename = filename; + +// QString val=filePath; +// QImage image(y2-y1, x1-x2,QImage::Format_RGB32); +// QPainter painter(&image); +// QRectF fillRect(0,0, y2-y1, x1-x2); +// painter.fillRect(fillRect,Qt::white); +// //平铺 +// DrawSVGNormal(&painter,filePath,fillRect,0); + +// val=GetImagePath()+"TempNew"; +// QDir ss; +// if(!ss.exists(val)) { +// ss.mkdir(val); +// } +// val+=QDir::separator(); +// val+=basename+".png"; +// image.save(val); + +// // +// mPixmap->setPixmap(QPixmap(val)); // 设置图片 + } + + //mPlot->replot(); +} + +// 设置矩形范围 +void TransparentDraggableSelectRect::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); + + double delta = (right_Hight - left_Low) / (double)(m_left_Low_Number-m_right_Hight_Number-1); + + int iLoop = 0; + for (int j=m_right_Hight_Number; jstart->setCoords(right_Hight-delta*iLoop, mPlot->m_y[j]); + qcpItemLine->end->setCoords(right_Hight-delta*(iLoop+1), mPlot->m_y[j+1]); + iLoop++; + } + + //位置与rect不一样,否则图像反转 +// mPixmap->topLeft->setCoords(right_Hight, lY1); +// mPixmap->bottomRight->setCoords(left_Low, lY2); + //drawResult(left_Low, right_Hight, lY1, lY2); + + //mItemTitle->position->setCoords(0.5, 0.5); + // 设置父锚点,定位点 + //mItemTitle->position->setParentAnchor(mRect->bottom); +// mItemTitle->position->setCoords((mRect->topLeft->coords().x() + mRect->bottomRight->coords().x())/2, +// (mRect->topLeft->coords().y() + mRect->bottomRight->coords().y())/2); // 设置文本在矩形中心位置 + + //mRect->topLeft->setCoords(left, mPlot->yAxis->range().upper); + //mRect->bottomRight->setCoords(right, mPlot->yAxis->range().lower); + + updateHandles(); + mPlot->replot(); +} + +// 获取当前范围 +QCPRange TransparentDraggableSelectRect::getRange() +{ + return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); +} + +// 设置矩形颜色 +void TransparentDraggableSelectRect::setColor(const QColor &color) +{ + mRect->setBrush(QBrush(color)); + mRect->setPen(QPen(color.darker())); + //mPlot->replot(); +} + +// 删除框图 +void TransparentDraggableSelectRect::deleteRect() +{ + if(mPlot) { + + // mRect->deleteLater(); + // mLeftHandle->deleteLater(); + // mRightHandle->deleteLater(); + // mPixmap->deleteLater(); + + mPlot->m_mapDraggable_Image.remove(m_strUuid); + + mPlot->removeItem(mRect); + mPlot->removeItem(mLeftHandle); + mPlot->removeItem(mRightHandle); + mPlot->removeItem(mPixmap); + mPlot->removeItem(mItemTitle); + + for(int i=m_qcpItemLine_List.size()-1; i>-1; i--) + { + mPlot->removeItem(m_qcpItemLine_List[i]); + } + mPlot->m_bEditRect = false;//当前是否正在编辑曲线。 + + mPlot->replot(); + this->deleteLater(); + + // + // //避免二次绘制框图 + // mPlot->m_bDrawRect = false; + // mDragMode = DragNone; + // //取消选中框 + // mPlot->selectionRect()->cancel(); + // mPlot->replot(); + // mPlot->selectionRect()->mActive=true; + } +} + + +void TransparentDraggableSelectRect::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, &TransparentDraggableSelectRect::onMousePress); + connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableSelectRect::onMouseMove); + connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableSelectRect::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 TransparentDraggableSelectRect::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 TransparentDraggableSelectRect::onDelRect() +{ + //mDragMode = DragNone; + //删除框图 + deleteRect(); +} + + +void TransparentDraggableSelectRect::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, &TransparentDraggableSelectRect::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 TransparentDraggableSelectRect::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, + proposedLeft, + mDragStartRange.upper - mMinWidth); + break; + } + case DragRight: { + //double proposedRight = mDragStartRange.upper + dx; + double proposedRight = mDragStartRange.upper + dy; + // 确保不超出轴范围且不使宽度小于最小值 + newRange.upper = qBound( + mDragStartRange.lower + mMinWidth, + proposedRight, + 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; + + // 检查是否超出轴范围 + 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 TransparentDraggableSelectRect::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; + } +} diff --git a/logPlus/transparentdraggableSelectRect.h b/logPlus/transparentdraggableSelectRect.h new file mode 100644 index 0000000..eda537d --- /dev/null +++ b/logPlus/transparentdraggableSelectRect.h @@ -0,0 +1,89 @@ +#ifndef TRANSPARENTDRAGGABLESELECTRECT_H +#define TRANSPARENTDRAGGABLESELECTRECT_H + +#include +#include "qmycustomplot.h" +#include +#include +#include "geometryutils.h" +#include + +#pragma execution_character_set("utf-8") // 强制指定执行字符集为 UTF-8 + +class TransparentDraggableSelectRect : public QObject +{ + Q_OBJECT +public: + explicit TransparentDraggableSelectRect(QMyCustomPlot *parentPlot, QString strUuid="", double minWidth = 1.0, QString strTitle = ""); + + + ~TransparentDraggableSelectRect(); + + + 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 setNumber(int left_Low_Number, int right_Hight_Number); + + //设置解释结论 + void setResult(QString filePath); + void drawResult(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); + +private: + QMyCustomPlot *mPlot; + QCPItemRect *mRect; + QCPItemRect *mLeftHandle; + QCPItemRect *mRightHandle; + + QCPItemPixmap *mPixmap; + QCPItemText *mItemTitle; + QString mstrTitle=""; + QString m_strUuid = ""; + QString m_Result; + // + QList m_qcpItemLine_List; + int m_left_Low_Number; + int m_right_Hight_Number; + + enum DragMode { DragNone, DragLeft, DragRight, DragRect }; + DragMode mDragMode = DragNone; + //double mDragStartX = 0; + double mDragStartY = 0; + QCPRange mDragStartRange; + + // 添加最小宽度成员变量 + double mMinWidth; +}; + +#endif // TRANSPARENTDRAGGABLESELECTRECT_H From 495af6493fa21b5371c2e521211cb8e864374f2e Mon Sep 17 00:00:00 2001 From: jiayulong Date: Mon, 2 Feb 2026 16:37:58 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=9B=B2=E7=BA=BF?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=BB=93=E6=9E=9C=E5=88=B0slf=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E5=B9=B6=E5=AE=9E=E6=97=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CallManage/CallManage.h | 3 + logPlus/mainwindowcurve.cpp | 45 +++++ logPlus/mainwindowcurve.h | 3 + logPlus/qmycustomplot.cpp | 183 +++++++++------------ logPlus/qmycustomplot.h | 2 + logPlus/transparentdraggableSelectRect.cpp | 152 ++++++++++++----- logPlus/transparentdraggableSelectRect.h | 6 + 7 files changed, 250 insertions(+), 144 deletions(-) diff --git a/CallManage/CallManage.h b/CallManage/CallManage.h index 4cd1823..f895298 100644 --- a/CallManage/CallManage.h +++ b/CallManage/CallManage.h @@ -173,6 +173,9 @@ signals: //Plot重新加载数据 void sig_ReloadPlot(QString strUuid, QString strSlfName, QString strLineName); + //编辑曲线,框选拉伸/压缩 + void sig_EShiftDepth(QString strSlfName, QString strLineName, int count, QList left_Low_List, QList right_Hight_List); + // //void sig_addImageToPlot(QMyCustomPlot* customPlot, double left_Low, double right_Hight, QString imagePath); diff --git a/logPlus/mainwindowcurve.cpp b/logPlus/mainwindowcurve.cpp index 08f6561..fca1929 100644 --- a/logPlus/mainwindowcurve.cpp +++ b/logPlus/mainwindowcurve.cpp @@ -135,6 +135,9 @@ MainWindowCurve::MainWindowCurve(QWidget *parent) : //执行拼接 connect(CallManage::getInstance(), SIGNAL(sig_Merge_List(QString, QList, QList)), this, SLOT(s_Merge_List(QString, QList, QList))); + //执行压缩/拉伸 + connect(CallManage::getInstance(), SIGNAL(sig_EShiftDepth(QString, QString, int, QList, QList)), this, SLOT(s_EShiftDepth(QString, QString, int, QList, QList))); + //图头 m_dock1=new QDockWidget(tr(""),this); m_dock1->setFeatures(QDockWidget::NoDockWidgetFeatures);//QDockWidget::DockWidgetMovable @@ -1368,6 +1371,48 @@ void MainWindowCurve::s_runcor() emit CallManage::getInstance()->sig_RuncorFromPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName); } +//编辑曲线,框选拉伸/压缩 +void MainWindowCurve::s_EShiftDepth(QString strSlfName, QString strLineName, int count, QList left_Low_List, QList right_Hight_List) +{ + if(strSlfName=="") return; + + float sdeps[2],edeps[2]; + sdeps[0]=right_Hight_List[0]; + sdeps[1]=left_Low_List[0]; + edeps[0]=right_Hight_List[1]; + edeps[1]=left_Low_List[1]; + + CMemRdWt * logio=new CMemRdWt(); + if(!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead)) + { + delete logio; + //AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败,请检查!"); + return; + } + + int curveindex=logio->FindObjectName((char*)strLineName.toStdString().c_str()); + if(curveindex<0) + { + delete logio; + return; + } + CString szBuffer1=""; + CString szBuffer=""; + for(int i=0;iEShiftDepth((char*)strLineName.toStdString().c_str(),2, sdeps, edeps); + delete logio; + + //Plot重新加载数据 + emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, strSlfName, strLineName); + +} + +//分段线,拉伸/压缩 void MainWindowCurve::s_Runcor_List(QString strUuid, QList left_Low_List, QList right_Hight_List) { if(strUuid != m_strUuid) diff --git a/logPlus/mainwindowcurve.h b/logPlus/mainwindowcurve.h index 6015634..7cd8e68 100644 --- a/logPlus/mainwindowcurve.h +++ b/logPlus/mainwindowcurve.h @@ -219,6 +219,9 @@ public slots: void s_merge(); void s_Merge_List(QString strUuid, QList left_Low_List, QList right_Hight_List); + //编辑曲线,框选拉伸/压缩 + void s_EShiftDepth(QString strSlfName, QString strLineName, int count, QList left_Low_List, QList right_Hight_List); + // void s_showHeadTable(); //显示/隐藏图头 void s_currtemplite(); //加载图文件 diff --git a/logPlus/qmycustomplot.cpp b/logPlus/qmycustomplot.cpp index 8dd998b..8ce64bf 100644 --- a/logPlus/qmycustomplot.cpp +++ b/logPlus/qmycustomplot.cpp @@ -402,113 +402,86 @@ void QMyCustomPlot::onEditLine() QMessageBox::information(nullptr, "提示", "当前正在编辑曲线,请先完成编辑!"); return; } - this->setInteractions(QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables | QCP::iMultiSelect); // 轴、图例、图表可以被选择,并且是多选的方式 this->setSelectionRectMode(QCP::srmCustom); // 鼠标框选 - for (int i=0; i < this->graphCount(); ++i) { - QCPGraph *graph = this->graph(i); - graph->setSelectable(QCP::stDataRange); - break; + if(m_bFirstTimeConnect) + { + //信号槽只绑定一次,避免重复绑定 + m_bFirstTimeConnect = false; + + for (int i=0; i < this->graphCount(); ++i) { + QCPGraph *graph = this->graph(i); + graph->setSelectable(QCP::stDataRange); + break; + } + + connect(this->selectionRect(), &QCPSelectionRect::accepted, [this](){ + if(this->m_bDrawRect == false) + { + this->m_bDrawRect = true; + return; + } + // 当选择完成时,获取矩形范围并放大 + QRectF rect = this->selectionRect()->rect(); // 获取选择的矩形区域(像素坐标) + m_bEditRect=true;//当前是否正在编辑曲线。 + + // 转换为坐标轴范围 + double top = rect.top(); + double bottom = rect.bottom(); + + double right_Hight = this->xAxis->pixelToCoord(top); + double left_Low = this->xAxis->pixelToCoord(bottom); + + float rlev=0; + if(m_x.size()>=2) + { + rlev = abs(m_x[1] - m_x[0]); + } + // + int left_Low_Number=0; + int right_Hight_Number=0; + for(int i =0; i= (3*rlev) )//至少选中5个点 + { + // for (int j=right_Hight_Number; jsetPen(QPen(Qt::blue)); + // qcpItemLine->setLayer("overlay"); // 确保在最上层 + // qcpItemLine->start->setCoords(this->m_x[j], this->m_y[j]); + // qcpItemLine->end->setCoords(this->m_x[j+1], this->m_y[j+1]); + // } + // this->replot(); + // QPixmap p = this->grab(QRect(rect.x(), rect.y(), rect.width(), rect.height())); + // p.save("./Rectpicture.png", "png"); + + //添加图形 + this->addSelectRectToPlot(m_x[left_Low_Number], m_x[right_Hight_Number], left_Low_Number, right_Hight_Number);//left_Low, right_Hight + + //取消框选 + this->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables); + this->setSelectionRectMode(QCP::srmNone); + } + }); + } - - connect(this->selectionRect(), &QCPSelectionRect::accepted, [this](){ - if(this->m_bDrawRect == false) - { - this->m_bDrawRect = true; - return; - } - // 当选择完成时,获取矩形范围并放大 - QRectF rect = this->selectionRect()->rect(); // 获取选择的矩形区域(像素坐标) - m_bEditRect=true;//当前是否正在编辑曲线。 - - // 转换为坐标轴范围 - double top = rect.top(); - double bottom = rect.bottom(); - - double right_Hight = this->xAxis->pixelToCoord(top); - double left_Low = this->xAxis->pixelToCoord(bottom); - - float rlev=0; - if(m_x.size()>=2) - { - rlev = abs(m_x[1] - m_x[0]); - } - // - int left_Low_Number=0; - int right_Hight_Number=0; - for(int i =0; i= (3*rlev) )//至少选中5个点 - { -// for (int j=right_Hight_Number; jsetPen(QPen(Qt::blue)); -// qcpItemLine->setLayer("overlay"); // 确保在最上层 -// qcpItemLine->start->setCoords(this->m_x[j], this->m_y[j]); -// qcpItemLine->end->setCoords(this->m_x[j+1], this->m_y[j+1]); -// } -// this->replot(); -// QPixmap p = this->grab(QRect(rect.x(), rect.y(), rect.width(), rect.height())); -// p.save("./Rectpicture.png", "png"); - - //添加图形 - this->addSelectRectToPlot(m_x[left_Low_Number], m_x[right_Hight_Number], left_Low_Number, right_Hight_Number);//left_Low, right_Hight - - //取消框选 - this->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables); - this->setSelectionRectMode(QCP::srmNone); - } - }); - - // 连接QCustomPlot的信号,selectionChangedByUser表明是由鼠标点击进行的选择 - // 这里主要就是同步图表和图例的显示 -// connect(this, &QMyCustomPlot::selectionChangedByUser, [this](){ -// for (int i=0; i < this->graphCount(); ++i) { -// QCPGraph *graph = this->graph(i); -// QCPPlottableLegendItem *item = this->legend->itemWithPlottable(graph); - -// if (item->selected() && !graph->selected()) -// { -// graph->setSelection(QCPDataSelection(graph->data()->dataRange())); // 当图例项被选择时,选择图表全部的数据 -// } -// else if (graph->selected()) -// { -// item->setSelected(true); - -// QCPDataSelection selection = this->graph(i)->selection(); -// // 遍历选中的数据范围 -// for (int j = 0; j < selection.dataRangeCount(); ++j) -// { -// QCPDataRange dataRange = selection.dataRange(j); -// double left_Low = this->graph(i)->data()->at(dataRange.begin())->key; -// double right_Hight = this->graph(i)->data()->at(dataRange.end())->key; -// if(right_Hight-left_Low>1) -// { -// //添加图形 -// //emit CallManage::getInstance()->sig_addImageToPlot(customPlot, left_Low, right_Hight, ":/image/file.png"); -// this->addImageToPlot(left_Low, right_Hight, ":/image/file.png"); -// } -// } -// } -// } -// }); } void QMyCustomPlot::onAddRect() @@ -543,6 +516,8 @@ void QMyCustomPlot::addImageToPlot(double left_Low, double right_Hight, const QS void QMyCustomPlot::addSelectRectToPlot(double left_Low, double right_Hight, int left_Low_Number, int right_Hight_Number) { + //qDebug() << "QMyCustomPlot addSelectRectToPlot"; + QtCommonClass *qtCommon = new QtCommonClass(this); QString strUuid = qtCommon->getUUid(); @@ -558,7 +533,7 @@ void QMyCustomPlot::addSelectRectToPlot(double left_Low, double right_Hight, int dragRect->setMinWidth(0.1); //dragRect->setTitle(strText); - m_mapDraggable_Image[strUuid] = dragRect; + m_mapDraggable_SelectRect[strUuid] = dragRect; } //校深线段 diff --git a/logPlus/qmycustomplot.h b/logPlus/qmycustomplot.h index 20b4051..2adc0d2 100644 --- a/logPlus/qmycustomplot.h +++ b/logPlus/qmycustomplot.h @@ -70,6 +70,7 @@ public: int m_iSplitNum=2000; //2000000; //2000; bool m_addRandomGraph=false;//当前是否绘制曲线 true:是。 bool m_bEditRect=false; //当前是否正在编辑曲线。 + bool m_bFirstTimeConnect=true; //初次绑定编辑曲线信号槽。 QMap m_mapDraggable_Rect; QMap m_mapDraggable_Result; @@ -86,6 +87,7 @@ public: QMap m_mapDraggable_SelectRect; QObject* m_SelectShiftLine=nullptr;//当前选中的分段线 + QObject* m_SelectRect=nullptr;//当前选中的曲线编辑框 public slots: void slot_time(); diff --git a/logPlus/transparentdraggableSelectRect.cpp b/logPlus/transparentdraggableSelectRect.cpp index 031f1fe..d30c36a 100644 --- a/logPlus/transparentdraggableSelectRect.cpp +++ b/logPlus/transparentdraggableSelectRect.cpp @@ -1,4 +1,5 @@ #include "transparentdraggableSelectRect.h" +#include "CallManage.h" extern double g_dPixelPerCm;//每厘米像素数 @@ -102,20 +103,6 @@ void TransparentDraggableSelectRect::setNumber(int left_Low_Number, int right_Hi // m_qcpItemLine_List.append(qcpItemLine); } - -// // -// double lY1 = mPlot->yAxis->range().lower;//+10 -// double lY2 = mPlot->yAxis->range().upper; -// double left_Low = mPlot->m_x[left_Low_Number]; -// double right_Hight = mPlot->m_x[right_Hight_Number]; -// // -// 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); -// // -// QPixmap p = this->grab(QRect(x2, x1, y2-y1, x1-x2)); -// p.save("./Rectpicture.png","png"); } //设置解释结论 @@ -207,6 +194,9 @@ void TransparentDraggableSelectRect::setRange(double left_Low, double right_High { if(left_Low >= right_Hight) return; + m_left_Low_Current = left_Low; + m_right_Hight_Current = right_Hight; + // double lY1 = mPlot->yAxis->range().lower;//+10 double lY2 = mPlot->yAxis->range().upper; mRect->topLeft->setCoords(left_Low, lY1); @@ -265,7 +255,7 @@ void TransparentDraggableSelectRect::deleteRect() // mRightHandle->deleteLater(); // mPixmap->deleteLater(); - mPlot->m_mapDraggable_Image.remove(m_strUuid); + mPlot->m_mapDraggable_SelectRect.remove(m_strUuid); mPlot->removeItem(mRect); mPlot->removeItem(mLeftHandle); @@ -355,6 +345,30 @@ void TransparentDraggableSelectRect::updateHandles() } +void TransparentDraggableSelectRect::slotSaveChange() +{ + // + QList left_Low_List; + QList right_Hight_List; + left_Low_List.append(0 - mPlot->m_x[m_left_Low_Number]); + right_Hight_List.append(0 - mPlot->m_x[m_right_Hight_Number]); + // + left_Low_List.append(0 - m_left_Low_Current); + right_Hight_List.append(0 - m_right_Hight_Current); + + QString strSlfName = mPlot->m_strSlfName; + QString strLineName = mPlot->m_strLineName; + int count = 2; + + //执行校正 + emit CallManage::getInstance()->sig_EShiftDepth(strSlfName, strLineName, count, left_Low_List, right_Hight_List); + + + //删除框图 + deleteRect(); + //emit sig_DelRect(); +} + void TransparentDraggableSelectRect::onDelRect() { //mDragMode = DragNone; @@ -378,6 +392,11 @@ void TransparentDraggableSelectRect::onMousePress(QMouseEvent *event) //else if(x >= currentRange.lower && x <= currentRange.upper) { else if(y >= currentRange.lower && y <= currentRange.upper) { mDragMode = DragNone; + + QMenu menu(mPlot); + menu.addAction(QIcon(::GetImagePath() + "icon/savecurve.png"), "保存当前数据修改", this, &TransparentDraggableSelectRect::slotSaveChange); + menu.addAction(QIcon(::GetImagePath() + "icon/ClearSel.png"), "放弃当前数据修改", this, &TransparentDraggableSelectRect::onDelRect); + menu.exec(event->globalPos()); } else { mDragMode = DragNone; @@ -385,22 +404,6 @@ void TransparentDraggableSelectRect::onMousePress(QMouseEvent *event) } //event->accept(); - - QMenu menu(nullptr); - QAction *delAction = menu.addAction("删除框图"); - //delAction->installEventFilter(this); - connect(delAction, &QAction::triggered, this, &TransparentDraggableSelectRect::onDelRect); - - // QAction* pItem = menu.exec(event->globalPos()); - // if(pItem == delAction) - // { - // //event->accept(); - - // int ii=0; - // ii++; - // } - menu.exec(event->globalPos()); - return; } @@ -455,7 +458,8 @@ void TransparentDraggableSelectRect::onMouseMove(QMouseEvent *event) double proposedLeft = mDragStartRange.lower + dy; // 确保不超出轴范围且不使宽度小于最小值 newRange.lower = qBound( - mPlot->xAxis->range().lower, + //mPlot->xAxis->range().lower, + getMyLower(), proposedLeft, mDragStartRange.upper - mMinWidth); break; @@ -467,7 +471,8 @@ void TransparentDraggableSelectRect::onMouseMove(QMouseEvent *event) newRange.upper = qBound( mDragStartRange.lower + mMinWidth, proposedRight, - mPlot->xAxis->range().upper); + getMyUpper()); + //mPlot->xAxis->range().upper); break; } case DragRect: { @@ -478,15 +483,24 @@ void TransparentDraggableSelectRect::onMouseMove(QMouseEvent *event) newRange.upper = center + width/2; // 检查是否超出轴范围 - QCPRange axisRange = mPlot->xAxis->range(); - if(newRange.lower < axisRange.lower) { - newRange.lower = axisRange.lower; - newRange.upper = newRange.lower + width; + if(newRange.lower < getMyLower()) { + newRange.lower = getMyLower(); + newRange.upper = newRange.lower + width; } - else if(newRange.upper > axisRange.upper) { - newRange.upper = axisRange.upper; - newRange.lower = newRange.upper - 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: @@ -541,3 +555,61 @@ void TransparentDraggableSelectRect::onMouseRelease(QMouseEvent *event) mPlot->selectionRect()->mActive=true; } } + +double TransparentDraggableSelectRect::getMyLower() +{ + double dLower = mPlot->xAxis->range().lower; + double proposedLeft = mDragStartRange.lower; + + TransparentDraggableSelectRect *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_SelectRect.begin(); + while( it != mPlot->m_mapDraggable_SelectRect.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableSelectRect*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) + { + dLower = tmpRange.upper; + } + it++; + } + } + + return dLower; +} + +double TransparentDraggableSelectRect::getMyUpper() +{ + double dUpper = mPlot->xAxis->range().upper; + double proposedRight = mDragStartRange.upper; + + TransparentDraggableSelectRect *pDraggableRect =NULL; + { + QMap::Iterator it = mPlot->m_mapDraggable_SelectRect.begin(); + while( it != mPlot->m_mapDraggable_SelectRect.end() ) + { + if(it.key() == m_strUuid) + { + it++; + continue; + } + pDraggableRect = (TransparentDraggableSelectRect*)it.value(); + // + QCPRange tmpRange = pDraggableRect->getRange(); + if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) + { + dUpper = tmpRange.lower; + } + it++; + } + } + + return dUpper; +} diff --git a/logPlus/transparentdraggableSelectRect.h b/logPlus/transparentdraggableSelectRect.h index eda537d..8a69c67 100644 --- a/logPlus/transparentdraggableSelectRect.h +++ b/logPlus/transparentdraggableSelectRect.h @@ -49,16 +49,20 @@ public: signals: void rangeChanged(QCPRange newRange); + void sig_DelRect(); private: void initRect(); void updateHandles() ; private slots: + void slotSaveChange(); void onDelRect(); void onMousePress(QMouseEvent *event); void onMouseMove(QMouseEvent *event); void onMouseRelease(QMouseEvent *event); + double getMyLower(); + double getMyUpper(); private: QMyCustomPlot *mPlot; @@ -75,6 +79,8 @@ private: QList m_qcpItemLine_List; int m_left_Low_Number; int m_right_Hight_Number; + double m_left_Low_Current; + double m_right_Hight_Current; enum DragMode { DragNone, DragLeft, DragRight, DragRect }; DragMode mDragMode = DragNone; From 401d75ec437c95f4ce0f2504a463841519cad074 Mon Sep 17 00:00:00 2001 From: zhaolei <353719554@qq.com> Date: Mon, 2 Feb 2026 18:16:47 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WellLogUI/src/WellLogTableDialogNew.cpp | 73 +++++-------------------- 1 file changed, 14 insertions(+), 59 deletions(-) diff --git a/WellLogUI/src/WellLogTableDialogNew.cpp b/WellLogUI/src/WellLogTableDialogNew.cpp index 00f4fb4..27e25d1 100644 --- a/WellLogUI/src/WellLogTableDialogNew.cpp +++ b/WellLogUI/src/WellLogTableDialogNew.cpp @@ -186,7 +186,7 @@ void WellLogTableDialogNew::setName(QString strOldPath, QString strOldName, int if (WAVE_OBJECT == m_ObjectType) pWellLog = new CObjWellLogWavefile; if (CURVE_OBJECT == m_ObjectType) - pWellLog = new CObjWellLogTABLE; + pWellLog = new CObjWellLog; pWellLog->SetSlfFileName(strOldPath); pWellLog->m_name = strOldName; m_pWellLogs.clear(); @@ -213,6 +213,15 @@ void WellLogTableDialogNew::InitWell() // m_gridData->initWellData(D_WellData,m_pWell); // } + if (CURVE_OBJECT == m_ObjectType) + { + m_DataTyle=valid_NULL; + m_gridData->initWellLogData(D_WellLogData ,m_pWellLogs); + m_pUI->tableWidget->verticalHeader()->hide();//隐藏左侧系统序号栏 + QShowEvent *evt = new QShowEvent(); + showEvent(evt); + return; + } if (TABLEE_OBJECT == m_ObjectType) { m_gridData->addActonMenu(2); @@ -235,63 +244,11 @@ void WellLogTableDialogNew::InitWell() // swtichViewSize(); return; } - - CLogIO *logio=new CLogIO(); - logio->Open(FileName.toStdString().c_str(),CSlfIO::modeRead); - index=logio->OpenCurve(CurveName.toStdString().c_str()); - if(index<0) { - delete logio; - return; - } - logio->GetCurveInfo(index,&curveinfo); - sdep=curveinfo.StartDepth; - edep=curveinfo.EndDepth; - rlev=curveinfo.DepLevel; - - curDepth=sdep+(edep-sdep)/2.; - - count=(curveinfo.EndDepth-curveinfo.StartDepth)/curveinfo.DepLevel+1.5; - val=new float[count]; - logio->ReadCurve(index,curveinfo.StartDepth,count,&val[0]); - logio->CloseCurve(index); - delete logio; - - // - //清空 - m_pUI->tableWidget->clearContents(); - m_pUI->tableWidget->verticalHeader()->hide();//隐藏左侧系统序号栏 - - //因为tableWidget需要提前规定好行数与列数 - int recordcount = count; //总行数 - m_pUI->tableWidget->setColumnCount(2); - m_pUI->tableWidget->setRowCount(recordcount); //动态设置行数 - - //表头 - QStringList list; - list << "深度" << "数据"; - m_pUI->tableWidget->setHorizontalHeaderLabels(list); - m_pUI->tableWidget->setColumnWidth(0, 200); - m_pUI->tableWidget->setColumnWidth(1, 200); - - for(int i=0; isetFlags(item->flags() & (~Qt::ItemIsEditable)); - m_pUI->tableWidget->setItem(i, 0, item); - - // - QTableWidgetItem* item2 = new QTableWidgetItem(QString::number(vtmp)); - //item2->setFlags(item2->flags() & (~Qt::ItemIsEditable)); - m_pUI->tableWidget->setItem(i, 1, item2); - } } bool WellLogTableDialogNew::InitWellLog() { - if (TABLEE_OBJECT == m_ObjectType || WAVE_OBJECT == m_ObjectType) + if (CURVE_OBJECT == m_ObjectType ||TABLEE_OBJECT == m_ObjectType || WAVE_OBJECT == m_ObjectType) { //表格数据 m_gridData->bindData(); @@ -778,13 +735,12 @@ std::vector WellLogTableDialogNew::InterceptDepthPoints( const SelectMuti bool WellLogTableDialogNew::TableFromCSVFile(QTableWidget *tableWidget) { -// m_gridData->importToFile(); - return true; + return m_gridData->importToFile(); } void WellLogTableDialogNew::showEvent(QShowEvent *evt) { - if(!m_pWellLogs.size()||CURVE_OBJECT == m_ObjectType) + if(!m_pWellLogs.size()) return; QDialog::showEvent(evt); if( (m_pWellLogs[0]->GetTypeID()==GetClassID_WellLog() || @@ -820,8 +776,7 @@ void WellLogTableDialogNew::resizeEvent(QResizeEvent *evt) bool WellLogTableDialogNew::TableToCSVFile(QTableWidget *tableWidget) { - //return m_gridData->tableToCSVFile(); - return true; + return m_gridData->tableToCSVFile(); } void WellLogTableDialogNew::slotVerScrollValueChange(int nValue) From 78e652354c7ca3bd09430a19358f8450b3b26a1d Mon Sep 17 00:00:00 2001 From: zhaolei <353719554@qq.com> Date: Mon, 2 Feb 2026 21:22:26 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E6=B1=89=E5=AD=97=E6=98=BE=E7=A4=BA=E4=B9=B1=E7=A0=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WellLogUI/src/WellLogTableDialogNew.cpp | 3 ++- WellLogUI/src/griddataadapter.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/WellLogUI/src/WellLogTableDialogNew.cpp b/WellLogUI/src/WellLogTableDialogNew.cpp index 27e25d1..6d05c25 100644 --- a/WellLogUI/src/WellLogTableDialogNew.cpp +++ b/WellLogUI/src/WellLogTableDialogNew.cpp @@ -636,7 +636,8 @@ void WellLogTableDialogNew::slotSave() char buf[513]; if(field[j].RepCode == 6 || field[j].Reserved) { - strcpy(buf, mColumn.toStdString().c_str()); + //strcpy(buf, mColumn.toStdString().c_str()); + strcpy(buf, mColumn.toLocal8Bit().data()); logio->SetTableFieldData(iIndex, j, buf, row + 1); } else diff --git a/WellLogUI/src/griddataadapter.cpp b/WellLogUI/src/griddataadapter.cpp index 7d62f4b..49f8078 100644 --- a/WellLogUI/src/griddataadapter.cpp +++ b/WellLogUI/src/griddataadapter.cpp @@ -2775,7 +2775,8 @@ void GridDataAdapter::updatetTableWellLogData() QString Qbug = digDec(/*QString::fromLocal8Bit*/(buf)); lstData<