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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-03 18:27:49 +08:00
|
|
|
|
void ElectricSvgGroup::updateCurState(monitorItemState e)
|
|
|
|
|
|
{
|
|
|
|
|
|
GraphicsProjectModelItem::updateCurState(e);
|
|
|
|
|
|
for(auto& p:m_childItems){
|
|
|
|
|
|
auto pItem = dynamic_cast<ElectricSvgItem*>(p);
|
|
|
|
|
|
if(pItem){
|
|
|
|
|
|
pItem->updateCurState(e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-11 18:51:33 +08:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-03 18:27:49 +08:00
|
|
|
|
void ElectricSvgGroup::setMonitorDisplayInfo(QMap<monitorItemStateStruct,monitorItemDisplayInfo> info)
|
|
|
|
|
|
{
|
|
|
|
|
|
GraphicsProjectModelItem::setMonitorDisplayInfo(info);
|
|
|
|
|
|
for(auto& p:m_childItems){
|
|
|
|
|
|
auto pItem = dynamic_cast<ElectricSvgItem*>(p);
|
|
|
|
|
|
if(pItem){
|
|
|
|
|
|
pItem->setMonitorDisplayInfo(info);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|