/** * @file ModuleConnectGraphicsItem.cpp * @brief 连线 */ #include #include #include #include #include #include "ModuleGraphicsItem.h" #include "ModuleConnection.h" #include "ModuleInformation.h" #include "ModuleConnectGraphicsItem.h" using namespace pai::graphics2d; using namespace pai::workflow; ModuleConnectGraphicsItem::ModuleConnectGraphicsItem(QGraphicsItem *pParent) : QGraphicsLineItem(pParent), m_pStartItem(NULL), m_pEndItem(NULL), m_StartPortIndex(0), m_EndPortIndex(0), m_pConnection(NULL) { setZValue(1); } ModuleConnectGraphicsItem::ModuleConnectGraphicsItem(pai::graphics2d::ModuleGraphicsItem *pStartItem, int startPortIndex, pai::graphics2d::ModuleGraphicsItem *pEndItem, int endPortIndex, QGraphicsItem *pParent) : QGraphicsLineItem(pParent), m_pStartItem(pStartItem), m_pEndItem(pEndItem), m_StartPortIndex(startPortIndex), m_EndPortIndex(endPortIndex), m_pConnection(NULL) { if((NULL == m_pEndItem) || (NULL == m_pStartItem)) { return; } setFlag(QGraphicsItem::ItemIsSelectable, true); setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); setLine(QLineF(m_pEndItem->GetPortPostion(pai::graphics2d::Top,m_EndPortIndex), m_pStartItem->GetPortPostion(pai::graphics2d::Bottom,m_StartPortIndex))); setZValue(1); } void ModuleConnectGraphicsItem::UpdatePosition() { if((NULL == m_pEndItem) || (NULL == m_pStartItem)) { return; } setLine(QLineF(m_pEndItem->GetPortPostion(pai::graphics2d::Top,m_EndPortIndex), m_pStartItem->GetPortPostion(pai::graphics2d::Bottom,m_StartPortIndex))); } ModuleConnectGraphicsItem::~ModuleConnectGraphicsItem() { //连线的信息在连线从工作流中移除时析构 if(m_pConnection) { m_pConnection=NULL; } } int ModuleConnectGraphicsItem::type() const { return Type; } QRectF ModuleConnectGraphicsItem::boundingRect() const { qreal extra = (pen().width() + 20) / 2.0; return QRectF(line().p1(), QSizeF(line().p2().x() - line().p1().x(), line().p2().y() - line().p1().y())) .normalized() .adjusted(-extra, -extra, extra, extra); } QPainterPath ModuleConnectGraphicsItem::shape() const { QPainterPath path = QGraphicsLineItem::shape(); path.addPolygon(m_ArrowHead); return path; } void ModuleConnectGraphicsItem::paint(QPainter *pPainter, const QStyleOptionGraphicsItem */*pOption*/, QWidget */*pWidget*/) { if((NULL == m_pEndItem) || (NULL == m_pStartItem)) { return; } const qreal Pi = 3.14159; const qreal arrowSize = 7; const qreal arrawAngle = 2*0.463648; const qreal arrawHeaderRadius=3; const qreal dPenWidth=1.0; const QColor arrawColor("#517284"); const QColor arrawSelectColor("#59CAFA"); QPen myPen = pen(); myPen.setWidthF(dPenWidth); myPen.setColor(isSelected()?arrawSelectColor:arrawColor); QBrush brush(isSelected()?arrawSelectColor:arrawColor); pPainter->setPen(myPen); pPainter->setBrush(brush); setLine(QLineF(m_pEndItem->GetPortPostion(pai::graphics2d::Top,m_EndPortIndex), m_pStartItem->GetPortPostion(pai::graphics2d::Bottom,m_StartPortIndex))); double angle = 0; if(line().length()>1e-8) { angle = ::acos(line().dx() / line().length()); } if (line().dy() >= 0) angle = (Pi * 2) - angle; QPainterPath path; QPointF p1(line().p1()); QPointF p2(line().p2()); path.moveTo(p2); path.lineTo(p1); m_ArrowHead.clear(); if (isSelected()) { path.addRect(p2.x()-arrawHeaderRadius,p2.y()-arrawHeaderRadius,arrawHeaderRadius+arrawHeaderRadius,arrawHeaderRadius+arrawHeaderRadius); path.addRect(p1.x()-arrawHeaderRadius,p1.y()-arrawHeaderRadius,arrawHeaderRadius+arrawHeaderRadius,arrawHeaderRadius+arrawHeaderRadius); } else { QPointF arrowP1 = p1 + QPointF(sin(angle + arrawAngle) * arrowSize, cos(angle + arrawAngle) * arrowSize); QPointF arrowP2 = p1 + QPointF(sin(angle + Pi - arrawAngle) * arrowSize, cos(angle + Pi - arrawAngle) * arrowSize); m_ArrowHead << p1 << arrowP1 << arrowP2; path.addPolygon(m_ArrowHead); } pPainter->drawPath(path); } CModuleConnection* ModuleConnectGraphicsItem::GetConnection() { if((NULL == m_pEndItem) || (NULL == m_pStartItem)) { return NULL; } if(NULL==m_pConnection) { m_pConnection=new CModuleConnection(); } CModuleInformation* pStartMoudle = m_pStartItem->GetModule(); CModuleInformation* pEndMoudle = m_pEndItem->GetModule(); if(pStartMoudle != NULL) { m_pConnection->SetSourceId(pStartMoudle->GetStepID()); } if(pEndMoudle != NULL) { m_pConnection->SetDestId(pEndMoudle->GetStepID()); } m_pConnection->SetOutPort(QString::number(m_StartPortIndex).toStdString()); m_pConnection->SetInPort(QString::number(m_EndPortIndex).toStdString()); return m_pConnection; } void ModuleConnectGraphicsItem::GetConnectLineStartEnd(pai::graphics2d::ModuleGraphicsItem *&pStart, pai::graphics2d::ModuleGraphicsItem *&pEnd) { pStart = m_pStartItem; pEnd = m_pEndItem; } int ModuleConnectGraphicsItem::GetStartPortIndex() const { return m_StartPortIndex; } int ModuleConnectGraphicsItem::GetEndPortIndex() const { return m_EndPortIndex; } ModuleGraphicsItem * ModuleConnectGraphicsItem::GetStartItem() const { return m_pStartItem; } void ModuleConnectGraphicsItem::SetStartItem(ModuleGraphicsItem *pStartItem) { m_pStartItem = pStartItem; } ModuleGraphicsItem * ModuleConnectGraphicsItem::GetEndItem() const { return m_pEndItem; } void ModuleConnectGraphicsItem::SetEndItem(ModuleGraphicsItem *pEndItem) { m_pEndItem = pEndItem; }