You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Src/nmNum/nmPlot/nmObjFaultTool.cpp

228 lines
5.2 KiB
C++

#include <QPainter>
#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<nmObjFault*>(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<nmObjFault*>(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<QPointF> 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;
}