解释结论道右键菜单,开始编辑解释结论,关闭编辑解释结论,从剪切板文本数据粘贴,分割为层内层,分割为独立层,拆分复合层成独立层,更新层号等菜单

This commit is contained in:
DESKTOP-450PEFP\mainc 2026-03-13 22:31:28 +08:00
parent 912bcdc996
commit 746166482a
6 changed files with 611 additions and 43 deletions

View File

@ -245,26 +245,27 @@ QString TransparentDraggableResult::getResult()
return m_Result; return m_Result;
} }
QString TransparentDraggableResult::getUuid()
{
return m_strUuid;
}
// 删除框图 // 删除框图
void TransparentDraggableResult::deleteRect() void TransparentDraggableResult::deleteRect(bool breplot)
{ {
if(mPlot) { if(mPlot) {
// mRect->deleteLater();
// mLeftHandle->deleteLater();
// mRightHandle->deleteLater();
// mPixmap->deleteLater();
mPlot->m_mapDraggable_Result.remove(m_strUuid); mPlot->m_mapDraggable_Result.remove(m_strUuid);
mPlot->removeItem(mRect); mPlot->removeItem(mRect);
if (mLeftHandle) if (mLeftHandle)
mPlot->removeItem(mLeftHandle); mPlot->removeItem(mLeftHandle);
//mPlot->removeItem(mRightHandle); if (mRightHandle)
mPlot->removeItem(mRightHandle);
mPlot->removeItem(mPixmap); mPlot->removeItem(mPixmap);
mPlot->removeItem(mItemTitle); mPlot->removeItem(mItemTitle);
mPlot->replot(); if (breplot)
mPlot->replot();
this->deleteLater(); this->deleteLater();
// //
@ -299,6 +300,16 @@ QCPItemRect * TransparentDraggableResult::getLeftHandle()
return mLeftHandle; return mLeftHandle;
} }
void TransparentDraggableResult::setUpResult(TransparentDraggableResult* pUp)
{
m_upDraggableResult = pUp;
//将自己设置为上方rect的下方
if (m_upDraggableResult)
{
m_upDraggableResult->m_downDraggableResult = this;
}
}
TransparentDraggableResult* TransparentDraggableResult::getUpResult() TransparentDraggableResult* TransparentDraggableResult::getUpResult()
{ {
return m_upDraggableResult; return m_upDraggableResult;
@ -406,6 +417,9 @@ void TransparentDraggableResult::onDelRect()
void TransparentDraggableResult::onMousePress(QMouseEvent *event) void TransparentDraggableResult::onMousePress(QMouseEvent *event)
{ {
event->ignore();
if (!mPlot->getIsEditor())
return;
// //右键 // //右键
// if(event->button() != Qt::LeftButton) // if(event->button() != Qt::LeftButton)
// { // {
@ -496,8 +510,6 @@ void TransparentDraggableResult::onMousePress(QMouseEvent *event)
m_downDraggableResult->mDragStartRange = m_downDraggableResult->getRange(); m_downDraggableResult->mDragStartRange = m_downDraggableResult->getRange();
} }
} }
event->ignore();
} }
void TransparentDraggableResult::onMouseMove_in(QMouseEvent *event) void TransparentDraggableResult::onMouseMove_in(QMouseEvent *event)
@ -647,6 +659,8 @@ void TransparentDraggableResult::onMouseMove(QMouseEvent *event)
event->accept(); event->accept();
if (!mPlot->getIsEditor())
return;
onMouseMove_in(event); onMouseMove_in(event);
//后面统一刷新上方和下方rect //后面统一刷新上方和下方rect
@ -676,7 +690,8 @@ void TransparentDraggableResult::onMouseRelease_in(QMouseEvent *event)
void TransparentDraggableResult::onMouseRelease(QMouseEvent *event) void TransparentDraggableResult::onMouseRelease(QMouseEvent *event)
{ {
if (!mPlot->getIsEditor())
return;
if(event->button() == Qt::LeftButton && mDragMode != DragNone) { if(event->button() == Qt::LeftButton && mDragMode != DragNone) {
if (mDragRect->visible()) if (mDragRect->visible())

View File

@ -45,13 +45,17 @@ public:
void setColor(const QColor &color); void setColor(const QColor &color);
QString getResult(); QString getResult();
// 获取Uuid
QString getUuid();
// 删除框图 // 删除框图
void deleteRect(); void deleteRect(bool breplot = true);
void setSelectRect(bool bselect); void setSelectRect(bool bselect);
QCPItemRect * getLeftHandle(); QCPItemRect * getLeftHandle();
void setUpResult(TransparentDraggableResult* pUp);
TransparentDraggableResult* getUpResult(); TransparentDraggableResult* getUpResult();
signals: signals:
void rangeChanged(QCPRange newRange); void rangeChanged(QCPRange newRange);
@ -78,12 +82,12 @@ private:
QMyCustomPlot *mPlot; QMyCustomPlot *mPlot;
QCPItemRect *mRect; QCPItemRect *mRect;
QCPItemRect *mLeftHandle = NULL; QCPItemRect *mLeftHandle = NULL;
QCPItemRect *mRightHandle; QCPItemRect *mRightHandle = NULL;
QCPItemRect *mDragRect; QCPItemRect *mDragRect = NULL;
QCPItemPixmap *mPixmap; QCPItemPixmap *mPixmap = NULL;
QCPItemText *mItemTitle; QCPItemText *mItemTitle = NULL;
QString mstrTitle=""; QString mstrTitle="";
QString m_strUuid = ""; QString m_strUuid = "";

View File

@ -22,7 +22,7 @@ TransparentGroupResult::~TransparentGroupResult()
} }
} }
void TransparentGroupResult::addResultToPlot(double left_Low, double right_Hight, QString myResult, QString &strUuid) void TransparentGroupResult::addResultToPlot(double left_Low, double right_Hight, QString myResult, QString &strUuid, int ninsertIdx)
{ {
//获取上方Rect //获取上方Rect
TransparentDraggableResult *upDragRect = nullptr; TransparentDraggableResult *upDragRect = nullptr;
@ -46,7 +46,22 @@ void TransparentGroupResult::addResultToPlot(double left_Low, double right_Hight
dragRect->setMinWidth(0.1); dragRect->setMinWidth(0.1);
//dragRect->setTitle(strText); //dragRect->setTitle(strText);
m_vecResult << strUuid; if (ninsertIdx < 0)
m_vecResult << strUuid;
else
{
// 插入设置上下Result
int newIdx = ninsertIdx + 1;
if (newIdx < m_vecResult.size())
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(newIdx)));
if (pret)
{
pret->setUpResult(dragRect);
}
}
m_vecResult.insert(newIdx, strUuid);
}
m_mapDraggable_Result[strUuid] = dragRect; m_mapDraggable_Result[strUuid] = dragRect;
} }
@ -124,6 +139,21 @@ void TransparentGroupResult::addAllResultToPlot(LAYER_DATA* pResult)
} }
void TransparentGroupResult::removeAllResult()
{
mPlot->m_mapDragGroup.remove(m_strUuid);
for (int i = 0; i < m_vecResult.size(); i++)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(i)));
if (pret == NULL)
continue;
pret->deleteRect(false);
}
m_vecResult.clear();
m_mapDraggable_Result.clear();
this->deleteRect();
}
//设置最小宽度 //设置最小宽度
void TransparentGroupResult::setMinWidth(double minWidth) void TransparentGroupResult::setMinWidth(double minWidth)
{ {
@ -401,6 +431,7 @@ void TransparentGroupResult::deleteRect()
mPlot->removeItem(mLeftHandle); mPlot->removeItem(mLeftHandle);
mPlot->removeItem(mRightHandle); mPlot->removeItem(mRightHandle);
mPlot->removeItem(mItemTitle); mPlot->removeItem(mItemTitle);
mPlot->removeItem(mDragLine);
mPlot->replot(); mPlot->replot();
this->deleteLater(); this->deleteLater();
@ -411,6 +442,7 @@ void TransparentGroupResult::deleteRect()
void TransparentGroupResult::setSelectRect(bool bselect) void TransparentGroupResult::setSelectRect(bool bselect)
{ {
m_bSelect = bselect;
if (bselect) if (bselect)
{ {
mRect->setBrush(QColor(255, 0, 0, 80)); mRect->setBrush(QColor(255, 0, 0, 80));
@ -424,6 +456,93 @@ void TransparentGroupResult::setSelectRect(bool bselect)
mPlot->replot(); mPlot->replot();
} }
bool TransparentGroupResult::getSelect()
{
return m_bSelect;
}
int TransparentGroupResult::getDraggableResultIndex(double depth)
{
int nidx = -1;
// 根据depth获取当前深度的DraggableResult索引
// upper---- 上
// lower---- 下
TransparentDraggableResult* pDret = NULL;
for (int i = 0; i < m_vecResult.size(); i++)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(i)));
if (pret == NULL)
continue;
QCPRange rg = pret->getRange();
if (depth <= rg.upper && depth >= rg.lower)
{
nidx = i;
pDret = pret;
break;
}
}
return nidx;
}
void TransparentGroupResult::segmentationInnerLayer(double depth)
{
// 根据depth获取当前深度的DraggableResult索引
// upper---- 上
// lower---- 下
int nidx = this->getDraggableResultIndex(depth);
if (nidx < 0)
return;
TransparentDraggableResult* pDret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(nidx)));
if (pDret == NULL)
return;
QCPRange rg = pDret->getRange();
// 分割层内层修改下边界坐标
pDret->setRange(depth, rg.upper);
QString strUuid = pDret->getUuid();
// 新增层
this->addResultToPlot(rg.lower, depth, ::GetOilSymbolDir() + "油层.svg", strUuid, nidx);
mPlot->replot();
}
void TransparentGroupResult::segmentationIndependentLayer(double depth)
{
int nidx = -1;
// 根据depth获取当前深度的DraggableResult索引
// upper---- 上
// lower---- 下
TransparentDraggableResult* pDret = NULL;
for (int i = 0; i < m_vecResult.size(); i++)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(i)));
if (pret == NULL)
continue;
QCPRange rg = pret->getRange();
if (depth <= rg.upper && depth >= rg.lower)
{
nidx = i;
pDret = pret;
break;
}
}
if (nidx < 0 || pDret == NULL)
return;
}
void TransparentGroupResult::splitIndependentLayer()
{
for (int i = 0; i < m_vecResult.size(); i++)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(i)));
if (pret == NULL)
continue;
QCPRange rg = pret->getRange();
QString strUuid = "";
TransparentGroupResult* pNew = mPlot->addResultGroup(rg.lower, rg.upper, strUuid);
pNew->addResultToPlot(rg.lower, rg.upper, pret->getResult(), strUuid);
}
}
int TransparentGroupResult::getCursor() int TransparentGroupResult::getCursor()
{ {
if (m_bMoveRect) if (m_bMoveRect)
@ -468,6 +587,16 @@ QString TransparentGroupResult::getOilGasDepth(int nidx)
return QString("%1").arg(-pDrag->getRange().upper); return QString("%1").arg(-pDrag->getRange().upper);
} }
const QVector<QString>& TransparentGroupResult::getVecResult()
{
return m_vecResult;
}
const QMap<QString, QObject*>& TransparentGroupResult::getMapDraggable_Result()
{
return m_mapDraggable_Result;
}
void TransparentGroupResult::initRect() void TransparentGroupResult::initRect()
{ {
// 创建透明矩形 // 创建透明矩形
@ -567,6 +696,8 @@ void TransparentGroupResult::onDelRect()
void TransparentGroupResult::onMousePress(QMouseEvent *event) void TransparentGroupResult::onMousePress(QMouseEvent *event)
{ {
event->accept(); event->accept();
if (!mPlot->getIsEditor())
return;
if (event->button() == Qt::LeftButton) if (event->button() == Qt::LeftButton)
{ {
@ -683,6 +814,8 @@ void TransparentGroupResult::onMouseMove_in(QMouseEvent *event)
void TransparentGroupResult::onMouseMove(QMouseEvent *event) void TransparentGroupResult::onMouseMove(QMouseEvent *event)
{ {
if (!mPlot->getIsEditor())
return;
if (mDragMode == DragRect) if (mDragMode == DragRect)
{ {
m_bMoveRect = true; m_bMoveRect = true;
@ -724,7 +857,8 @@ void TransparentGroupResult::onMouseRelease_in(QMouseEvent *event)
void TransparentGroupResult::onMouseRelease(QMouseEvent *event) void TransparentGroupResult::onMouseRelease(QMouseEvent *event)
{ {
if (!mPlot->getIsEditor())
return;
if(event->button() == Qt::LeftButton && mDragMode != DragNone) { if(event->button() == Qt::LeftButton && mDragMode != DragNone) {
{ {
double low = mRect->topLeft->coords().x(); double low = mRect->topLeft->coords().x();

View File

@ -21,12 +21,14 @@ public:
enum DragMode { DragNone, DragLeft, DragRight, DragItem, DragRect }; enum DragMode { DragNone, DragLeft, DragRight, DragItem, DragRect };
void addResultToPlot(double left_Low, double right_Hight, QString myResult, QString &strUuid); void addResultToPlot(double left_Low, double right_Hight, QString myResult, QString &strUuid, int ninsertIdx = -1);
QString getIconName(const QMap<QString, QString>& zoneOrder, const QString& result_str, int nidx, double dMDepth); QString getIconName(const QMap<QString, QString>& zoneOrder, const QString& result_str, int nidx, double dMDepth);
void addAllResultToPlot(LAYER_DATA* pResult); void addAllResultToPlot(LAYER_DATA* pResult);
void removeAllResult();
//设置最小宽度 //设置最小宽度
void setMinWidth(double minWidth); void setMinWidth(double minWidth);
//设置标题 //设置标题
@ -68,6 +70,17 @@ public:
void deleteRect(); void deleteRect();
void setSelectRect(bool bselect); void setSelectRect(bool bselect);
// 获取选定状态
bool getSelect();
// 获取组内解释结论索引
int getDraggableResultIndex(double depth);
// 层内层
void segmentationInnerLayer(double depth);
// 分割为独立层
void segmentationIndependentLayer(double depth);
// 拆分复合层成独立层
void splitIndependentLayer();
int getCursor(); int getCursor();
@ -76,6 +89,9 @@ public:
// 获取分段点深度 // 获取分段点深度
QString getOilGasDepth(int nidx); QString getOilGasDepth(int nidx);
const QVector<QString>& getVecResult();
const QMap<QString, QObject*>& getMapDraggable_Result();
signals: signals:
void rangeChanged(QCPRange newRange); void rangeChanged(QCPRange newRange);
@ -114,6 +130,8 @@ private:
QString m_Result; QString m_Result;
QString m_Remark=""; QString m_Remark="";
bool m_bSelect = false;
DragMode mDragMode = DragNone; DragMode mDragMode = DragNone;
//double mDragStartX = 0; //double mDragStartX = 0;
double mDragStartY = 0; double mDragStartY = 0;

View File

@ -63,6 +63,7 @@ QMyCustomPlot::QMyCustomPlot(QWidget *parent, QString strSlfName, QString strWel
xAxis2->setTickLabels(false); xAxis2->setTickLabels(false);
yAxis2->setTickLabels(false); yAxis2->setTickLabels(false);
connect(this->selectionRect(), &QCPSelectionRect::accepted, this, &QMyCustomPlot::slotSelectionRectAccepted);
// make bottom and left axes transfer their ranges to top and right axes: // make bottom and left axes transfer their ranges to top and right axes:
connect(xAxis, SIGNAL(rangeChanged(QCPRange)), xAxis2, SLOT(setRange(QCPRange))); connect(xAxis, SIGNAL(rangeChanged(QCPRange)), xAxis2, SLOT(setRange(QCPRange)));
connect(yAxis, SIGNAL(rangeChanged(QCPRange)), yAxis2, SLOT(setRange(QCPRange))); connect(yAxis, SIGNAL(rangeChanged(QCPRange)), yAxis2, SLOT(setRange(QCPRange)));
@ -704,6 +705,23 @@ void QMyCustomPlot::init(QString strName, QVector<double> xx, QVector<double> yy
//raise(); //置于上层显示 //raise(); //置于上层显示
} }
void QMyCustomPlot::mouseDoubleClickEvent(QMouseEvent *event)
{
// 检查是否是左键双击
if (event->button() == Qt::LeftButton) {
//qDebug() << "左键双击发生!";
// 在这里添加你的双击处理逻辑
m_bEditor = true;
// 接受事件
event->accept();
}
else {
// 其他按钮的双击交给基类处理
QWidget::mouseDoubleClickEvent(event);
}
}
//void QMyCustomPlot::mousePressEvent(QMouseEvent *event) //void QMyCustomPlot::mousePressEvent(QMouseEvent *event)
//{ //{
// //qDebug() << "mousePress"; // //qDebug() << "mousePress";
@ -712,19 +730,50 @@ void QMyCustomPlot::init(QString strName, QVector<double> xx, QVector<double> yy
void QMyCustomPlot::mousePressEvent(QMouseEvent *event) void QMyCustomPlot::mousePressEvent(QMouseEvent *event)
{ {
// if (event->button() == Qt::LeftButton) { if (event->button() == Qt::LeftButton)
{
if (m_strLineName == "RESULT")
{
if (m_bEditor)
{
//获取鼠标点位置
double y_pos = event->pos().y();
//转为图像位置
double x_val = xAxis->pixelToCoord(y_pos);
mMousePress = true;
// if (auto *item = itemAt(event->pos(), true)) { QObjectList objList = m_mapDragGroup.values();
// emit mousePress(event); // 由于我们直接返回了,所以要负责将鼠标点击信号发送出去 for (int i = 0; i < objList.size(); i++)
{
// // deselectAll(); TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(objList.at(i));
// mMousePress = true; if (pGroup == nullptr)
// mLastPos = event->pos(); continue;
// item->setSelected(true); QCPRange rg = pGroup->getRange();
// replot(); if (x_val <= rg.upper && x_val >= rg.lower)
// return; // 如果点击的是一个item直接返回不然QCustomPlot会把事件传递给其它的层对象例如轴矩形 {
// } mMousePress = false;
// } break;
}
}
if (mMousePress)
{
m_dPressX = x_val;
if (m_pAddLine1 == NULL)
{
m_pAddLine1 = new QCPItemStraightLine(this);
m_pAddLine1->setPen(QPen(Qt::red, 1, Qt::DashDotDotLine));
m_pAddLine1->setVisible(false);
}
if (m_pAddLine2 == NULL)
{
m_pAddLine2 = new QCPItemStraightLine(this);
m_pAddLine2->setPen(QPen(Qt::red, 1, Qt::DashDotDotLine));
m_pAddLine2->setVisible(false);
}
}
}
}
}
if(m_bDrawCore_PHYSICS)//岩心分析 if(m_bDrawCore_PHYSICS)//岩心分析
{ {
@ -778,6 +827,28 @@ void QMyCustomPlot::mousePressEvent(QMouseEvent *event)
void QMyCustomPlot::mouseMoveEvent(QMouseEvent *event) void QMyCustomPlot::mouseMoveEvent(QMouseEvent *event)
{ {
if (m_strLineName == "RESULT")
{
if (mMousePress)
{
//获取鼠标点位置
double y_pos = event->pos().y();
//转为图像位置
double x_val = xAxis->pixelToCoord(y_pos);
double absval = abs(abs(m_dPressX) - abs(x_val));
if (absval > 0.5 && !m_pAddLine1->visible())
{
m_pAddLine1->setVisible(true);
m_pAddLine1->point1->setCoords(m_dPressX, 0);
m_pAddLine1->point2->setCoords(m_dPressX, 1);
m_pAddLine2->setVisible(true);
}
m_pAddLine2->point1->setCoords(x_val, 0);
m_pAddLine2->point2->setCoords(x_val, 1);
replot();
}
}
QCustomPlot::mouseMoveEvent(event); QCustomPlot::mouseMoveEvent(event);
int nmaxCursor = 0; int nmaxCursor = 0;
@ -925,15 +996,25 @@ void QMyCustomPlot::mouseMoveEvent(QMouseEvent *event)
void QMyCustomPlot::mouseReleaseEvent(QMouseEvent *event) void QMyCustomPlot::mouseReleaseEvent(QMouseEvent *event)
{ {
// if (mMousePress) { if (m_strLineName == "RESULT")
// mMousePress = false; {
// if (auto *item = itemAt(event->pos(), true)) { if (mMousePress)
// emit mouseReleaseEvent(event); // 由于我们直接返回了,所以要负责将鼠标点击信号发送出去 {
// item->setSelected(false); //获取鼠标点位置
// replot(); double y_pos = event->pos().y();
// return; //转为图像位置
// } double x_val = xAxis->pixelToCoord(y_pos);
// } double absval = abs(abs(m_dPressX) - abs(x_val));
if (absval < 0.4)
{
mMousePress = false;
m_pAddLine1->setVisible(false);
m_pAddLine2->setVisible(false);
replot();
}
}
}
if(m_bDrawCore_PHYSICS)//岩心分析 if(m_bDrawCore_PHYSICS)//岩心分析
{ {
@ -998,6 +1079,55 @@ void QMyCustomPlot::executeSingle(QMouseEvent *event)
} }
} }
void QMyCustomPlot::slotSelectionRectAccepted(const QRect &rect, QMouseEvent *event)
{
if ("RESULT" == m_strLineName)
{
if (!mMousePress)
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); //下边界
bool bAdd = true;
QObjectList objList = m_mapDragGroup.values();
for (int i = 0; i < objList.size(); i++)
{
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(objList.at(i));
if (pGroup == nullptr)
continue;
QCPRange rg = pGroup->getRange();
if (right_Hight <= rg.upper && right_Hight >= rg.lower
|| left_Low <= rg.upper && left_Low >= rg.lower)
{
bAdd = false;
break;
}
}
if (bAdd)
{
QString strUp = "";
TransparentGroupResult* pGroup = this->addResultGroup(left_Low, right_Hight, strUp, "");
strUp = "";
pGroup->addResultToPlot(left_Low, right_Hight, ::GetOilSymbolDir() + "油层.svg", strUp);
}
mMousePress = false;
m_pAddLine1->setVisible(false);
m_pAddLine2->setVisible(false);
replot();
}
}
//槽函数,选中曲线 //槽函数,选中曲线
void QMyCustomPlot::s_LineClicked(int index) void QMyCustomPlot::s_LineClicked(int index)
{ {
@ -1095,6 +1225,32 @@ void QMyCustomPlot::contextMenuEvent(QContextMenuEvent *event)
menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "刷新数据", this, &QMyCustomPlot::RefreshItems_Layer); menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "刷新数据", this, &QMyCustomPlot::RefreshItems_Layer);
menu.exec(event->globalPos()); menu.exec(event->globalPos());
} }
else if (m_strLineName == "RESULT") // 解释结论
{
QMenu menu(this);
if (!m_bEditor)
{
menu.addAction(QIcon(::GetImagePath() + "curve.png"), "开始编辑解释结论", this, &QMyCustomPlot::onOpenEditResult);
}
else
{
mLastPos = event->pos();
qDebug() << "mLastPos:" << mLastPos;
menu.addAction(QIcon(::GetImagePath() + "curve.png"), "关闭编辑解释结论", this, &QMyCustomPlot::onCloseEditResult);
menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "从剪切板文本数据粘贴", this, &QMyCustomPlot::addItems_Layer);
menu.addAction(QIcon(::GetImagePath() + "icon/ClearSelectCore.png"), "取消选中", this, &QMyCustomPlot::ClearSelectItems);
menu.addAction(QIcon(::GetImagePath() + "icon/Delete.png"), "删除选中对象", this, &QMyCustomPlot::DeleteItemGroup);
menu.addAction(QIcon(::GetImagePath() + "icon/Delete.png"), "全部清空", this, &QMyCustomPlot::DeleteItems_Layer);
menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "刷新数据", this, &QMyCustomPlot::RefreshItems_Layer);
menu.addAction(QIcon(::GetImagePath() + "icon/SetZone.png"), "更新层号", this, &QMyCustomPlot::updateGroupZone);
menu.addAction(QIcon(::GetImagePath() + "icon/Split.png"), "分割为层内层", this, &QMyCustomPlot::segmentationInnerLayer);
menu.addAction(QIcon(::GetImagePath() + "icon/Split.png"), "分割为独立层", this, &QMyCustomPlot::segmentationIndependentLayer);
menu.addAction(QIcon(::GetImagePath() + "icon/Split.png"), "拆分复合层成独立层", this, &QMyCustomPlot::splitIndependentLayer);
}
menu.exec(event->globalPos());
}
else if (m_strLineName == "IMAGE_DATA") else if (m_strLineName == "IMAGE_DATA")
{ {
QMenu menu(this); QMenu menu(this);
@ -4295,7 +4451,7 @@ TransparentGroupResult* QMyCustomPlot::addResultGroup(double left_Low, double ri
TransparentGroupResult *upGroup = nullptr; TransparentGroupResult *upGroup = nullptr;
if (strUuid != "") if (strUuid != "")
{ {
upGroup = (TransparentGroupResult *)m_mapDragGroup[strUuid]; upGroup = (TransparentGroupResult *)m_mapDragGroup.value(strUuid);
} }
strUuid = getUUid(); strUuid = getUUid();
@ -6691,3 +6847,223 @@ void QMyCustomPlot::RefreshItems_Jiegutext()
PropertyService()->InitCurrentViewInfo(); PropertyService()->InitCurrentViewInfo();
} }
void QMyCustomPlot::onOpenEditResult()
{
m_bEditor = true;
this->selectionRect()->setPen(Qt::NoPen);
this->setInteractions(QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables | QCP::iMultiSelect); // 轴、图例、图表可以被选择,并且是多选的方式
this->setSelectionRectMode(QCP::srmSelect); // 鼠标框选
}
void QMyCustomPlot::onCloseEditResult()
{
ClearSelectItems();
m_bEditor = false;
//取消框选
this->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables);
this->setSelectionRectMode(QCP::srmNone);
}
void QMyCustomPlot::DeleteItemGroup()
{
if (m_strLineName == "RESULT")
{
QStringList listRemove;
QMap<QString, QObject*>::iterator it = m_mapDragGroup.begin();
for (; it != m_mapDragGroup.end(); ++it)
{
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(it.value());
if (pGroup == nullptr)
continue;
if (pGroup->getSelect())
listRemove << it.key();
}
for (int i = 0; i < listRemove.size(); i++)
{
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(m_mapDragGroup.value(listRemove.at(i)));
if (pGroup == nullptr)
continue;
pGroup->removeAllResult();
}
}
}
void QMyCustomPlot::updateGroupZone()
{
QMap<double, QString> mapSort;
QMap<QString, QObject*>::iterator it = m_mapDragGroup.begin();
for (; it != m_mapDragGroup.end(); ++it)
{
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(it.value());
if (pGroup == nullptr)
continue;
mapSort.insert(pGroup->getRange().upper, it.key());
}
int nZid = 1;
QList<double> listkey = mapSort.keys();
for (int i = listkey.size() - 1; i >= 0; i--)
{
QString skey = mapSort.value(listkey.at(i));
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(m_mapDragGroup.value(skey));
if (pGroup == nullptr)
continue;
pGroup->setTitle(QString::number(nZid));
nZid++;
}
this->replot();
}
TransparentGroupResult* QMyCustomPlot::getCurGroupResult(double x_val)
{
TransparentGroupResult *pClickGroup = NULL;
QObjectList objList = m_mapDragGroup.values();
for (int i = 0; i < objList.size(); i++)
{
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(objList.at(i));
if (pGroup == nullptr)
continue;
QCPRange rg = pGroup->getRange();
if (x_val <= rg.upper && x_val >= rg.lower)
{
pClickGroup = pGroup;
break;
}
}
return pClickGroup;
}
void QMyCustomPlot::segmentationInnerLayer()
{
//获取鼠标点位置
double y_pos = mLastPos.y();
//转为图像位置
double x_val = xAxis->pixelToCoord(y_pos);
// 获取当前点击的解释结论组
TransparentGroupResult *pClickGroup = getCurGroupResult(x_val);
if (pClickGroup == NULL)
return;
pClickGroup->segmentationInnerLayer(x_val);
}
void QMyCustomPlot::segmentationIndependentLayer()
{
//获取鼠标点位置
double y_pos = mLastPos.y();
//转为图像位置
double x_val = xAxis->pixelToCoord(y_pos);
// 获取当前点击的解释结论组
TransparentGroupResult *pClickGroup = getCurGroupResult(x_val);
if (pClickGroup == NULL)
return;
int nidx = pClickGroup->getDraggableResultIndex(x_val);
if (nidx < 0)
return;
double dupper;
double dlower;
const QVector<QString>& vec = pClickGroup->getVecResult();
const QMap<QString, QObject*>& mapResult = pClickGroup->getMapDraggable_Result();
QVector<QPair<QCPRange, QString>> g1;
for (int i = 0; i <= nidx; i++)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(mapResult.value(vec.at(i)));
if (pret == NULL)
continue;
QCPRange rg = pret->getRange();
if (i == 0)
dupper = rg.upper;
if (i == nidx)
{
dlower = x_val;
rg.lower = x_val;
g1 << qMakePair(rg, pret->getResult());
}
else
{
g1 << qMakePair(rg, pret->getResult());
}
}
QString strUuid = "";
if (g1.size() > 0)
{
TransparentGroupResult* pGroup = this->addResultGroup(dlower, dupper, strUuid);
strUuid = "";
for (int i = 0; i < g1.size(); i++)
{
const QPair<QCPRange, QString>& r = g1.at(i);
pGroup->addResultToPlot(r.first.lower, r.first.upper, r.second, strUuid);
}
}
QVector<QPair<QCPRange, QString>> g2;
for (int i = nidx; i < vec.size(); i++)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(mapResult.value(vec.at(i)));
if (pret == NULL)
continue;
QCPRange rg = pret->getRange();
if (i == vec.size() - 1)
dlower = rg.lower;
if (i == nidx)
{
dupper = x_val;
rg.upper = x_val;
g2 << qMakePair(rg, pret->getResult());
}
else
{
g2 << qMakePair(rg, pret->getResult());
}
}
if (g2.size() > 0)
{
TransparentGroupResult* pGroup2 = this->addResultGroup(dlower, dupper, strUuid);
strUuid = "";
for (int i = 0; i < g2.size(); i++)
{
const QPair<QCPRange, QString>& r = g2.at(i);
pGroup2->addResultToPlot(r.first.lower, r.first.upper, r.second, strUuid);
}
}
pClickGroup->removeAllResult();
this->replot();
}
void QMyCustomPlot::splitIndependentLayer()
{
//获取鼠标点位置
double y_pos = mLastPos.y();
//转为图像位置
double x_val = xAxis->pixelToCoord(y_pos);
// 获取当前点击的解释结论组
TransparentGroupResult *pClickGroup = getCurGroupResult(x_val);
if (pClickGroup == NULL)
return;
// 符合层拆分成独立层
pClickGroup->splitIndependentLayer();
// 删除原来的复合层
pClickGroup->removeAllResult();
this->replot();
}
bool QMyCustomPlot::getIsEditor()
{
if (m_strLineName == "RESULT")
{
return m_bEditor;
}
return true;
}

View File

@ -140,6 +140,10 @@ public:
int m_nWaveJg = 100; int m_nWaveJg = 100;
int m_nWaveHei = 1; int m_nWaveHei = 1;
public: public:
bool m_bEditor = false; // 编辑状态
QCPItemStraightLine* m_pAddLine1 = NULL;
QCPItemStraightLine* m_pAddLine2 = NULL;
QString m_strGroupUid = ""; QString m_strGroupUid = "";
// 解释结论终止深度 // 解释结论终止深度
float m_fResultEndDepth = 0.0f; float m_fResultEndDepth = 0.0f;
@ -284,6 +288,8 @@ public:
void addRightListToPlot( QList<double> new_DepthList, QList<double> new_ValueList); void addRightListToPlot( QList<double> new_DepthList, QList<double> new_ValueList);
public slots: public slots:
void slotSelectionRectAccepted(const QRect &rect, QMouseEvent *event);
void s_LineClicked(int index); void s_LineClicked(int index);
void onResetZoom(); void onResetZoom();
void removeSelectedGraph(); void removeSelectedGraph();
@ -393,6 +399,19 @@ public slots:
void addItems_Jiegutext(); //从剪切板文本数据粘贴 void addItems_Jiegutext(); //从剪切板文本数据粘贴
void DeleteItems_Jiegutext(); //全部清空 void DeleteItems_Jiegutext(); //全部清空
void RefreshItems_Jiegutext(); //刷新数据 void RefreshItems_Jiegutext(); //刷新数据
//右键--解释结论
void onOpenEditResult();
void onCloseEditResult();
void DeleteItemGroup();
void updateGroupZone(); //更新层号
TransparentGroupResult* getCurGroupResult(double x_val);
void segmentationInnerLayer(); // 分割为层内层
void segmentationIndependentLayer(); // 分割为独立层
void splitIndependentLayer(); // 拆分复合层成独立层
bool getIsEditor();
// //
void addItems_Core(); void addItems_Core();
@ -435,8 +454,10 @@ public:
bool mKedou = false; bool mKedou = false;
// //
bool mMousePress = false; bool mMousePress = false;
double m_dPressX = 0;
QPoint mLastPos; QPoint mLastPos;
QCPSizeHandleManager *mSizeHandleManager; QCPSizeHandleManager *mSizeHandleManager;
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mousePressEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event);