373 lines
14 KiB
C
373 lines
14 KiB
C
|
|
#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使用uuid,load数据使用数据库自增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
|