logplus/logPlus/TransparentDraggableJiegutext.cpp
2026-03-20 18:04:15 +08:00

659 lines
20 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

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

#include "TransparentDraggableJiegutext.h"
#include "PropertyWidget.h"
#include "CallManage.h"
extern double g_dPixelPerCm;//每厘米像素数
//static GeoIndicatorGenerator m_drawGeo;
TransparentDraggableJiegutext::TransparentDraggableJiegutext(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QStringList strTitle)
: QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth)
{
m_strUuid = strUuid;
//
initRect();
}
TransparentDraggableJiegutext::~TransparentDraggableJiegutext()
{
if(mPlot) {
// mPlot->removeItem(mRect);
// mPlot->removeItem(mLeftHandle);
// mPlot->removeItem(mRightHandle);
}
}
//设置最小宽度
void TransparentDraggableJiegutext::setMinWidth(double minWidth)
{
mMinWidth = minWidth;
}
//设置标题
void TransparentDraggableJiegutext::setTitle(QStringList strTitle)
{
// mstrTitle = strTitle;
// iMaxNum=strTitle.size();
// if(iMaxNum>MAX_NUM)
// {
// iMaxNum=MAX_NUM;
// }
// for(int i=0; i<iMaxNum; i++)
// {
// mItemTitle[i] = new QCPItemText(mPlot);
// mItemTitle[i]->setText(mstrTitle[i]);
// //mItemTitle->setBrush(QBrush(Qt::red));
// mItemTitle[i]->setFont(QFont("Arial", 12, QFont::Bold));
// mItemTitle[i]->setColor(Qt::black);
// mItemTitle[i]->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);
// mItemTitle[i]->position->setType(QCPItemPosition::ptPlotCoords);
// //mItemTitle->position->setType(QCPItemPosition::ptAxisRectRatio);
// mItemTitle[i]->position->setCoords(0.5, 0);
// mItemTitle[i]->setLayer("overlay");
// mItemTitle[i]->setRotation(90);//竖直文字
// }
// QPen wPen(Qt::black, 1);
// for(int i=0; i<iMaxNum-1; i++)
// {
// pLine[i] = new QCPItemLine(mPlot);
// pLine[i]->setPen(wPen);
// }
// //mPlot->replot();
}
// 设置矩形范围
void TransparentDraggableJiegutext::setRange(double left_Low, double right_Hight, bool bReplot)
{
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);
float fSpace = (lY2 - lY1)/(float)iMaxNum;
float flNewPos = mPlot->xAxis->coordToPixel((left_Low + right_Hight)/2.0) - 15;
for(int i=0; i<iMaxNum; i++)
{
mItemTitle[i]->position->setCoords(mPlot->xAxis->pixelToCoord(flNewPos),
i*fSpace + 0.5*fSpace); // 设置文本在矩形中心位置
}
//分隔线
for(int i=0; i<iMaxNum-1; i++)
{
pLine[i]->start->setCoords(left_Low, (i+1)*fSpace);
pLine[i]->end->setCoords(right_Hight, (i+1)*fSpace);
}
updateHandles();
//刷新,针对批量修改不在此处刷新,后面统一刷新
if(bReplot)
{
mPlot->replot();
}
}
// 获取当前范围
QCPRange TransparentDraggableJiegutext::getRange()
{
return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x());
}
// 设置矩形颜色
void TransparentDraggableJiegutext::setColor(const QColor &color)
{
mRect->setBrush(QBrush(color));
mRect->setPen(QPen(color.darker()));
//mPlot->replot();
}
// 删除框图
void TransparentDraggableJiegutext::deleteRect()
{
if(mPlot) {
// mRect->deleteLater();
// mLeftHandle->deleteLater();
// mRightHandle->deleteLater();
// mPixmap->deleteLater();
mPlot->m_mapDraggable_Jiegutext.remove(m_strUuid);
mPlot->removeItem(mRect);
mPlot->removeItem(mLeftHandle);
mPlot->removeItem(mRightHandle);
//mPlot->removeItem(mPixmap);
for(int i=0; i<iMaxNum; i++)
{
mPlot->removeItem(mItemTitle[i]);
}
for(int i=0; i<iMaxNum-1; i++)
{
mPlot->removeItem(pLine[i]);
}
//mPlot->replot();
this->deleteLater();
//
// //避免二次绘制框图
// mPlot->m_bDrawRect = false;
// mDragMode = DragNone;
// //取消选中框
// mPlot->selectionRect()->cancel();
// mPlot->replot();
// mPlot->selectionRect()->mActive=true;
}
}
void TransparentDraggableJiegutext::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::black));
mLeftHandle->setPen(QPen(Qt::black));
mRightHandle = new QCPItemRect(mPlot);
mRightHandle->setLayer("overlay");
mRightHandle->setBrush(QBrush(Qt::black));
mRightHandle->setPen(QPen(Qt::black));
// 设置初始位置
//double center = mPlot->xAxis->range().center();
// setRange(center - 10, center + 10);
// 连接鼠标事件
connect(mPlot, &QCustomPlot::mousePress, this, &TransparentDraggableJiegutext::onMousePress);
connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableJiegutext::onMouseMove);
connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableJiegutext::onMouseRelease);
// mPixmap = new QCPItemPixmap(mPlot);
// //mPixmap->setPixmap(QPixmap(":/image/file.png")); // 设置图片
// mPixmap->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式
// mPixmap->setLayer("overlay"); // 确保在最上层
iMaxNum=mstrTitle.size();
if(iMaxNum>MAX_NUM)
{
iMaxNum=MAX_NUM;
}
for(int i=0; i<iMaxNum; i++)
{
mItemTitle[i] = new QCPItemText(mPlot);
mItemTitle[i]->setText(mstrTitle[i]);
//mItemTitle->setBrush(QBrush(Qt::red));
mItemTitle[i]->setFont(QFont("Arial", 12, QFont::Bold));
mItemTitle[i]->setColor(Qt::black);
mItemTitle[i]->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);
mItemTitle[i]->position->setType(QCPItemPosition::ptPlotCoords);
//mItemTitle->position->setType(QCPItemPosition::ptAxisRectRatio);
mItemTitle[i]->position->setCoords(0.5, 0);
mItemTitle[i]->setLayer("overlay");
mItemTitle[i]->setRotation(90);//竖直文字
}
QPen wPen(Qt::black, 1);
for(int i=0; i<iMaxNum-1; i++)
{
pLine[i] = new QCPItemLine(mPlot);
pLine[i]->setPen(wPen);
}
}
void TransparentDraggableJiegutext::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 TransparentDraggableJiegutext::onDelRect()
{
//删除框图
deleteRect();
mPlot->replot();
//保存
mPlot->SaveToSLF_Jiegutext();
//属性清空
PropertyService()->InitCurrentViewInfo();
}
//设置深度移动量
void TransparentDraggableJiegutext::setItemDepthOffset()
{
bool ok=0;
double depthshift=QInputDialog::getDouble(NULL,"深度移动","请输入移动的深度量(上移-,下移+)",0.0,-2147483647, 2147483647,4,&ok);
if(!ok) return;
QCPRange currentRange = getRange();
QCPRange newRange = currentRange;
newRange.lower = currentRange.lower-depthshift;
newRange.upper = currentRange.upper-depthshift;
//
double width = currentRange.size();
// //double center = mDragStartRange.center() + dx;
// double center = currentRange.center() - depthshift;
// newRange.lower = center - width/2;
// newRange.upper = center + width/2;
// 检查是否超出轴范围
if(newRange.lower < getMyLower()) {
return;
}
else if(newRange.upper > getMyUpper()) {
return;
}
//
setRange(newRange.lower, newRange.upper);
{
// double low = mRect->topLeft->coords().x();
// double hight = mRect->bottomRight->coords().x();
// PropertyService()->initGujingItemProperty(this, low, hight, m_Result);
//保存
mPlot->SaveToSLF_Jiegutext();
//重新加载数据
this->ReLoadValues();
//属性清空
PropertyService()->InitCurrentViewInfo();
//取消所有选中单元格
emit CallManage::getInstance()->sig_Raise(mPlot->m_strUuid, "", "", "", "", 0, "");
}
}
void TransparentDraggableJiegutext::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();
double low = mRect->topLeft->coords().x();
double hight = mRect->bottomRight->coords().x();
PropertyService()->initJiegutextItemProperty(this, low, hight);
QMenu menu(nullptr);
menu.addAction(QIcon(::GetImagePath() + "icon/Delete.png"), "删除选中对象", this, &TransparentDraggableJiegutext::onDelRect);
menu.addAction(QIcon(::GetImagePath() + "icon/Shift.png"), "设置深度移动量", this, &TransparentDraggableJiegutext::setItemDepthOffset);
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;
}
int TransparentDraggableJiegutext::getCursor()
{
if (m_bMoveRect)
{
return 2;
}
if (m_bArrow)
{
return 1;
}
return 0;
}
void TransparentDraggableJiegutext::onMouseMove(QMouseEvent *event)
{
if (mDragMode == DragRect)
{
m_bMoveRect = true;
}
else if (mLeftHandle->selectTest(event->pos(), false) < 5
|| mRightHandle->selectTest(event->pos(), false) < 5)
{
m_bArrow = true;
m_bMoveRect = false;
}
else
{
m_bArrow = false;
m_bMoveRect = false;
}
//--------------------
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;
}
}
}
//位置改变鼠标拖动item
if(newRange.lower!= mDragStartRange.lower || newRange.upper!= mDragStartRange.upper)
{
m_bChange = true;
}
setRange(newRange.lower, newRange.upper);
}
//设置顶深
void TransparentDraggableJiegutext::setUpper(double upper)
{
QCPRange currentRange = getRange();
QCPRange newRange = currentRange;
double proposedRight = upper;
// 确保不超出轴范围且不使宽度小于最小值
newRange.upper = qBound(
currentRange.lower + mMinWidth,
proposedRight,
getMyUpper());
// 最终确保宽度不小于最小值(针对整体拖动的情况)
if(newRange.size() < mMinWidth) {
newRange.upper = newRange.lower + mMinWidth;
}
setRange(newRange.lower, newRange.upper);
}
//设置底深
void TransparentDraggableJiegutext::setLower(double lower)
{
QCPRange currentRange = getRange();
QCPRange newRange = currentRange;
double proposedLeft = lower;
// 确保不超出轴范围且不使宽度小于最小值
newRange.lower = qBound(
getMyLower(),
proposedLeft,
currentRange.upper - mMinWidth);
// 最终确保宽度不小于最小值(针对整体拖动的情况)
if(newRange.size() < mMinWidth) {
// 如果是边界拖动,强制设置最小宽度
newRange.lower = newRange.upper - mMinWidth;
}
setRange(newRange.lower, newRange.upper);
}
//重新加载数据
void TransparentDraggableJiegutext::ReLoadValues()
{
//
FormInfo* pInfo = mPlot->m_formTrack->getFormInfoByParameters(mPlot->m_strUuid, mPlot->m_strWellName, mPlot->m_strTrackName, mPlot->m_strLineName);
if (pInfo == NULL)
{
return;
}
//
QCPRange tmpRange = getRange();
QString strAliasName = pInfo->m_strAliasName;
QStringList listAliasName = strAliasName.split("/");//QString字符串分割函数
if(listAliasName.contains("SDEP") || listAliasName.contains("EDEP"))
{
for(int i=0; i<listAliasName.size(); i++)
{
if(listAliasName[i]=="SDEP")
{
mstrTitle[i] = QString::number(-tmpRange.upper);
mItemTitle[i]->setText(mstrTitle[i]);
}
else if(listAliasName[i]=="EDEP")
{
mstrTitle[i] = QString::number(-tmpRange.lower);
mItemTitle[i]->setText(mstrTitle[i]);
}
}
mPlot->replot();
}
}
void TransparentDraggableJiegutext::onMouseRelease(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton && mDragMode != DragNone) {
event->accept();
//属性
{
double low = mRect->topLeft->coords().x();
double hight = mRect->bottomRight->coords().x();
PropertyService()->initJiegutextItemProperty(this, low, hight);
if(m_bChange)
{
//保存
mPlot->SaveToSLF_Jiegutext();
}
//重新加载数据
this->ReLoadValues();
//取消所有选中单元格
emit CallManage::getInstance()->sig_Raise(mPlot->m_strUuid, "", "", "", "", 0, "");
}
//避免二次绘制框图
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 TransparentDraggableJiegutext::getMyLower()
{
double dLower = mPlot->xAxis->range().lower;
double proposedLeft = mDragStartRange.lower;
TransparentDraggableJiegutext *pDraggableRect =NULL;
{
QMap<QString,QObject *>::Iterator it = mPlot->m_mapDraggable_Jiegutext.begin();
while( it != mPlot->m_mapDraggable_Jiegutext.end() )
{
if(it.key() == m_strUuid)
{
it++;
continue;
}
pDraggableRect = (TransparentDraggableJiegutext*)it.value();
//
QCPRange tmpRange = pDraggableRect->getRange();
if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft)
{
dLower = tmpRange.upper;
}
it++;
}
}
return dLower;
}
double TransparentDraggableJiegutext::getMyUpper()
{
double dUpper = mPlot->xAxis->range().upper;
double proposedRight = mDragStartRange.upper;
TransparentDraggableJiegutext *pDraggableRect =NULL;
{
QMap<QString,QObject *>::Iterator it = mPlot->m_mapDraggable_Jiegutext.begin();
while( it != mPlot->m_mapDraggable_Jiegutext.end() )
{
if(it.key() == m_strUuid)
{
it++;
continue;
}
pDraggableRect = (TransparentDraggableJiegutext*)it.value();
//
QCPRange tmpRange = pDraggableRect->getRange();
if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight)
{
dUpper = tmpRange.lower;
}
it++;
}
}
return dUpper;
}