DiagramDesigner/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGro...

182 lines
5.1 KiB
C++
Raw Normal View History

2026-03-13 08:31:37 +08:00
#include "graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.h"
#include "graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "baseProperty.h"
#include "global.h"
#include <QPainter>
#include <QStyleOption>
#include <QGraphicsScene>
#include <QGraphicsView>
ElectricFunctionModelSvgGroupPT::ElectricFunctionModelSvgGroupPT(const QRect &rect, QGraphicsItem *parent)
: ElectricFunctionModelSvgGroup(rect,parent)
{
initial();
}
ElectricFunctionModelSvgGroupPT::~ElectricFunctionModelSvgGroupPT()
{
}
void ElectricFunctionModelSvgGroupPT::setImage_1(QFileInfo info)
{
QByteArray svgData;
QFile svgFile(info.absoluteFilePath());
if (svgFile.open(QIODevice::ReadOnly)) {
svgData = svgFile.readAll();
svgFile.close();
} else {
qDebug() << "can't open imgfile" << svgFile.errorString();
}
QMap<QString,QByteArray> mapData;
if(!svgData.isEmpty()){
mapData["pt"] = svgData;
updateMapSvg(mapData,"pt");
updateItem();
}
QString sMeta;
QString sModel;
if(_property){
sMeta = _property->metaModelName();
sModel = _property->modelName();
}
if(_pHandle && !sMeta.isEmpty() && !sModel.isEmpty())
_pHandle->updateItemIcon(sMeta,sModel,mapData,"pt");
GraphicsBaseItem::setImage_1(info);
}
void ElectricFunctionModelSvgGroupPT::setupFinish(QVariant var)
{
if(var.canConvert<QList<int>>()){
QList<int> lst = var.value<QList<int>>();
m_lstType = lst;
}
updateItem();
}
void ElectricFunctionModelSvgGroupPT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricFunctionModelSvgGroup::paint(painter,option,widget);
if(m_childItems.isEmpty()){ //无对象时绘制提示框
QPen pen(Qt::lightGray);
pen.setStyle(Qt::DotLine);
painter->setPen(pen);
painter->drawRect(m_boundingRect);
}
}
void ElectricFunctionModelSvgGroupPT::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
if(!_itemImgIndex.contains("y"))
_itemImgIndex.append("y");
if(!_itemImgIndex.contains("z"))
_itemImgIndex.append("z");
}
void ElectricFunctionModelSvgGroupPT::updateItem()
{
for(auto pItem:m_childItems){
delete pItem;
}
m_childItems.clear();
QRect rec(0,0,30,30);
for(int i = 0;i < m_lstType.size();++i){
ElectricFunctionModelSvgItemPT* p = new ElectricFunctionModelSvgItemPT(rec);
if(m_lstType[i] == 1){
p->loadSvg(m_mapSvg["y"]);
p->setItemType(1);
}
else{
p->loadSvg(m_mapSvg["z"]);
p->setItemType(0);
}
p->setMoveable(false);
addSvgItem(p);
}
updateTerPos();
}
void ElectricFunctionModelSvgGroupPT::updateLayout()
{
if (m_childItems.isEmpty()) return;
// 获取所有子项
//QList<QGraphicsItem*> children = childItems();
int n = m_childItems.size();
if (n == 0) return;
// 中心点
QPointF center(0, 0); // 假设以当前item的坐标系中心为布局中心
// 圆的半径(假设所有子项大小相同)
qreal radius = m_childItems.first()->boundingRect().width()*0.5; // 根据需要调整
// 布局半径(子项中心到布局中心的距离)
qreal layoutRadius = radius * 1; // 根据需要调整
switch(n) {
case 1:
// 单个子项放在中心
m_childItems[0]->setPos(center);
break;
case 2:
// 两个子项上下排列
m_childItems[0]->setPos(center.x(), center.y() - layoutRadius);
m_childItems[1]->setPos(center.x(), center.y() + layoutRadius);
break;
case 3:
// 三个子项三角形排列
for (int i = 0; i < 3; ++i) {
qreal angle = 2 * M_PI * i / 3 - M_PI / 2; // 从顶部开始
m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle),
center.y() + layoutRadius * sin(angle));
}
break;
case 4:
// 四个子项正方形排列
for (int i = 0; i < 4; ++i) {
qreal angle = 2 * M_PI * i / 4 - M_PI / 4; // 从右上角开始
m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle),
center.y() + layoutRadius * sin(angle));
}
break;
case 5:
// 五个子项五角星排列
for (int i = 0; i < 5; ++i) {
qreal angle = 2 * M_PI * i / 5 - M_PI / 2; // 从顶部开始
m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle),
center.y() + layoutRadius * sin(angle));
}
break;
default:
// 对于多于5个的情况使用圆形排列
for (int i = 0; i < n; ++i) {
qreal angle = 2 * M_PI * i / n;
m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle),
center.y() + layoutRadius * sin(angle));
}
break;
}
updateBoundRect();
}