modify monitor data structure

This commit is contained in:
baiYue 2025-11-14 19:31:09 +08:00
parent 0354edfcfb
commit f0feb9c0c1
83 changed files with 2330 additions and 491 deletions

View File

@ -52,6 +52,8 @@ set(H_HEADER_FILES
include/diagramView.h
include/topologyTree.h
include/createEditor.h
include/monitorItemsDlg.h
include/monitorPagesDlg.h
common/include/global.h
common/include/tools.h
@ -80,6 +82,8 @@ set(CPP_SOURCE_FILES
source/diagramView.cpp
source/topologyTree.cpp
source/createEditor.cpp
source/monitorItemsDlg.cpp
source/monitorPagesDlg.cpp
common/source/httpInterface.cpp
common/source/global.cpp
@ -94,6 +98,8 @@ set(UI_FILES
ui/topologyView.ui
ui/diagramView.ui
ui/createEditor.ui
ui/monitorItemsDlg.ui
ui/monitorPagesDlg.ui
)
#

View File

@ -20,11 +20,14 @@ public:
virtual QString name() const {return sName;}
virtual void setContext(QJsonObject j){jContext = j;}
virtual QJsonObject context() const {return jContext;}
virtual void setSubList(QList<QPair<int,QUuid>> lst) {subList = lst;}
virtual QList<QPair<int,QUuid>>& getSubList() {return subList;}
protected:
QUuid uUid;
QString sTag;
QString sName;
QJsonObject jContext; //存放port信息
QList<QPair<int,QUuid>> subList; //可能存在的子对象(不用来拓朴计算) <类型uid> //类型0:设备 1:间隔
};
class BayProperty:public AbstractProperty //间隔属性(待扩展)

View File

@ -82,7 +82,8 @@ enum class ModelFunctionType //模型函数的类型
ProjectModel = 0,
BaseModel,
EditorModel,
BlockEditorModel //模块划分时的连接关系
BlockEditorModel, //模块划分时的连接关系
RuntimeModel //运行时
};
@ -659,6 +660,7 @@ struct DiagramEditorBlockInfo //组态编辑block信息
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; //详细编辑状态
@ -1003,6 +1005,32 @@ struct pageInfo
int op;
};
struct monitorRelationSturctItem //监控关系结构item
{
int nCategory; //类型 0设备1间隔
int nEquipType; //设备类别
QString sName; //名称
QUuid uid; //id
};
struct monitorRelationItem //监控关系item
{
monitorRelationSturctItem parent;
monitorRelationSturctItem item;
QList<monitorRelationSturctItem> subList;
};
struct monitorPageInfo //运行时page
{
int id = -1;
QUuid uid;
QString tag;
QString name;
QString parent;
QJsonObject context;
QString ts;
};
struct gridInfo
{
int id = -1;

View File

@ -67,6 +67,11 @@ private:
};
int getLevel(QStandardItem *item);
QStandardItem* findStandardItemAtLevel(QStandardItemModel *model, int targetLevel,
const QString &targetText,
QStandardItem *parent = nullptr,
int currentLevel = 0);
QList<QStandardItem*> getAllChildren(QStandardItem* parentItem);
QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target,
int role = Qt::DisplayRole, const QModelIndex& parent = QModelIndex());

View File

@ -63,7 +63,7 @@ BaseProperty::BaseProperty(QObject* parent)
BaseProperty::~BaseProperty()
{
qDebug()<<"release by "<<uuid();
//qDebug()<<"release by "<<uuid();
}
/*************************属性变量*************************/

View File

@ -16,6 +16,70 @@ int getLevel(QStandardItem *item) {
}
}
QStandardItem* findStandardItemAtLevel(QStandardItemModel *model, int targetLevel,
const QString &targetText,
QStandardItem *parent,
int currentLevel) {
if (!model) return nullptr;
if (currentLevel == targetLevel) {
if (parent) {
// 在父项的子树中查找
for (int row = 0; row < parent->rowCount(); ++row) {
QStandardItem *item = parent->child(row, 0);
if (item && item->text() == targetText) {
return item;
}
}
} else {
// 在根层级查找
for (int row = 0; row < model->rowCount(); ++row) {
QStandardItem *item = model->item(row, 0);
if (item && item->text() == targetText) {
return item;
}
}
}
return nullptr;
}
if (currentLevel > targetLevel) return nullptr;
// 递归查找子项
if (parent) {
for (int row = 0; row < parent->rowCount(); ++row) {
QStandardItem *child = parent->child(row, 0);
QStandardItem *result = findStandardItemAtLevel(model, targetLevel, targetText, child, currentLevel + 1);
if (result) return result;
}
} else {
for (int row = 0; row < model->rowCount(); ++row) {
QStandardItem *item = model->item(row, 0);
QStandardItem *result = findStandardItemAtLevel(model, targetLevel, targetText, item, currentLevel + 1);
if (result) return result;
}
}
return nullptr;
}
QList<QStandardItem*> getAllChildren(QStandardItem* parentItem) {
QList<QStandardItem*> children;
if (!parentItem) return children;
for (int row = 0; row < parentItem->rowCount(); ++row) {
for (int column = 0; column < parentItem->columnCount(); ++column) {
QStandardItem* childItem = parentItem->child(row, column);
if (childItem) {
children.append(childItem);
}
}
}
return children;
}
QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target,
int role, const QModelIndex& parent) {
for (int row = 0; row < model->rowCount(parent); ++row) {

View File

@ -5,7 +5,9 @@ set(DIAGRAMCAVAS_HEADER_FILES
include/designerScene.h
include/designerView.h
include/diagramCavas.h
include/baseDrawingPanel.h
include/drawingPanel.h
include/monitorPanel.h
include/itemPropertyDlg.h
include/propertyContentDlg.h
include/serializable.h
@ -112,7 +114,9 @@ set(DIAGRAMCAVAS_SOURCE_FILES
source/designerScene.cpp
source/designerView.cpp
source/diagramCavas.cpp
source/baseDrawingPanel.cpp
source/drawingPanel.cpp
source/monitorPanel.cpp
source/itemPropertyDlg.cpp
source/propertyContentDlg.cpp
source/statusBar.cpp
@ -211,7 +215,6 @@ set(DIAGRAMCAVAS_SOURCE_FILES
)
set(UI_FILES
ui/drawingPanel.ui
ui/itemPropertyDlg.ui
ui/baseInfoDlg.ui
ui/ptExtraInfoDlg.ui

View File

@ -0,0 +1,59 @@
#ifndef BASEDRAWINGPANEL_H
#define BASEDRAWINGPANEL_H
/****************工程模和运行时panel的基类*****************/
#include <QWidget>
#include "global.h"
#include "designerScene.h"
class DesignerView;
class DesignerScene;
class SelectorManager;
class GraphicsItemGroup;
class StatusBar;
class PowerEntity;
class ProjectDiagramNameInput;
class BayManagerDlg;
class BaseDrawingPanel : public QWidget
{
Q_OBJECT
public:
BaseDrawingPanel(PowerEntity* pEntity,QWidget *parent = nullptr,DiagramMode mode = DM_edit);
~BaseDrawingPanel();
QGraphicsScene* getQGraphicsScene();
DesignerScene* getDesignerScene();
SelectorManager* selectorManager() const; //返回manager指针
void setPageName(QString s){_name = s;_pModel->setPageName(_name);} //设置当前page名称
QString pageName(){return _name;}
FixedPortsModel* getModelController() const {return _pModel;}
DiagramMode getMode(){return _mode;}
virtual void loadNodes(QJsonObject obj) {}; //加载图元信息
virtual void saveNodes(int pageId) {}; //保存到数据库
DesignerScene* getScene() {return m_pGraphicsScene;}
DesignerView* getView() {return m_pGraphicsView;}
signals:
void panelDelete(const QString&,int);
protected:
virtual void closeEvent(QCloseEvent *closeEvent) {};
protected:
DesignerView* m_pGraphicsView;
DesignerScene* m_pGraphicsScene;
SelectorManager* m_pSelectorManager;
StatusBar* m_pStatusBar;
FixedPortsModel* _pModel;
DiagramMode _mode;
QString _name;
PowerEntity* _pEntity; //组态图拓扑对象
};
#endif

View File

@ -11,15 +11,15 @@ public:
ElectricBaseModelSvgItem(const QRect &rect, QGraphicsItem *parent = 0); //genNewPort生成新接线点
ElectricBaseModelSvgItem(const ElectricBaseModelSvgItem&);
virtual ElectricBaseModelSvgItem* clone() const override;
virtual ~ElectricBaseModelSvgItem();
void updateCoordinate();
void move(const QPointF&);
virtual ~ElectricBaseModelSvgItem() override;
void updateCoordinate() override;
void move(const QPointF&) override;
void loadSvg(const QByteArray&);
protected:
virtual QPainterPath shape();
virtual void editShape(int, const QPointF&);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual QPainterPath shape() override;
virtual void editShape(int, const QPointF&) override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
protected:
QRectF m_lastBoudingRect; //记录上一时刻的boundingRect

View File

@ -6,7 +6,7 @@
#include "graphicsDataModel/fixedPortsModel.h"
class GraphicsItemGroup;
class DrawingPanel;
class BaseDrawingPanel;
class DesignerScene : public BaseScene
@ -42,7 +42,7 @@ protected:
private:
bool m_bGridVisible;
QGraphicsView* m_pView;
DrawingPanel* m_pDrawingPanel; //保存父指针
BaseDrawingPanel* m_pDrawingPanel; //保存父指针
private:
FixedPortsModel* _graphModel;

View File

@ -15,6 +15,7 @@ class DiagramEditorWizard;
class EditPanel;
class GraphicsBaseModelItem;
class EditBaseItem;
class MonitorPanel;
class DIAGRAM_DESIGNER_PUBLIC DiagramCavas : public QMdiArea
{
@ -26,15 +27,22 @@ public:
DrawingPanel* getPanel(QString);
EditPanel* getEditPanel(QString);
MonitorPanel* getMonitorPanel(QString);
public:
void initial();
signals:
void prepareUpdateItems(QList<monitorRelationItem>,bool refresh);
void prepareSelectItems(QList<QPair<QString,QUuid>>);
void updateMonitorList(QString,QPair<QString,QUuid>,int nMode = 0); //0新增1删除
void createdMonitorItems(QList<QPair<QString,QUuid>>); //创建的监控中item个数
public slots:
void onSignal_addDrawingPanel(PowerEntity* p,DiagramMode = DM_edit);
void onSignal_addDrawingPanel(PowerEntity* p,DiagramMode = DM_edit,QString parent = QString()); //parent:派生运行时的page
void onSignal_addGraphicsItem(modelStateInfo&);
void onSignal_addPage();
void onSignal_savePage();
void onSignal_loadPage(PowerEntity* p);
void onSignal_loadEdit(const QString&,QUuid);
void onSignal_loadMonitor(PowerEntity* p);
void runPage(const QString); //运行时
void onSignal_runPage();
void onSignal_deletePage();
@ -47,7 +55,7 @@ public slots:
void onSignal_deleteEntity(EntityInfo);
void onSignal_selectEntity(EntityInfo);
void onSignal_createDiagram(DiagramInfo);
void onSignal_createDiagram(DiagramInfo,DiagramMode mode = DM_edit);
void onSignal_changeDiagram(DiagramInfo);
void onSignal_deleteDiagram(DiagramInfo);
void onSignal_selectDiagram(DiagramInfo);
@ -64,11 +72,25 @@ public slots:
void onSignal_unloadProject(const QString&);
/*********************************间隔**************************************/
void onSignl_openCurrentBay();
/********************************运行时**********************************/
void onSignal_updateCurItems(QList<monitorRelationItem>,bool); //更新当前设备列表
void onSignal_selectedItems(QList<QPair<QString,QUuid>>); //当前选中设备
void onSignal_generate(QString,QList<QPair<QString,QUuid>>); //使用选中设备生成监控 (监控名,设备)
void onSignal_monitorCreated(QString,QPair<QString,QUuid>); //监控已创建
void onSignal_monitorItemCreated(QList<QPair<QString,QUuid>>); //监控中创建的对象
void onSignal_monitorSelected(DiagramInfo); //监控选中
void onSignal_saveMonitor(QList<QPair<QString,QUuid>>); //保存选中的监控
QMap<QString,QPair<DrawingPanel*,QMdiSubWindow*>> getMapDraw() {return m_mapDrawPanel;}
QMap<QString,QPair<EditPanel*,QMdiSubWindow*>> getMapEdit() {return m_mapEditPanel;}
QMap<QString,QPair<MonitorPanel*,QMdiSubWindow*>> getMapMonitor() {return m_mapMonitorPanel;}
private:
void removePanel(PowerEntity*);
private:
QMap<QString,QPair<DrawingPanel*,QMdiSubWindow*>> m_mapDrawPanel;
QMap<QString,QPair<EditPanel*,QMdiSubWindow*>> m_mapEditPanel;
QMap<QString,QPair<DrawingPanel*,QMdiSubWindow*>> m_mapDrawPanel; //工程模panel
QMap<QString,QPair<EditPanel*,QMdiSubWindow*>> m_mapEditPanel; //编辑时
QMap<QString,QPair<MonitorPanel*,QMdiSubWindow*>> m_mapMonitorPanel; //监控时panel
int _pageIndex;
QString _curPage;
};

View File

@ -23,6 +23,18 @@ public:
virtual void removeConnect(QUuid);
virtual QList<QUuid> getConnect() {return _lstCon;}
virtual void clearConnect() {_lstCon.clear();}
virtual bool addSubList(QPair<int,QUuid> pair){
for (const auto& item : _lstSub) {
if (item.second == pair.second) {
return false;
}
}
_lstSub.append(pair);
return true;
}
virtual void setSubList(QList<QPair<int,QUuid>> lst) {_lstSub = lst;}
virtual QList<QPair<int,QUuid>>& getSubList() {return _lstSub;}
virtual void clearSubList() {_lstSub.clear();}
virtual void setCurContainer(DiagramEditorStructContainer* p) {_curContainer = p;}
virtual DiagramEditorStructContainer* getCurContainer() {return _curContainer;}
virtual void setContainerLevel(int n) {nContainerLevel = n;}
@ -41,6 +53,7 @@ protected:
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; //详细编辑状态

View File

@ -2,23 +2,12 @@
#define DRAWINGPANEL_H
#include <QWidget>
#include "global.h"
#include "designerScene.h"
#include "baseDrawingPanel.h"
QT_BEGIN_NAMESPACE
namespace Ui { class drawingPanel; }
QT_END_NAMESPACE
class DesignerView;
class DesignerScene;
class SelectorManager;
class GraphicsItemGroup;
class StatusBar;
class PowerEntity;
class ProjectDiagramNameInput;
class BayManagerDlg;
class DrawingPanel : public QWidget
class DrawingPanel : public BaseDrawingPanel
{
Q_OBJECT
@ -26,47 +15,15 @@ public:
DrawingPanel(PowerEntity* pEntity,QWidget *parent = nullptr,DiagramMode mode = DM_edit);
~DrawingPanel();
QGraphicsScene* getQGraphicsScene();
DesignerScene* getDesignerScene();
void grahpicsViewZoomIn();
void grahpicsViewZoomOut();
void grahpicsViewZoomFit();
GraphicsItemGroup* createItemGroup();
void destroyItemGroup();
SelectorManager* selectorManager() const; //返回manager指针
void setPageName(QString s){_name = s;_pModel->setPageName(_name);} //设置当前page名称
QString pageName(){return _name;}
FixedPortsModel* getModelController() const {return _pModel;}
DiagramMode getMode(){return _mode;}
QJsonObject getDiagramInfo() const; //返回图元位置信息
void loadNodes(QJsonObject obj); //加载图元信息
void saveNodes(int pageId); //保存到数据库
DesignerScene* getScene() {return m_pGraphicsScene;}
DesignerView* getView() {return m_pGraphicsView;}
signals:
void panelDelete(const QString&,int);
void loadNodes(QJsonObject obj) override; //加载图元信息
void saveNodes(int pageId) override; //保存到数据库
protected:
void closeEvent(QCloseEvent *closeEvent);
void closeEvent(QCloseEvent *closeEvent) override;
public slots:
void onSignal_addGraphicsItem(modelStateInfo&);
void onSignal_Generate(); //由基模组态生成工程模组态
private:
Ui::drawingPanel *ui;
DesignerView* m_pGraphicsView;
DesignerScene* m_pGraphicsScene;
SelectorManager* m_pSelectorManager;
StatusBar* m_pStatusBar;
FixedPortsModel* _pModel;
DiagramMode _mode;
QString _name;
PowerEntity* _pEntity; //组态图拓扑对象
ProjectDiagramNameInput* m_pDiagramNameInputer;
};

View File

@ -13,6 +13,7 @@ class EditPanel;
class DiagramEditorWizard;
class DiagramCavas;
class EditBaseItem;
class DiagramEditorBaseBlock;
int const g_nHorizontalBlockSpacing = 100; //间隔横向间距
@ -30,8 +31,8 @@ public:
void generateTempTrans(int nType,DiagramEditorTransformerBlock* block = nullptr); //0高压侧1中压侧2低压侧3整个变压器
void connectTransToNeutral(DiagramEditorTransformerBlock* block); //连接变压器与中性点设备
void linkTransItem(GraphicsBaseModelItem*,QStandardItemModel*); //连接中性点与设备点
GraphicsBaseModelItem* generateComponent(QUuid uid,QString sName,int nCategory,int nType,QPointF pos,int nRotate,int mode); //生成设备 uid,分类(设备、逻辑点),类型,旋转,模式(0局部1整体)
ElectricBaseModelLineItem* generateLine(QUuid uid,QString sName,int mode); //生成连线 mode 0局部1整体
GraphicsBaseModelItem* generateComponent(QUuid uid,QString sName,int nCategory,int nType,QPointF pos,int nRotate,int mode,QString sBay = QString()); //生成设备 uid,分类(设备、逻辑点),类型,旋转,模式(0局部1整体)
ElectricBaseModelLineItem* generateLine(QUuid uid,QString sName,int mode,QString sBay = QString()); //生成连线 mode 0局部1整体
void clearCurPreview();
void setPanel(EditPanel* p) {_pPanel = p;}
EditPanel* getPanel(){return _pPanel;}
@ -57,8 +58,8 @@ public:
QStandardItem* getNameItem(const QString&,int nFrom = 0); //获取返回当前设备模型中的name项 nFrom,0间隔1变压器
void generateItemByModel(QStandardItemModel* pModel,int nFrom = 0,QPoint delta = QPoint(0,0)); //0间隔1变压器
QList<DiagramEditorComponentInfo> generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item
QMultiMap<int,QUuid> generateOutConnection(QList<DiagramEditorComponentInfo>,int nTypeTransCon,int nPos = 0); //生成外部连接手动bind的连接 nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置
QList<DiagramEditorComponentInfo> generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta = QPointF(0,0),DiagramEditorBaseBlock* pParent = nullptr); //根据data生成item parent:生成的对象添加到parent下(非拓扑计算)
QMultiMap<int,QUuid> generateOutConnection(QList<DiagramEditorComponentInfo>,int nTypeTransCon,int nPos = 0,DiagramEditorBaseBlock* pParent = nullptr); //生成外部连接手动bind的连接 nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置
QRectF updateTarget(QMap<QString,DiagramEditorRouteInfo>&,QMap<QString,DiagramEditorComponentInfo>&,int nLayout,int nSource,bool saveToModel = true); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 regenerate重新生成标志 saveToModel:生成到模型或map
void clearCompoDir(QMap<QString,DiagramEditorRouteInfo>&,QMap<QString,DiagramEditorComponentInfo>&,int nSource); //清空component中的dir(updateTarget前调用)
@ -68,9 +69,10 @@ public:
void setWizardInfo(const QByteArray&); //二进制设置wizard
private:
void bulidAndLinkComponent(QList<DiagramEditorComponentInfo>,QMap<QString,DiagramEditorComponentInfo>); //生成并连接线路上的设备 lstmapComponents(从map中获取正确数据)
void bulidAndLinkComponent(QList<DiagramEditorComponentInfo>,QMap<QString,DiagramEditorComponentInfo>,DiagramEditorBaseBlock* pParent = nullptr); //生成并连接线路上的设备 lstmapComponents(从map中获取正确数据)
QByteArray serializeWizardData(const DiagramEditorProjectInfo &data); //序列化eidtor向导设置数据
DiagramEditorProjectInfo deserializeWizardData(const QByteArray &byteArray); //反序列化eidtor向导设置
DiagramEditorBaseBlock* getBlockDataByName(QString,EditorItemType); //通过名称类型获取block的data
private:
QMap<QUuid,GraphicsBaseModelItem*> _tempItem; //临时预览对象
QMap<QUuid,GraphicsBaseModelItem*> _previewItem; //预览对象
@ -81,5 +83,6 @@ private:
EditBaseScene* _pCurPreviewScene; //当前预览scene
EditPanel* _pPanel; //主界面
QPointer<DiagramEditorWizard> _pWizard; //向导界面数据
int _cableCount; //导线计数
};

View File

@ -8,6 +8,7 @@
#include <QJsonObject>
#include <QTimer>
class BaseDrawingPanel;
class DrawingPanel;
class GraphicsBaseItem;
class GraphicsProjectModelItem;
@ -43,17 +44,17 @@ public:
QVector<ModelProperty*> allConnectionProperty();
QMap<QUuid,GraphicsProjectModelItem*>& allItems();
bool addNodeItem(QUuid uuid,GraphicsProjectModelItem*);
void addNodeItem(QUuid id,QPointF pos,double width = 0,double height = 0,double rotate = 0);
QString addNodeItem(QUuid id,QPointF pos,double width = 0,double height = 0,double rotate = 0);
GraphicsProjectModelItem* nodeItem(QUuid uuid);
BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据一个data可对应多个itemid,类型,名称,工程模名)
void loadNodeDataFromDataBase(); //从数据库加载数据
void addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort);
QString addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort);
void deleteNodeItem(GraphicsProjectModelItem*);
//QJsonObject saveNode(QUuid const) const;
void saveNode(int nPageId);
void setScene(DesignerScene* p){_scene = p;}
DesignerScene* getScene() {return _scene;}
void setTopWidget(DrawingPanel* p) {_widget = p;}
void setTopWidget(BaseDrawingPanel* p) {_widget = p;}
QWidget* getTopWidget();
QPointF getTerminalPos(const QString& sTerminalId); //获取拓扑接线点在当前diagram中的位置
ElectricConnectLineItem* getLineItemById(const QString& terminalId);
@ -95,8 +96,14 @@ public:
void addTestData(); //生成测试基模
QJsonObject turnListToJson(QList<QUuid> lst,QString sInerTag,QString sOutTag); //将list转换为QJsonObject,<lst,内部标签,外部标签>
QList<QUuid> turnJsonArrToList(QJsonObject obj,QString sInner,QString sOut);
/*************************监控(运行时)**************************/
void generateMonitor(QString,QList<QPair<QString,QUuid>>); //生成监控 (监控名,选中的设备列表)
Q_SIGNALS:
void activatePage(const QString&); //激活当前model所在page
void updateCurrentItems(QList<monitorRelationItem>,bool); //更新当前组态元件列表 <名称,uid>
void itemSelected(QList<QPair<QString,QUuid>>); //发送选中的元件
void monitorCreated(QString,QPair<QString,QUuid>); //监控创建信号 <工程page,<监控page,page_uid>>
void monitorItems(QList<QPair<QString,QUuid>>); //发送创建成功的Items
public:
void setPageName(QString s) {_pageName = s;} //设置表名称
QString pageName() const {return _pageName;}
@ -113,6 +120,7 @@ private:
void addPortsToItem_json(PortState,QJsonArray,GraphicsProjectModelItem*); //将json格式的port添加到item
void autoSetModelName(GraphicsBaseModelItem*); //如果此页的工程模已被设置将projectName更新到item
QString removeSuffix(const QString& str); //移除最后一个下划线后的内容 (处理各种tag后缀)
ModelProperty* getItemByUid(QList<GraphicsBaseItem*>,QUuid); //返回uid对应的data
private:
QMap<QUuid,GraphicsProjectModelItem*> _nodeItem; //工程模对象
@ -123,7 +131,7 @@ private:
QString _pageName;
DiagramCavas* _cavas;
DesignerScene* _scene;
DrawingPanel* _widget; //顶层widget
BaseDrawingPanel* _widget; //顶层widget
HttpInterface* _Interface;
QTimer* _timer;
PowerEntity* _pEntity; //拓扑实体

