DiagramDesigner/diagramCavas/source/graphicsItem/electricSvgGroup.cpp

137 lines
3.8 KiB
C++
Raw Normal View History

2025-10-11 18:51:33 +08:00
#include "graphicsItem/electricSvgGroup.h"
#include "graphicsItem/electricSvgItem.h"
#include <QPainter>
#include <QStyleOption>
#include <QDebug>
ElectricSvgGroup::ElectricSvgGroup(const QRect &rect,QGraphicsItem *parent)
: GraphicsProjectModelGroup(parent)
{
m_lastBoudingRect = rect;
m_boundingRect = rect;
m_dWidth = rect.width();
m_dHeight = rect.height();
}
2025-11-14 19:31:09 +08:00
ElectricSvgGroup::ElectricSvgGroup(const ElectricSvgGroup& obj)
: GraphicsProjectModelGroup(obj)
{
m_lastBoudingRect = obj.m_lastBoudingRect;
m_boundingRect = obj.m_boundingRect;
m_dWidth = obj.m_dWidth;
m_dHeight = obj.m_dHeight;
m_mapSvg = obj.m_mapSvg;
}
2025-10-11 18:51:33 +08:00
ElectricSvgGroup::~ElectricSvgGroup()
{
}
2025-11-14 19:31:09 +08:00
ElectricSvgGroup* ElectricSvgGroup::clone() const
{
return new ElectricSvgGroup(*this);
}
2025-10-11 18:51:33 +08:00
QPainterPath ElectricSvgGroup::shape()
{
QPainterPath path;
path.addRect(m_boundingRect);
return path;
}
void ElectricSvgGroup::updateCoordinate() //当执行了resie和editShape函数后boundingRect发生了变换需要将item的原点(以中心点为原点)校准至boundingRect.center()
{
if (!parentItem())
{
QPointF pt1, pt2, delta;
pt1 = mapToScene(QPointF(0, 0));
pt2 = mapToScene(m_boundingRect.center());
delta = pt1 - pt2;
prepareGeometryChange();
//将boundingRect设置成中心点和原点也是默认变换原点这样三点重合有助于简化计算
m_boundingRect = QRectF(-m_dWidth / 2, -m_dHeight / 2, m_dWidth, m_dHeight);
//setTransformOriginPoint(m_boundingRect.center()); //变换中心默认为item的(0,0)点,所以不执行这句话也没有问题
//更新bouondingRect后重回会显示位置会有变化需要做对应的移动
moveBy(-delta.x(), -delta.y());
updateHandles();
}
m_lastBoudingRect = m_boundingRect;
}
void ElectricSvgGroup::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
painter->setPen(m_pen);
painter->setBrush(m_brush);
if(m_state == S_prepareConnect)
{
painter->setPen(QPen(QColor(255,51,153,180)));
painter->drawLine(m_beginConnectPoint,m_endConnectPoint);
}
if(m_touched)
{
painter->setPen(QPen(QColor(238,58,140,220)));
painter->drawRect(m_boundingRect);
}
if (option->state & QStyle::State_Selected) //是选中状态,绘制选中框
{
renderSelectBackground(painter);
}
}
void ElectricSvgGroup::resize(int nHandle,double dSX, double dSY, const QPointF& basePoint)
{
switch (nHandle)
{
case H_left:
case H_right:
dSY = 1; //拖拽的是左点右点,为水平缩放,忽略垂直变化
break;
case H_top:
case H_bottom:
dSX = 1; //拖拽的是顶点底点,为垂直缩放,忽略水平变化
break;
default:
break;
}
QTransform trans;
//缩放是以图元原点(中心)位置为基准,所以每帧都先移动移动到想要的基准点,缩放之后再移回
trans.translate(basePoint.x(), basePoint.y());
trans.scale(dSX, dSY);
trans.translate(-basePoint.x(), -basePoint.y());
prepareGeometryChange();
m_boundingRect = trans.mapRect(m_lastBoudingRect);
m_dWidth = m_boundingRect.width();
m_dHeight = m_boundingRect.height();
updateHandles();
}
void ElectricSvgGroup::move(const QPointF& point)
{
moveBy(point.x(), point.y());
}
2025-10-17 18:14:44 +08:00
void ElectricSvgGroup::updateMapSvg(QMap<QString,QByteArray> map)
2025-10-11 18:51:33 +08:00
{
2025-10-17 18:14:44 +08:00
m_mapSvg = map;
2025-10-11 18:51:33 +08:00
}
void ElectricSvgGroup::addSvgItem(ElectricSvgItem* item)
{
item->setParentItem(this); // 关键:设置父项
m_childItems.append(item);
updateLayout();
}
void ElectricSvgGroup::editShape(int nHandle,const QPointF& ptMouse)
{
prepareGeometryChange();
updateHandles();
}