#include #include "ZxBaseUtil.h" #include "nmObjDelete.h" #include "nmObjDeleteTool.h" #include "nmSingalCenter.h" #include "ZxPlot.h" #include #include "nmObjLineCrack.h" nmObjDeleteTool::nmObjDeleteTool() : nmObjToolBase() , m_pPlot(nullptr) { setText(tr("nObjDeleteTool")); m_oNot = NMOT_Delete; m_bShowDeleteIcon = false; m_hoverObj = nullptr; m_deleteIcon.load(ZxBaseUtil::getDirOf(s_Dir_Res, "Icon") + "nmTrash.png"); } nmObjDeleteTool::nmObjDeleteTool(ZxPlot* pPlot) : nmObjToolBase() , m_pPlot(pPlot) { setText(tr("nObjDeleteTool")); m_oNot = NMOT_Delete; nmDataLogFile::getInstance()->writeLog(" nmObjDeleteTool ++++++++ " + QString::number(m_oNot)); this->m_delObj.clear(); m_bShowDeleteIcon = false; m_hoverObj = nullptr; m_deleteIcon.load(ZxBaseUtil::getDirOf(s_Dir_Res, "Icon") + "nmTrash.png"); } bool nmObjDeleteTool::onLeftUp(const QPointF& pt) { if (NULL == m_pObj) //绘图对象尚未创建(鼠标选点ing) { //changeCursor(Qt::CrossCursor); // 判断鼠标是否进入了要删除的对象上 if (!m_delObj.isEmpty()) { int objCount = this->m_delObj.count(); for(int i = 0; i < objCount; i++) { ZxObjBase* obj = this->m_delObj[i]; if (obj == NULL) { continue; } QVector pts = obj->getAllPos(); // 井或区域标记 if (pts.count() == 1) { // 计算鼠标点击位置与井的中心点的距离 float distance = QLineF(pt, pts[0]).length(); if (distance <= 1.f * 5) // 如果距离在5像素范围内 { if (obj != NULL) { nmSingalCenter::getInstance()->emitSigDeleteOneObj(obj->getName(), (void*)this); return true; } } } // 线 for (int i = 0; i < pts.count(); i++) { int n1 = i; int n2 = (i == pts.count() - 1 ? 0 : i + 1); if (_isNearLine(pt, pts[n1], pts[n2], 1.f * 3)) { if (obj != NULL) { nmSingalCenter::getInstance()->emitSigDeleteOneObj(obj->getName(),(void*) this); return true; } } } } } else { return nmObjToolBase::onLeftUp(pt); } return true; } else //业已绑定绘图对象 { return nmObjToolBase::onLeftUp(pt); } } void nmObjDeleteTool::onPaint(QPainter* painter, const ZxPaintParam& param) { nmObjDelete* pObj = dynamic_cast(m_pObj); if (pObj == NULL) //绘图对象尚未创建(鼠标选点ing) { m_currentMousePos = getCurrentPos(); m_bShowDeleteIcon = false; m_hoverObj = nullptr; if (this->m_pPlot == NULL) { return; } // 处理可删除对象列表 int objCount = this->m_pPlot->getObjCount(); for(int i = 0; i < objCount; i++) { ZxObjBase* obj = this->m_pPlot->getObjByIndex(i); if (obj == NULL) { continue; } if(_isSame("nObjLineFracture", obj->getTagName()) || \ _isSame("nObjLineFault", obj->getTagName()) || \ _isSame("nObjRegion", obj->getTagName()) || \ _isSame("nObjPointWell", obj->getTagName()) || \ _isSame("nObjRegionMark", obj->getTagName())) { // 判断裂缝是不是裂缝 if(_isSame("nObjLineFracture", obj->getTagName())) { nmObjLineCrack* pFractureObj = dynamic_cast(obj); if (pFractureObj == NULL || pFractureObj->getFractureData() == NULL) { continue; } // 如果是DFN生成的裂缝,那么不做处理 if (pFractureObj->getFractureData()->getFractureType().getValue() == tr("DFN")) { continue; } } bool isContain = false; // 遍历 m_delObj,检查是否存在相同的指针 for (int j = 0; j < m_delObj.count(); j++) { if (m_delObj[j] == obj) { isContain = true; break; } } if (!isContain) { m_delObj.append(obj); } // 检查鼠标是否在此对象上 QVector pts = obj->getAllPos(); // 井或区域标记 if (pts.count() == 1) { float distance = QLineF(m_currentMousePos, pts[0]).length(); if (distance <= 1.f * 5) // 如果距离在5像素范围内 { m_bShowDeleteIcon = true; m_hoverObj = obj; } } // 线 else { for (int j = 0; j < pts.count(); j++) { int n1 = j; int n2 = (j == pts.count() - 1 ? 0 : j + 1); if (_isNearLine(m_currentMousePos, pts[n1], pts[n2], 1.f * 3)) { m_bShowDeleteIcon = true; m_hoverObj = obj; break; } } } } } // 如果鼠标悬停在可删除对象上,绘制删除图标 if (m_bShowDeleteIcon && !m_deleteIcon.isNull()) { // 在鼠标右侧绘制图标 QPointF iconPos = m_currentMousePos + QPointF(4, 2); int iconSize = 10; // 图标尺寸 QRectF iconRect(iconPos.x(), iconPos.y(), iconSize, iconSize); painter->drawPixmap(iconRect, m_deleteIcon, m_deleteIcon.rect()); } } else //业已绑定绘图对象 { // paintTrackingRealObj(painter, param); } }