DiagramDesigner/common/core_model/diagram.h

373 lines
14 KiB
C
Raw Normal View History

2026-03-13 08:31:37 +08:00
#ifndef DIAGRAM_H
#define DIAGRAM_H
/*********组态图********/
#include <QString>
#include <QUuid>
#include <QJsonObject>
#include <QHash>
#include <QList>
#include <QPointF>
#include <QRectF>
// 组态图信息
struct DiagramInfo {
QVariant id; //临时id使用uuidload数据使用数据库自增id
QString sName;
QString sTag;
QVariant parentId;
QString sBasePageName; //父组态图名称
};
struct DiagramEditorWizardBusInfo //组态编辑母线信息
{
int nIndex = 0;
double dVoltage = 0; //电压等级
int nLineType = 1; //1单母线2双母线
int nNum1 = 0; //1母
int nNum2 = 0; //2母
int connectType = 0; //接线方式1为分段连接
int nState = 0; //母线状态位 0已保存1新建2修改
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorWizardBusInfo &data) {
out << data.nIndex << data.dVoltage << data.nLineType << data.nNum1 << data.nNum2 << data.connectType << data.nState;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorWizardBusInfo &data) {
in >> data.nIndex >> data.dVoltage >> data.nLineType >> data.nNum1 >> data.nNum2 >> data.connectType >> data.nState;
return in;
}
};
enum class TransformerType //变压器类型
{
twoWinding = 0, //两绕组
threeWinding //三绕组
};
enum class BayType //间隔类型
{
busSectionBay = 0, //分段
busCouplerBay, //母联
ptBay, //pt
incomingBay, //进线
outcomingBay, //出线
compensationBay, //无功补偿
bypassBay, //旁路
mainTransformerBay //主变
};
enum class EditorItemType //组态编辑中的图形项类型
{
bus = 1, //母线
bay, //间隔
trans, //变压器
line, //连接线
None //空白占位图
};
struct EditorTransConnection //组态变压器连接信息
{
QString sName;
int nPara = 0; //012,高中低侧
};
struct DiagramEditorWizardTransformerInfo //组态变压器信息
{
QString sName;
TransformerType nType;
double dVoltageLevel;
QList<EditorTransConnection> lstBindObj; //连接的对象
};
struct DiagramEditorWizardBayInfo //组态间隔信息
{
QString sName;
BayType nType;
double dVoltageLevel;
QList<QString> lstBindObj; //连接的对象
};
struct DiagramEditorComponentInfo //组态设备信息
{
int nCategory = 0; //分类 0电气设备1连接关系
QString sName;
int nType = 0; //类型 1母线2异步电动机3断路器4电缆5电流互感器6电压互感器7隔离开关8接地开关9快速接地开关10双掷接地隔离开关11带电指示器12避雷器13电缆出线套筒14电缆端
QString sBindObj; //所关联的实体名 (母线block,间隔block变压器高中低端子)
int nBindType = 0; //关联实体的类型 1母线2间隔3变压器
int nBindPara = 0; //关联额外参数,关联变压器时为(0高1中2低)
QString sBindParent; //关联父item名关联变压器时为变压器名
QStringList sUsedRoute; //使用设备的线路名
int nUsedDirection = 0; //被占用的方向 8421 上下左右
QPoint deltaPos = QPoint(0,0); //相对坐标(相对间隔)
QUuid uid;
int nFlag = 0; //标志0未使用1新建2修改
int nRotate = 0; //旋转角
bool operator ==(const DiagramEditorComponentInfo& obj) const {
if(nCategory == obj.nCategory && sName == obj.sName && nType == obj.nType && sBindObj == obj.sBindObj && nBindType == obj.nBindType &&
sUsedRoute == obj.sUsedRoute && nUsedDirection == obj.nUsedDirection && deltaPos == obj.deltaPos && uid == obj.uid && nFlag == obj.nFlag && nRotate == obj.nRotate)
return true;
else
return false;
}
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorComponentInfo &data) {
out << data.nCategory << data.sName << data.nType << data.sBindObj << data.nBindType << data.nBindPara << data.sBindParent << data.sUsedRoute << data.nUsedDirection << data.deltaPos << data.uid << data.nFlag << data.nRotate;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorComponentInfo &data) {
in >> data.nCategory >> data.sName >> data.nType >> data.sBindObj >> data.nBindType >> data.nBindPara >> data.sBindParent >> data.sUsedRoute >> data.nUsedDirection >> data.deltaPos >> data.uid >> data.nFlag >> data.nRotate;
return in;
}
};
inline uint qHash(const DiagramEditorComponentInfo &key, uint seed = 0) {
return qHash(key.uid, seed);
}
struct DiagramEditorRouteInfo //间隔中单条线路信息
{
QString sRouteName;
bool bMainRoute = false; //主线路(包含设备最多的线路,决定整体布局)
QList<DiagramEditorComponentInfo> lstCompo;
QList<DiagramEditorComponentInfo> lstOrder; //线路顺序容器(计算用)
QList<DiagramEditorComponentInfo> lstReverse; //逆序容器(计算用)
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorRouteInfo &data) {
out << data.sRouteName << data.bMainRoute << data.lstCompo << data.lstOrder << data.lstReverse;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorRouteInfo &data) {
in >> data.sRouteName >> data.bMainRoute >> data.lstCompo >> data.lstOrder >> data.lstReverse;
return in;
}
};
struct DiagramEditorBayInfo //组态编辑间隔信息
{
QString name; //间隔名
int nLayout; //布局 0纵向1横向
QList<QUuid> lstFrom; //起始
QList<QUuid> lstTo; //结束
QMap<QString,DiagramEditorRouteInfo> mapRoute; //线路信息
QMap<QString,DiagramEditorComponentInfo> mapComponent; //设备信息
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorBayInfo &data) {
out << data.name << data.nLayout << data.lstFrom << data.lstTo << data.mapRoute << data.mapComponent;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorBayInfo &data) {
in >> data.name >> data.nLayout >> data.lstFrom >> data.lstTo >> data.mapRoute >> data.mapComponent;
return in;
}
};
struct DiagramEditorTransNeutralInfo //组态编辑变压器中性点信息
{
QString name; //中性点名
int nType = 0; //中性点类型 0高1中2低
QPointF delPoint; //相对变压器偏移量
QMap<QString,DiagramEditorRouteInfo> mapRoute; //中性点对应的线路结构
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorTransNeutralInfo &data) {
out << data.name << data.nType << data.delPoint << data.mapRoute;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorTransNeutralInfo &data) {
in >> data.name >> data.nType >> data.delPoint >> data.mapRoute;
return in;
}
};
struct DiagramEditorTransInfo //组态编辑变压器信息
{
QString name; //变压器名
QMap<int,DiagramEditorTransNeutralInfo> mapNeutral; //中性点结构
QMap<QString,DiagramEditorComponentInfo> mapComponent; //设备信息
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorTransInfo &data) {
out << data.name << data.mapNeutral << data.mapComponent;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorTransInfo &data) {
in >> data.name >> data.mapNeutral >> data.mapComponent;
return in;
}
};
enum class DiagramEditorStructType
{
block = 0, //模块(母线段、间隔、变压器)
blockContainer, //模块容器(包含若干模块)
rowData //行数据(包含若干容器)
};
struct DiagramEditorConnectType //组态编辑连接信息
{
QString sName;
int nType = 0; //1母线2间隔,3变压器
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorConnectType &data) {
out << data.sName << data.nType;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorConnectType &data) {
in >> data.sName >> data.nType;
return in;
}
};
struct DiagramEditorBriefConnect //组态编辑时连接信息
{
QUuid uid;
DiagramEditorConnectType con1;
DiagramEditorConnectType con2;
int nPara = 0; //万用参数(变压器中表示连接位置,0高压侧1中压侧2低压侧)
bool operator==(const DiagramEditorBriefConnect& obj)
{
if(this == &obj)
return false;
if((con1.sName == obj.con1.sName && con2.sName == obj.con2.sName)||(con1.sName == obj.con2.sName && con2.sName == obj.con1.sName))
return true;
else
return false;
}
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorBriefConnect &data) {
out << data.uid << data.con1 << data.con2 << data.nPara;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorBriefConnect &data) {
in >> data.uid >> data.con1 >> data.con2 >> data.nPara;
return in;
}
DiagramEditorConnectType getOpposite(const QString& s){ //获取另一端名称
if(con1.sName == s)
return con2;
else if(con2.sName == s)
return con1;
return DiagramEditorConnectType();
}
};
struct DiagramEditorBlockInfo //组态编辑block信息
{
QString sName;
QString sContainerId; //所属的容器id
int nType; //1母线,2间隔,3变压器
int nContainerLevel; //所处容器的层级 0,1,2,3
QUuid uid;
QList<QUuid> _lstCon; //连接信息
QList<QPair<int,QUuid>> _lstSub; //子对象列表(非拓扑计算使用) 如母线子对象为间隔间隔子对象为item电动机子对象为item <类型uid> 类型0设备1间隔
QRectF recSize; //当前大小(根据内容确定)
QPointF sceneDelta; //block中心相对位移(计算布局位置
bool bEditState; //详细编辑状态
//bus
float fVoltage; //母线电压
int nBusType; //0无前缀,1:Ⅰ母,2Ⅱ母
int nIndex; //第几段,1A,2B,3C,4D,5E,6F,7G,8H
//bay
BayType nBayType;
DiagramEditorBayInfo bayInfo; //间隔信息
//transformer
TransformerType nTransType;
DiagramEditorTransInfo transInfo;
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorBlockInfo &data) {
out << data.sName << data.sContainerId << data.nType << data.nContainerLevel << data.uid << data._lstCon << data.recSize << data.sceneDelta
<< data.bEditState << data.fVoltage << data.nBusType << data.nIndex << data.nBayType << data.bayInfo << data.nTransType << data.transInfo;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorBlockInfo &data) {
in >> data.sName >> data.sContainerId >> data.nType >> data.nContainerLevel >> data.uid >> data._lstCon >> data.recSize >> data.sceneDelta
>> data.bEditState >> data.fVoltage >> data.nBusType >> data.nIndex >> data.nBayType >> data.bayInfo >> data.nTransType >> data.transInfo;
return in;
}
};
struct DiagramEditorContainerInfo //组态编辑容器信息
{
QString sId;
double dMidUpY; //1母上边界
double dMidDownY; //2母下边界
double dStartX; //起始x
double dStartY; //起始y
double dWidth; //宽度
double dHeight;
double dMaxUpH; //上方最大高度(1母线到上边界)
double dMaxDownH; //下方最大高度(2母线到下边界)
QMap<int,QList<DiagramEditorBlockInfo>> mapBlockInfo;
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorContainerInfo &data) {
out << data.sId << data.dMidUpY << data.dMidDownY << data.dStartX << data.dStartY << data.dWidth << data.dHeight << data.dMaxUpH << data.dMaxDownH << data.mapBlockInfo;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorContainerInfo &data) {
in >> data.sId >> data.dMidUpY >> data.dMidDownY >> data.dStartX >> data.dStartY >> data.dWidth >> data.dHeight >> data.dMaxUpH >> data.dMaxDownH >> data.mapBlockInfo;
return in;
}
};
struct DiagramEditorProjectInfo //editor工程信息
{
QString sName;
QUuid uid;
QMap<int,DiagramEditorWizardBusInfo> mapBus;
QMap<int,QList<DiagramEditorContainerInfo>> mapSturctContainer;
QMap<QUuid,DiagramEditorBriefConnect> mapConnect;
friend QDataStream &operator<<(QDataStream &out, const DiagramEditorProjectInfo &data) {
out << data.sName << data.uid << data.mapBus << data.mapSturctContainer << data.mapConnect;
return out;
}
friend QDataStream &operator>>(QDataStream &in, DiagramEditorProjectInfo &data) {
in >> data.sName >> data.uid >> data.mapBus >> data.mapSturctContainer >> data.mapConnect;
return in;
}
};
struct DiagramContent {
QString diagramId; // 对应的PowerEntity ID
// 元素位置信息 <元素ID, 位置>
QHash<QString, QPointF> elementPositions;
QHash<QString, QList<QPointF>> connectionPaths; // 自定义路径点
};
struct BaseComponentInfo //基模图元数据
{
int id = 0;
QUuid uuid;
QString name;
QString tag;
int typeId = 0;
QJsonObject context;
QString metaMmodel;
QString projectModel;
};
struct EditorProjectInfo //editor工程数据
{
int id = 0;
QUuid uuid;
QString name;
QString tag;
};
struct EditorBaseSettingInfo //editor基础设置
{
int id = 0;
QUuid uuid;
QString projectName; //所属工程名
QString autor; //作者
QByteArray context; //内容
QUuid generateUid; //生成的图uuid
QString ts; //时间戳
};
#endif // DIAGRAM_H