View File

@ -9,7 +9,9 @@ class ElectricConnectLineItem : public GraphicsProjectModelItem
{
public:
ElectricConnectLineItem(QGraphicsItem *parent = 0);
ElectricConnectLineItem(const ElectricConnectLineItem&); //暂不拷贝位置关系,由线自己计算
virtual ~ElectricConnectLineItem();
virtual ElectricConnectLineItem* clone() const override;
void setStartPoint(const QPointF& p);
void setEndPoint(const QPointF& p);
@ -23,6 +25,8 @@ protected:
virtual QPainterPath shape() const override;
virtual QRectF boundingRect() const override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
private:
QPainterPath m_points;
QPainterPath m_pointsBoundingRect; //包裹点的矩形集合

View File

@ -3,19 +3,24 @@
#include "graphicsItem/graphicsBaseItem.h"
//node节点
class ElectricPortItem :public GraphicsProjectModelItem
{
Q_OBJECT
public:
ElectricPortItem(QGraphicsItem *parent = 0);
ElectricPortItem(const ElectricPortItem&);
virtual ~ElectricPortItem();
virtual ElectricPortItem* clone() const override;
void addPort();
public:
virtual void updateConnectData();
virtual void updateConnectData() override;
protected:
virtual QRectF boundingRect() const override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -11,17 +11,19 @@ class ElectricSvgGroup :public GraphicsProjectModelGroup
Q_OBJECT
public:
ElectricSvgGroup(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgGroup(const ElectricSvgGroup&);
virtual ~ElectricSvgGroup();
void resize(int,double, double, const QPointF&);
void updateCoordinate();
void move(const QPointF&);
virtual ElectricSvgGroup* clone() const override;
void resize(int,double, double, const QPointF&) override;
void updateCoordinate() override;
void move(const QPointF&) override;
virtual void addSvgItem(ElectricSvgItem* item);
virtual void updateMapSvg(QMap<QString,QByteArray> map); //工程模property不含图片额外存储
protected:
virtual QPainterPath shape();
virtual void editShape(int, const QPointF&);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual QPainterPath shape() override;
virtual void editShape(int, const QPointF&) override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
protected:
QRectF m_lastBoudingRect; //记录上一时刻的boundingRect
QMap<QString,QByteArray> m_mapSvg;

View File

@ -8,7 +8,9 @@ class ElectricSvgGroupCT :public ElectricSvgGroup
Q_OBJECT
public:
ElectricSvgGroupCT(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgGroupCT(const ElectricSvgGroupCT&);
virtual ~ElectricSvgGroupCT();
virtual ElectricSvgGroupCT* clone() const override;
virtual void setupFinish(QVariant) override;
virtual void updateItem() override;
void setCtType(int n){_nType = n;}

View File

@ -8,7 +8,9 @@ class ElectricSvgGroupPT :public ElectricSvgGroup
Q_OBJECT
public:
ElectricSvgGroupPT(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgGroupPT(const ElectricSvgGroupPT&);
virtual ~ElectricSvgGroupPT();
virtual ElectricSvgGroupPT* clone() const override;
virtual void setupFinish(QVariant) override;
virtual void updateItem() override;
virtual void updateLayout() override;

View File

@ -9,21 +9,24 @@ class ElectricSvgItem :public GraphicsProjectModelItem
Q_OBJECT
public:
ElectricSvgItem(const QRect &rect, bool genNewPort = true,QGraphicsItem *parent = 0); //genNewPort生成新接线点
ElectricSvgItem(const ElectricSvgItem&);
virtual ~ElectricSvgItem();
void resize(int,double, double, const QPointF&);
void updateCoordinate();
void move(const QPointF&);
virtual ElectricSvgItem* clone() const override;
void resize(int,double, double, const QPointF&) override;
void updateCoordinate() override;
void move(const QPointF&) override;
virtual void loadSvg(){};
virtual void loadSvg(QByteArray); //第二种load直接加载图片
virtual void updateMapSvg(QMap<QString,QByteArray> map);
protected:
virtual QPainterPath shape();
virtual void editShape(int, const QPointF&);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual QPainterPath shape() override;
virtual void editShape(int, const QPointF&) override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
protected:
QRectF m_lastBoudingRect; //记录上一时刻的boundingRect
QSvgRenderer* m_pRender;
QMap<QString,QByteArray> m_mapSvg;
QByteArray _tempSvg; //保存直接加载的svg数据
};
#endif

View File

@ -9,10 +9,14 @@ class ElectricSvgItem2wTransformer :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItem2wTransformer(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItem2wTransformer(const ElectricSvgItem2wTransformer&);
virtual ~ElectricSvgItem2wTransformer();
virtual ElectricSvgItem2wTransformer* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -9,10 +9,14 @@ class ElectricSvgItem3wTransformer :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItem3wTransformer(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItem3wTransformer(const ElectricSvgItem3wTransformer&);
virtual ~ElectricSvgItem3wTransformer();
virtual ElectricSvgItem3wTransformer* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -9,15 +9,18 @@ class ElectricSvgItemBus :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemBus(const QRect &rect, QGraphicsItem *parent = 0);
ElectricSvgItemBus(const ElectricSvgItemBus&);
virtual ~ElectricSvgItemBus();
virtual ElectricSvgItemBus* clone() const override;
void addPort();
public:
virtual void updateConnectData();
virtual void updateConnectData() override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
virtual void updateHandles() override;
private:
virtual void updateHandles();
void initial();
};
#endif

View File

@ -8,10 +8,14 @@ class ElectricSvgItemCT :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemCT(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemCT(const ElectricSvgItemCT&);
virtual ~ElectricSvgItemCT();
virtual ElectricSvgItemCT* clone() const override;
void setItemType(int n){_itemType = n;}
private:
void initial();
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
int _itemType = 0; //1三相0零相
};

View File

@ -9,10 +9,14 @@ class ElectricSvgItemCableEnd :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemCableEnd(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemCableEnd(const ElectricSvgItemCableEnd&);
virtual ~ElectricSvgItemCableEnd();
virtual ElectricSvgItemCableEnd* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -9,10 +9,14 @@ class ElectricSvgItemCableTer :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemCableTer(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemCableTer(const ElectricSvgItemCableTer&);
virtual ~ElectricSvgItemCableTer();
virtual ElectricSvgItemCableTer* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -8,10 +8,14 @@ class ElectricSvgItemDS :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemDS(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemDS(const ElectricSvgItemDS&);
virtual ~ElectricSvgItemDS();
virtual ElectricSvgItemDS* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -9,10 +9,14 @@ class ElectricSvgItemDTEDS:public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemDTEDS(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemDTEDS(const ElectricSvgItemDTEDS&);
virtual ~ElectricSvgItemDTEDS();
virtual ElectricSvgItemDTEDS* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void inital();
};
#endif

View File

@ -8,10 +8,14 @@ class ElectricSvgItemES :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemES(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemES(const ElectricSvgItemES&);
virtual ~ElectricSvgItemES();
virtual ElectricSvgItemES* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -8,10 +8,14 @@ class ElectricSvgItemFES :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemFES(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemFES(const ElectricSvgItemFES&);
virtual ~ElectricSvgItemFES();
virtual ElectricSvgItemFES* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -9,10 +9,14 @@ class ElectricSvgItemLA :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemLA(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemLA(const ElectricSvgItemLA&);
virtual ~ElectricSvgItemLA();
virtual ElectricSvgItemLA* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -9,10 +9,14 @@ class ElectricSvgItemPI :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemPI(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemPI(const ElectricSvgItemPI&);
virtual ~ElectricSvgItemPI();
virtual ElectricSvgItemPI* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
};
#endif

View File

@ -8,10 +8,14 @@ class ElectricSvgItemPT :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemPT(const QRect &rect,QGraphicsItem *parent = 0);
ElectricSvgItemPT(const ElectricSvgItemPT&);
virtual ~ElectricSvgItemPT();
virtual ElectricSvgItemPT* clone() const override;
void setItemType(int n){_itemType = n;}
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
void initial();
int _itemType = 0; //1星型 0三角
};

View File

@ -10,14 +10,15 @@ class ElectricSvgItemRect :public ElectricSvgItem
Q_OBJECT
public:
ElectricSvgItemRect(const QRect &rect, bool genNewPort = true,QGraphicsItem *parent = 0);
ElectricSvgItemRect(const ElectricSvgItemRect&);
virtual ~ElectricSvgItemRect();
virtual ElectricSvgItemRect* clone() const override;
protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
virtual void updateHandles() override;
private:
virtual void updateHandles();
double m_dRatioX;
void initial();
};
#endif

View File

@ -173,6 +173,7 @@ class GraphicsBaseItem :public QObject, public AbstractShapeType<QGraphicsItem>
GraphicsBaseItem(QGraphicsItem *parent);
GraphicsBaseItem(const GraphicsBaseItem&);
virtual ~GraphicsBaseItem();
virtual GraphicsBaseItem* clone() const = 0;
public:
virtual int addPort(PortState typ,QPointF vec,QString id = "",HandleType hType = T_lineInOut,PortPos pos = P_top,double dXPercent = 0,double dYPercent = 0); //新建,返回-1失败
@ -496,7 +497,7 @@ public:
GraphicsBaseModelItem(QGraphicsItem *parent);
GraphicsBaseModelItem(const GraphicsBaseModelItem&);
virtual ~GraphicsBaseModelItem();
virtual GraphicsBaseModelItem* clone() const = 0;
virtual GraphicsBaseModelItem* clone() const override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
virtual void setMask(bool b){_stateMask = b;}
virtual bool getMask(){return _stateMask;}
@ -527,13 +528,15 @@ class GraphicsProjectModelItem : public GraphicsBaseItem //工程模item
Q_OBJECT
public:
GraphicsProjectModelItem(QGraphicsItem *parent);
GraphicsProjectModelItem(const GraphicsProjectModelItem&);
virtual ~GraphicsProjectModelItem();
virtual GraphicsProjectModelItem* clone() const override;
virtual void createOperationCopy();
virtual void removeOperationCopy();
virtual void moveOperationCopy(const QPointF&);
virtual void rotateOperationCopy(const double&);
virtual void syncRotationDataFromParent(const double&);
virtual void createOperationCopy() override;
virtual void removeOperationCopy() override;
virtual void moveOperationCopy(const QPointF&) override;
virtual void rotateOperationCopy(const double&) override;
virtual void syncRotationDataFromParent(const double&) override;
//多边形、线段等点选创建的对象需要的函数
virtual void addPoint(const QPointF&) {}
virtual bool endDrawing() { return true; }
@ -552,7 +555,7 @@ public:
virtual void setLastPort(int n){_lastPort = n;}
virtual int getLastPort() const {return _lastPort;}
virtual void unbindProperty(); //断开图元与数据的绑定
virtual void updateByProperty(); //使用data对象更新自己
virtual void updateByProperty() override; //使用data对象更新自己
virtual void updateConnectData(); //更新连接关系数据
virtual void setModelName(QString sName){_modelName = sName;}
virtual QString getModelName() const {return _modelName;}
@ -560,8 +563,9 @@ public:
virtual void updateItem(){}; //更新自身(如ct,pt)
virtual void updateTerPos(); //ct,pt等item大小变动后重新计算端点位置
protected:
virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&);
virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent*);
virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&) override;
virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent*) override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
signals:
void ifExist(QUuid id,const QString&,int type,GraphicsProjectModelItem*);
public slots:
@ -579,7 +583,9 @@ class GraphicsProjectModelGroup : public GraphicsProjectModelItem //
Q_OBJECT
public:
GraphicsProjectModelGroup(QGraphicsItem *parent);
GraphicsProjectModelGroup(const GraphicsProjectModelGroup&);
virtual ~GraphicsProjectModelGroup();
virtual GraphicsProjectModelGroup* clone() const override;
virtual void addItem(GraphicsProjectModelItem* item);
virtual void updateLayout();
//virtual QRectF boundingRect() const override;

View File

@ -0,0 +1,29 @@
#ifndef MONITORPANEL_H
#define MONITORPANEL_H
#include <QWidget>
#include "baseDrawingPanel.h"
class PowerEntity;
class MonitorPanel : public BaseDrawingPanel
{
Q_OBJECT
public:
MonitorPanel(PowerEntity* pEntity,QWidget *parent = nullptr,DiagramMode mode = DM_edit);
~MonitorPanel();
QJsonObject getMonitorInfo() const; //返回运行时的item信息
void loadNodes(QJsonObject obj) override; //加载图元信息
void saveNodes(int pageId) override; //保存到数据库
void setParentPage(const QString& str) {_sParentPage = str;}
QString getParentPage() {return _sParentPage;}
protected:
void closeEvent(QCloseEvent *closeEvent) override;
private:
QString _sParentPage; //派生自哪个工程
};
#endif

View File

@ -75,6 +75,7 @@ private:
QHash<QString, PowerEntity*> m_entities; // ID到实体映射
QHash<QString, PowerEntity*> m_diagrams; // 组态图拓扑结构
QHash<QString, PowerEntity*> m_monitorDiagrams; //运行时组态
// 连接存储
QHash<QString,PowerConnection*> m_connections;
QMultiHash<QString,PowerConnection*> m_connectionIndex; // 接线点ID到连接的映射

View File

@ -0,0 +1,67 @@
#include <QJsonArray>
#include "baseDrawingPanel.h"
#include <QMessageBox>
#include <QCloseEvent>
#include <QVBoxLayout>
#include "designerView.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "util/selectorManager.h"
#include "statusBar.h"
#include "powerEntity.h"
#include "topologyManager.h"
BaseDrawingPanel::BaseDrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: QWidget(parent)
,_pModel(nullptr)
,_mode(mode)
,_pEntity(pEntity)
{
_pModel = new FixedPortsModel(pEntity);
_pModel->setTopWidget(this);
m_pSelectorManager = new SelectorManager(_pModel,this);
m_pGraphicsScene = new DesignerScene(_pModel,this);
//设置场景大小.前两个参数为scene的坐标远点设置到view的中心点后无论view如何缩放secne的坐标原点都不会动方便后续的位置计算
m_pGraphicsScene->setSceneRect(0,0, g_dGriaphicsScene_Width*4, g_dGriaphicsScene_Height*4);
m_pGraphicsScene->setGridVisible(true);
m_pGraphicsView = new DesignerView(this);
m_pGraphicsView->setScene(m_pGraphicsScene);
m_pGraphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
m_pGraphicsScene->setView(m_pGraphicsView);
_pModel->setScene(m_pGraphicsScene);
m_pStatusBar = new StatusBar(this);
connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged);
QVBoxLayout *verticalLayout = new QVBoxLayout(this);
verticalLayout->addWidget(m_pGraphicsView);
verticalLayout->addWidget(m_pStatusBar);
verticalLayout->setContentsMargins(0, 0, 0, 0); // 左,上,右,下
verticalLayout->setSpacing(0); // 部件之间的间距
}
BaseDrawingPanel::~BaseDrawingPanel()
{
if(_pModel)
delete _pModel;
}
QGraphicsScene* BaseDrawingPanel::getQGraphicsScene()
{
return m_pGraphicsView->scene();
}
DesignerScene* BaseDrawingPanel::getDesignerScene()
{
return m_pGraphicsScene;
}
SelectorManager* BaseDrawingPanel::selectorManager() const
{
if(m_pSelectorManager)
return m_pSelectorManager;
else
return NULL;
}

View File

@ -31,7 +31,7 @@ DesignerScene::DesignerScene(FixedPortsModel* graphModel, QObject *parent)
{
m_bGridVisible = true;
m_pView = nullptr;
m_pDrawingPanel = dynamic_cast<DrawingPanel*>(parent);
m_pDrawingPanel = dynamic_cast<BaseDrawingPanel*>(parent);
}
DesignerScene::~DesignerScene()
{
@ -72,8 +72,6 @@ void DesignerScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
if(m_pDrawingPanel)
{
DiagramMode mode = m_pDrawingPanel->getMode();
if(mode == DM_run)
return;
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mousePressEvent(mouseEvent, this,mode);
update();
}
@ -86,8 +84,6 @@ void DesignerScene::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent)
if(m_pDrawingPanel)
{
DiagramMode mode = m_pDrawingPanel->getMode();
if(mode == DM_run)
return;
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mouseMoveEvent(mouseEvent, this,mode);
update();
}
@ -100,8 +96,6 @@ void DesignerScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* mouseEvent)
if(m_pDrawingPanel)
{
DiagramMode mode = m_pDrawingPanel->getMode();
if(mode == DM_run)
return;
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mouseReleaseEvent(mouseEvent, this,mode);
update();
}
@ -114,8 +108,6 @@ void DesignerScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent)
if(m_pDrawingPanel)
{
DiagramMode mode = m_pDrawingPanel->getMode();
if(mode == DM_run)
return;
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mouseDoubleClickEvent(mouseEvent, this,mode);
update();
}

View File

@ -3,18 +3,16 @@
#include <QJsonObject>
#include <QStandardItem>
#include "drawingPanel.h"
#include "monitorPanel.h"
#include "diagramCavas.h"
#include "dataBase.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "topologyManager.h"
#include "powerEntity.h"
#include "diagramEditor/diagramEditorWizard.h"
#include "projectModelManager.h"
#include "baseProperty.h"
#include "diagramEditor/editPanel.h"
#include "graphicsDataModel/diagramEditorModel.h"
#include "projectManager.h"
#include "designerView.h"
#include "basePropertyManager.h"
#include <QLibrary>
#include <QMetaMethod>
@ -44,6 +42,13 @@ EditPanel* DiagramCavas::getEditPanel(QString sPage)
return nullptr;
}
MonitorPanel* DiagramCavas::getMonitorPanel(QString sPage)
{
if(m_mapMonitorPanel.contains(sPage))
return m_mapMonitorPanel[sPage].first;
return nullptr;
}
void DiagramCavas::initial()
{
//todo:读取数据并初始化
@ -54,13 +59,13 @@ void DiagramCavas::initial()
}
}
void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode)
void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode,QString parent)
{
if(mode == DM_baseModel || mode == DM_edit){
DrawingPanel* pPanel = new DrawingPanel(pItem,this,mode);
_curPage = pItem->name();
pPanel->setPageName(_curPage);
pPanel->setWindowTitle(_curPage);
//->setAttribute(Qt::WA_DeleteOnClose);
QMdiSubWindow* pSub = this->addSubWindow(pPanel);
m_mapDrawPanel.insert(_curPage,qMakePair(pPanel,pSub));
pPanel->show();
@ -68,11 +73,26 @@ void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode)
FixedPortsModel* pModel = pPanel->getModelController();
pModel->setCavas(this);
connect(pModel,&FixedPortsModel::activatePage,this,&DiagramCavas::onSignal_activatePage);
connect(pModel,&FixedPortsModel::updateCurrentItems,this,&DiagramCavas::onSignal_updateCurItems);
connect(pModel,&FixedPortsModel::itemSelected,this,&DiagramCavas::onSignal_selectedItems);
connect(pPanel,&DrawingPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete);
}
else if(mode == DM_run){
MonitorPanel* pPanel = new MonitorPanel(pItem,this,mode);
_curPage = pItem->name();
pPanel->setPageName(_curPage);
pPanel->setWindowTitle(_curPage);
pPanel->setParentPage(parent);
QMdiSubWindow* pSub = this->addSubWindow(pPanel);
m_mapMonitorPanel.insert(_curPage,qMakePair(pPanel,pSub));
pPanel->show();
if(mode == DM_baseModel)
{
FixedPortsModel* pModel = pPanel->getModelController();
pModel->setCavas(this);
connect(pModel,&FixedPortsModel::activatePage,this,&DiagramCavas::onSignal_activatePage);
connect(pPanel,&MonitorPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete);
connect(pModel,&FixedPortsModel::monitorCreated,this,&DiagramCavas::onSignal_monitorCreated);
connect(pModel,&FixedPortsModel::monitorItems,this,&DiagramCavas::onSignal_monitorItemCreated);
}
}
@ -143,6 +163,7 @@ void DiagramCavas::onSignal_savePage()
DataBase::GetInstance()->updatePage(_curPage,_curPage,pPanel->getDiagramInfo());
int pageId = DataBase::GetInstance()->getPageIdByName(_curPage);
pPanel->saveNodes(pageId);
}
break;
case QMessageBox::Cancel:
@ -189,6 +210,20 @@ void DiagramCavas::onSignal_loadEdit(const QString& sProject,QUuid uid)
}
}
void DiagramCavas::onSignal_loadMonitor(PowerEntity* p)
{
if(!m_mapMonitorPanel.contains(p->name()))
{
onSignal_addDrawingPanel(p,DiagramMode::DM_run);
//QJsonObject context = DataBase::GetInstance()->getPageContextByName(p->name());
//m_mapDrawPanel[p->name()].first->loadNodes(context);
}
else //已存在
{
m_mapMonitorPanel[p->name()].first->show();
}
}
void DiagramCavas::runPage(const QString sName)
{
QString pageName = sName+QString("_run");
@ -229,10 +264,12 @@ void DiagramCavas::onSignal_panelDelete(const QString& name,int nType)
}
else if(nType == 1){
DrawingPanel* pPanel = m_mapDrawPanel.take(name).first;
if(m_mapDrawPanel.isEmpty())
{
this->removeSubWindow(pPanel);
delete pPanel;
}
else if(nType == 2){
MonitorPanel* pPanel = m_mapMonitorPanel.take(name).first;
if(m_mapMonitorPanel.isEmpty())
this->removeSubWindow(pPanel);
delete pPanel;
}
@ -312,20 +349,25 @@ void DiagramCavas::onSignal_selectEntity(EntityInfo info)
}
}
void DiagramCavas::onSignal_createDiagram(DiagramInfo info)
void DiagramCavas::onSignal_createDiagram(DiagramInfo info,DiagramMode mode)
{
PowerEntity* pEntity;
pEntity = TopologyManager::instance().findDiagram(info.id.toString());
ModelFunctionType type;
if(mode == DM_run)
type = ModelFunctionType::RuntimeModel;
else if(mode == DM_edit)
type = ModelFunctionType::ProjectModel;
pEntity = TopologyManager::instance().findDiagram(info.id.toString(),type);
if(!pEntity) //不存在创建
{
pEntity = TopologyManager::instance().createDiagram(info.id.toString(),info.sName);
PowerEntity* pParent = TopologyManager::instance().findDiagram(info.parentId.toString());
pEntity = TopologyManager::instance().createDiagram(info.id.toString(),info.sName,type);
/*PowerEntity* pParent = TopologyManager::instance().findDiagram(info.parentId.toString());
if(pParent) //构建父子关系
{
pParent->addChild(pEntity);
}
}*/
onSignal_addDrawingPanel(pEntity);
onSignal_addDrawingPanel(pEntity,mode);
}
}
@ -451,7 +493,7 @@ void DiagramCavas::onSignal_addEditWizard(QString name,QUuid uid,bool val)
pPanel->showWizard();
}
void DiagramCavas::onSignal_wizardFinished(QString sName,QMap<QUuid,GraphicsBaseModelItem*> mapItem,QList<EditBaseItem*> mapBay)
void DiagramCavas::onSignal_wizardFinished(QString sName,QMap<QUuid,GraphicsBaseModelItem*> mapItem,QList<EditBaseItem*> mapBlock)
{
PowerEntity* pEntity;
QUuid id = QUuid::createUuid();
@ -465,7 +507,7 @@ void DiagramCavas::onSignal_wizardFinished(QString sName,QMap<QUuid,GraphicsBase
TopologyManager::instance().cloneEditorToBase(); //拷贝拓扑结构
auto pModel = pPanel->getModelController();
if(pModel){
pModel->onWizardFinished(mapItem,mapBay);
pModel->onWizardFinished(mapItem,mapBlock);
}
}
}
@ -505,4 +547,65 @@ void DiagramCavas::onSignl_openCurrentBay()
}
}
}
/*********************monitor**************************/
void DiagramCavas::onSignal_updateCurItems(QList<monitorRelationItem> lst,bool refresh)
{
emit prepareUpdateItems(lst,refresh);
}
void DiagramCavas::onSignal_selectedItems(QList<QPair<QString,QUuid>> lst)
{
emit prepareSelectItems(lst);
}
void DiagramCavas::onSignal_generate(QString sPage,QList<QPair<QString,QUuid>> lst)
{
QWidget* pWindow= currentSubWindow()->widget();
DrawingPanel* pPanel = dynamic_cast<DrawingPanel*>(pWindow);
if(pPanel){
pPanel->getModelController()->generateMonitor(sPage,lst);
}
}
void DiagramCavas::onSignal_monitorCreated(QString sProj,QPair<QString,QUuid> pair)
{
emit updateMonitorList(sProj,pair);
}
void DiagramCavas::onSignal_monitorItemCreated(QList<QPair<QString,QUuid>> lst)
{
emit createdMonitorItems(lst);
}
void DiagramCavas::onSignal_monitorSelected(DiagramInfo info)
{
PowerEntity* pEntity = TopologyManager::instance().findDiagram(info.id.toString(),ModelFunctionType::RuntimeModel);
if(pEntity)
{
onSignal_loadMonitor(pEntity);
}
}
void DiagramCavas::onSignal_saveMonitor(QList<QPair<QString,QUuid>> lst)
{
for(auto &pair:lst){
auto pMonitor = m_mapMonitorPanel.value(pair.first).first;
if(pMonitor){
if(DataBase::GetInstance()->getPageIdByName(pMonitor->getParentPage()) == -1){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"请先保存工程模型"));
return;
}
}
}
for(auto& pair:lst){
auto pMonitor = m_mapMonitorPanel.value(pair.first).first;
if(pMonitor){
if(DataBase::GetInstance()->getMonitorIdByName(pair.first).isNull()) //不存在,创建
DataBase::GetInstance()->insertMonitor(pair.second,pair.first,pair.first,pMonitor->getParentPage(),pMonitor->getMonitorInfo());
else
DataBase::GetInstance()->updateMonitor(pair.first,pMonitor->getMonitorInfo());
}
}
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功"));
}

