#include #include "ZxBaseUtil.h" #include "nmObjFault.h" #include "nmObjFaultTool.h" nmObjFaultTool::nmObjFaultTool() : nmObjToolBase() { setText(tr("nObjFaultTool")); m_oNot = NMOT_Fault; } bool nmObjFaultTool::onLeftDown(const QPointF& pt) { if (nullptr == m_pObj) //绘图对象尚未创建(鼠标选点ing) { m_bTracking = true; m_ptStart = pt; changeCursor(Qt::CrossCursor); // 对于持续性选点的工具,需要设置 getView()->setCursorKeeping(true); m_vecPoints.push_back(pt); return true; } else //业已绑定绘图对象 { return nmObjToolBase::onLeftDown(pt); } } bool nmObjFaultTool::onMouseMove(const QPointF& pt) { if (nullptr == m_pObj) //绘图对象尚未创建(鼠标选点ing) { m_ptMove = pt; if (m_bTracking) { updateLastMoveArea(true); } return true; } else //业已绑定绘图对象 { return nmObjToolBase::onMouseMove(pt); } } bool nmObjFaultTool::onLeftUp(const QPointF& pt) { if (nullptr == m_pObj) //绘图对象尚未创建(鼠标选点ing) { if (!m_vecPoints.isEmpty()) //避免本工具被Detach之后无法update { updateLastMoveArea(true); } return true; } else //业已绑定绘图对象 { return nmObjToolBase::onLeftUp(pt); } } bool nmObjFaultTool::onLeftDoubleClick(const QPointF& pt) { if (nullptr == m_pObj && m_vecPoints.count() >= 2) //绘图对象尚未创建(鼠标选点ing) { changeCursor(Qt::ArrowCursor); emit sigPtsFinished(m_vecPoints); //注:该句正确执行之后,会把本工具nmObjFaultTool //与View之间detach m_vecPoints.clear(); if (m_bTracking) { m_bTracking = false; } return true; } else //业已绑定绘图对象 { return nmObjToolBase::onLeftDoubleClick(pt); } } bool nmObjFaultTool::onMouseWheel(const QPointF& pt, int delta) { return nmObjToolBase::onMouseWheel(pt, delta); } void nmObjFaultTool::onPaint(QPainter* painter, const ZxPaintParam& param) { nmObjFault* pObj = dynamic_cast(m_pObj); if (pObj == nullptr) //绘图对象尚未创建(鼠标选点ing) { Qt::CursorShape o = Qt::CrossCursor; changeCursor(o); paintTrackingVirtualObj(painter, param); } else //业已绑定绘图对象 { paintTrackingRealObj(painter, param); } } void nmObjFaultTool::paintTrackingVirtualObj(QPainter* painter, const ZxPaintParam& param) { painter->save(); // 已经选的点 { QPen pen(Qt::SolidLine); painter->setPen(pen); for (int i = 0; i < m_vecPoints.count() - 1; i++) { painter->drawLine(m_vecPoints[i], m_vecPoints[i + 1]); } } // 当前正在进行的点 if (m_bTracking || !m_vecPoints.isEmpty()) { QPen pen(Qt::DashLine); painter->setPen(pen); painter->drawLine(m_ptStart, m_ptMove); } painter->restore(); } void nmObjFaultTool::paintTrackingRealObj(QPainter* painter, const ZxPaintParam& param) { if (!m_bTracking) { return; } nmObjFault* pObj = dynamic_cast(m_pObj); Q_ASSERT (nullptr != pObj); if (nullptr == pObj) { return; // 如果pObj为nullptr,直接返回 } int nIndex = pObj->m_nHitIndex; Qt::CursorShape o = getCursorBy((int)m_oHitOption, nIndex); QVector vec = pObj->getAllPos(); QPointF ptOld = m_ptStart; QPointF ptNew = getCurrentPos(); if (m_oHitOption == OHO_Point) { if (nIndex >= 0 && nIndex < vec.count()) { vec[nIndex] = getCurrentPos(); } } else if (m_oHitOption == OHO_Bound) { // if (nIndex >= 0 && nIndex < vec.count() - 1) // { // vec[nIndex] = pObj->offsetPoint(vec[nIndex], ptOld, ptNew); // vec[nIndex + 1] = pObj->offsetPoint(vec[nIndex + 1], ptOld, ptNew); // } // } // else if (m_oHitOption == OHO_Inner) // { for (int i = 0; i < vec.count(); i++) { vec[i] = pObj->offsetPoint(vec[i], ptOld, ptNew); } } else { return; } painter->save(); QPen pen(Qt::DashLine); painter->setPen(pen); for (int i = 1; i < vec.count(); i++) { QPointF pt1 = vec[i - 1]; QPointF pt2 = vec[i]; QLineF oLine = QLineF(pt1, pt2); painter->drawLine(oLine); } // QColor clr = pObj->getBackgrdColor(); // clr.setAlpha(128); // painter->fillPath(oPath, QBrush(clr)); changeCursor(o); painter->restore(); } Qt::CursorShape nmObjFaultTool::getCursorBy(const int& nOption, const int& nSubIndex) { if (nOption < 0) { return Qt::ArrowCursor; } ObjHitOption oHitOption = (ObjHitOption)nOption; if (oHitOption == OHO_Point) { return (Qt::CrossCursor); } else if (oHitOption == OHO_Bound) { // return (Qt::SizeAllCursor); // } // else if (oHitOption == OHO_Inner) // { return (Qt::SizeAllCursor); } return Qt::ArrowCursor; }