#include "forminfo.h" #include "ui_forminfo.h" #include "CallManage.h" #include #include #include #include #include "geometryutils.h" #include "qtColorSchemeComboBox.h" //曲线名称(单个) FormInfo::FormInfo(QWidget *parent, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QColor lineColor) : QWidget(parent), ui(new Ui::FormInfo) { ui->setupUi(this); // setAcceptDrops(true); m_strSlfName = strSlfName; m_strWellName = strWellName; m_strTrackName = strTrackName; m_strLineName = strLineName; m_lineColor = lineColor; // m_dWidth = 3; m_lineStyle = Qt::SolidLine; m_newFillMode = "无填充"; m_newHeadFill = "不绘制"; // // // QPushButton *button = new QPushButton("Drag Me", this); // QVBoxLayout *layout = new QVBoxLayout(this); // layout->addWidget(button); // setLayout(layout); // // 设置拖拽功能 // setWindowFlags(Qt::FramelessWindowHint | Qt::Window); // setAttribute(Qt::WA_TranslucentBackground); //左刻度 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLeftScale(QString, QString, QString, QString, QString, double)), this, SLOT(s_ChangeLeftScale(QString, QString, QString, QString, QString, double))); //右刻度 connect(CallManage::getInstance(), SIGNAL(sig_ChangeRightScale(QString, QString, QString, QString, QString, double)), this, SLOT(s_ChangeRightScale(QString, QString, QString, QString, QString, double))); //刻度类型 connect(CallManage::getInstance(), SIGNAL(sig_ChangeScaleType(QString, QString, QString, QString, QString, QString)), this, SLOT(s_ChangeScaleType(QString, QString, QString, QString, QString, QString))); //颜色 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineColor(QString, QString, QString, QString, QString, QColor)), this, SLOT(s_ChangeLineColor(QString, QString, QString, QString, QString, QColor))); //线宽 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineWidth(QString, QString, QString, QString, QString, double)), this, SLOT(s_ChangeLineWidth(QString, QString, QString, QString, QString, double))); //线型 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineStyle(QString, QString, QString, QString, QString, Qt::PenStyle)), this, SLOT(s_ChangeLineStyle(QString, QString, QString, QString, QString, Qt::PenStyle))); //岩性填充-不填充 connect(CallManage::getInstance(), SIGNAL(sig_ClearFillMode(QString, QString, QString, QString, QString)), this, SLOT(s_ClearFillMode(QString, QString, QString, QString, QString))); //岩性填充-填充 connect(CallManage::getInstance(), SIGNAL(sig_ChangeFillMode(QString, QString, QString, QString, QString, QString, QString, QColor, QString, QString, float, float, QString, QColor, QColor, QString, bool)), this, SLOT(s_ChangeFillMode(QString, QString, QString, QString, QString, QString, QString, QColor, QString, QString, float, float, QString, QColor, QColor, QString, bool))); //修改曲线选择状态 iSelect=0未知,1标准曲线,2主曲线,3从曲线 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineStatus(QString, QString, QString, QString, QString, int, bool)), this, SLOT(s_ChangeLineStatus(QString, QString, QString, QString, QString, int, bool))); QFont font1("微软雅黑", 10); QFont font2("微软雅黑", 8); m_curveNameFont = font1; // 曲线名称 m_curveUnitFont = font2; // 曲线单位 m_curveScaleFont = font2; // 曲线刻度 m_bShowScale = true; } FormInfo::~FormInfo() { delete ui; } void FormInfo::initProperty(QJsonObject obj) { m_vmin = obj.value("vmin").toDouble(); m_vmax = obj.value("vmax").toDouble(); m_strUnit = obj.value("Unit").toString(); QString strType = obj.value("Type").toString(); if ("waveObject" == strType) { m_nDrawType = obj.value("DrawType").toInt(); m_nFillType = obj.value("FillType").toInt(); m_strAmp = obj.value("Amp").toString(); m_fMaxAmp = obj.value("MaxAmp").toDouble(); m_nSchemeIndex = obj.value("SchemeIndex").toInt(); m_nColorNum = obj.value("ColorNum").toInt(); } } QJsonObject FormInfo::makeJson() { // 创建根对象 QJsonObject rootObj; // QString slffilename=QString(""); int ind=m_strSlfName.lastIndexOf('\\'); int ind2=m_strSlfName.lastIndexOf('/'); if(ind2>ind) ind=ind2; if(ind>-1) { slffilename=m_strSlfName.mid(ind+1); } rootObj["SlfName"] = slffilename; rootObj["WellName"] = m_strWellName; // rootObj["TrackName"] = m_strTrackName; rootObj["LineName"] = m_strLineName; rootObj["AliasName"] = m_strAliasName; rootObj["Unit"] = m_strUnit; rootObj["Type"] = m_strType; rootObj["lineColor"] = m_lineColor.name(); rootObj["Width"] = m_dWidth; rootObj["lineStyle"] = m_lineStyle; rootObj["vmax"] = m_vmax; rootObj["vmin"] = m_vmin; rootObj["ScaleType"] = m_strScaleType; rootObj["ShowScale"] = m_bShowScale; if (m_strType == "curveObject") { //岩性填充 rootObj["newFillMode"] = m_newFillMode; rootObj["newHeadFill"] = m_newHeadFill; rootObj["newTargetLine"] = m_newTargetLine; rootObj["newFillType"] = m_newFillType; //填充颜色 rootObj["newColor"] = m_newColor.name(); rootObj["newLithosImage"] = m_newLithosImage; rootObj["new_vMax"] = m_new_vMax; rootObj["new_vMin"] = m_new_vMin; //岩性前景色 rootObj["frontColor"] = m_frontColor.name(); //岩性背景色 rootObj["backColor"] = m_backColor.name(); } else if (m_strType == "waveObject") { rootObj["DrawType"] = m_nDrawType; rootObj["FillType"] = m_nFillType; rootObj["Amp"] = m_strAmp; rootObj["MaxAmp"] = m_fMaxAmp; rootObj["SchemeIndex"] = m_nSchemeIndex; rootObj["ColorNum"] = m_nColorNum; } return rootObj; } void FormInfo::paintEvent(QPaintEvent* event) { QPainter painter(this); QRect rect = this->rect(); //背景透明 painter.fillRect(rect.left(), rect.top(), rect.width(), rect.height(), QColor(0, 0, 0, 0)); //QColor(67, 67, 67, 100) if(m_newFillMode=="无填充" || m_newHeadFill == "不绘制") { painter.setBrush(Qt::NoBrush); } else //if(m_newFillMode=="填充" && m_newHeadFill == "绘制") { if(m_newFillType == "岩性模式") { QColor oldFrontColor(0, 0, 0); // 原始颜色 QColor oldBackColor(255, 255, 255); // 原始颜色 // QImage image(m_newLithosImage); for (int y = 0; y < image.height(); ++y) { for (int x = 0; x < image.width(); ++x) { QColor pixelColor = QColor(image.pixel(x, y)); if (pixelColor == oldFrontColor) { image.setPixelColor(x, y, m_frontColor); // 使用 setPixelColor 来设置新颜色 } if (pixelColor == oldBackColor) { image.setPixelColor(x, y, m_backColor); // 使用 setPixelColor 来设置新颜色 } } } // painter.setBrush(QBrush(QPixmap::fromImage(image))); //painter.setBrush(QBrush(QPixmap(m_newLithosImage))); //graph(0)->setBrush(QBrush(QPixmap(":/image/file.png"))); } else if(m_newFillType == "颜色模式") { painter.setBrush(QBrush(m_newColor)); } else if(m_newFillType == "成像化") { } } //painter.setBrush(QBrush(Qt::red, Qt::SolidPattern)); QRect rectRound(rect.left()+2,rect.top()+4, rect.width()-4, rect.height()-8); painter.setPen(QPen(m_lineColor, m_dWidth, m_lineStyle)); //painter.drawRoundRect(rectRound);//利用画刷(颜色/岩性图片),画框 painter.drawRect(rectRound); painter.setBrush(Qt::NoBrush); // 确保文字不被填充色遮挡 painter.setFont(m_curveNameFont); painter.setPen(m_lineColor); // fontColor QColor(220, 220, 220) //painter.drawText(rect.left() + 20, 30, m_strAliasName); // titleBarText QStringLiteral("动画") //painter.drawText(rect, Qt::AlignCenter, m_strAliasName); if(m_strAliasName == "") { painter.drawText(rect.left(), rect.top(), rect.width(), rect.height()/3, Qt::AlignCenter, m_strLineName); } else { //气测/FMT/射孔/文本 if(m_strType=="JiegutextObject") { QStringList list = m_strAliasName.split("/");//QString字符串分割函数 int iMaxNum = list.size(); if (iMaxNum > 1) { float fSpace = rect.width()/(float)iMaxNum; for(int i=0; iSetCurrentSchemeIndex(m_nSchemeIndex); //ColorTableIndex = ind; QtColorTableData::getInstance()->ChangeColorNum(m_nColorNum); QList rgbList = QtColorTableData::getInstance()->GetRgb(); int iColorNum = rgbList.size(); //头部绘制调色板 float scale = (float)(rect.width() - 4) / (float)iColorNum; QRectF rt7 = QRectF(rect.left() + 2, rect.top() + rect.height() / 3, rect.width() - 4, rect.height() / 3); for (int i = 0; i < iColorNum; i++) { QColor acolor = rgbList.at(i); float temp = (float)i * scale; if (i)rt7.setLeft(rect.left() + 2 + temp); else rt7.setLeft(rect.left() + 2 + temp + 1); temp = (float)(i + 1) * scale; rt7.setRight(rect.left() + 2 + temp); QBrush HeadBrush = QBrush(acolor); painter.fillRect(rt7, HeadBrush); } } painter.setFont(m_curveUnitFont); painter.setPen(m_lineColor); //painter.drawText(rect.left() + 20, 55, m_strUnit); //painter.drawText(rect.left() + 20, 80, QString::number(m_vmin)+" ~ "+QString::number(m_vmax)); if(m_strType=="curveObject") { //曲线 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3, Qt::AlignCenter, m_strUnit); } //--------------- if(m_strLineName=="WORDS_RELUST") { //文字结论,不绘制左右范围 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, "文字结论"); } else if(m_strLineName=="RESULT") { //解释结论,不绘制左右范围 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, "解释结论"); } else if(m_strLineName=="GEO_LITH") { //录井剖面,不绘制左右范围 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, "录井剖面"); } else if(m_strLineName=="SWALL_CORE") { //井壁取心,不绘制左右范围 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, "井壁取心"); } else if(m_strLineName == "GUJING1_RESULT" || m_strLineName == "GUJING2_RESULT" || m_strLineName == "GUJING3_RESULT") { //固井结论,不绘制左右范围 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, "固井结论"); } else if(m_strLineName=="CORE_PHYSICS") { //岩心分析,不绘制左右范围 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, "岩心实验数据"); } else if(m_strLineName=="FRAC_HOLE.TABLE" && m_strType=="tableObject") { //蝌蚪图,不绘制左右范围 painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, "蝌蚪图"); } else if(m_strLineName=="井眼垮塌矢量图" || m_strLineName=="井斜方位图") { painter.drawText(rect.left(), rect.top()+rect.height()/3, rect.width(), rect.height()/3, Qt::AlignCenter, m_strUnit); painter.drawText(rect.left(), rect.top()+rect.height()*2/3, rect.width(), rect.height()/3 ,Qt::AlignCenter, QString::number(m_vmin)+" ~ "+QString::number(m_vmax)); } // if(m_strType=="tableObject" && (m_strLineName=="WORDS_RELUST" || m_strLineName == "RESULT" || m_strLineName == "GEO_LITH"|| m_strLineName == "SWALL_CORE" || m_strLineName == "GUJING1_RESULT" || m_strLineName == "GUJING2_RESULT" || m_strLineName == "GUJING3_RESULT" || m_strLineName == "CORE_PHYSICS") ) { } else { if(m_strType=="waveObject" || m_strType=="curveObject") { painter.drawText(rect.left()+10, rect.top() + rect.height() * 2 / 3, rect.width(), rect.height() / 3, Qt::AlignCenter, m_strUnit); // 显示刻度 if (m_bShowScale) { painter.setFont(m_curveScaleFont); QFontMetrics fm1(m_curveScaleFont); QRect textRect = fm1.boundingRect(QString::number(m_vmax, 'f', 0)); painter.drawText(rect.left() + 10, rect.top() + rect.height() * 2 / 3, rect.width(), rect.height() / 3, Qt::AlignLeft | Qt::AlignVCenter, QString::number(m_vmin));// +" ~ " + QString::number(m_vmax)); painter.drawText(rect.left() + 10, rect.top() + rect.height() * 2 / 3, rect.width() - textRect.width(), rect.height() / 3, Qt::AlignRight | Qt::AlignVCenter, QString::number(m_vmax)); } } } QWidget::paintEvent(event); } void FormInfo::dragEnterEvent(QDragEnterEvent* event) { qDebug() << "FormInfo dragEnterEvent"; const QMimeData* mimeData = event->mimeData(); // 检查拖拽的数据类型,确定是否接受拖拽 if (event->mimeData()->hasFormat("text/plain")) { event->acceptProposedAction(); //QApplication::setOverrideCursor(Qt::PointingHandCursor); // 设置鼠标为可添加状态 } else { event->ignore(); //QApplication::setOverrideCursor(Qt::ForbiddenCursor); // 设置鼠标为不可添加状态 } } void FormInfo::dragMoveEvent(QDragMoveEvent* event) { qDebug() << "FormInfo dragMoveEvent"; // 可以在这里更新鼠标的位置,根据位置判断是否可以放置 // ... //dragEnterEvent(event); // 可以使用相同的逻辑 //event->accept(); } void FormInfo::dropEvent(QDropEvent* event) { qDebug() << "FormInfo dropEvent"; // 处理放置动作,更新UI或数据 if (event->mimeData()->hasFormat("text/plain")) { // 获取拖拽的数据 QString strExtern = event->mimeData()->text(); qDebug() << strExtern; // QStringList list = strExtern.split("#@@#");//QString字符串分割函数 if (list.size() > 3) { QString strSlfName = list[0]; QString strWellName = list[1]; QString strLineName = list[2]; QString strType = list[3]; qDebug() << "strSlfName:" << strSlfName<< " strWellName:" << strWellName<< " strLineName:" << strLineName << " strType:" << strType; if(m_strWellName == strWellName) { if(strType=="curveObject") { //新建曲线 emit CallManage::getInstance()->sig_AddLine(m_strUuid, strSlfName, strWellName, m_strTrackName, strLineName); } else if(strType=="waveObject") { //新建波列 emit CallManage::getInstance()->sig_AddWave(m_strUuid, strSlfName, strWellName, m_strTrackName, strLineName); } else if(strType=="tableObject") { //新建表格曲线 emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, strSlfName, strWellName, m_strTrackName, strLineName); } // 接受拖拽事件 event->setDropAction(Qt::MoveAction); event->accept(); } else { // 如果井名不正确,不接受拖拽事件 event->ignore(); } } else { // 如果数据格式不正确,不接受拖拽事件 event->ignore(); } } else { // 如果数据格式不正确,不接受拖拽事件 event->ignore(); } // 恢复鼠标光标 //QApplication::restoreOverrideCursor(); } //线宽 void FormInfo::setLineWidth(double dWidth) { m_dWidth = dWidth; } double FormInfo::getLineWidth() { return m_dWidth; } //线型 void FormInfo::setLineStyle(Qt::PenStyle lineStyle) { m_lineStyle = lineStyle; } Qt::PenStyle FormInfo::getLineStyle() { return m_lineStyle; } void FormInfo::setVMax(float vmax) { m_vmax = vmax; } float FormInfo::getVMax() { return m_vmax; } void FormInfo::setVMin(float vmin) { m_vmin = vmin; } float FormInfo::getVMin() { return m_vmin; } void FormInfo::setFrontColor(QColor frontColor) { m_frontColor = frontColor; } QColor FormInfo::getFrontColor() { return m_frontColor; } void FormInfo::setBackColor(QColor backColor) { m_backColor = backColor; } QColor FormInfo::getBackColor() { return m_backColor; } bool FormInfo::setInfoProperty(QString strProName, QVariant val) { bool bDraw = false; if ("显示名称" == strProName) { this->m_strAliasName = val.toString(); } else if ("显示单位" == strProName) { this->m_strUnit = val.toString(); } else if ("曲线名称" == strProName) { this->m_curveNameFont = val.value(); } else if ("曲线单位" == strProName) { this->m_curveUnitFont = val.value(); } else if ("曲线刻度" == strProName) { this->m_curveScaleFont = val.value(); } else if ("类型" == strProName) { bDraw = true; this->m_nDrawType = val.toInt(); } else if ("方式" == strProName) { bDraw = true; this->m_nFillType = val.toInt(); } else if ("左刻度" == strProName) { bDraw = true; this->m_vmin = val.toDouble(); } else if ("右刻度" == strProName) { bDraw = true; this->m_vmax = val.toDouble(); } else if ("幅度刻度" == strProName) { this->m_strAmp = val.toString(); } else if ("最大振幅" == strProName) { this->m_fMaxAmp = val.toFloat(); } else if ("显示刻度" == strProName) { this->m_bShowScale = val.toBool(); } else if ("色板" == strProName) { this->m_nSchemeIndex = val.toInt(); return true; } else if ("变密度颜色级数" == strProName) { this->m_nColorNum = val.toInt(); return true; } this->update(); return bDraw; } int FormInfo::getFillTypeIndex() { return m_nFillType; } //修改曲线选择状态 iSelect=0未知,1标准曲线,2主曲线,3从曲线 void FormInfo::s_ChangeLineStatus(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iSelect, bool bMerge) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_iSelect = iSelect; m_bMerge = bMerge; update(); } } //属性-左刻度 void FormInfo::s_ChangeLeftScale(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double newLeftScale) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_vmin = newLeftScale; update(); } } //属性-右刻度 void FormInfo::s_ChangeRightScale(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double newRightScale) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_vmax = newRightScale; update(); } } //属性-刻度类型 void FormInfo::s_ChangeScaleType(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QString strScaleType) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_strScaleType = strScaleType; } } //属性-颜色 void FormInfo::s_ChangeLineColor(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QColor lineColor) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_lineColor = lineColor; update(); } } //属性-线宽 void FormInfo::s_ChangeLineWidth(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double width) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_dWidth = width; update(); } } //属性-线型 void FormInfo::s_ChangeLineStyle(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, Qt::PenStyle lineStyle) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_lineStyle = lineStyle; update(); } } //岩性填充-不填充 void FormInfo::s_ClearFillMode(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_newFillMode = "无填充"; update(); } } //岩性填充-填充 void FormInfo::s_ChangeFillMode(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QString newFillType, QString newTargetLine, QColor newColor, QString newLithosImage, QString newHeadFill, float vMin, float vMax, QString strOtherScaleType, QColor frontColor, QColor backColor, QString newFillMode, bool bFillNow) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_newFillType = newFillType; m_newTargetLine = newTargetLine; m_newColor = newColor; m_newLithosImage = newLithosImage; m_newHeadFill = newHeadFill; m_new_vMin = vMin; m_new_vMax = vMax; m_strOtherScaleType = strOtherScaleType; m_frontColor = frontColor; m_backColor = backColor; m_newFillMode = newFillMode;//"填充"; update(); } }