View File

@ -37,6 +37,7 @@ DiagramEditorBlockInfo DiagramEditorBaseBlock::getBlockInfo()
info.nContainerLevel = nContainerLevel;
info.uid = uid;
info._lstCon = _lstCon;
info._lstSub = _lstSub;
info.recSize = recSize;
info.sceneDelta = sceneDelta;
info.bEditState = bEditState;

View File

@ -399,8 +399,8 @@ void EditPanel::showConfirmDlg()
void EditPanel::generate()
{
auto pCavas = getCavas();
QList<EditBaseItem*> pBays = getBlockItems(EditorItemType::bay);
pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBays);
QList<EditBaseItem*> pBlocks = getBlockItems();
pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBlocks);
}
void EditPanel::showWizard()

View File

@ -1,101 +1,30 @@
#include <QJsonArray>
#include "drawingPanel.h"
#include "ui_drawingPanel.h"
#include <QMessageBox>
#include <QCloseEvent>
#include "designerView.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "util/selectorManager.h"
#include "statusBar.h"
#include "dataBase.h"
#include "powerEntity.h"
#include "topologyManager.h"
#include "projectDiagramNameInput.h"
#include "baseProperty.h"
#include "graphicsItem/electricBayItem.h"
#include "statusBar.h"
DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: QWidget(parent)
, ui(new Ui::drawingPanel)
,_pModel(nullptr)
,_mode(mode)
,_pEntity(pEntity)
: BaseDrawingPanel(pEntity,parent,mode)
,m_pDiagramNameInputer(nullptr)
{
ui->setupUi(this);
_pModel = new FixedPortsModel(pEntity);
_pModel->setTopWidget(this);
if(mode == DM_edit || mode == DM_baseModel)
m_pSelectorManager = new SelectorManager(_pModel,this);
m_pGraphicsScene = new DesignerScene(_pModel,this);
//设置场景大小.前两个参数为scene的坐标远点设置到view的中心点后无论view如何缩放secne的坐标原点都不会动方便后续的位置计算
m_pGraphicsScene->setSceneRect(0,0, g_dGriaphicsScene_Width*4, g_dGriaphicsScene_Height*4);
m_pGraphicsScene->setGridVisible(true);
m_pGraphicsView = new DesignerView(this);
m_pGraphicsView->setScene(m_pGraphicsScene);
m_pGraphicsScene->setView(m_pGraphicsView);
ui->mainLayout->addWidget(m_pGraphicsView);
_pModel->setScene(m_pGraphicsScene);
m_pStatusBar = new StatusBar(this);
if(mode == DM_edit)
m_pStatusBar->setButtonVisible(false);
ui->mainLayout->addWidget(m_pStatusBar);
connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged);
connect(m_pStatusBar,&StatusBar::generateDiagram,this,&DrawingPanel::onSignal_Generate);
}
DrawingPanel::~DrawingPanel()
{
delete ui;
if(_pModel)
delete _pModel;
}
QGraphicsScene* DrawingPanel::getQGraphicsScene()
{
return m_pGraphicsView->scene();
}
DesignerScene* DrawingPanel::getDesignerScene()
{
return m_pGraphicsScene;
}
void DrawingPanel::grahpicsViewZoomIn()
{
m_pGraphicsView->zoomIn();
}
void DrawingPanel::grahpicsViewZoomOut()
{
m_pGraphicsView->zoomOut();
}
void DrawingPanel::grahpicsViewZoomFit()
{
m_pGraphicsView->zoomFit();
}
GraphicsItemGroup* DrawingPanel::createItemGroup()
{
return m_pGraphicsScene->createGroup();
}
void DrawingPanel::destroyItemGroup()
{
m_pGraphicsScene->destroyGroup();
}
SelectorManager* DrawingPanel::selectorManager() const
{
if(m_pSelectorManager)
return m_pSelectorManager;
else
return NULL;
}
void DrawingPanel::closeEvent(QCloseEvent *closeEvent)
@ -153,10 +82,6 @@ void DrawingPanel::closeEvent(QCloseEvent *closeEvent)
}
emit panelDelete(_name,1);
}
else if(getMode() == DM_baseModel)
{
}
}
void DrawingPanel::onSignal_addGraphicsItem(modelStateInfo& info)
@ -233,6 +158,7 @@ void DrawingPanel::loadNodes(QJsonObject obj)
{
QJsonArray nodesJsonArray = obj["nodes"].toArray();
QList<QPair<QString,QUuid>> lst;
for (QJsonValueRef nodeJson : nodesJsonArray)
{
QJsonObject node = nodeJson.toObject();
@ -246,7 +172,10 @@ void DrawingPanel::loadNodes(QJsonObject obj)
//componentInfo info =DataBase::GetInstance()->getComponentInfoByUuid(uuid);
if(_pModel)
{
_pModel->addNodeItem(QUuid(uuid)/*,info.type*/,QPointF(dX,dY),dWidth,dHeight,dRotate);
QString sName = _pModel->addNodeItem(QUuid(uuid)/*,info.type*/,QPointF(dX,dY),dWidth,dHeight,dRotate);
if(sName != "err"){
lst.append(qMakePair(sName,QUuid(uuid)));
}
}
}
@ -268,7 +197,10 @@ void DrawingPanel::loadNodes(QJsonObject obj)
//todo:从拓扑结构中查找port的id
if(_pModel)
{
_pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
QString sName = _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
if(sName != "err"){
lst.append(qMakePair(sName,QUuid(id)));
}
}
}
else
@ -277,6 +209,9 @@ void DrawingPanel::loadNodes(QJsonObject obj)
}
}
//if(_pModel)
//emit _pModel->updateCurrentItems(lst);
QJsonArray bayArr = obj["bays"].toArray();
for(QJsonValueRef bayJson:bayArr)
{

View File

@ -29,6 +29,7 @@ DiagramEditorModel::DiagramEditorModel()
,_pCurPreviewScene(nullptr)
,_pCurTransComponent(nullptr)
,_pPanel(nullptr)
,_cableCount(0)
{
}
@ -144,7 +145,7 @@ QRectF DiagramEditorModel::generateTempBay()
return itemsRect;
}
GraphicsBaseModelItem* DiagramEditorModel::generateComponent(QUuid uid,QString sName,int nCategory,int nType,QPointF pos,int nRotate,int mode)
GraphicsBaseModelItem* DiagramEditorModel::generateComponent(QUuid uid,QString sName,int nCategory,int nType,QPointF pos,int nRotate,int mode,QString sBay)
{
GraphicsBaseModelItem* pItem = nullptr;
int componentType = -1; //对应的componentType
@ -299,11 +300,11 @@ GraphicsBaseModelItem* DiagramEditorModel::generateComponent(QUuid uid,QString s
pItem->setEntity(pEntityData);
DiagramEditorItemProperty* pData = nullptr;
if(nCategory == 1){
pData = addPreviewData(uid,0,sName,"node","",mode);
pData = addPreviewData(uid,0,sName,"node",sBay,mode);
pData->setGraphicsType(pItem->getItemType());
}
else if(nCategory == 0){ //设备
pData = addPreviewData(uid,componentType,sName,DataBase::GetInstance()->ModelType()[nType].modelType,"",mode);
pData = addPreviewData(uid,componentType,sName,DataBase::GetInstance()->ModelType()[nType].modelType,sBay,mode);
pData->setGraphicsType(pItem->getItemType());
}
if(pData)
@ -319,12 +320,12 @@ GraphicsBaseModelItem* DiagramEditorModel::generateComponent(QUuid uid,QString s
return pItem;
}
ElectricBaseModelLineItem* DiagramEditorModel::generateLine(QUuid uid,QString sName,int mode)
ElectricBaseModelLineItem* DiagramEditorModel::generateLine(QUuid uid,QString sName,int mode,QString sBay)
{
ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem();
pLine->setItemId(uid);
pLine->setItemType(GIT_baseLine);
DiagramEditorItemProperty* pData = addPreviewData(uid,8,sName,DataBase::GetInstance()->ModelType()[4].modelType,"",mode);
DiagramEditorItemProperty* pData = addPreviewData(uid,8,sName,DataBase::GetInstance()->ModelType()[4].modelType,sBay,mode);
pData->setGraphicsType(GIT_baseLine);
if(pData)
{
@ -439,10 +440,11 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt
nPos = 1;
else if(sBindObj == "低压绕组中性点")
nPos = 2;
QString strCable = "cable_"+QString::number(_cableCount++);
auto pLineData = TopologyManager::instance().ifConnection(uid1.toString(),uid2.toString()); //判断两个item是否有连接
if(pLineData != nullptr){
if(!_tempItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",0); //重新绘制
auto pLine = generateLine(QUuid(pLineData->id()),strCable,0); //重新绘制
if(pLine)
establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos);
}
@ -450,7 +452,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt
}
}
else{ //connectdata不存在新建
auto pLine = generateLine(QUuid::createUuid(),"",0);
auto pLine = generateLine(QUuid::createUuid(),strCable,0);
if(pLine)
establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos);
}
@ -514,7 +516,7 @@ void DiagramEditorModel::generatePreview()
QPointF centerLocal = rect.center();
// 转换为场景坐标系
QPointF centerScene = item->mapToScene(centerLocal);
QList<DiagramEditorComponentInfo> lstCompo = generateItemByInfo(mapRoute,mapCompo,centerScene); //返回与外部连接的compo
QList<DiagramEditorComponentInfo> lstCompo = generateItemByInfo(mapRoute,mapCompo,centerScene,pBay); //返回与外部连接的compo
if(!baysCompo.contains(sBay))
baysCompo.insert(sBay,lstCompo);
}
@ -536,6 +538,7 @@ void DiagramEditorModel::generatePreview()
else
nType = 16;
auto pItem = generateComponent(uid,name,0,nType,pos,0,1);
auto pro = pItem->getProperty();
QRectF rect = item->boundingRect();
// 计算中心点(本地坐标系)
@ -548,7 +551,7 @@ void DiagramEditorModel::generatePreview()
for(auto &neutral:transInfo.mapNeutral){
QPointF pDelta = neutral.delPoint;
int nT = neutral.nType;
QList<DiagramEditorComponentInfo> lstCompo = generateItemByInfo(neutral.mapRoute,transInfo.mapComponent,centerScene+pDelta);
QList<DiagramEditorComponentInfo> lstCompo = generateItemByInfo(neutral.mapRoute,transInfo.mapComponent,centerScene+pDelta,pTrans);
if(!neutralInfo.contains(nT))
neutralInfo.insert(nT,lstCompo);
}
@ -560,7 +563,7 @@ void DiagramEditorModel::generatePreview()
}
for(auto iter = baysCompo.begin();iter != baysCompo.end();++iter){
QMultiMap<int,QUuid> mapId = generateOutConnection(iter.value(),2);
//QMultiMap<int,QUuid> mapId = generateOutConnection(iter.value(),2);
QList<QUuid> lstFrom; //处理进出链接
QList<QUuid> lstTo;
@ -571,6 +574,7 @@ void DiagramEditorModel::generatePreview()
DiagramEditorBayBlock* pBay = dynamic_cast<DiagramEditorBayBlock*>(p.data());
if(pBay){
if(pBay->getName() == iter.key()){ //相同间隔
QMultiMap<int,QUuid> mapId = generateOutConnection(iter.value(),2,0,pBay); //type为2时pos不启用
switch (pBay->getBayType()) {
case BayType::busSectionBay:{
QList<QUuid> values = mapId.values(1);
@ -641,9 +645,19 @@ void DiagramEditorModel::generatePreview()
}
}
for(auto &map:transCompo){
for(auto it = map.begin(); it != map.end();++it){
generateOutConnection(it.value(),1,it.key());
for(auto iter = transCompo.begin();iter != transCompo.end();++iter){
for(auto it = iter.value().begin(); it != iter.value().end();++it){ //遍历每侧中性点
for(auto item:lst){
if(item->getType() == EditorItemType::trans){
auto p = item->getBlockData(); //获取blockitem对应的data
DiagramEditorTransformerBlock* pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(p.data());
if(pTrans){
if(pTrans->getName() == iter.key()){
generateOutConnection(it.value(),1,it.key(),pTrans);
}
}
}
}
}
}
}
@ -1011,10 +1025,11 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro
if(_tempItem.contains(uid1) && _tempItem.contains(uid2)){
GraphicsBaseModelItem* p1 = _tempItem.value(uid1);
GraphicsBaseModelItem* p2 = _tempItem.value(uid2);
QString strCable = "cable_"+QString::number(_cableCount++);
auto pLineData = TopologyManager::instance().ifConnection(uid1.toString(),uid2.toString(),ModelFunctionType::BlockEditorModel); //判断两个item是否有连接
if(pLineData != nullptr){
if(!_tempItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",0); //重新绘制
auto pLine = generateLine(QUuid(pLineData->id()),strCable,0); //重新绘制
if(pLine)
establishConnection(p1,p2,pLine,ModelFunctionType::BlockEditorModel);
}
@ -1022,7 +1037,7 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro
}
}
else{ //connectdata不存在新建
auto pLine = generateLine(QUuid::createUuid(),"",0);
auto pLine = generateLine(QUuid::createUuid(),strCable,0);
if(pLine)
establishConnection(p1,p2,pLine,ModelFunctionType::BlockEditorModel);
}
@ -1033,7 +1048,7 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro
}
}
QList<DiagramEditorComponentInfo> DiagramEditorModel::generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta)
QList<DiagramEditorComponentInfo> DiagramEditorModel::generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta,DiagramEditorBaseBlock* pParent)
{
QList<DiagramEditorComponentInfo> lstBind; //连接外部对象的component
QString sMain;
@ -1044,15 +1059,19 @@ QList<DiagramEditorComponentInfo> DiagramEditorModel::generateItemByInfo(QMap<QS
auto info = mapCompo.value(compo.sName);
if(_previewItem.contains(info.uid))
continue;
generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1);
generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1,pParent->getName());
if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"")){ //非空且不是无
if(!lstBind.contains(info))
lstBind.append(info);
}
if(pParent != nullptr){ //添加到block中的子item列表
pParent->addSubList(qMakePair(0,info.uid));
}
}
if(route.lstCompo.size() > 1){
bulidAndLinkComponent(route.lstCompo,mapCompo);
bulidAndLinkComponent(route.lstCompo,mapCompo,pParent); //添加线到subitem
}
}
}
@ -1065,7 +1084,7 @@ QList<DiagramEditorComponentInfo> DiagramEditorModel::generateItemByInfo(QMap<QS
auto info = mapCompo.value(compo.sName);
if(_previewItem.contains(info.uid))
continue;
generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1);
generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1,pParent->getName());
if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"")){ //非空且不是无
if(!lstBind.contains(info))
lstBind.append(info);
@ -1076,7 +1095,7 @@ QList<DiagramEditorComponentInfo> DiagramEditorModel::generateItemByInfo(QMap<QS
auto info = mapCompo.value(compo.sName);
if(_previewItem.contains(info.uid))
continue;
generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1);
generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1,pParent->getName());
if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"")){ //非空且不是无
if(!lstBind.contains(info))
lstBind.append(info);
@ -1084,18 +1103,18 @@ QList<DiagramEditorComponentInfo> DiagramEditorModel::generateItemByInfo(QMap<QS
}
if(route.lstOrder.size() > 1){
bulidAndLinkComponent(route.lstOrder,mapCompo);
bulidAndLinkComponent(route.lstOrder,mapCompo,pParent);
}
if(route.lstReverse.size() > 1){
bulidAndLinkComponent(route.lstReverse,mapCompo);
bulidAndLinkComponent(route.lstReverse,mapCompo,pParent);
}
}
return lstBind;
}
QMultiMap<int,QUuid> DiagramEditorModel::generateOutConnection(QList<DiagramEditorComponentInfo> lstBind,int nTypeTransCon,int nPos)
QMultiMap<int,QUuid> DiagramEditorModel::generateOutConnection(QList<DiagramEditorComponentInfo> lstBind,int nTypeTransCon,int nPos,DiagramEditorBaseBlock* pParent)
{
QMultiMap<int,QUuid> bindId; //返回关联的对象id<类型id>
for(auto& compo:lstBind){ //遍历关联外部的item进行连线
@ -1107,12 +1126,20 @@ QMultiMap<int,QUuid> DiagramEditorModel::generateOutConnection(QList<DiagramEdit
QUuid uId = pro->uuid();
int nType = pro->type();
if(sName == compo.sBindObj){
auto pBus = getBlockDataByName(sName,EditorItemType::bus);
if(pParent && pBus){ //直连到母线的一般是间隔添加到busblock的sublist中
pBus->addSubList(qMakePair(1,pParent->getId()));
}
GraphicsBaseModelItem* pSrc = _previewItem.value(compo.uid);
GraphicsBaseModelItem* pTarget = pItem;
QString strCable = "cable_"+QString::number(_cableCount++);
QUuid lineId;
auto pLineData = TopologyManager::instance().ifConnection(pSrc->itemId().toString(),pTarget->itemId().toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接
if(pLineData != nullptr){
if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制
lineId = QUuid(pLineData->id());
if(!_previewItem.contains(lineId)){ //connectdata已存在item未绘制
auto pLine = generateLine(lineId,strCable,1,pParent->getName()); //重新绘制
if(pLine)
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel);
}
@ -1120,11 +1147,15 @@ QMultiMap<int,QUuid> DiagramEditorModel::generateOutConnection(QList<DiagramEdit
}
}
else{ //connectdata不存在新建
auto pLine = generateLine(QUuid::createUuid(),"",1);
lineId = QUuid::createUuid();
auto pLine = generateLine(lineId,strCable,1,pParent->getName());
if(pLine)
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel);
}
bindId.insert(nType,uId);
if(pParent){
pParent->addSubList(qMakePair(0,lineId));
}
}
}
}
@ -1139,10 +1170,13 @@ QMultiMap<int,QUuid> DiagramEditorModel::generateOutConnection(QList<DiagramEdit
if(sName == compo.sBindParent){ //判断变压器名
GraphicsBaseModelItem* pSrc = _previewItem.value(compo.uid);
GraphicsBaseModelItem* pTarget = pItem;
QString strCable = "cable_"+QString::number(_cableCount++);
QUuid lineId;
auto pLineData = TopologyManager::instance().ifConnection(pSrc->itemId().toString(),pTarget->itemId().toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接
if(pLineData != nullptr){
if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制
lineId = QUuid(pLineData->id());
if(!_previewItem.contains(lineId)){ //connectdata已存在item未绘制
auto pLine = generateLine(lineId,strCable,1); //重新绘制
if(pLine){
if(nTypeTransCon == 2)
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,2,compo.nBindPara);
@ -1154,7 +1188,8 @@ QMultiMap<int,QUuid> DiagramEditorModel::generateOutConnection(QList<DiagramEdit
}
}
else{ //connectdata不存在新建
auto pLine = generateLine(QUuid::createUuid(),"",1);
lineId = QUuid::createUuid();
auto pLine = generateLine(lineId,strCable,1);
if(pLine){
if(nTypeTransCon == 2)
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,2,compo.nBindPara);
@ -1163,6 +1198,9 @@ QMultiMap<int,QUuid> DiagramEditorModel::generateOutConnection(QList<DiagramEdit
}
}
bindId.insert(nType,uId);
if(pParent){
pParent->addSubList(qMakePair(0,lineId));
}
}
}
}
@ -2253,7 +2291,7 @@ QRectF DiagramEditorModel::updateTarget(QMap<QString,DiagramEditorRouteInfo>& da
return recBounding;
}
void DiagramEditorModel::bulidAndLinkComponent(QList<DiagramEditorComponentInfo> lst,QMap<QString,DiagramEditorComponentInfo> components)
void DiagramEditorModel::bulidAndLinkComponent(QList<DiagramEditorComponentInfo> lst,QMap<QString,DiagramEditorComponentInfo> components,DiagramEditorBaseBlock* pParent)
{
for(int i = 0;i < lst.size()-1;++i){
auto item1 = lst[i];
@ -2263,12 +2301,15 @@ void DiagramEditorModel::bulidAndLinkComponent(QList<DiagramEditorComponentInfo>
if(_previewItem.contains(info1.uid) && _previewItem.contains(info2.uid)){
GraphicsBaseModelItem* p1 = _previewItem.value(info1.uid);
GraphicsBaseModelItem* p2 = _previewItem.value(info2.uid);
QString strCable = "cable_"+QString::number(_cableCount++);
QUuid lineId;
auto pLineData = TopologyManager::instance().ifConnection(info1.uid.toString(),info2.uid.toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接
if(pLineData != nullptr){
if(_previewItem.contains(QUuid(pLineData->id()))) //已绘制
lineId = QUuid(pLineData->id());
if(_previewItem.contains(lineId)) //已绘制
continue;
if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制
if(!_previewItem.contains(lineId)){ //connectdata已存在item未绘制
auto pLine = generateLine(lineId,strCable,1,pParent->getName()); //重新绘制
if(pLine)
establishConnection(p1,p2,pLine,ModelFunctionType::EditorModel);
}
@ -2276,10 +2317,15 @@ void DiagramEditorModel::bulidAndLinkComponent(QList<DiagramEditorComponentInfo>
}
}
else{ //connectdata不存在新建
auto pLine = generateLine(QUuid::createUuid(),"",1);
lineId = QUuid::createUuid();
auto pLine = generateLine(lineId,strCable,1,pParent->getName());
if(pLine)
establishConnection(p1,p2,pLine,ModelFunctionType::EditorModel);
}
if(pParent){
pParent->addSubList(qMakePair(0,lineId));
}
}
}
}
@ -2336,3 +2382,16 @@ DiagramEditorProjectInfo DiagramEditorModel::deserializeWizardData(const QByteAr
stream >> data; // 调用重载的操作符
return data;
}
DiagramEditorBaseBlock* DiagramEditorModel::getBlockDataByName(QString sName,EditorItemType typ)
{
auto lstBlock = _pPanel->getBlockItems();
for(auto& block:lstBlock){
if(block->getName() == sName){
if(block->getType() == typ){
return block->getBlockData().data();
}
}
}
return nullptr;
}

View File

@ -2,7 +2,6 @@
#include "graphicsItem/graphicsBaseItem.h"
#include "graphicsItem/electricSvgItemBus.h"
#include "graphicsItem/electricSvgItemRect.h"
#include "graphicsItem/electricSvgItemTriangle.h"
#include "graphicsItem/electricConnectLineItem.h"
#include "graphicsItem/electricPortItem.h"
#include "graphicsItem/electricSvgGroupCT.h"
@ -40,11 +39,14 @@
#include <QMessageBox>
#include <QRandomGenerator>
#include <QJsonDocument>
#include <QMdiSubWindow>
#include "baseProperty.h"
#include "projectModelSetting.h"
#include "bayManagerDlg.h"
#include "projectModelManager.h"
#include "projectIconSetting.h"
#include "monitorPanel.h"
#include "designerView.h"
#include "global.h"
bool FixedPortsModel::_dataInitialised = false;
@ -137,7 +139,7 @@ bool FixedPortsModel::addNodeItem(QUuid uuid,GraphicsProjectModelItem* pItem)
}
}
void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width,double height,double rotate)
QString FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width,double height,double rotate)
{
//todo:load图形时必有拓扑实体关联到对应的entity
BaseProperty* pro = nullptr;
@ -151,7 +153,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width
{
int type = pro->graphicsType();
if(type == GIT_link) //连线对象外部处理
return;
return QString("err");
QString sMeta = pro->metaModelName();
QString sProModel = pro->modelName();
@ -629,18 +631,19 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width
item->editShape(0, pos);
item->setPos(pos);
item->setRotation(rotate);
//item->setSelected(true);
_scene->addItem(item);
item->addPoint(pos);
item->setProperty(pro); //绑定模型
item->updateByProperty(); //使用模型更新自身
QString sModel = _projectModelName.value(id.toString());
item->setModelName(sModel);
//QString sModel = _projectModelName.value(id.toString());
//item->setModelName(sModel);
_nodeItem.insert(id,item);
connect(item,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits);
}
return pro->name();
}
}
return QString("err");
}
BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QString modelName)
@ -759,7 +762,7 @@ void FixedPortsModel::loadNodeDataFromDataBase()
}
}
void FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
QString FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
{
GraphicsProjectModelItem* src = _nodeItem[srcId];
GraphicsProjectModelItem* dest = _nodeItem[destId];
@ -767,7 +770,7 @@ void FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUui
if(mapData.contains(lineId))
{
BaseProperty* pPro = mapData.value(lineId);
if(src && dest)
if(src && dest && pPro)
{
ElectricConnectLineItem* pItem = new ElectricConnectLineItem();
pItem->setItemId(lineId);
@ -797,8 +800,11 @@ void FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUui
addNodeItem(pItem->itemId(),pItem);
pItem->setProperty(pPro);
}
return pPro->name();
}
}
return QString("err");
}
void FixedPortsModel::deleteNodeItem(GraphicsProjectModelItem* pItem)
@ -1236,6 +1242,17 @@ QString FixedPortsModel::removeSuffix(const QString& str)
return str.left(lastUnderscore);
}
ModelProperty* FixedPortsModel::getItemByUid(QList<GraphicsBaseItem*> lst,QUuid uid)
{
for(auto& item:lst){
auto pPro = item->getProperty();
if(pPro->uuid() == uid){
return pPro;
}
}
return nullptr;
}
QWidget* FixedPortsModel::getTopWidget()
{
@ -1497,7 +1514,7 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<Graphi
pProPanel = _cavas->getPanel(sPageName);
}
for(auto& pBaseItem:lstItem) //第二次循环处理所有连线对象
for(auto& pBaseItem:lstItem) //先处理连线递归处理连线连接的item
{
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
if(pBase->type() == 8){ //电缆
@ -1513,14 +1530,113 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<Graphi
}
QList<BaseProperty*> lstProData;
QList<QPair<QString,QUuid>> lstItems;
QMap<QUuid,GraphicsProjectModelItem*> mapItem = pProPanel->getModelController()->allItems(); //根据item获取data
for(auto& item:mapItem){
BaseProperty* pPro = dynamic_cast<BaseProperty*>(item->getProperty());
if(pPro){
lstProData.append(pPro);
lstItems.append(qMakePair(pPro->name(),pPro->uuid()));
}
}
QList<GraphicsBaseItem*> lstBase;
for(auto &pItem:lstItem){
GraphicsBaseItem* p = pItem;
lstBase.append(p);
}
QList<monitorRelationItem> lstFirst;
for(auto& pBaseItem:lstItem) //首次循环添加母线及独立设备(变压器等),更新列表显示使用
{
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
if(pBase->type() == 1){ //母线添加子间隔
monitorRelationItem info;
info.item.nEquipType = pBase->type();
info.item.nCategory = 0;
info.item.sName = pBase->name();
info.item.uid = pBase->uuid();
for(auto& subPair:pBase->getSubList()){
monitorRelationSturctItem subStruct;
BayProperty* pTargetBay = nullptr;
for(auto& pOtherItem:lstOther)
{
BayProperty* pBay = dynamic_cast<BayProperty*>(pOtherItem->getProperty());
if(pBay){
if(pBay->uuid() == subPair.second){ //从所有间隔中找到sublist中的间隔
pTargetBay = pBay;
break;
}
}
}
if(pTargetBay){
subStruct.nEquipType = 0;
subStruct.nCategory = 1;
subStruct.sName = pTargetBay->tag();
subStruct.uid = pTargetBay->uuid();
info.subList.append(subStruct);
}
}
lstFirst.append(info);
}
else if(pBase->type() == 15 || pBase->type() == 16){
monitorRelationItem info;
info.item.nEquipType = pBase->type();
info.item.nCategory = 0;
info.item.sName = pBase->name();
info.item.uid = pBase->uuid();
for(auto& subPair:pBase->getSubList()){
monitorRelationSturctItem subStruct;
auto pPro = getItemByUid(lstBase,subPair.second);
if(pPro){
subStruct.nEquipType = pPro->type();
subStruct.nCategory = 0;
subStruct.sName = pPro->name();
subStruct.uid = pPro->uuid();
info.subList.append(subStruct);
}
}
lstFirst.append(info);
}
}
emit updateCurrentItems(lstFirst,true);
QList<monitorRelationItem> lstSecond;
for(auto& pBaseItem:lstItem) //二次循环添加间隔内设备(更新列表显示使用)
{
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
if(pBase->type() != 1 && pBase->type() != 15 && pBase->type() != 16){ //设备添加
monitorRelationItem info;
info.item.nEquipType = pBase->type();
info.item.nCategory = 0;
info.item.sName = pBase->name();
info.item.uid = pBase->uuid();
BayProperty* pTargetBay = nullptr;
for(auto& pOtherItem:lstOther)
{
BayProperty* pBay = dynamic_cast<BayProperty*>(pOtherItem->getProperty());
if(pBay){
if(pBay->tag() == pBase->getBay()){ //将bay添加到parent
info.parent.nEquipType = 0;
info.parent.nCategory = 1;
info.parent.sName = pBay->tag();
info.parent.uid = pBay->uuid();
break;
}
}
}
lstSecond.append(info);
}
}
emit updateCurrentItems(lstSecond,false);
for(auto& pOtherItem:lstOther)
{
BayProperty* pBay = dynamic_cast<BayProperty*>(pOtherItem->getProperty());
@ -1528,13 +1644,14 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<Graphi
BayProperty* pData = pProPanel->getModelController()->generateBayData(pBay,lstProData);
if(pData)
{
pData->setSubList(pBay->getSubList());
pProPanel->getModelController()->addBayByData(pData);
}
}
}
}
void FixedPortsModel::onWizardFinished(QMap<QUuid,GraphicsBaseModelItem*> mapItem,QList<EditBaseItem*> mapBay)
void FixedPortsModel::onWizardFinished(QMap<QUuid,GraphicsBaseModelItem*> mapItem,QList<EditBaseItem*> mapBlock)
{
QMap<QUuid,DiagramEditorItemProperty*> mapEditor = BasePropertyManager::instance().getEditorData();
for(auto& pro:mapEditor){
@ -1550,6 +1667,32 @@ void FixedPortsModel::onWizardFinished(QMap<QUuid,GraphicsBaseModelItem*> mapIte
auto cloneItem = pItem->clone();
BaseModelProperty* pPro = BasePropertyManager::instance().findBaseEntityData(cloneItem->itemId());
if(pPro){
if(pPro->type() == 1){ //母线
for(auto item:mapBlock){
auto p = item->getBlockData(); //获取blockitem对应的data
if(p->getType() == 1){
DiagramEditorBusBlock* pBus = dynamic_cast<DiagramEditorBusBlock*>(p.data());
if(pBus){
QString sBus = pBus->getName();
if(sBus == pPro->name())
pPro->setSubList(pBus->getSubList()); //将子列表转移到item
}
}
}
}
else if(pPro->type() == 15 || pPro->type() == 16){ //变压器
for(auto item:mapBlock){
auto p = item->getBlockData(); //获取blockitem对应的data
if(p->getType() == 3){
DiagramEditorTransformerBlock* pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(p.data());
if(pTrans){
QString sTrans = pTrans->getName();
if(sTrans == pPro->name())
pPro->setSubList(pTrans->getSubList()); //将子列表转移到item
}
}
}
}
cloneItem->setProperty(pPro);
_scene->addItem(cloneItem);
cloneItem->setPos(pItem->pos());
@ -1585,8 +1728,9 @@ void FixedPortsModel::onWizardFinished(QMap<QUuid,GraphicsBaseModelItem*> mapIte
//_widget->getView()->centerOn(center);
//**************间隔*************
for(auto item:mapBay){
for(auto item:mapBlock){
auto p = item->getBlockData(); //获取blockitem对应的data
if(p->getType() == 2){
DiagramEditorBayBlock* pBay = dynamic_cast<DiagramEditorBayBlock*>(p.data());
if(pBay){
QString sBay = pBay->getName();
@ -1656,6 +1800,7 @@ void FixedPortsModel::onWizardFinished(QMap<QUuid,GraphicsBaseModelItem*> mapIte
pBayData->setType(sType);
pBayData->setLstFrom(pBay->getBayInfo().lstFrom);
pBayData->setLstTo(pBay->getBayInfo().lstTo);
pBayData->setSubList(pBay->getSubList());
for(auto &info:lstInfo){
pBayData->getLstComponent().append(info.uid);
@ -1667,6 +1812,7 @@ void FixedPortsModel::onWizardFinished(QMap<QUuid,GraphicsBaseModelItem*> mapIte
}
}
}
}
void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pItem,BaseProperty* pPro)
{
@ -1678,6 +1824,8 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
pPro->setSourceItemId(pBaseItem->itemId().toString()); //设置被哪个对象生成
pPro->setMetaModelName(pBase->metaModelName()); //传递基模名
pPro->setPath(pBase->getBay());
pPro->setSubList(pBase->getSubList()); //传递sublist
pPro->setBay(pBase->getBay());
QString sMeta = pBase->metaModelName();
QString sModel = pBase->modelName();
@ -1964,22 +2112,6 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
}
QPointF pos = proTer->relativePosition();
PortPos locate = PortPos(baseTer->getPortLocate());
/*if(pos.x() < 0)
{
locate = P_left;
}
else if(pos.x() > 0)
{
locate = P_right;
}
else if(pos.y() > 0)
{
locate = P_down;
}
else if(pos.y() < 0)
{
locate = P_top;
}*/
pProItem->addPort(P_const,pos,proTer->id(),typ,locate,dPerX,dPerY);
ItemPort* pPort = pProItem->getPortById(proTer->id());
@ -1993,9 +2125,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
pPanel->getScene()->addItem(pProItem);
pProItem->setProperty(pPro); //绑定模型
pProItem->updateByProperty(); //使用模型更新自身
//QString sModel = _projectModelName.value(id.toString());
//QString sModel = pBase->getModelProperty().modelSetting.modelName;
//pProItem->setModelName(sModel);
pPanel->getModelController()->addNodeItem(QUuid(pEntity->id()),pProItem);
}
}
@ -2092,7 +2222,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
pPro->setConnection(Connection(QUuid(proFromItemId),QUuid(proFromTerId),proFromType,proFromPos,QUuid(proToItemId),QUuid(proToTerId),proToType,proToPos));
}
}
//QString sModel = pBase->getModelProperty().modelSetting.modelName;
if(pProItem){
pProItem->setModelName(sModel);
pProItem->setRotation(pItem->rotation());
@ -2440,3 +2570,61 @@ QList<QUuid> FixedPortsModel::turnJsonArrToList(QJsonObject object,QString sInne
return lst;
}
void FixedPortsModel::generateMonitor(QString sPage,QList<QPair<QString,QUuid>> lst)
{
MonitorPanel* pPanel = nullptr;
if(_cavas){
DiagramInfo info;
info.id = QUuid::createUuid();
info.sName = sPage;
info.sTag = sPage;
info.sBasePageName = _pageName;
info.parentId = _pEntity->id();
_cavas->onSignal_createDiagram(info,DiagramMode::DM_run);
pPanel = _cavas->getMonitorPanel(sPage);
QList<QPair<QString,QUuid>> lstCreated;
for(auto& pair:lst)
{
if(_nodeItem.contains(pair.second)){
auto pItem = _nodeItem.value(pair.second);
BaseProperty* pPro = dynamic_cast<BaseProperty*>(pItem->getProperty());
if(pPro){
auto pNewItem = pItem->clone();
if(pPro->type() == 8){
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pNewItem);
if(pLine)
pLine->calculatePath();
}
else{
pNewItem->updateItem();
}
if(pNewItem && pPanel){
pNewItem->setProperty(pPro);
pNewItem->updateHandles();
pNewItem->updateByProperty(); //使用模型更新自身
pPanel->getModelController()->addNodeItem(pPro->uuid(),pNewItem);
pPanel->getScene()->addItem(pNewItem); //绑定模型
lstCreated.append(qMakePair(pPro->name(),pPro->uuid()));
}
}
}
}
if (!pPanel->getScene()->items().isEmpty()) {
QRectF itemsRect = pPanel->getScene()->itemsBoundingRect();
itemsRect.adjust(-30, -30, 30, 30);
auto map = _cavas->getMapMonitor();
if(map.contains(sPage)){
auto pSubWin = map.value(sPage).second;
pSubWin->resize(itemsRect.width(),itemsRect.height());
}
//pPanel->getScene()->setSceneRect(itemsRect);
pPanel->getView()->fitInView(itemsRect, Qt::KeepAspectRatio);
}
emit pPanel->getModelController()->monitorCreated(_pageName,qMakePair(sPage,info.id.toUuid()));
emit pPanel->getModelController()->monitorItems(lstCreated);
}
}

View File

@ -5,6 +5,27 @@
ElectricConnectLineItem::ElectricConnectLineItem(QGraphicsItem *parent)
: GraphicsProjectModelItem(parent)
{
initial();
}
ElectricConnectLineItem::ElectricConnectLineItem(const ElectricConnectLineItem& obj)
: GraphicsProjectModelItem(obj)
{
initial();
m_lstPoints = obj.m_lstPoints;
}
ElectricConnectLineItem::~ElectricConnectLineItem()
{
}
ElectricConnectLineItem* ElectricConnectLineItem::clone() const
{
return new ElectricConnectLineItem(*this);
}
void ElectricConnectLineItem::initial()
{
m_boundingRect = QRectF();
m_pen = QPen(Qt::black);
@ -17,9 +38,6 @@ ElectricConnectLineItem::ElectricConnectLineItem(QGraphicsItem *parent)
_curLine = QPoint();
}
ElectricConnectLineItem::~ElectricConnectLineItem()
{
}
void ElectricConnectLineItem::setStartPoint(const QPointF& p)
{

View File

@ -8,12 +8,13 @@
ElectricPortItem::ElectricPortItem(QGraphicsItem *parent)
: GraphicsProjectModelItem(parent)
{
m_boundingRect = QRectF(-1,-1,2,2);
m_pen = QPen(Qt::black);
m_brush = QBrush(Qt::black);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricPortItem::ElectricPortItem(const ElectricPortItem& obj)
: GraphicsProjectModelItem(obj)
{
initial();
}
ElectricPortItem::~ElectricPortItem()
@ -21,6 +22,11 @@ ElectricPortItem::~ElectricPortItem()
}
ElectricPortItem* ElectricPortItem::clone() const
{
return new ElectricPortItem(*this);
}
QRectF ElectricPortItem::boundingRect() const
{
return m_boundingRect;
@ -57,3 +63,13 @@ void ElectricPortItem::paint(QPainter* painter, const QStyleOptionGraphicsItem*
painter->setBrush(m_brush);
painter->drawEllipse(m_boundingRect);
}
void ElectricPortItem::initial()
{
m_boundingRect = QRectF(-1,-1,2,2);
m_pen = QPen(Qt::black);
m_brush = QBrush(Qt::black);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -14,11 +14,26 @@ ElectricSvgGroup::ElectricSvgGroup(const QRect &rect,QGraphicsItem *parent)
m_dHeight = rect.height();
}
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;
}
ElectricSvgGroup::~ElectricSvgGroup()
{
}
ElectricSvgGroup* ElectricSvgGroup::clone() const
{
return new ElectricSvgGroup(*this);
}
QPainterPath ElectricSvgGroup::shape()
{
QPainterPath path;

View File

@ -18,11 +18,30 @@ ElectricSvgGroupCT::ElectricSvgGroupCT(const QRect &rect, QGraphicsItem *parent)
setFunctionHandleEnaable(false);
}
ElectricSvgGroupCT::ElectricSvgGroupCT(const ElectricSvgGroupCT& obj)
:ElectricSvgGroup(obj)
{
setHandleIfShow(H_textCaption,false);
setHandleIfShow(H_textCurrent,false);
setHandleIfShow(h_textVoltage,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
_nType = obj._nType;
_nSize = obj._nSize;
}
ElectricSvgGroupCT::~ElectricSvgGroupCT()
{
}
ElectricSvgGroupCT* ElectricSvgGroupCT::clone() const
{
return new ElectricSvgGroupCT(*this);
}
void ElectricSvgGroupCT::setupFinish(QVariant var)
{
if(var.canConvert<QPair<int,int>>()){

View File

@ -16,11 +16,26 @@ ElectricSvgGroupPT::ElectricSvgGroupPT(const QRect &rect, QGraphicsItem *parent)
setFunctionHandleEnaable(false);
}
ElectricSvgGroupPT::ElectricSvgGroupPT(const ElectricSvgGroupPT& obj)
: ElectricSvgGroup(obj)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
m_lstType = obj.m_lstType;
}
ElectricSvgGroupPT::~ElectricSvgGroupPT()
{
}
ElectricSvgGroupPT* ElectricSvgGroupPT::clone() const
{
return new ElectricSvgGroupPT(*this);
}
void ElectricSvgGroupPT::setupFinish(QVariant var)
{
if(var.canConvert<QList<int>>()){

View File

@ -20,9 +20,33 @@ ElectricSvgItem::ElectricSvgItem(const QRect &rect, bool autoGenPort,QGraphicsIt
setFunctionHandleEnaable(false);
}
ElectricSvgItem::ElectricSvgItem(const ElectricSvgItem& obj)
: GraphicsProjectModelItem(obj)
{
m_lastBoudingRect = obj.m_lastBoudingRect;
m_boundingRect = obj.m_boundingRect;
m_dWidth = obj.m_dWidth;
m_dHeight = obj.m_dHeight;
_tempSvg = obj._tempSvg;
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
if(!_tempSvg.isEmpty())
m_pRender = new QSvgRenderer(_tempSvg);
}
ElectricSvgItem::~ElectricSvgItem()
{
if(m_pRender)
delete m_pRender;
}
ElectricSvgItem* ElectricSvgItem::clone() const
{
return new ElectricSvgItem(*this);
}
QPainterPath ElectricSvgItem::shape()
@ -116,6 +140,7 @@ void ElectricSvgItem::move(const QPointF& point)
void ElectricSvgItem::loadSvg(QByteArray b)
{
m_pRender = new QSvgRenderer(b);
_tempSvg = b;
}
void ElectricSvgItem::updateMapSvg(QMap<QString,QByteArray> map)

View File

@ -9,10 +9,13 @@
ElectricSvgItem2wTransformer::ElectricSvgItem2wTransformer(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItem2wTransformer::ElectricSvgItem2wTransformer(const ElectricSvgItem2wTransformer& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItem2wTransformer::~ElectricSvgItem2wTransformer()
@ -20,9 +23,20 @@ ElectricSvgItem2wTransformer::~ElectricSvgItem2wTransformer()
}
ElectricSvgItem2wTransformer* ElectricSvgItem2wTransformer::clone() const
{
return new ElectricSvgItem2wTransformer(*this);
}
void ElectricSvgItem2wTransformer::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItem2wTransformer::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -9,10 +9,13 @@
ElectricSvgItem3wTransformer::ElectricSvgItem3wTransformer(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItem3wTransformer::ElectricSvgItem3wTransformer(const ElectricSvgItem3wTransformer& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItem3wTransformer::~ElectricSvgItem3wTransformer()
@ -20,9 +23,21 @@ ElectricSvgItem3wTransformer::~ElectricSvgItem3wTransformer()
}
ElectricSvgItem3wTransformer* ElectricSvgItem3wTransformer::clone() const
{
return new ElectricSvgItem3wTransformer(*this);
}
void ElectricSvgItem3wTransformer::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItem3wTransformer::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -11,13 +11,13 @@
ElectricSvgItemBus::ElectricSvgItemBus(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
//loadSvg(":/images/element/svg_bus.svg");
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
setHandleEnaable(H_right,true);
setHandleEnaable(H_left,true);
initial();
}
ElectricSvgItemBus::ElectricSvgItemBus(const ElectricSvgItemBus& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemBus::~ElectricSvgItemBus()
@ -25,6 +25,11 @@ ElectricSvgItemBus::~ElectricSvgItemBus()
}
ElectricSvgItemBus* ElectricSvgItemBus::clone() const
{
return new ElectricSvgItemBus(*this);
}
void ElectricSvgItemBus::updateHandles()
{
ElectricSvgItem::updateHandles();
@ -60,3 +65,13 @@ void ElectricSvgItemBus::paint(QPainter* painter, const QStyleOptionGraphicsItem
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemBus::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
setHandleEnaable(H_right,true);
setHandleEnaable(H_left,true);
}

View File

@ -16,10 +16,14 @@ ElectricSvgItemCT::ElectricSvgItemCT(const QRect &rect, QGraphicsItem *parent)
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);*/
initial();
}
setFlag(QGraphicsItem::ItemIsSelectable, false);
setFlag(QGraphicsItem::ItemIsFocusable, false);
setAcceptedMouseButtons(Qt::NoButton);
ElectricSvgItemCT::ElectricSvgItemCT(const ElectricSvgItemCT& obj)
:ElectricSvgItem(obj)
{
initial();
_itemType = obj._itemType;
}
ElectricSvgItemCT::~ElectricSvgItemCT()
@ -27,6 +31,18 @@ ElectricSvgItemCT::~ElectricSvgItemCT()
}
ElectricSvgItemCT* ElectricSvgItemCT::clone() const
{
return new ElectricSvgItemCT(*this);
}
void ElectricSvgItemCT::initial()
{
setFlag(QGraphicsItem::ItemIsSelectable, false);
setFlag(QGraphicsItem::ItemIsFocusable, false);
setAcceptedMouseButtons(Qt::NoButton);
}
void ElectricSvgItemCT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
if (!m_pRender || !m_pRender->isValid())

View File

@ -9,10 +9,13 @@
ElectricSvgItemCableEnd::ElectricSvgItemCableEnd(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItemCableEnd::ElectricSvgItemCableEnd(const ElectricSvgItemCableEnd& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemCableEnd::~ElectricSvgItemCableEnd()
@ -20,9 +23,21 @@ ElectricSvgItemCableEnd::~ElectricSvgItemCableEnd()
}
ElectricSvgItemCableEnd* ElectricSvgItemCableEnd::clone() const
{
return new ElectricSvgItemCableEnd(*this);
}
void ElectricSvgItemCableEnd::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemCableEnd::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -9,10 +9,13 @@
ElectricSvgItemCableTer::ElectricSvgItemCableTer(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItemCableTer::ElectricSvgItemCableTer(const ElectricSvgItemCableTer& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemCableTer::~ElectricSvgItemCableTer()
@ -20,9 +23,20 @@ ElectricSvgItemCableTer::~ElectricSvgItemCableTer()
}
ElectricSvgItemCableTer* ElectricSvgItemCableTer::clone() const
{
return new ElectricSvgItemCableTer(*this);
}
void ElectricSvgItemCableTer::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemCableTer::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -9,10 +9,13 @@
ElectricSvgItemDS::ElectricSvgItemDS(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItemDS::ElectricSvgItemDS(const ElectricSvgItemDS& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemDS::~ElectricSvgItemDS()
@ -20,9 +23,21 @@ ElectricSvgItemDS::~ElectricSvgItemDS()
}
ElectricSvgItemDS* ElectricSvgItemDS::clone() const
{
return new ElectricSvgItemDS(*this);
}
void ElectricSvgItemDS::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemDS::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -9,10 +9,13 @@
ElectricSvgItemDTEDS::ElectricSvgItemDTEDS(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
inital();
}
ElectricSvgItemDTEDS::ElectricSvgItemDTEDS(const ElectricSvgItemDTEDS& obj)
: ElectricSvgItem(obj)
{
inital();
}
ElectricSvgItemDTEDS::~ElectricSvgItemDTEDS()
@ -20,9 +23,21 @@ ElectricSvgItemDTEDS::~ElectricSvgItemDTEDS()
}
ElectricSvgItemDTEDS* ElectricSvgItemDTEDS::clone() const
{
return new ElectricSvgItemDTEDS(*this);
}
void ElectricSvgItemDTEDS::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemDTEDS::inital()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -9,10 +9,13 @@
ElectricSvgItemES::ElectricSvgItemES(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItemES::ElectricSvgItemES(const ElectricSvgItemES& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemES::~ElectricSvgItemES()
@ -20,9 +23,21 @@ ElectricSvgItemES::~ElectricSvgItemES()
}
ElectricSvgItemES* ElectricSvgItemES::clone() const
{
return new ElectricSvgItemES(*this);
}
void ElectricSvgItemES::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemES::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -9,10 +9,13 @@
ElectricSvgItemFES::ElectricSvgItemFES(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItemFES::ElectricSvgItemFES(const ElectricSvgItemFES& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemFES::~ElectricSvgItemFES()
@ -20,9 +23,20 @@ ElectricSvgItemFES::~ElectricSvgItemFES()
}
ElectricSvgItemFES* ElectricSvgItemFES::clone() const
{
return new ElectricSvgItemFES(*this);
}
void ElectricSvgItemFES::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemFES::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -9,10 +9,13 @@
ElectricSvgItemLA::ElectricSvgItemLA(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItemLA::ElectricSvgItemLA(const ElectricSvgItemLA& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemLA::~ElectricSvgItemLA()
@ -20,9 +23,21 @@ ElectricSvgItemLA::~ElectricSvgItemLA()
}
ElectricSvgItemLA* ElectricSvgItemLA::clone() const
{
return new ElectricSvgItemLA(*this);
}
void ElectricSvgItemLA::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemLA::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -10,10 +10,13 @@
ElectricSvgItemPI::ElectricSvgItemPI(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
ElectricSvgItemPI::ElectricSvgItemPI(const ElectricSvgItemPI& obj)
: ElectricSvgItem(obj)
{
initial();
}
ElectricSvgItemPI::~ElectricSvgItemPI()
@ -21,10 +24,21 @@ ElectricSvgItemPI::~ElectricSvgItemPI()
}
ElectricSvgItemPI* ElectricSvgItemPI::clone() const
{
return new ElectricSvgItemPI(*this);
}
void ElectricSvgItemPI::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemPI::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -10,9 +10,14 @@
ElectricSvgItemPT::ElectricSvgItemPT(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
setFlag(QGraphicsItem::ItemIsSelectable, false);
setFlag(QGraphicsItem::ItemIsFocusable, false);
setAcceptedMouseButtons(Qt::NoButton);
initial();
}
ElectricSvgItemPT::ElectricSvgItemPT(const ElectricSvgItemPT& obj)
: ElectricSvgItem(obj)
{
initial();
_itemType = obj._itemType;
}
ElectricSvgItemPT::~ElectricSvgItemPT()
@ -20,6 +25,11 @@ ElectricSvgItemPT::~ElectricSvgItemPT()
}
ElectricSvgItemPT* ElectricSvgItemPT::clone() const
{
return new ElectricSvgItemPT(*this);
}
void ElectricSvgItemPT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
if (!m_pRender || !m_pRender->isValid())
@ -27,4 +37,10 @@ void ElectricSvgItemPT::paint(QPainter* painter, const QStyleOptionGraphicsItem*
m_pRender->render(painter, m_boundingRect);
}
void ElectricSvgItemPT::initial()
{
setFlag(QGraphicsItem::ItemIsSelectable, false);
setFlag(QGraphicsItem::ItemIsFocusable, false);
setAcceptedMouseButtons(Qt::NoButton);
}

View File

@ -11,21 +11,13 @@
ElectricSvgItemRect::ElectricSvgItemRect(const QRect &rect, bool genNewPort, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
//loadSvg(":/images/element/svg_rect.svg");
setHandleIfShow(H_textCaption,false);
setHandleIfShow(H_textCurrent,false);
setHandleIfShow(h_textVoltage,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
initial();
}
m_dRatioX = 0.5;
/*if(genNewPort)
ElectricSvgItemRect::ElectricSvgItemRect(const ElectricSvgItemRect& obj)
: ElectricSvgItem(obj)
{
addPort(P_const,QPointF(boundingRect().right() - boundingRect().width() * m_dRatioX, boundingRect().top()),QUuid::createUuid().toString(),T_lineIn,P_top);
addPort(P_const,QPointF(boundingRect().right() - boundingRect().width() * m_dRatioX, boundingRect().bottom()),QUuid::createUuid().toString(),T_lineOut,P_down);
}*/
initial();
}
ElectricSvgItemRect::~ElectricSvgItemRect()
@ -33,6 +25,11 @@ ElectricSvgItemRect::~ElectricSvgItemRect()
}
ElectricSvgItemRect* ElectricSvgItemRect::clone() const
{
return new ElectricSvgItemRect(*this);
}
void ElectricSvgItemRect::updateHandles()
{
ElectricSvgItem::updateHandles();
@ -43,4 +40,12 @@ void ElectricSvgItemRect::paint(QPainter* painter, const QStyleOptionGraphicsIte
ElectricSvgItem::paint(painter,option,widget);
}
void ElectricSvgItemRect::initial()
{
setHandleIfShow(H_textCaption,false);
setHandleIfShow(H_textCurrent,false);
setHandleIfShow(h_textVoltage,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}

View File

@ -7,40 +7,10 @@
ElectricSvgItemTriangle::ElectricSvgItemTriangle(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
//loadSvg(":/images/element/svg_triangle.svg");
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
//入线口
/*ItemPort* pHandle1 = new ItemPort(this);
pHandle1->setType(T_lineOut);
pHandle1->setTag(H_connect);
pHandle1->setPortPos(P_top);
pHandle1->setParent(this);
m_vecHanle.insert(H_connect,pHandle1);
//出线口
ItemPort* pHandle2 = new ItemPort(this);
pHandle2->setType(T_lineIn);
pHandle2->setTag(H_connect+1);
pHandle2->setPortPos(P_down);
pHandle2->setParent(this);
m_vecHanle.insert(H_connect+1,pHandle2);
ItemPort* pHandle3 = new ItemPort(this);
pHandle3->setType(T_lineIn);
pHandle3->setTag(H_connect+2);
pHandle3->setPortPos(P_down);
pHandle3->setParent(this);
m_vecHanle.insert(H_connect+2,pHandle3);
m_dTopRatioX = 0.5;
m_dBottomRatioX = 0.333;
m_mapPort.insert(QString::number(_portId++),pHandle1);
m_mapPort.insert(QString::number(_portId++),pHandle2);
m_mapPort.insert(QString::number(_portId++),pHandle3);*/
}
ElectricSvgItemTriangle::~ElectricSvgItemTriangle()

View File

@ -41,7 +41,7 @@ GraphicsBaseItem::GraphicsBaseItem(const GraphicsBaseItem& obj)
m_boundingRect_selected = obj.m_boundingRect_selected;
PortState tpe;
if(m_Itemtype == GIT_baseNode || m_Itemtype == GIT_baseBus){
if(m_Itemtype == GIT_baseNode || m_Itemtype == GIT_baseBus || m_Itemtype == GIT_node || m_Itemtype == GIT_bus){
tpe = p_movable;
}
else{
@ -242,6 +242,11 @@ GraphicsBaseModelItem::~GraphicsBaseModelItem()
}
GraphicsBaseModelItem* GraphicsBaseModelItem::clone() const
{
return new GraphicsBaseModelItem(*this);
}
void GraphicsBaseModelItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
if(_stateMask){
@ -282,7 +287,7 @@ GraphicsBaseModelGroup::~GraphicsBaseModelGroup()
GraphicsBaseModelGroup* GraphicsBaseModelGroup::clone() const
{
return new GraphicsBaseModelGroup(*this);
}
void GraphicsBaseModelGroup::addItem(GraphicsBaseModelItem* item)
@ -364,11 +369,55 @@ GraphicsProjectModelItem::GraphicsProjectModelItem(QGraphicsItem *parent)
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}
GraphicsProjectModelItem::GraphicsProjectModelItem(const GraphicsProjectModelItem& obj)
:GraphicsBaseItem(obj)
{
_lastPort = -1;
//初始化缩放操作用的handle
//m_vecHanle.reserve(H_left);
for(int i = H_leftTop; i <= H_left; i++)
{
ItemControlHandle* pHandle = new HandleRect(this);
pHandle->setType(T_resize);
pHandle->setTag(i);
m_vecHanle.insert(i-1,pHandle);
}
for(int i = H_rotate_leftTop; i <= H_rotate_leftBottom; i++)
{
ItemControlHandle* pHandle = new HandleRect(this);
pHandle->setType(T_rotate);
pHandle->setTag(i);
m_vecHanle.insert(i-1,pHandle);
}
HandleText* pHandle = new HandleText(this);
pHandle->setType(T_text);
pHandle->setTag(H_textCaption);
pHandle->setPos(30,-30);
pHandle->setParent(this);
m_vecHanle.insert(H_textCaption,pHandle);
m_state = obj.m_state;
m_beginConnectPoint = obj.m_beginConnectPoint;
m_endConnectPoint = obj.m_endConnectPoint;
_modelName = obj._modelName;
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
setPos(obj.pos());
setRotation(obj.rotation());
}
GraphicsProjectModelItem::~GraphicsProjectModelItem()
{
}
GraphicsProjectModelItem* GraphicsProjectModelItem::clone() const
{
return new GraphicsProjectModelItem(*this);
}
void GraphicsProjectModelItem::createOperationCopy()
{
@ -450,6 +499,13 @@ void GraphicsProjectModelItem::contextMenuEvent(QGraphicsSceneContextMenuEvent*
Q_UNUSED(event);
}
void GraphicsProjectModelItem::paint(QPainter *painter,const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(painter);
Q_UNUSED(option);
Q_UNUSED(widget);
}
void GraphicsProjectModelItem::setLabelTag(const QString& name)
{
m_vecHanle[H_textCaption]->setText(name);
@ -546,11 +602,28 @@ GraphicsProjectModelGroup::GraphicsProjectModelGroup(QGraphicsItem *parent)
}
GraphicsProjectModelGroup::GraphicsProjectModelGroup(const GraphicsProjectModelGroup& obj)
:GraphicsProjectModelItem(obj)
{
m_direction = obj.m_direction;
m_spacing = obj.m_spacing;
_groupType = obj.m_spacing;
for(auto &pItem:obj.m_childItems){
auto newItem = pItem->clone();
m_childItems.append(newItem);
}
}
GraphicsProjectModelGroup::~GraphicsProjectModelGroup()
{
}
GraphicsProjectModelGroup* GraphicsProjectModelGroup::clone() const
{
return new GraphicsProjectModelGroup(*this);
}
void GraphicsProjectModelGroup::addItem(GraphicsProjectModelItem* item)
{

View File

@ -0,0 +1,87 @@
#include <QJsonArray>
#include "monitorPanel.h"
#include <QMessageBox>
#include <QCloseEvent>
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "powerEntity.h"
#include "statusBar.h"
#include "baseProperty.h"
#include "graphicsItem/electricBayItem.h"
MonitorPanel::MonitorPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: BaseDrawingPanel(pEntity,parent,mode)
{
m_pStatusBar->setButtonVisible(false);
}
MonitorPanel::~MonitorPanel()
{
}
void MonitorPanel::closeEvent(QCloseEvent *closeEvent)
{
emit panelDelete(_name,2);
}
QJsonObject MonitorPanel::getMonitorInfo() const
{
QJsonObject obj;
QJsonArray arr;
if(_pModel)
{
QMap<QUuid,itemPageInfo> map = _pModel->allNodePos();
for(auto iter = map.begin();iter != map.end();++iter)
{
QJsonObject node;
node["id"] = iter.key().toString();
node["x"] = iter.value().pos.x();
node["y"] = iter.value().pos.y();
node["width"] = iter.value().dWidth;
node["height"] = iter.value().dHeight;
node["rotate"] = iter.value().dRotate;
arr.append(node);
}
obj["nodes"] = arr;
QJsonArray arrConnect;
QVector<ModelProperty*> vec = _pModel->allConnectionProperty();
for(auto& pPro:vec){
Connection con = pPro->getConnection();
QJsonObject connect;
connect["id"] = pPro->uuid().toString();
connect["SrcNodeId"] = con.nSrcNodeId.toString();
connect["SrcPortId"] = con.nSrcPortId.toString();
connect["DestNodeId"] = con.nDestNodeId.toString();
connect["DestPortId"] = con.nDestPortId.toString();
arrConnect.append(connect);
}
obj["connections"] = arrConnect;
QJsonArray arrBay;
QMap<QUuid,ElectricBayItem*> mapBay = _pModel->allBayItem();
for(auto& bayItem:mapBay){
AbstractProperty* pPro = bayItem->getProperty();
BayProperty* pBay = dynamic_cast<BayProperty*>(pPro);
if(pBay)
{
QJsonObject bay;
bay["id"] = pBay->uuid().toString();
arrBay.append(bay);
}
}
obj["bays"] = arrBay;
}
return obj;
}
void MonitorPanel::loadNodes(QJsonObject obj)
{
}
void MonitorPanel::saveNodes(int pageId)
{
}

View File

@ -749,6 +749,13 @@ PowerEntity* TopologyManager::createDiagram(const QString& id,const QString& nam
m_baseDiagrams.insert(entity->id(), entity);
}
}
else if(funType == ModelFunctionType::RuntimeModel){
if(!m_monitorDiagrams.contains(id))
{
entity = new ConfigurationDiagram(id,name);
m_monitorDiagrams.insert(entity->id(), entity);
}
}
return entity;
}
@ -759,6 +766,8 @@ PowerEntity* TopologyManager::findDiagram(const QString& id,ModelFunctionType fu
return m_diagrams.value(id, nullptr); // 避免异常的安全查询
else if(funType == ModelFunctionType::BaseModel)
return m_baseDiagrams.value(id, nullptr);
else if(funType == ModelFunctionType::RuntimeModel)
return m_monitorDiagrams.value(id, nullptr);
return nullptr;
}

View File

@ -197,6 +197,66 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
}
}
}
else if(sceneMode == DM_run){
if (event->button() != Qt::LeftButton)
return;
_model->activateModel(); //激活当前窗口
ms_ptMouseDown = event->scenePos();
ms_ptMouseLast = event->scenePos();
if(!m_bHoverOnHandel)
scene->callParentEvent(event); //此处是通过触发QGraphicsScene的事件函数来取消所有被选中item的选中状态
m_opMode = OM_none;
QList<QGraphicsItem *> items = scene->selectedItems();
if (items.count() == 1) //只有一个选中
{
GraphicsProjectModelItem* item = qgraphicsitem_cast<GraphicsProjectModelItem*>(items.first());
if(item)
{
GraphicsItemType tpe = item->getItemType();
if(tpe == GIT_link) //对象是连接线
{
m_opMode = OM_linkMove;
setCursor(scene, Qt::ArrowCursor);
emit setWorkingSelector(ST_linkMoving);
}
else
{
m_opMode = OM_move;
setCursor(scene, Qt::ClosedHandCursor);
emit setWorkingSelector(ST_moving);
}
}
}
else if (items.count() > 1) //选中多个
{
m_opMode = OM_move;
emit setWorkingSelector(ST_moving);
setCursor(scene, Qt::ClosedHandCursor);
}
if(m_opMode == OM_move) //可以多个选中同时移动
{
for(int n = 0; n < items.size(); n++)
{
//创建副本
GraphicsProjectModelItem* item = qgraphicsitem_cast<GraphicsProjectModelItem*>(items.at(n));
GraphicsItemType tpe = item->getItemType();
if(tpe == GIT_link)
continue;
item->createOperationCopy();
}
}
else if(m_opMode == OM_none)
{
QGraphicsView *view = scene->getView();
if(view)
view->setDragMode(QGraphicsView::RubberBandDrag);
}
}
}
void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene,DiagramMode sceneMode)
@ -396,6 +456,19 @@ void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerSc
view->setDragMode(QGraphicsView::NoDrag);
}
QList<QPair<QString,QUuid>> lst; //发送已选中的元件
QList<QGraphicsItem *> items = scene->selectedItems();
for(auto& pItem:items){
GraphicsProjectModelItem* item = qgraphicsitem_cast<GraphicsProjectModelItem*>(pItem);
if(item){
auto pPro = item->getProperty();
if(pPro){
lst.append(qMakePair(pPro->name(),pPro->uuid()));
}
}
}
emit _model->itemSelected(lst);
m_opMode = OM_none;
m_bHoverOnHandel = false;
ms_nDragHandle = H_none;
@ -406,6 +479,22 @@ void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerSc
m_opMode = OM_none;
scene->callParentEvent(event);
}
else if(sceneMode == DM_run)
{
setCursor(scene, Qt::ArrowCursor);
if(m_opMode == OM_none)
{
QGraphicsView *view = scene->getView();
if(view)
view->setDragMode(QGraphicsView::NoDrag);
}
m_opMode = OM_none;
m_bHoverOnHandel = false;
ms_nDragHandle = H_none;
scene->callParentEvent(event);
}
}
void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene,DiagramMode sceneMode)
@ -464,6 +553,26 @@ void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, Design
}
}
}
else if(sceneMode == DM_run)
{
QList<QGraphicsItem *> items = scene->selectedItems();
if(items.count() == 1)
{
GraphicsProjectModelItem* item = qgraphicsitem_cast<GraphicsProjectModelItem*>(items.first());
if(item)
{
if(item->getItemType() == GIT_bay) //间隔暂时返回
return;
ModelProperty* pro = item->getProperty();
if(pro){
QString modelName = pro->modelName();
QUuid uuid = item->itemId();
_model->showModelDlg(modelName,uuid,item);
}
}
}
}
}
void BaseSelector::dragEnterEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*,DiagramMode sceneMode)

