logplus/logPlus/transparentdraggableGuan.cpp

724 lines
22 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 "transparentdraggableGuan.h"
#include "PropertyWidget.h"
#include "CallManage.h"
extern double g_dPixelPerCm;//每厘米像素数
//static GeoIndicatorGenerator m_drawGeo;
TransparentDraggableGuan::TransparentDraggableGuan(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QString strTitle)
: QObject(parentPlot), mPlot(parentPlot), /*mstrTitle(strTitle),*/ mMinWidth(minWidth)
{
m_strUuid = strUuid;
//
initRect();
}
TransparentDraggableGuan::~TransparentDraggableGuan()
{
if(mPlot) {
// mPlot->removeItem(mRect);
// mPlot->removeItem(mLeftHandle);
// mPlot->removeItem(mRightHandle);
}
}
void TransparentDraggableGuan::DrawSVGNormal(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout)
{
QString svg=svgFileName;
QRectF boundingRect = painter->transform().mapRect(borderRect);
painter->save();
QTransform transform;
transform.reset();
if (!IsWellSectonHorizonLayout)
{
painter->setWorldTransform(transform);
}
else
{
}
QPixmap tiledmap(svg);
QRect border(boundingRect.left(),boundingRect.top(),boundingRect.width(),boundingRect.height());
painter->drawPixmap(border,tiledmap);
painter->restore();
}
//拉伸
void TransparentDraggableGuan::DrawSVGSteched(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout)
{
QString svg=svgFileName;
QSvgRenderer m_SvgRenderer;
m_SvgRenderer.load(svg);
m_SvgRenderer.render(painter,borderRect);
}
//平铺
void TransparentDraggableGuan::DrawSVGTiled(QPainter* painter,QString svgFileName,QRectF borderRect,bool IsWellSectonHorizonLayout)
{
QString svg=svgFileName;
QRectF boundingRect = painter->transform().mapRect(borderRect);
painter->save();
QTransform transform;
transform.reset();
if (!IsWellSectonHorizonLayout)
{
painter->setWorldTransform(transform);
}
else
{
}
QPixmap tiledmap(svg);
painter->drawTiledPixmap(boundingRect,tiledmap);
painter->restore();
}
//设置最小宽度
void TransparentDraggableGuan::setMinWidth(double minWidth)
{
mMinWidth = minWidth;
}
//设置外径长
void TransparentDraggableGuan::setOin(float in)
{
mIn = in;
}
////设置标题
//void TransparentDraggableGuan::setTitle(QString strTitle)
//{
// mstrTitle = strTitle;
// mItemTitle->setText(mstrTitle);
// //mPlot->replot();
//}
//设置套管组件
void TransparentDraggableGuan::setResult(QString filePath)
{
m_Result = filePath;
mPixmap->setPixmap(QPixmap(filePath)); // 设置图片
//
//
QString name,itemName;
this->m_Result.replace("\\","/");
int l=this->m_Result.lastIndexOf("/");
if(l>-1) name=this->m_Result.mid(l+1);
l=name.indexOf(".");
name=name.left(l);
itemName=name;
mstrTitle = itemName;
mItemTitle->setText(mstrTitle);
}
void TransparentDraggableGuan::drawResult(double left_Low, double right_Hight, double lY1, double lY2)
{
if(m_Result=="")
{
return;
}
double x1 = mPlot->xAxis->coordToPixel(left_Low);
double x2 = mPlot->xAxis->coordToPixel(right_Hight);
double y1 = mPlot->yAxis->coordToPixel(lY1);
double y2 = mPlot->yAxis->coordToPixel(lY2);
//
QString filePath = m_Result;
//
QString strLast = filePath.right(4);
if(strLast.toLower()==".svg")
{
QString path,filename;
GetWellNameAndPath(filePath, filename, path);
QString basename = filename;
QString val=filePath;
QImage image(y2-y1, x1-x2,QImage::Format_RGB32);
QPainter painter(&image);
QRectF fillRect(0,0, y2-y1, x1-x2);
painter.fillRect(fillRect,Qt::white);
//拉伸
DrawSVGSteched(&painter,filePath,fillRect,0);
//平铺
//DrawSVGTiled(&painter,filePath,fillRect,0);
//正常
//DrawSVGNormal(&painter,filePath,fillRect,0);
val=GetImagePath()+"TempNew";
QDir ss;
if(!ss.exists(val)) {
ss.mkdir(val);
}
val+=QDir::separator();
val+=basename+".png";
image.save(val);
//
mPixmap->setPixmap(QPixmap(val)); // 设置图片
}
else
{
mPixmap->setPixmap(QPixmap(filePath)); // 设置图片
// QString path,filename;
// GetWellNameAndPath(filePath, filename, path);
// QString basename = filename;
// QString val=filePath;
// QImage image(y2-y1, x1-x2,QImage::Format_RGB32);
// QPainter painter(&image);
// QRectF fillRect(0,0, y2-y1, x1-x2);
// painter.fillRect(fillRect,Qt::white);
// //平铺
// DrawSVGNormal(&painter,filePath,fillRect,0);
// val=GetImagePath()+"TempNew";
// QDir ss;
// if(!ss.exists(val)) {
// ss.mkdir(val);
// }
// val+=QDir::separator();
// val+=basename+".png";
// image.save(val);
// //
// mPixmap->setPixmap(QPixmap(val)); // 设置图片
}
//mPlot->replot();
}
// 设置矩形范围
void TransparentDraggableGuan::setRange(double left_Low, double right_Hight, bool bReplot)
{
if(left_Low >= right_Hight) return;
//套管组件高度
mH = right_Hight-left_Low;
double lY1 = 0;//mPlot->yAxis->range().lower;//+10
double lY2 = mPlot->m_OutD_Tubing;//mPlot->yAxis->range().upper - mPlot->yAxis->range().lower; //mPlot->yAxis->range().upper;
mRect->topLeft->setCoords(left_Low, lY1 + (lY2-lY1-mIn)/2.0);
mRect->bottomRight->setCoords(right_Hight, lY2 - (lY2-lY1-mIn)/2.0);
//绘制工具
if(mPlot->m_bDrawTools_Tubing)
{
//位置与rect不一样否则图像反转
mPixmap->topLeft->setCoords(right_Hight, lY1 + (lY2-lY1-mIn)/2.0);
mPixmap->bottomRight->setCoords(left_Low, lY2 - (lY2-lY1-mIn)/2.0);
}
else
{
//位置与rect不一样否则图像反转
mPixmap->topLeft->setCoords(0, 0);
mPixmap->bottomRight->setCoords(0, 0);
}
//标注工具
if(mPlot->m_bDrawSPTool_Tubing)
{
mItemTitle->setText(mstrTitle);
}
else
{
mItemTitle->setText("");
}
//
mstrTitle2 = QString::number(-(right_Hight+left_Low)/2.0);
mItemTitle2->setText(mstrTitle2);
//
float fSpace = (lY2 - lY1)/(float)5;
float flNewPos = mPlot->xAxis->coordToPixel((left_Low + right_Hight)/2.0) - 15;
mItemTitle->position->setCoords(mPlot->xAxis->pixelToCoord(flNewPos),
3*fSpace); // 设置文本在矩形中心位置
//
mItemTitle2->position->setCoords(mPlot->xAxis->pixelToCoord(flNewPos),
4*fSpace + 0.5*fSpace); // 设置文本在矩形中心位置
updateHandles();
//刷新,针对批量修改不在此处刷新,后面统一刷新
if(bReplot)
{
mPlot->replot();
}
}
// 获取当前范围
QCPRange TransparentDraggableGuan::getRange()
{
return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x());
}
// 设置矩形颜色
void TransparentDraggableGuan::setColor(const QColor &color)
{
mRect->setBrush(QBrush(color));
mRect->setPen(QPen(color.darker()));
//mPlot->replot();
}
// 删除框图
void TransparentDraggableGuan::deleteRect()
{
if(mPlot) {
// mRect->deleteLater();
// mLeftHandle->deleteLater();
// mRightHandle->deleteLater();
// mPixmap->deleteLater();
mPlot->m_mapDraggable_Guan.remove(m_strUuid);
mPlot->removeItem(mRect);
// mPlot->removeItem(mLeftHandle);
// mPlot->removeItem(mRightHandle);
mPlot->removeItem(mPixmap);
mPlot->removeItem(mItemTitle);
mPlot->removeItem(mItemTitle2);
//mPlot->replot();
this->deleteLater();
}
}
//设置深度移动量
void TransparentDraggableGuan::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);
{
//保存
mPlot->SaveToSLF_Tubing();
//检查套管组件名称,是否需要更新套管图形
bool bReDraw = mPlot->checkTubingName(m_Result);
if(bReDraw)
{
//组件改变后,重绘管柱
mPlot->LoadFromSLF_ReDrawTubing(mPlot->m_strSlfName, mPlot->m_strLineName);
}
//属性清空
PropertyService()->InitCurrentViewInfo();
//取消所有选中单元格
emit CallManage::getInstance()->sig_Raise(mPlot->m_strUuid, "", "", "", "", 0, "");
}
}
void TransparentDraggableGuan::initRect()
{
// 创建透明矩形
mRect = new QCPItemRect(mPlot);
mRect->setLayer("overlay"); // 确保在最上层
mRect->setBrush(QBrush(QColor(255, 255, 255, 0))); // 透明
mRect->setPen(QPen(QColor(70, 70, 255, 0)));// 透明
// // 创建左右边界控制点
// 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, &TransparentDraggableGuan::onMousePress);
connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableGuan::onMouseMove);
connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableGuan::onMouseRelease);
mPixmap = new QCPItemPixmap(mPlot);
//mPixmap->setPixmap(QPixmap(":/image/file.png")); // 设置图片
mPixmap->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式
mPixmap->setLayer("overlay"); // 确保在最上层
mItemTitle = new QCPItemText(mPlot);
mItemTitle->setText(mstrTitle);
//mItemTitle->setBrush(QBrush(Qt::red));
mItemTitle->setFont(QFont("Arial", 12, QFont::Bold));
mItemTitle->setColor(Qt::black);
mItemTitle->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);
mItemTitle->position->setType(QCPItemPosition::ptPlotCoords);
//mItemTitle->position->setType(QCPItemPosition::ptAxisRectRatio);
mItemTitle->position->setCoords(0.5, 0);
mItemTitle->setLayer("overlay");
mItemTitle->setRotation(90);//竖直文字
//
mItemTitle2 = new QCPItemText(mPlot);
mItemTitle2->setText(mstrTitle2);
//mItemTitle2->setBrush(QBrush(Qt::red));
mItemTitle2->setFont(QFont("Arial", 12, QFont::Bold));
mItemTitle2->setColor(Qt::black);
mItemTitle2->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);
mItemTitle2->position->setType(QCPItemPosition::ptPlotCoords);
//mItemTitle2->position->setType(QCPItemPosition::ptAxisRectRatio);
mItemTitle2->position->setCoords(0.5, 0);
mItemTitle2->setLayer("overlay");
mItemTitle2->setRotation(90);//竖直文字
}
void TransparentDraggableGuan::updateHandles()
{
// 左边界矩形控制点
// mLeftHandle->topLeft->setParentAnchor(mRect->topLeft);
// mLeftHandle->bottomRight->setParentAnchor(mRect->topRight);//(mRect->bottomLeft);
// mLeftHandle->topLeft->setCoords(-0.5, 0.5); // 矩形大小
// mLeftHandle->bottomRight->setCoords(0.5, -0.5); // 矩形大小
// // 右边界矩形控制点
// mRightHandle->topLeft->setParentAnchor(mRect->bottomLeft);
// mRightHandle->bottomRight->setParentAnchor(mRect->bottomRight);
// mRightHandle->topLeft->setCoords(-0.5, 0.5); // 矩形大小
// mRightHandle->bottomRight->setCoords(0.5, -0.5); // 矩形大小
}
void TransparentDraggableGuan::onDelRect()
{
//mDragMode = DragNone;
//删除框图
deleteRect();
mPlot->replot();
//保存
mPlot->SaveToSLF_Tubing();
//检查套管组件名称,是否需要更新套管图形
bool bReDraw = mPlot->checkTubingName(m_Result);
if(bReDraw)
{
//组件改变后,重绘管柱
mPlot->LoadFromSLF_ReDrawTubing(mPlot->m_strSlfName, mPlot->m_strLineName);
}
//属性清空
PropertyService()->InitCurrentViewInfo();
}
void TransparentDraggableGuan::onMousePress(QMouseEvent *event)
{
if(event->button() != Qt::LeftButton)//右键
{
double y = mPlot->xAxis->pixelToCoord(event->pos().y());//x轴展示深度
QCPRange currentRange = getRange();
// if(mLeftHandle->selectTest(event->pos(), false) < 5) {
// mDragMode = DragNone;
// }
// else if(mRightHandle->selectTest(event->pos(), false) < 5) {
// mDragMode = DragNone;
// }
//else
if(y >= currentRange.lower && y <= currentRange.upper) {
mDragMode = DragNone;
}
else {
mDragMode = DragNone;
return;
}
//event->accept();
double low = mRect->topLeft->coords().x();
double hight = mRect->bottomRight->coords().x();
PropertyService()->initTubingItemProperty(this, low, hight, m_Result);
QMenu menu(nullptr);
menu.addAction(QIcon(::GetImagePath() + "icon/Delete.png"), "删除选中对象", this, &TransparentDraggableGuan::onDelRect);
menu.addAction(QIcon(::GetImagePath() + "icon/Shift.png"), "设置深度移动量", this, &TransparentDraggableGuan::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 TransparentDraggableGuan::getCursor()
{
if (m_bMoveRect)
{
return 2;
}
if (m_bArrow)
{
return 1;
}
return 0;
}
void TransparentDraggableGuan::onMouseMove(QMouseEvent *event)
{
if (mDragMode == DragRect)
{
m_bMoveRect = true;
}
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 TransparentDraggableGuan::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()->initTubingItemProperty(this, low, hight, m_Result);
if(m_bChange)
{
//保存
mPlot->SaveToSLF_Tubing();
//检查套管组件名称,是否需要更新套管图形
bool bReDraw = mPlot->checkTubingName(m_Result);
if(bReDraw)
{
//组件改变后,重绘管柱
mPlot->LoadFromSLF_ReDrawTubing(mPlot->m_strSlfName, mPlot->m_strLineName);
}
}
//取消所有选中单元格
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 TransparentDraggableGuan::getMyLower()
{
double dLower = mPlot->xAxis->range().lower;
// double proposedLeft = mDragStartRange.lower;
// TransparentDraggableGuan *pDraggableRect =NULL;
// {
// QMap<QString,QObject *>::Iterator it = mPlot->m_mapDraggable_Guan.begin();
// while( it != mPlot->m_mapDraggable_Guan.end() )
// {
// if(it.key() == m_strUuid)
// {
// it++;
// continue;
// }
// pDraggableRect = (TransparentDraggableGuan*)it.value();
// //
// QCPRange tmpRange = pDraggableRect->getRange();
// if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft)
// {
// dLower = tmpRange.upper;
// }
// it++;
// }
// }
return dLower;
}
double TransparentDraggableGuan::getMyUpper()
{
double dUpper = mPlot->xAxis->range().upper;
// double proposedRight = mDragStartRange.upper;
// TransparentDraggableGuan *pDraggableRect =NULL;
// {
// QMap<QString,QObject *>::Iterator it = mPlot->m_mapDraggable_Guan.begin();
// while( it != mPlot->m_mapDraggable_Guan.end() )
// {
// if(it.key() == m_strUuid)
// {
// it++;
// continue;
// }
// pDraggableRect = (TransparentDraggableGuan*)it.value();
// //
// QCPRange tmpRange = pDraggableRect->getRange();
// if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight)
// {
// dUpper = tmpRange.lower;
// }
// it++;
// }
// }
return dUpper;
}