#include #include "ZxBaseUtil.h" #include "nmObjPolygon.h" #include "nmObjPolygonTool.h" nmObjPolygonTool::nmObjPolygonTool() : nmObjToolBase() { setText(tr("nObjPolygonTool")); m_oNot = NOT_Polygon; } bool nmObjPolygonTool::onLeftDown(const QPointF& pt) { if (NULL == m_pObj) //绘图对象尚未创建(鼠标选点ing) { m_bTracking = true; m_ptStart = pt; changeCursor(Qt::CrossCursor); // 对于持续性选点的工具,需要设置 getView()->setCursorKeeping(true); double nDistance = 3.0f; if (m_vecPoints.count() > 2) //如果与第一个点非常接近,自动封闭处理 { if ((qAbs(m_vecPoints[0].x() - pt.x()) < nDistance) && \ (qAbs(m_vecPoints[0].y() - pt.y()) < nDistance)) { getView()->setCursorKeeping(false); changeCursor(Qt::ArrowCursor); emit sigPtsFinished(m_vecPoints); //注:该句正确执行之后,会把本工具nmObjPolygonTool //与View之间detach m_vecPoints.clear(); m_bTracking = false; return true; } } m_vecPoints.push_back(pt); return true; } else //业已绑定绘图对象 { return nmObjToolBase::onLeftDown(pt); } } bool nmObjPolygonTool::onMouseMove(const QPointF& pt) { if (NULL == m_pObj) //绘图对象尚未创建(鼠标选点ing) { m_ptMove = pt; if (m_bTracking) { updateLastMoveArea(true); } return true; } else //业已绑定绘图对象 { return nmObjToolBase::onMouseMove(pt); } } bool nmObjPolygonTool::onLeftUp(const QPointF& pt) { if (NULL == m_pObj) //绘图对象尚未创建(鼠标选点ing) { // if (m_bTracking) // { // m_bTracking = false; // } if (!m_vecPoints.isEmpty()) //避免本工具被Detach之后无法update { updateLastMoveArea(true); } return true; } else //业已绑定绘图对象 { return nmObjToolBase::onLeftUp(pt); } } bool nmObjPolygonTool::onLeftDoubleClick(const QPointF& pt) { if (NULL == m_pObj) //绘图对象尚未创建(鼠标选点ing) { changeCursor(Qt::ArrowCursor); emit sigPtsFinished(m_vecPoints); //注:该句正确执行之后,会把本工具nmObjPolygonTool //与View之间detach m_vecPoints.clear(); if (m_bTracking) { m_bTracking = false; } return true; } else //业已绑定绘图对象 { return nmObjToolBase::onLeftDoubleClick(pt); } } bool nmObjPolygonTool::onMouseWheel(const QPointF& pt, int delta) { return nmObjToolBase::onMouseWheel(pt, delta); } void nmObjPolygonTool::onPaint(QPainter* painter, const ZxPaintParam& param) { nmObjPolygon* pObj = dynamic_cast(m_pObj); if (pObj == NULL) //绘图对象尚未创建(鼠标选点ing) { Qt::CursorShape o = Qt::CrossCursor; changeCursor(o); paintTrackingVirtualObj(painter, param); } else //业已绑定绘图对象 { paintTrackingRealObj(painter, param); } } void nmObjPolygonTool::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 nmObjPolygonTool::paintTrackingRealObj(QPainter* painter, const ZxPaintParam& param) { if (!m_bTracking) { return; } nmObjPolygon* pObj = dynamic_cast(m_pObj); Q_ASSERT (NULL != pObj); 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); QPainterPath oPath; oPath.moveTo(vec[0]); for (int i = 1; i < vec.count(); i++) { oPath.lineTo(vec[i]); } oPath.closeSubpath(); QColor clr = pObj->getBackgrdColor(); clr.setAlpha(128); painter->fillPath(oPath, QBrush(clr)); changeCursor(o); painter->restore(); } Qt::CursorShape nmObjPolygonTool::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; }