Compare commits

...

2 Commits

Author SHA1 Message Date
54cdf3c99f Merge branch 'main' of http://git.hivekion.com:3000/jiayulong/logplus
# Conflicts:
#	logPlus/forminfo.cpp
2026-03-10 09:24:28 +08:00
a6a5d707b0 解释结论ITEM属性开发
垂向绘制, 旋转角度(°)效果实现。
2026-03-10 09:10:16 +08:00
6 changed files with 302 additions and 115 deletions

View File

@ -379,6 +379,25 @@ void PropertyWidget::SlotPropertyChanged( QtProperty *pProperty, const QVariant
}
}
}
else if (m_strCurrentProperty == JieshiItem_Property)
{
if (m_tdJieshi)
{
if ("顶深(m)" == m_propertyData[pProperty])
{
double upper = variant.value<double>();
m_tdJieshi->setDragRect(2, -upper);
}
else if ("底深(m)" == m_propertyData[pProperty])
{
double lower = variant.value<double>();
m_tdJieshi->setDragRect(1, -lower);
}
else if ("油气结论" == m_propertyData[pProperty])
{
}
}
}
else if (m_strCurrentProperty == GujingItem_Property)
{
//固井结论item
@ -1663,8 +1682,8 @@ void PropertyWidget::initTableProperty(FormInfo *formInfo)
_CreateVariantPropertyItem("通常", "选择井曲线", m_strLineName + "@" + m_strSlfName, QVariant::String);
_CreateVariantPropertyItem("名称", "显示名称", formInfo->m_strLineName, QVariant::String);
//_CreateVariantPropertyItem("名称", "垂向绘制", formInfo->m_bVerticaDrawing, QVariant::Bool);
//_CreateVariantPropertyItem("名称", "旋转角度(°)", formInfo->m_nRotationAngle, QVariant::Int);
_CreateVariantPropertyItem("名称", "垂向绘制", formInfo->m_bVerticaDrawing, QVariant::Bool);
_CreateVariantPropertyItem("名称", "旋转角度(°)", formInfo->m_nRotationAngle, QVariant::Int);
_CreateVariantPropertyItem("名称", "字体", formInfo->m_curveNameFont, QVariant::Font);
_CreateVariantPropertyItem("名称", "颜色", formInfo->m_lineColor, QVariant::Color);
@ -1867,6 +1886,32 @@ void PropertyWidget::initWaveProperty(FormInfo *formInfo, int nType)
m_strCurrentProperty = Wave_Property;
}
void PropertyWidget::initJieshiItemProperty(TransparentGroupResult* tdJieshi, double lower, double upper, QString strResult)
{
//初始化,清空
InitCurrentViewInfo();
m_tdJieshi = tdJieshi;
//
_CreateVariantPropertyItem("当前项", "顶深(m)", -upper, QVariant::Double);
_CreateVariantPropertyItem("当前项", "底深(m)", -lower, QVariant::Double);
_CreateVariantPropertyItem("当前项", "解释层号", tdJieshi->getTitle(), QVariant::String);
_CreateVariantPropertyItem("当前项", "油气结论", strResult, VariantManager::filePathTypeId());
_CreateVariantPropertyItem("当前项", "备注", "", QVariant::String);
for (int i = 1; i <= 10; i++)
{
_CreateVariantPropertyItem("当前项", QString("油气结论%1").arg(i), strResult, VariantManager::filePathTypeId());
}
for (int i = 1; i <= 10; i++)
{
_CreateVariantPropertyItem("当前项", QString("分段点%1深度").arg(i), strResult, VariantManager::filePathTypeId());
}
//当前属性类型
m_strCurrentProperty = JieshiItem_Property;
}
void PropertyWidget::initSwallCoreProperty(FormInfo *formInfo)
{
_CreateVariantPropertyItem("通常", "选择井曲线", m_strLineName + "@" + m_strSlfName, QVariant::String);

View File

@ -26,6 +26,8 @@
#include "TransparentDraggableRect.h"
#include "TransparentDraggableLayer.h"
#include "TransparentGroupResult.h"
//当前曲线类型
#define Widget_Property "Widget_Property"
#define Well_Property "Well_Property" //井
@ -33,6 +35,8 @@
#define Curve_Property "Curve_Property" //曲线
#define Wave_Property "Wave_Property" //波列
#define Table_Property "Table_Property" //解释结论
#define JieshiItem_Property "JieshiItem_Property" //解释结论Item
#define Head_Property "Head_Property" //图头,单元格
#define Gujing_Property "Gujing_Property" //固井结论
@ -114,6 +118,7 @@ public:
bool m_bSelfChange=false;
TransparentGroupResult* m_tdJieshi;
//
TransparentDraggableGujing* m_tdGujing;
TransparentDraggableSwallCore* m_tdSwallCore;
@ -151,6 +156,9 @@ public:
// 波列属性
void initWaveProperty(FormInfo *formInfo, int nType = 3);
// 解释结论Item属性
void initJieshiItemProperty(TransparentGroupResult* tdJieshi, double lower, double upper, QString strResult);
// 固井结论属性
void initGujingProperty(FormInfo *formInfo);
void initGujingItemProperty(TransparentDraggableGujing* tdGujing, double lower, double upper, QString strResult);

View File

@ -1,5 +1,7 @@
#include "TransparentGroupResult.h"
#include "TransparentDraggableResult.h"
#include "PropertyWidget.h"
extern double g_dPixelPerCm;//每厘米像素数
TransparentGroupResult::TransparentGroupResult(QMyCustomPlot *parentPlot, TransparentGroupResult *upDraggableResult, QString strUuid, double minWidth, QString strTitle)
@ -62,6 +64,11 @@ void TransparentGroupResult::setTitle(QString strTitle)
//mPlot->replot();
}
QString TransparentGroupResult::getTitle()
{
return mstrTitle;
}
//设置解释结论
void TransparentGroupResult::setResult(QString filePath)
{
@ -138,6 +145,7 @@ void TransparentGroupResult::setGroupShowPos(int nSPos)
void TransparentGroupResult::setFloorVisible(bool bs)
{
mItemTitle->setRotation(90);
mItemTitle->setVisible(bs);
mPlot->replot();
}
@ -148,6 +156,122 @@ void TransparentGroupResult::setFloorFont(QFont f)
mPlot->replot();
}
void TransparentGroupResult::setFloorRot(double dr)
{
mItemTitle->setRotation(dr);
mPlot->replot();
}
void TransparentGroupResult::setDragRect(int dMode, double dragVal)
{
QCPRange mDragStartRange = getRange();
QCPRange newRange = mDragStartRange;
switch (dMode) {
case DragLeft: {
//double proposedLeft = mDragStartRange.lower + dx;
double proposedLeft = dragVal;
// 确保不超出轴范围且不使宽度小于最小值
newRange.lower = qBound(
//mPlot->xAxis->range().lower,
getMyLower(),
proposedLeft,
mDragStartRange.upper - mMinWidth);
break;
}
case DragRight: {
//double proposedRight = mDragStartRange.upper + dx;
double proposedRight = dragVal;
// 确保不超出轴范围且不使宽度小于最小值
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() + dragVal;
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;
}
break;
}
default:
break;
}
// 最终确保宽度不小于最小值(针对整体拖动的情况)
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);
if (m_vecResult.size() == 1)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(0)));
if (pret)
{
pret->setRange(newRange.lower, newRange.upper);
}
}
else
{
if (mDragMode == DragRect)
{
float offset = mDragStartRange.lower - getRange().lower;
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();
pret->setRange(rg.lower - offset, rg.upper - offset);
}
}
else
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(0)));
if (pret)
{
pret->setRange(pret->getRange().lower, newRange.upper);
}
pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.last()));
if (pret)
{
pret->setRange(newRange.lower, pret->getRange().upper);
}
}
}
mPlot->replot();
}
// 删除框图
void TransparentGroupResult::deleteRect()
{
@ -453,7 +577,11 @@ void TransparentGroupResult::onMouseRelease(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton && mDragMode != DragNone) {
{
double low = mRect->topLeft->coords().x();
double hight = mRect->bottomRight->coords().x();
PropertyService()->initJieshiItemProperty(this, low, hight, m_Result);
}
if (mDragRect->visible())
{
double y = mPlot->xAxis->pixelToCoord(event->pos().y());
@ -461,134 +589,49 @@ void TransparentGroupResult::onMouseRelease(QMouseEvent *event)
QCPRange newRange = mDragStartRange;
double dval = dy;
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);
dval = mDragStartRange.lower + dy;
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);
dval = mDragStartRange.upper + dy;
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;
}
break;
}
default:
break;
}
// 最终确保宽度不小于最小值(针对整体拖动的情况)
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;
}
}
}
this->setDragRect(mDragMode, dval);
mDragRect->setVisible(false);
mDragLine->setVisible(false);
setRange(newRange.lower, newRange.upper);
if (m_vecResult.size() == 1)
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(0)));
if (pret)
{
pret->setRange(newRange.lower, newRange.upper);
}
}
else
{
if (mDragMode == DragRect)
{
float offset = mDragStartRange.lower - getRange().lower;
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();
pret->setRange(rg.lower - offset, rg.upper - offset);
}
}
else
{
TransparentDraggableResult* pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.at(0)));
if (pret)
{
pret->setRange(pret->getRange().lower, newRange.upper);
}
pret = qobject_cast<TransparentDraggableResult*>(m_mapDraggable_Result.value(m_vecResult.last()));
if (pret)
{
pret->setRange(newRange.lower, pret->getRange().upper);
}
}
}
}
else if (mDragLine->visible())
{
if (mDragMode == DragItem)
{
if (m_pDragResult)
if (mDragMode == DragItem)
{
double y = mPlot->xAxis->pixelToCoord(event->pos().y());
double dy = y - mDragStartY;
QCPRange rg = m_pDragResult->getRange();
m_pDragResult->setRange(rg.lower, rg.upper + dy);
TransparentDraggableResult* upr = m_pDragResult->getUpResult();
if (upr)
if (m_pDragResult)
{
QCPRange rg = upr->getRange();
upr->setRange(rg.lower + dy, rg.upper);
double y = mPlot->xAxis->pixelToCoord(event->pos().y());
double dy = y - mDragStartY;
QCPRange rg = m_pDragResult->getRange();
m_pDragResult->setRange(rg.lower, rg.upper + dy);
TransparentDraggableResult* upr = m_pDragResult->getUpResult();
if (upr)
{
QCPRange rg = upr->getRange();
upr->setRange(rg.lower + dy, rg.upper);
}
m_pDragResult = NULL;
}
m_pDragResult = NULL;
mDragLine->setVisible(false);
}
mDragLine->setVisible(false);
}
}
mPlot->replot();
}