View File

@ -3,6 +3,7 @@
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <graphicsItem/graphicsBaseItem.h>
#include "baseProperty.h"
MovingSelector::MovingSelector(FixedPortsModel* model,QObject *parent)
: BaseSelector(model,parent)
@ -41,13 +42,23 @@ void MovingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerSce
void MovingSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene,DiagramMode sceneMode)
{
QList<QPair<QString,QUuid>> lst; //发送已选中的元件
QList<QGraphicsItem *> items = scene->selectedItems();
for(int n = 0; n < items.size(); n++)
{
AbstractShape* item = qgraphicsitem_cast<AbstractShape*>(items.at(n));
if(item)
item->removeOperationCopy();
GraphicsProjectModelItem* p = qgraphicsitem_cast<GraphicsProjectModelItem*>(items.at(n));
if(p){
auto pPro = p->getProperty();
if(pPro){
lst.append(qMakePair(pPro->name(),pPro->uuid()));
}
}
}
emit _model->itemSelected(lst);
updateConnectLineByTopology(items);

View File

@ -133,6 +133,13 @@ public:
QList<measureAttributeType> getMeasureAttributeTypes(); //获取所有量测属性
/************************************运行模式(监控)*********************************************/
bool insertMonitor(QUuid uid,QString tag,QString name,QString parent,QJsonObject context);
QUuid getMonitorIdByName(QString name);
bool updateMonitor(QString tag,QJsonObject context);
QJsonObject getMonitorContextByTag(QString tag);
QList<monitorPageInfo> getAllMonitor();
public:
/***********************************editor编辑器**********************************************/
bool insertEditorProject(QUuid,QString,QString);

View File

@ -2635,6 +2635,126 @@ QList<measureAttributeType> DataBase::getMeasureAttributeTypes() //暂时
return lst;
}
/************************************运行模式*********************************************/
bool DataBase::insertMonitor(QUuid uid,QString tag,QString name,QString parent,QJsonObject context)
{
QString strSQL = "INSERT INTO diagramui_monitor_page(global_uuid, tag, name, parent, context) VALUES (?, ?, ?, ?, ?)";
QJsonDocument dataContext(context);
QString strContext = dataContext.toJson(QJsonDocument::Compact);
QVariantList params;
params.append(uid);
params.append(tag);
params.append(name);
params.append(parent);
params.append(strContext);
try
{
executeSQL(strSQL,false,params);
return true;
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("Insert diagramui_monitor_page fail"));
return false;
}
}
QUuid DataBase::getMonitorIdByName(QString name)
{
QString strSQL = "SELECT global_uuid FROM diagramui_monitor_page WHERE tag = ?";
QVariantList params;
params.append(name);
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
return QUuid(query.value(0).toString());
}
}
catch (const std::exception& e)
{
}
return QUuid();
}
bool DataBase::updateMonitor(QString tag,QJsonObject context)
{
QString strSQL = "UPDATE diagramui_monitor_page SET context = ? WHERE tag = ?";
QVariantList params;
params.append(context);
params.append(tag);
try
{
executeSQL(strSQL,false,params);
return true;
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("Update diagramui_monitor_page %1 fail").arg(tag));
return false;
}
}
QJsonObject DataBase::getMonitorContextByTag(QString tag)
{
QString strSQL = "SELECT context FROM diagramui_monitor_page WHERE tag = ?";
QVariantList params;
params.append(tag);
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
QString str = query.value(0).toString();
QJsonObject obj = QstringToJson(str);
return obj;
}
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("SELECT diagramui_monitor_page %1 fail").arg(tag));
}
return QJsonObject();
}
QList<monitorPageInfo> DataBase::getAllMonitor()
{
QList<monitorPageInfo> lst;
QString strSQL = "SELECT id,global_uuid,tag,name,parent,context,ts FROM diagramui_monitor_page";
try
{
QSqlQuery query = executeSQL(strSQL);
while (query.next())
{
monitorPageInfo info;
info.id = query.value(0).toInt();
info.uid = QUuid(query.value(1).toString());
info.tag = query.value(2).toString();
info.name = query.value(3).toString();
info.parent = query.value(4).toString();
QString context = query.value(5).toString();
info.context = QstringToJson(context);
info.ts = query.value(6).toString();
lst.append(info);
}
query.clear();
return lst;
}
catch (const std::exception& e)
{
return lst;
}
}
bool DataBase::createDynamicTable(const QString &tableName, const QStringList &fields)
{
QString strSQL = "CREATE TABLE IF NOT EXISTS " + tableName + " (";

View File

@ -22,6 +22,8 @@ class projectModelDlg;
class TopologyView;
class DiagramView;
class CreateEditor;
class MonitorItemsDlg;
class MonitorPagesDlg;
class CMainWindow : public QMainWindow
{
@ -78,5 +80,10 @@ private:
LoadPageDlg* m_pLoadPageDlg;
projectModelDlg* m_pProjectModelDlg;
CreateEditor* m_pCreateEdiotr;
MonitorItemsDlg* m_pMonitorItemsDlg;
MonitorPagesDlg* m_pMonitorPagesDlg;
QDockWidget* m_pMonitorItemsDock;
QDockWidget* m_pMonitorPagesDock;
QAction* _pActMonitor;
};
#endif // MAINWINDOW_H

37
include/monitorItemsDlg.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef MONITORITEMSDLG_H
#define MONITORITEMSDLG_H
#include <QDialog>
#include "global.h"
QT_BEGIN_NAMESPACE
namespace Ui { class monitorItemsDlg; }
QT_END_NAMESPACE
class MonitorItemsDlg : public QDialog
{
Q_OBJECT
public:
MonitorItemsDlg(QWidget *parent = nullptr);
~MonitorItemsDlg();
void initial();
signals:
void generateMonitor(QString,QList<QPair<QString,QUuid>>); //生成监控
public slots:
void onUpdateItems(QList<monitorRelationItem>,bool refresh); //更新当前设备列表
void onSelectItems(QList<QPair<QString,QUuid>>); //更新当前选中的设备
void onGenerateClicked();
void onMonitorCreated(QList<QPair<QString,QUuid>>); //创建后的设备列表
void onItemChanged(QStandardItem *item); //item勾选事件
private:
void resetSelect(); //重置选中
void setChildrenCheckState(QStandardItem *parent, Qt::CheckState state);
private:
Ui::monitorItemsDlg *ui;
QStandardItemModel* _modelAll; //图中所有item
QStandardItemModel* _modelSelect; //生成的item
};
#endif

35
include/monitorPagesDlg.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef MONITORPAGESDLG_H
#define MONITORPAGESDLG_H
#include <QDialog>
#include "global.h"
QT_BEGIN_NAMESPACE
namespace Ui { class monitorPagesDlg; }
QT_END_NAMESPACE
class MonitorPagesDlg : public QDialog
{
Q_OBJECT
public:
MonitorPagesDlg(QWidget *parent = nullptr);
~MonitorPagesDlg();
void initial();
signals:
void monitorSelected(DiagramInfo);
void prepareSaveMonitor(QList<QPair<QString,QUuid>>);
public slots:
void onMonitorCreated(QString,QPair<QString,QUuid>,int);
void onItemClicked(const QModelIndex &index);
void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单
private:
QStandardItem* findTopLevelItem(const QString& name); //查找顶层项
private:
Ui::monitorPagesDlg *ui;
QStandardItemModel* _pModel;
};
#endif

View File

@ -76,7 +76,7 @@ void DiagramView::onIndexRbtnClicked(const QPoint &pos)
if (!index.isValid()) {
// 如果点击的是空白区域,创建新组态图菜单
QAction *addAction = new QAction("添加组态图", this);
/* QAction *addAction = new QAction("添加组态图", this);
connect(addAction,&QAction::triggered,this,[&](){
QVariant id = QUuid::createUuid();
@ -94,7 +94,7 @@ void DiagramView::onIndexRbtnClicked(const QPoint &pos)
emit diagramCreate(info);
});
menu.addAction(addAction);
menu.addAction(addAction);*/
}
else{ //目标组态图下添加子组态图
QStandardItem* item = _pModel->itemFromIndex(index);
@ -102,7 +102,7 @@ void DiagramView::onIndexRbtnClicked(const QPoint &pos)
if(item)
{
QAction *addAction = new QAction("添加子组态图", this);
/*QAction *addAction = new QAction("添加子组态图", this);
connect(addAction,&QAction::triggered,this,[&](){
QVariant id = QUuid::createUuid();
@ -121,7 +121,7 @@ void DiagramView::onIndexRbtnClicked(const QPoint &pos)
emit diagramCreate(info);
});
menu.addAction(addAction);
menu.addAction(addAction);*/
QAction *delAction = new QAction("删除", this);

View File

@ -1,6 +1,4 @@
#include "mainwindow.h"
#include "graphicsItem/graphicsItemGroup.h"
#include "ui_mainwindow.h"
#include <QWidgetAction>
@ -14,9 +12,9 @@
#include <QSqlDatabase>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QLibrary>
#include "diagramCavas.h"
#include "designerScene.h"
#include "graphicElementsPanel.h"
#include "operationCommand.h"
#include "electricElementsBox.h"
@ -29,7 +27,8 @@
#include "createEditor.h"
#include "projectModelManager.h"
#include "projectManager.h"
#include <QLibrary>
#include "monitorItemsDlg.h"
#include "monitorPagesDlg.h"
//using namespace ads;
@ -44,6 +43,11 @@ CMainWindow::CMainWindow(QWidget *parent)
m_pTopologyView = nullptr;
m_pDiagramView = nullptr;
m_pCreateEdiotr = nullptr;
m_pMonitorItemsDlg = nullptr;
m_pMonitorPagesDlg = nullptr;
m_pMonitorItemsDock = nullptr;
m_pMonitorPagesDock = nullptr;
_pActMonitor = nullptr;
initializeDockUi();
initializeAction();
@ -97,6 +101,22 @@ void CMainWindow::initializeDockUi()
diagramDock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
this->addDockWidget(Qt::LeftDockWidgetArea,diagramDock);
m_pMonitorItemsDlg = new MonitorItemsDlg(this);
m_pMonitorItemsDock = new QDockWidget(QString::fromWCharArray(L"当前设备列表"),this);
m_pMonitorItemsDock->setWidget(m_pMonitorItemsDlg);
m_pMonitorItemsDock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
this->addDockWidget(Qt::RightDockWidgetArea,m_pMonitorItemsDock);
m_pMonitorPagesDlg = new MonitorPagesDlg(this);
m_pMonitorPagesDock = new QDockWidget(QString::fromWCharArray(L"监控列表"),this);
m_pMonitorPagesDock->setWidget(m_pMonitorPagesDlg);
m_pMonitorPagesDock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
m_pMonitorPagesDock->setMinimumSize(120,550);
this->addDockWidget(Qt::RightDockWidgetArea,m_pMonitorPagesDock);
m_pMonitorItemsDock->hide();
m_pMonitorPagesDock->hide();
m_pDiagramCavas = new DiagramCavas();
m_pDiagramCavas->initial();
this->setCentralWidget(m_pDiagramCavas);
@ -135,11 +155,20 @@ void CMainWindow::initializeAction()
connect(m_pTopologyView,&TopologyView::entityDelete,m_pDiagramCavas,&DiagramCavas::onSignal_deleteEntity);
connect(m_pTopologyView,&TopologyView::entitySelected,m_pDiagramCavas,&DiagramCavas::onSignal_selectEntity);
connect(m_pDiagramView,&DiagramView::diagramCreate,m_pDiagramCavas,&DiagramCavas::onSignal_createDiagram);
//connect(m_pDiagramView,&DiagramView::diagramCreate,m_pDiagramCavas,&DiagramCavas::onSignal_createDiagram);
connect(m_pDiagramView,&DiagramView::diagramChange,m_pDiagramCavas,&DiagramCavas::onSignal_changeDiagram);
connect(m_pDiagramView,&DiagramView::diagramDelete,m_pDiagramCavas,&DiagramCavas::onSignal_deleteDiagram);
connect(m_pDiagramView,&DiagramView::diagramSelected,m_pDiagramCavas,&DiagramCavas::onSignal_selectDiagram);
connect(m_pDiagramView,&DiagramView::createProject,this,&CMainWindow::onAction_createEditor);
connect(m_pDiagramCavas,&DiagramCavas::prepareUpdateItems,m_pMonitorItemsDlg,&MonitorItemsDlg::onUpdateItems);
connect(m_pDiagramCavas,&DiagramCavas::prepareSelectItems,m_pMonitorItemsDlg,&MonitorItemsDlg::onSelectItems);
connect(m_pDiagramCavas,&DiagramCavas::updateMonitorList,m_pMonitorPagesDlg,&MonitorPagesDlg::onMonitorCreated);
connect(m_pDiagramCavas,&DiagramCavas::createdMonitorItems,m_pMonitorItemsDlg,&MonitorItemsDlg::onMonitorCreated);
connect(m_pMonitorItemsDlg,&MonitorItemsDlg::generateMonitor,m_pDiagramCavas,&DiagramCavas::onSignal_generate);
connect(m_pMonitorPagesDlg,&MonitorPagesDlg::monitorSelected,m_pDiagramCavas,&DiagramCavas::onSignal_monitorSelected);
connect(m_pMonitorPagesDlg,&MonitorPagesDlg::prepareSaveMonitor,m_pDiagramCavas,&DiagramCavas::onSignal_saveMonitor);
connect(&ProjectManager::instance(),&ProjectManager::prepareUnloadProject,this,&CMainWindow::onAction_unloadEditor);
connect(m_pDiagramView,&DiagramView::loadProject,this,&CMainWindow::onSignal_loadProject);
@ -161,6 +190,23 @@ void CMainWindow::initializeAction()
QAction* actEdit = ui->menuProject->addAction(QString::fromWCharArray(L"编辑工程模"));
connect(actEdit,&QAction::triggered,this,&CMainWindow::onAction_editProject);
ui->menuProject->addSeparator();
_pActMonitor = ui->menuProject->addAction(QString::fromWCharArray(L"管理监控"));
_pActMonitor->setCheckable(true);
connect(_pActMonitor,&QAction::triggered,this,[&](){
if(!_pActMonitor->isChecked()){
_pActMonitor->setChecked(false);
m_pMonitorItemsDock->hide();
m_pMonitorPagesDock->hide();
}
else{
_pActMonitor->setChecked(true);
m_pMonitorItemsDock->show();
m_pMonitorPagesDock->show();
}
});
QAction* testAct = ui->menuTest->addAction(QString::fromWCharArray(L"生成测试基模"));
connect(testAct,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onCreateTestBaseModelDiagram);
}

167
source/monitorItemsDlg.cpp Normal file
View File

@ -0,0 +1,167 @@
#include "monitorItemsDlg.h"
#include "ui_monitorItemsDlg.h"
#include "dataBase.h"
#include <QToolTip>
MonitorItemsDlg::MonitorItemsDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::monitorItemsDlg)
,_modelAll(nullptr)
,_modelSelect(nullptr)
{
ui->setupUi(this);
initial();
}
MonitorItemsDlg::~MonitorItemsDlg()
{
delete ui;
}
void MonitorItemsDlg::initial()
{
_modelAll = new QStandardItemModel(this);
ui->treeView_all->setModel(_modelAll);
ui->treeView_all->setHeaderHidden(true);
_modelSelect = new QStandardItemModel(this);
ui->treeView_select->setModel(_modelSelect);
ui->treeView_select->setHeaderHidden(true);
ui->le_name->setPlaceholderText("输入名称");
connect(ui->btn_generate,&QPushButton::clicked,this,&MonitorItemsDlg::onGenerateClicked);
connect(_modelAll, &QStandardItemModel::itemChanged,this, &MonitorItemsDlg::onItemChanged);
}
void MonitorItemsDlg::onUpdateItems(QList<monitorRelationItem> lst,bool refresh)
{
if(refresh){
QStandardItem *root = _modelAll->invisibleRootItem();
int rowCount = root->rowCount();
if (rowCount > 0) {
_modelAll->removeRows(0, rowCount);
}
}
for(auto &info:lst){
auto curItem = info.item;
if(curItem.nCategory == 0){
if(curItem.nEquipType == 1 || curItem.nEquipType == 15 || curItem.nEquipType == 16){ //母线与变压器等间隔外设备并列第一层
QStandardItem *pItem = new QStandardItem(curItem.sName);
pItem->setCheckable(true); // 启用勾选框
pItem->setCheckState(Qt::Unchecked);
pItem->setData(curItem.nCategory,Qt::UserRole+1);
pItem->setData(curItem.nEquipType,Qt::UserRole+2);
pItem->setData(curItem.uid,Qt::UserRole+3);
for(auto& subInfo:info.subList){ //母线挂接间隔,变压器挂接设备
QStandardItem *pSub = new QStandardItem(subInfo.sName);
pSub->setCheckable(true); // 启用勾选框
pSub->setCheckState(Qt::Unchecked);
pSub->setData(subInfo.nCategory,Qt::UserRole+1);
pSub->setData(subInfo.nEquipType,Qt::UserRole+2);
pSub->setData(subInfo.uid,Qt::UserRole+3);
pItem->appendRow(pSub);
}
_modelAll->appendRow(pItem);
}
else{ //其他设备挂接在母线下的间隔中
if(!info.parent.sName.isEmpty()){ //有父,在间隔内
QStandardItem *pItem = new QStandardItem(curItem.sName);
pItem->setCheckable(true); // 启用勾选框
pItem->setCheckState(Qt::Unchecked);
pItem->setData(curItem.nCategory,Qt::UserRole+1);
pItem->setData(curItem.nEquipType,Qt::UserRole+2);
pItem->setData(curItem.uid,Qt::UserRole+3);
auto pParent = findStandardItemAtLevel(_modelAll,1,info.parent.sName,nullptr,0); //查找父间隔所在item
if(pParent){
pParent->appendRow(pItem);
}
}
}
}
}
ui->treeView_all->expandAll();
}
void MonitorItemsDlg::onSelectItems(QList<QPair<QString,QUuid>> lst)
{
ui->stackedWidget->setCurrentIndex(0);
/*resetSelect();
for(auto& info:lst){
for(int i = 0;i < ui->listWidget_all->count();++i){
QListWidgetItem *item = ui->listWidget_all->item(i);
QUuid uid = item->data(Qt::UserRole).toUuid();
if(uid == info.second){ //设置选中
item->setCheckState(Qt::Checked);
continue;
}
}
}*/
}
void MonitorItemsDlg::onGenerateClicked()
{
QString sName = ui->le_name->text();
if (sName.isEmpty()) {
ui->le_name->setFocus();
return;
}
/*QList<QPair<QString,QUuid>> lst;
for (int i = 0; i < ui->listWidget_all->count(); ++i) {
QListWidgetItem *item = ui->listWidget_all->item(i);
// 处理每个项
if(item->checkState() == Qt::Checked){
QString text = item->text();
QUuid uid = item->data(Qt::UserRole).toUuid();
lst.append(qMakePair(text,uid));
}
}
emit generateMonitor(sName,lst);*/
}
void MonitorItemsDlg::onMonitorCreated(QList<QPair<QString,QUuid>> lst)
{
/*ui->stackedWidget->setCurrentIndex(1);
ui->listWidget_select->clear();
for(auto& pair:lst){
QListWidgetItem *item = new QListWidgetItem(pair.first);
item->setData(Qt::UserRole,pair.second);
ui->listWidget_select->addItem(item);
}*/
}
void MonitorItemsDlg::onItemChanged(QStandardItem *item)
{
QSignalBlocker blocker(_modelAll);
if (item->isCheckable()) {
Qt::CheckState newState = item->checkState();
// 设置所有子项与父项相同的状态
setChildrenCheckState(item, newState);
}
ui->treeView_all->repaint();
}
void MonitorItemsDlg::setChildrenCheckState(QStandardItem *parent, Qt::CheckState state) {
for (int row = 0; row < parent->rowCount(); ++row) {
QStandardItem *child = parent->child(row, 0); // 第一列
if (child && child->isCheckable()) {
child->setCheckState(state);
setChildrenCheckState(child, state);
}
}
}
void MonitorItemsDlg::resetSelect()
{
/*for(int i = 0;i < ui->listWidget_all->count();++i){
QListWidgetItem *item = ui->listWidget_all->item(i);
item->setCheckState(Qt::Unchecked);
}*/
}

125
source/monitorPagesDlg.cpp Normal file
View File

@ -0,0 +1,125 @@
#include "monitorPagesDlg.h"
#include "ui_monitorPagesDlg.h"
#include <QMenu>
#include "dataBase.h"
#include "tools.h"
MonitorPagesDlg::MonitorPagesDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::monitorPagesDlg)
,_pModel(nullptr)
{
ui->setupUi(this);
initial();
}
MonitorPagesDlg::~MonitorPagesDlg()
{
delete ui;
}
void MonitorPagesDlg::initial()
{
_pModel = new QStandardItemModel(this);
ui->treeView->setModel(_pModel);
ui->treeView->setHeaderHidden(true);
connect(ui->treeView, &QTreeView::clicked, this, &MonitorPagesDlg::onItemClicked);
}
void MonitorPagesDlg::onMonitorCreated(QString sProj,QPair<QString,QUuid> pair,int nMode)
{
QStandardItem* topLevelItem = findTopLevelItem(sProj);
if (topLevelItem) {
// 如果存在,直接在该项下插入子项
QStandardItem* childItem = new QStandardItem(pair.first);
childItem->setData(pair.second);
topLevelItem->appendRow(childItem);
} else {
// 如果不存在,创建新的顶层项并插入子项
QStandardItem* newTopLevelItem = new QStandardItem(sProj);
QStandardItem* childItem = new QStandardItem(pair.first);
childItem->setData(pair.second);
newTopLevelItem->appendRow(childItem);
_pModel->appendRow(newTopLevelItem);
}
ui->treeView->expandAll();
}
void MonitorPagesDlg::onItemClicked(const QModelIndex &index)
{
QStandardItem* item = _pModel->itemFromIndex(index);
int nLevel = getLevel(item);
if(nLevel == 0) //顶层不响应
return;
QStandardItem* parent = item->parent();
if(item)
{
DiagramInfo info;
info.id = item->data(Qt::UserRole+1).toUuid();
info.sName = item->text();
emit monitorSelected(info);
}
}
void MonitorPagesDlg::onIndexRbtnClicked(const QPoint &pos)
{
// 获取当前点击的位置对应的索引
QMenu menu;
QModelIndex index = ui->treeView->indexAt(pos);
if (!index.isValid()) {
return;
}
else{ //目标组态图下添加子组态图
QStandardItem* item = _pModel->itemFromIndex(index);
if(item){
int nLevel = getLevel(item);
if(nLevel == 0){
QAction *allSaveAction = new QAction("全部保存", this);
connect(allSaveAction,&QAction::triggered,this,[&](){
QList<QPair<QString,QUuid>> lstInfo;
auto lstItem = getAllChildren(item);
for(auto& subItem:lstItem){
QString sName = subItem->text();
QUuid uid = subItem->data().toUuid();
lstInfo.append(qMakePair(sName,uid));
}
emit prepareSaveMonitor(lstInfo);
});
menu.addAction(allSaveAction);
}
else if(nLevel == 1){
QAction *saveAction = new QAction("保存", this);
connect(saveAction,&QAction::triggered,this,[&](){
QList<QPair<QString,QUuid>> lstInfo;
QString sName = item->text();
QUuid uid = item->data().toUuid();
lstInfo.append(qMakePair(sName,uid));
emit prepareSaveMonitor(lstInfo);
});
menu.addAction(saveAction);
}
}
}
// 在点击位置显示菜单
menu.exec(ui->treeView->mapToGlobal(pos));
}
QStandardItem* MonitorPagesDlg::findTopLevelItem(const QString& name)
{
for (int i = 0; i < _pModel->rowCount(); ++i) {
QStandardItem* item = _pModel->item(i);
if (item && item->text() == name) {
return item;
}
}
return nullptr;
}

84
ui/monitorItemsDlg.ui Normal file
View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>monitorItemsDlg</class>
<widget class="QDialog" name="monitorItemsDlg">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>182</width>
<height>446</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="page_allItem">
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QLineEdit" name="le_name"/>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="btn_generate">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>80</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>生成监控</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QTreeView" name="treeView_all"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_selectedItem">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeView" name="treeView_select"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

24
ui/monitorPagesDlg.ui Normal file
View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>monitorPagesDlg</class>
<widget class="QDialog" name="monitorPagesDlg">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>182</width>
<height>427</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTreeView" name="treeView"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>