View File

@ -19,12 +19,15 @@ public:
~TransparentGroupResult();
enum DragMode { DragNone, DragLeft, DragRight, DragItem, DragRect };
void addResultToPlot(double left_Low, double right_Hight, QString myResult, QString &strUuid);
//设置最小宽度
void setMinWidth(double minWidth);
//设置标题
void setTitle(QString strTitle);
QString getTitle();
//设置解释结论
void setResult(QString filePath);
@ -40,8 +43,15 @@ public:
void setGroupConclusionProportion(int nCopr);
// 设置显示位置
void setGroupShowPos(int nSPos);
// 设置层号显示
void setFloorVisible(bool bs);
// 设置层号字体
void setFloorFont(QFont f);
// 设置层号旋转
void setFloorRot(double dr);
//设置顶深, 底深
void setDragRect(int dMode, double dragVal);
// 删除框图
void deleteRect();
@ -86,7 +96,6 @@ private:
QString m_Result;
enum DragMode { DragNone, DragLeft, DragRight, DragItem, DragRect };
DragMode mDragMode = DragNone;
//double mDragStartX = 0;
double mDragStartY = 0;

View File

@ -293,7 +293,7 @@ void FormInfo::paintEvent(QPaintEvent* event)
//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);
//painter.drawText(rect.left(), rect.top(), rect.width(), rect.height()/3, Qt::AlignCenter, m_strLineName);
}
else {
//气测/FMT/射孔/文本
@ -431,20 +431,47 @@ void FormInfo::paintEvent(QPaintEvent* event)
//painter.drawText(rect.left() + 20, 55, m_strUnit);
//painter.drawText(rect.left() + 20, 80, QString::number(m_vmin)+" ~ "+QString::number(m_vmax));
if(m_strLineName=="RESULT")
QString strShowTxt = "";
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, "解释结论");
}
strShowTxt = "解释结论";
}
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, "岩心实验数据");
strShowTxt = "岩心实验数据";
}
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, "蝌蚪图");
strShowTxt = "蝌蚪图";
}
else if(m_strLineName=="井眼垮塌矢量图"
|| m_strLineName=="井斜方位图")
@ -453,6 +480,53 @@ void FormInfo::paintEvent(QPaintEvent* event)
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 (strShowTxt.length()>0)
{
QRect rt = rect;
QString text = "";
if (!m_bVerticaDrawing)
{
rt.setX(rect.left());
rt.setY(rect.top() + rect.height() / 3);
rt.setWidth(rect.width());
rt.setHeight(rect.height() / 3);
text = strShowTxt;
}
else
{
for (int i = 0; i < strShowTxt.size(); i++) {
if (!i)text += strShowTxt.at(i);
else {
text += "\n";
text += strShowTxt.at(i);
}
}
}
if (m_nRotationAngle != 0)
{
// 获取文本的精确尺寸
QFontMetrics fm(m_curveUnitFont);
int textWidth = fm.horizontalAdvance(text);
int textHeight = fm.height();
painter.save();
painter.translate(rect.center()); // 将原点移到控件中心
painter.rotate(m_nRotationAngle); // 顺时针旋转90度
// 3. 绘制文本(相对于新原点居中)
painter.drawText(-textWidth / 2, // x偏移向左一半宽度
-textHeight / 2, // y偏移向上一半高度
text);
painter.restore();
}
else
{
painter.drawText(rt, Qt::AlignCenter, text);
}
}
//
if(m_strType=="tableObject" && (m_strLineName=="WORDS_RELUST" || m_strLineName == "RESULT"
|| m_strLineName == "GEO_LITH"|| m_strLineName == "SWALL_CORE"

View File

@ -629,6 +629,10 @@ void QMyCustomPlot::setShowProperty(QVariant val, int ntag)
QFont f = val.value<QFont>();
pGroup->setFloorFont(f);
}
else if (ntag == 5)
{
pGroup->setFloorRot(val.toDouble());
}
}
}
@ -3824,6 +3828,10 @@ void QMyCustomPlot::s_changeDrawProperty(QVariantList vlist)
{
this->setShowProperty(varVal, 4);
}
else if ("层号旋转" == strProperty)
{
this->setShowProperty(varVal, 5);
}
this->replot();
}
}