diff --git a/CMakeLists.txt b/CMakeLists.txt index da3de88..7e7519e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 ) # 包含源文件目录 diff --git a/common/include/baseProperty.h b/common/include/baseProperty.h index 6af7f78..ac628a8 100644 --- a/common/include/baseProperty.h +++ b/common/include/baseProperty.h @@ -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> lst) {subList = lst;} + virtual QList>& getSubList() {return subList;} protected: QUuid uUid; QString sTag; QString sName; QJsonObject jContext; //存放port信息 + QList> subList; //可能存在的子对象(不用来拓朴计算) <类型,uid> //类型0:设备 1:间隔 }; class BayProperty:public AbstractProperty //间隔属性(待扩展) diff --git a/common/include/global.h b/common/include/global.h index 1b42ea1..5c4a2fd 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -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 _lstCon; //连接信息 + QList> _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 subList; +}; + +struct monitorPageInfo //运行时page +{ + int id = -1; + QUuid uid; + QString tag; + QString name; + QString parent; + QJsonObject context; + QString ts; +}; + struct gridInfo { int id = -1; diff --git a/common/include/tools.h b/common/include/tools.h index dbd7a90..8c56442 100644 --- a/common/include/tools.h +++ b/common/include/tools.h @@ -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 getAllChildren(QStandardItem* parentItem); QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target, int role = Qt::DisplayRole, const QModelIndex& parent = QModelIndex()); diff --git a/common/source/baseProperty.cpp b/common/source/baseProperty.cpp index 5bd4b05..6bd1d1f 100644 --- a/common/source/baseProperty.cpp +++ b/common/source/baseProperty.cpp @@ -63,7 +63,7 @@ BaseProperty::BaseProperty(QObject* parent) BaseProperty::~BaseProperty() { - qDebug()<<"release by "<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 getAllChildren(QStandardItem* parentItem) { + QList 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) { diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index d4eb3c1..ae8857c 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -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 diff --git a/diagramCavas/include/baseDrawingPanel.h b/diagramCavas/include/baseDrawingPanel.h new file mode 100644 index 0000000..0ad7532 --- /dev/null +++ b/diagramCavas/include/baseDrawingPanel.h @@ -0,0 +1,59 @@ +#ifndef BASEDRAWINGPANEL_H +#define BASEDRAWINGPANEL_H + +/****************工程模和运行时panel的基类*****************/ + +#include +#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 diff --git a/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h b/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h index 763a4ac..6c2f52b 100644 --- a/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h +++ b/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h @@ -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 diff --git a/diagramCavas/include/designerScene.h b/diagramCavas/include/designerScene.h index 4ad04a2..a19f13a 100644 --- a/diagramCavas/include/designerScene.h +++ b/diagramCavas/include/designerScene.h @@ -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; diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index 0a8051a..6391ce0 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -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(); + void initial(); +signals: + void prepareUpdateItems(QList,bool refresh); + void prepareSelectItems(QList>); + void updateMonitorList(QString,QPair,int nMode = 0); //0新增1删除 + void createdMonitorItems(QList>); //创建的监控中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,bool); //更新当前设备列表 + void onSignal_selectedItems(QList>); //当前选中设备 + void onSignal_generate(QString,QList>); //使用选中设备生成监控 (监控名,设备) + void onSignal_monitorCreated(QString,QPair); //监控已创建 + void onSignal_monitorItemCreated(QList>); //监控中创建的对象 + + void onSignal_monitorSelected(DiagramInfo); //监控选中 + void onSignal_saveMonitor(QList>); //保存选中的监控 + + QMap> getMapDraw() {return m_mapDrawPanel;} + QMap> getMapEdit() {return m_mapEditPanel;} + QMap> getMapMonitor() {return m_mapMonitorPanel;} private: void removePanel(PowerEntity*); private: - QMap> m_mapDrawPanel; - QMap> m_mapEditPanel; + QMap> m_mapDrawPanel; //工程模panel + QMap> m_mapEditPanel; //编辑时 + QMap> m_mapMonitorPanel; //监控时panel int _pageIndex; QString _curPage; }; diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h index 3c9fec8..00f3cc9 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h @@ -23,6 +23,18 @@ public: virtual void removeConnect(QUuid); virtual QList getConnect() {return _lstCon;} virtual void clearConnect() {_lstCon.clear();} + virtual bool addSubList(QPair pair){ + for (const auto& item : _lstSub) { + if (item.second == pair.second) { + return false; + } + } + _lstSub.append(pair); + return true; + } + virtual void setSubList(QList> lst) {_lstSub = lst;} + virtual QList>& 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 _lstCon; //连接信息 + QList> _lstSub; //子对象列表(非拓扑计算使用) 如母线子对象为间隔,间隔子对象为item,电动机子对象为item <类型,uid> 类型:0设备1间隔 QRectF recSize; //当前大小(根据内容确定) QPointF sceneDelta; //block中心相对位移(计算布局位置 bool bEditState; //详细编辑状态 diff --git a/diagramCavas/include/drawingPanel.h b/diagramCavas/include/drawingPanel.h index 12690b3..f216cf2 100644 --- a/diagramCavas/include/drawingPanel.h +++ b/diagramCavas/include/drawingPanel.h @@ -2,23 +2,12 @@ #define DRAWINGPANEL_H #include -#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; }; diff --git a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h index ad40fb5..7788023 100644 --- a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h +++ b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h @@ -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 generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item - QMultiMap generateOutConnection(QList,int nTypeTransCon,int nPos = 0); //生成外部连接(手动bind的连接) nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置 + QList generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta = QPointF(0,0),DiagramEditorBaseBlock* pParent = nullptr); //根据data生成item parent:生成的对象添加到parent下(非拓扑计算) + QMultiMap generateOutConnection(QList,int nTypeTransCon,int nPos = 0,DiagramEditorBaseBlock* pParent = nullptr); //生成外部连接(手动bind的连接) nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置 QRectF updateTarget(QMap&,QMap&,int nLayout,int nSource,bool saveToModel = true); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 regenerate重新生成标志 saveToModel:生成到模型或map void clearCompoDir(QMap&,QMap&,int nSource); //清空component中的dir(updateTarget前调用) @@ -68,9 +69,10 @@ public: void setWizardInfo(const QByteArray&); //二进制设置wizard private: - void bulidAndLinkComponent(QList,QMap); //生成并连接线路上的设备 lst,mapComponents(从map中获取正确数据) + void bulidAndLinkComponent(QList,QMap,DiagramEditorBaseBlock* pParent = nullptr); //生成并连接线路上的设备 lst,mapComponents(从map中获取正确数据) QByteArray serializeWizardData(const DiagramEditorProjectInfo &data); //序列化eidtor向导设置数据 DiagramEditorProjectInfo deserializeWizardData(const QByteArray &byteArray); //反序列化eidtor向导设置 + DiagramEditorBaseBlock* getBlockDataByName(QString,EditorItemType); //通过名称类型获取block的data private: QMap _tempItem; //临时预览对象 QMap _previewItem; //预览对象 @@ -81,5 +83,6 @@ private: EditBaseScene* _pCurPreviewScene; //当前预览scene EditPanel* _pPanel; //主界面 QPointer _pWizard; //向导界面数据 + int _cableCount; //导线计数 }; diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index 3c4f41b..66e475e 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -8,6 +8,7 @@ #include #include +class BaseDrawingPanel; class DrawingPanel; class GraphicsBaseItem; class GraphicsProjectModelItem; @@ -43,17 +44,17 @@ public: QVector allConnectionProperty(); QMap& 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可对应多个item(id,类型,名称,工程模名) 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 lst,QString sInerTag,QString sOutTag); //将list转换为QJsonObject, QList turnJsonArrToList(QJsonObject obj,QString sInner,QString sOut); + /*************************监控(运行时)**************************/ + void generateMonitor(QString,QList>); //生成监控 (监控名,选中的设备列表) Q_SIGNALS: void activatePage(const QString&); //激活当前model所在page + void updateCurrentItems(QList,bool); //更新当前组态元件列表 <名称,uid> + void itemSelected(QList>); //发送选中的元件 + void monitorCreated(QString,QPair); //监控创建信号 <工程page,<监控page,page_uid>> + void monitorItems(QList>); //发送创建成功的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,QUuid); //返回uid对应的data private: QMap _nodeItem; //工程模对象 @@ -123,7 +131,7 @@ private: QString _pageName; DiagramCavas* _cavas; DesignerScene* _scene; - DrawingPanel* _widget; //顶层widget + BaseDrawingPanel* _widget; //顶层widget HttpInterface* _Interface; QTimer* _timer; PowerEntity* _pEntity; //拓扑实体 diff --git a/diagramCavas/include/graphicsItem/electricConnectLineItem.h b/diagramCavas/include/graphicsItem/electricConnectLineItem.h index b53c908..3b4c637 100644 --- a/diagramCavas/include/graphicsItem/electricConnectLineItem.h +++ b/diagramCavas/include/graphicsItem/electricConnectLineItem.h @@ -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; //包裹点的矩形集合 diff --git a/diagramCavas/include/graphicsItem/electricPortItem.h b/diagramCavas/include/graphicsItem/electricPortItem.h index b3690ba..0915651 100644 --- a/diagramCavas/include/graphicsItem/electricPortItem.h +++ b/diagramCavas/include/graphicsItem/electricPortItem.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgGroup.h b/diagramCavas/include/graphicsItem/electricSvgGroup.h index 240b5b2..06d2f61 100644 --- a/diagramCavas/include/graphicsItem/electricSvgGroup.h +++ b/diagramCavas/include/graphicsItem/electricSvgGroup.h @@ -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 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 m_mapSvg; diff --git a/diagramCavas/include/graphicsItem/electricSvgGroupCT.h b/diagramCavas/include/graphicsItem/electricSvgGroupCT.h index 6c5fb5e..4ecb599 100644 --- a/diagramCavas/include/graphicsItem/electricSvgGroupCT.h +++ b/diagramCavas/include/graphicsItem/electricSvgGroupCT.h @@ -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;} diff --git a/diagramCavas/include/graphicsItem/electricSvgGroupPT.h b/diagramCavas/include/graphicsItem/electricSvgGroupPT.h index c2d45cf..cd4ac63 100644 --- a/diagramCavas/include/graphicsItem/electricSvgGroupPT.h +++ b/diagramCavas/include/graphicsItem/electricSvgGroupPT.h @@ -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; diff --git a/diagramCavas/include/graphicsItem/electricSvgItem.h b/diagramCavas/include/graphicsItem/electricSvgItem.h index cccdcc0..4ec6821 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItem.h +++ b/diagramCavas/include/graphicsItem/electricSvgItem.h @@ -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 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 m_mapSvg; + QByteArray _tempSvg; //保存直接加载的svg数据 }; #endif diff --git a/diagramCavas/include/graphicsItem/electricSvgItem2wTransformer.h b/diagramCavas/include/graphicsItem/electricSvgItem2wTransformer.h index 17fa184..1a5ad5c 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItem2wTransformer.h +++ b/diagramCavas/include/graphicsItem/electricSvgItem2wTransformer.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItem3wTransformer.h b/diagramCavas/include/graphicsItem/electricSvgItem3wTransformer.h index 7fe72cf..8598fd5 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItem3wTransformer.h +++ b/diagramCavas/include/graphicsItem/electricSvgItem3wTransformer.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemBus.h b/diagramCavas/include/graphicsItem/electricSvgItemBus.h index c6e9bb9..eda0f53 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemBus.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemBus.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemCT.h b/diagramCavas/include/graphicsItem/electricSvgItemCT.h index 894a52e..5e27f60 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemCT.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemCT.h @@ -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零相 }; diff --git a/diagramCavas/include/graphicsItem/electricSvgItemCableEnd.h b/diagramCavas/include/graphicsItem/electricSvgItemCableEnd.h index f27d9be..dba374c 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemCableEnd.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemCableEnd.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemCableTer.h b/diagramCavas/include/graphicsItem/electricSvgItemCableTer.h index 8e542f6..700fdf3 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemCableTer.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemCableTer.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemDS.h b/diagramCavas/include/graphicsItem/electricSvgItemDS.h index 23b8fbd..5bf8d16 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemDS.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemDS.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemDTEDS.h b/diagramCavas/include/graphicsItem/electricSvgItemDTEDS.h index 3e484c9..3e2b73c 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemDTEDS.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemDTEDS.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemES.h b/diagramCavas/include/graphicsItem/electricSvgItemES.h index 41897d6..53a216d 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemES.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemES.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemFES.h b/diagramCavas/include/graphicsItem/electricSvgItemFES.h index bf579d8..7cf3711 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemFES.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemFES.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemLA.h b/diagramCavas/include/graphicsItem/electricSvgItemLA.h index e8c917a..0ee0ed9 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemLA.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemLA.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemPI.h b/diagramCavas/include/graphicsItem/electricSvgItemPI.h index 3e1a518..15e0032 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemPI.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemPI.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/electricSvgItemPT.h b/diagramCavas/include/graphicsItem/electricSvgItemPT.h index 503011d..d8e80bb 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemPT.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemPT.h @@ -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三角 }; diff --git a/diagramCavas/include/graphicsItem/electricSvgItemRect.h b/diagramCavas/include/graphicsItem/electricSvgItemRect.h index 645a426..7897cee 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemRect.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemRect.h @@ -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 diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index 924db1c..ebdfd64 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -173,6 +173,7 @@ class GraphicsBaseItem :public QObject, public AbstractShapeType 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; diff --git a/diagramCavas/include/monitorPanel.h b/diagramCavas/include/monitorPanel.h new file mode 100644 index 0000000..9e5310b --- /dev/null +++ b/diagramCavas/include/monitorPanel.h @@ -0,0 +1,29 @@ +#ifndef MONITORPANEL_H +#define MONITORPANEL_H + +#include +#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 diff --git a/diagramCavas/include/topologyManager.h b/diagramCavas/include/topologyManager.h index 1ee5b48..f3f9940 100644 --- a/diagramCavas/include/topologyManager.h +++ b/diagramCavas/include/topologyManager.h @@ -75,6 +75,7 @@ private: QHash m_entities; // ID到实体映射 QHash m_diagrams; // 组态图拓扑结构 + QHash m_monitorDiagrams; //运行时组态 // 连接存储 QHash m_connections; QMultiHash m_connectionIndex; // 接线点ID到连接的映射 diff --git a/diagramCavas/source/baseDrawingPanel.cpp b/diagramCavas/source/baseDrawingPanel.cpp new file mode 100644 index 0000000..a174e18 --- /dev/null +++ b/diagramCavas/source/baseDrawingPanel.cpp @@ -0,0 +1,67 @@ +#include +#include "baseDrawingPanel.h" +#include +#include +#include +#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; +} + diff --git a/diagramCavas/source/designerScene.cpp b/diagramCavas/source/designerScene.cpp index 4b065c2..af70dcd 100644 --- a/diagramCavas/source/designerScene.cpp +++ b/diagramCavas/source/designerScene.cpp @@ -31,7 +31,7 @@ DesignerScene::DesignerScene(FixedPortsModel* graphModel, QObject *parent) { m_bGridVisible = true; m_pView = nullptr; - m_pDrawingPanel = dynamic_cast(parent); + m_pDrawingPanel = dynamic_cast(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(); } diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index b18f79d..aec3ed8 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -3,18 +3,16 @@ #include #include #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 #include @@ -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,25 +59,40 @@ void DiagramCavas::initial() } } -void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode) +void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode,QString parent) { - 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(); + if(mode == DM_baseModel || mode == DM_edit){ + DrawingPanel* pPanel = new DrawingPanel(pItem,this,mode); + _curPage = pItem->name(); + pPanel->setPageName(_curPage); + pPanel->setWindowTitle(_curPage); + QMdiSubWindow* pSub = this->addSubWindow(pPanel); + m_mapDrawPanel.insert(_curPage,qMakePair(pPanel,pSub)); + pPanel->show(); - FixedPortsModel* pModel = pPanel->getModelController(); - pModel->setCavas(this); - connect(pModel,&FixedPortsModel::activatePage,this,&DiagramCavas::onSignal_activatePage); - connect(pPanel,&DrawingPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete); - - if(mode == DM_baseModel) - { + 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(); + 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 mapItem,QList mapBay) +void DiagramCavas::onSignal_wizardFinished(QString sName,QMap mapItem,QList mapBlock) { PowerEntity* pEntity; QUuid id = QUuid::createUuid(); @@ -465,7 +507,7 @@ void DiagramCavas::onSignal_wizardFinished(QString sName,QMapgetModelController(); if(pModel){ - pModel->onWizardFinished(mapItem,mapBay); + pModel->onWizardFinished(mapItem,mapBlock); } } } @@ -505,4 +547,65 @@ void DiagramCavas::onSignl_openCurrentBay() } } } +/*********************monitor**************************/ +void DiagramCavas::onSignal_updateCurItems(QList lst,bool refresh) +{ + emit prepareUpdateItems(lst,refresh); +} +void DiagramCavas::onSignal_selectedItems(QList> lst) +{ + emit prepareSelectItems(lst); +} + +void DiagramCavas::onSignal_generate(QString sPage,QList> lst) +{ + QWidget* pWindow= currentSubWindow()->widget(); + DrawingPanel* pPanel = dynamic_cast(pWindow); + if(pPanel){ + pPanel->getModelController()->generateMonitor(sPage,lst); + } +} + +void DiagramCavas::onSignal_monitorCreated(QString sProj,QPair pair) +{ + emit updateMonitorList(sProj,pair); +} + +void DiagramCavas::onSignal_monitorItemCreated(QList> 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> 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"保存成功")); +} diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp index 97318c8..a03c0cf 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp @@ -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; diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index a4fe1e9..0809724 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -399,8 +399,8 @@ void EditPanel::showConfirmDlg() void EditPanel::generate() { auto pCavas = getCavas(); - QList pBays = getBlockItems(EditorItemType::bay); - pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBays); + QList pBlocks = getBlockItems(); + pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBlocks); } void EditPanel::showWizard() diff --git a/diagramCavas/source/drawingPanel.cpp b/diagramCavas/source/drawingPanel.cpp index becd6d3..f60cf72 100644 --- a/diagramCavas/source/drawingPanel.cpp +++ b/diagramCavas/source/drawingPanel.cpp @@ -1,101 +1,30 @@ #include #include "drawingPanel.h" -#include "ui_drawingPanel.h" #include #include -#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> 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) { diff --git a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp index c194350..8aaadee 100644 --- a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp +++ b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp @@ -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 lstCompo = generateItemByInfo(mapRoute,mapCompo,centerScene); //返回与外部连接的compo + QList 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 lstCompo = generateItemByInfo(neutral.mapRoute,transInfo.mapComponent,centerScene+pDelta); + QList 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 mapId = generateOutConnection(iter.value(),2); + //QMultiMap mapId = generateOutConnection(iter.value(),2); QList lstFrom; //处理进出链接 QList lstTo; @@ -571,6 +574,7 @@ void DiagramEditorModel::generatePreview() DiagramEditorBayBlock* pBay = dynamic_cast(p.data()); if(pBay){ if(pBay->getName() == iter.key()){ //相同间隔 + QMultiMap mapId = generateOutConnection(iter.value(),2,0,pBay); //type为2时pos不启用 switch (pBay->getBayType()) { case BayType::busSectionBay:{ QList 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(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 DiagramEditorModel::generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta) +QList DiagramEditorModel::generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta,DiagramEditorBaseBlock* pParent) { QList lstBind; //连接外部对象的component QString sMain; @@ -1044,15 +1059,19 @@ QList DiagramEditorModel::generateItemByInfo(QMapgetName()); 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 DiagramEditorModel::generateItemByInfo(QMapgetName()); if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"无")){ //非空且不是无 if(!lstBind.contains(info)) lstBind.append(info); @@ -1076,7 +1095,7 @@ QList DiagramEditorModel::generateItemByInfo(QMapgetName()); if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"无")){ //非空且不是无 if(!lstBind.contains(info)) lstBind.append(info); @@ -1084,18 +1103,18 @@ QList DiagramEditorModel::generateItemByInfo(QMap 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 DiagramEditorModel::generateOutConnection(QList lstBind,int nTypeTransCon,int nPos) +QMultiMap DiagramEditorModel::generateOutConnection(QList lstBind,int nTypeTransCon,int nPos,DiagramEditorBaseBlock* pParent) { QMultiMap bindId; //返回关联的对象id<类型,id> for(auto& compo:lstBind){ //遍历关联外部的item,进行连线 @@ -1107,12 +1126,20 @@ QMultiMap DiagramEditorModel::generateOutConnection(QListuuid(); 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 DiagramEditorModel::generateOutConnection(QListgetName()); if(pLine) establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel); } bindId.insert(nType,uId); + if(pParent){ + pParent->addSubList(qMakePair(0,lineId)); + } } } } @@ -1139,10 +1170,13 @@ QMultiMap DiagramEditorModel::generateOutConnection(QListitemId().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 DiagramEditorModel::generateOutConnection(QList DiagramEditorModel::generateOutConnection(QListaddSubList(qMakePair(0,lineId)); + } } } } @@ -2253,7 +2291,7 @@ QRectF DiagramEditorModel::updateTarget(QMap& da return recBounding; } -void DiagramEditorModel::bulidAndLinkComponent(QList lst,QMap components) +void DiagramEditorModel::bulidAndLinkComponent(QList lst,QMap components,DiagramEditorBaseBlock* pParent) { for(int i = 0;i < lst.size()-1;++i){ auto item1 = lst[i]; @@ -2263,12 +2301,15 @@ void DiagramEditorModel::bulidAndLinkComponent(QList 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 } } 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; +} diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index 003f59d..baecc9b 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -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 #include #include +#include #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 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,QListgetPanel(sPageName); } - for(auto& pBaseItem:lstItem) //第二次循环处理所有连线对象 + for(auto& pBaseItem:lstItem) //先处理连线,递归处理连线连接的item { BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); if(pBase->type() == 8){ //电缆 @@ -1513,14 +1530,113 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList lstProData; + QList> lstItems; QMap mapItem = pProPanel->getModelController()->allItems(); //根据item获取data for(auto& item:mapItem){ BaseProperty* pPro = dynamic_cast(item->getProperty()); if(pPro){ lstProData.append(pPro); + lstItems.append(qMakePair(pPro->name(),pPro->uuid())); } } + QList lstBase; + for(auto &pItem:lstItem){ + GraphicsBaseItem* p = pItem; + lstBase.append(p); + } + + QList lstFirst; + for(auto& pBaseItem:lstItem) //首次循环添加母线及独立设备(变压器等),更新列表显示使用 + { + BaseModelProperty* pBase = dynamic_cast(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(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 lstSecond; + for(auto& pBaseItem:lstItem) //二次循环添加间隔内设备(更新列表显示使用) + { + BaseModelProperty* pBase = dynamic_cast(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(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(pOtherItem->getProperty()); @@ -1528,13 +1644,14 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QListgetModelController()->generateBayData(pBay,lstProData); if(pData) { + pData->setSubList(pBay->getSubList()); pProPanel->getModelController()->addBayByData(pData); } } } } -void FixedPortsModel::onWizardFinished(QMap mapItem,QList mapBay) +void FixedPortsModel::onWizardFinished(QMap mapItem,QList mapBlock) { QMap mapEditor = BasePropertyManager::instance().getEditorData(); for(auto& pro:mapEditor){ @@ -1550,6 +1667,32 @@ void FixedPortsModel::onWizardFinished(QMap 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(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(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,85 +1728,88 @@ void FixedPortsModel::onWizardFinished(QMap mapIte //_widget->getView()->centerOn(center); //**************间隔************* - for(auto item:mapBay){ + for(auto item:mapBlock){ auto p = item->getBlockData(); //获取blockitem对应的data - DiagramEditorBayBlock* pBay = dynamic_cast(p.data()); - if(pBay){ - QString sBay = pBay->getName(); - auto bayInfo = pBay->getBayInfo(); - auto mapRoute = bayInfo.mapRoute; - auto mapCompo = bayInfo.mapComponent; + if(p->getType() == 2){ + DiagramEditorBayBlock* pBay = dynamic_cast(p.data()); + if(pBay){ + QString sBay = pBay->getName(); + auto bayInfo = pBay->getBayInfo(); + auto mapRoute = bayInfo.mapRoute; + auto mapCompo = bayInfo.mapComponent; - QList lstInfo; - for(auto& route:mapRoute){ //获取路线中使用的设备 - for(auto& compo:route.lstCompo){ - auto info = mapCompo.value(compo.sName); + QList lstInfo; + for(auto& route:mapRoute){ //获取路线中使用的设备 + for(auto& compo:route.lstCompo){ + auto info = mapCompo.value(compo.sName); - bool exist = false; - for(auto& inf:lstInfo){ - if(inf == info){ - exist = true; - break; + bool exist = false; + for(auto& inf:lstInfo){ + if(inf == info){ + exist = true; + break; + } + } + if(!exist){ + lstInfo.append(info); } } - if(!exist){ - lstInfo.append(info); - } } - } - QList lst; - for(auto &inf:lstInfo){ - if(_baseItem.contains(inf.uid)) - lst.append(_baseItem.value(inf.uid)); - } - QRectF rec = calculateItemsBoundingRect(lst); - ElectricBayItem* pNew = new ElectricBayItem(rec); - pNew->setItemType(GIT_bay); - pNew->setText(sBay); - QString sType; - switch (pBay->getBayType()) { - case BayType::busSectionBay: - sType = QString("分段间隔"); - break; - case BayType::busCouplerBay: - sType = QString("母联间隔"); - break; - case BayType::ptBay: - sType = QString("PT间隔"); - break; - case BayType::incomingBay: - sType = QString("进线间隔"); - break; - case BayType::outcomingBay: - sType = QString("出线间隔"); - break; - case BayType::compensationBay: - sType = QString("无功补偿间隔"); - break; - case BayType::bypassBay: - sType = QString("旁路间隔"); - break; - default: - break; - } + QList lst; + for(auto &inf:lstInfo){ + if(_baseItem.contains(inf.uid)) + lst.append(_baseItem.value(inf.uid)); + } + QRectF rec = calculateItemsBoundingRect(lst); + ElectricBayItem* pNew = new ElectricBayItem(rec); + pNew->setItemType(GIT_bay); + pNew->setText(sBay); + QString sType; + switch (pBay->getBayType()) { + case BayType::busSectionBay: + sType = QString("分段间隔"); + break; + case BayType::busCouplerBay: + sType = QString("母联间隔"); + break; + case BayType::ptBay: + sType = QString("PT间隔"); + break; + case BayType::incomingBay: + sType = QString("进线间隔"); + break; + case BayType::outcomingBay: + sType = QString("出线间隔"); + break; + case BayType::compensationBay: + sType = QString("无功补偿间隔"); + break; + case BayType::bypassBay: + sType = QString("旁路间隔"); + break; + default: + break; + } - QUuid bayId = pBay->getId(); - BayProperty* pBayData = addBayData(bayId,ModelFunctionType::BaseModel); - pNew->setProperty(pBayData); - pBayData->setName(sBay); - pBayData->setTag(sBay); - pBayData->setType(sType); - pBayData->setLstFrom(pBay->getBayInfo().lstFrom); - pBayData->setLstTo(pBay->getBayInfo().lstTo); + QUuid bayId = pBay->getId(); + BayProperty* pBayData = addBayData(bayId,ModelFunctionType::BaseModel); + pNew->setProperty(pBayData); + pBayData->setName(sBay); + pBayData->setTag(sBay); + 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); + for(auto &info:lstInfo){ + pBayData->getLstComponent().append(info.uid); + } + + addBayItem(bayId,pNew,ModelFunctionType::BaseModel); + //pModel->addItemsToBay(lst,pNew); + _scene->addItem(pNew); } - - addBayItem(bayId,pNew,ModelFunctionType::BaseModel); - //pModel->addItemsToBay(lst,pNew); - _scene->addItem(pNew); } } } @@ -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 FixedPortsModel::turnJsonArrToList(QJsonObject object,QString sInne return lst; } +void FixedPortsModel::generateMonitor(QString sPage,QList> 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> lstCreated; + for(auto& pair:lst) + { + if(_nodeItem.contains(pair.second)){ + auto pItem = _nodeItem.value(pair.second); + BaseProperty* pPro = dynamic_cast(pItem->getProperty()); + if(pPro){ + auto pNewItem = pItem->clone(); + if(pPro->type() == 8){ + auto pLine = dynamic_cast(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); + } +} diff --git a/diagramCavas/source/graphicsItem/electricConnectLineItem.cpp b/diagramCavas/source/graphicsItem/electricConnectLineItem.cpp index 5d5a1df..0abf631 100644 --- a/diagramCavas/source/graphicsItem/electricConnectLineItem.cpp +++ b/diagramCavas/source/graphicsItem/electricConnectLineItem.cpp @@ -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) { diff --git a/diagramCavas/source/graphicsItem/electricPortItem.cpp b/diagramCavas/source/graphicsItem/electricPortItem.cpp index 7e32bf2..4fd6d75 100644 --- a/diagramCavas/source/graphicsItem/electricPortItem.cpp +++ b/diagramCavas/source/graphicsItem/electricPortItem.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgGroup.cpp b/diagramCavas/source/graphicsItem/electricSvgGroup.cpp index 61fb2a9..c580812 100644 --- a/diagramCavas/source/graphicsItem/electricSvgGroup.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgGroup.cpp @@ -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; diff --git a/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp b/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp index 0daf843..de2fec9 100644 --- a/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp @@ -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>()){ diff --git a/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp b/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp index aed3ec2..19dea4f 100644 --- a/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp @@ -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>()){ diff --git a/diagramCavas/source/graphicsItem/electricSvgItem.cpp b/diagramCavas/source/graphicsItem/electricSvgItem.cpp index 81e3986..9a1bfe4 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItem.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItem.cpp @@ -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 map) diff --git a/diagramCavas/source/graphicsItem/electricSvgItem2wTransformer.cpp b/diagramCavas/source/graphicsItem/electricSvgItem2wTransformer.cpp index 5f945b0..1e0612a 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItem2wTransformer.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItem2wTransformer.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItem3wTransformer.cpp b/diagramCavas/source/graphicsItem/electricSvgItem3wTransformer.cpp index bfdc13e..677130b 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItem3wTransformer.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItem3wTransformer.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp index a4dba6d..5d8a664 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemCT.cpp b/diagramCavas/source/graphicsItem/electricSvgItemCT.cpp index fedaf76..f4e84d6 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemCT.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemCT.cpp @@ -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()) diff --git a/diagramCavas/source/graphicsItem/electricSvgItemCableEnd.cpp b/diagramCavas/source/graphicsItem/electricSvgItemCableEnd.cpp index 44f5b5e..674c86a 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemCableEnd.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemCableEnd.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemCableTer.cpp b/diagramCavas/source/graphicsItem/electricSvgItemCableTer.cpp index 3616be9..de4c7ed 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemCableTer.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemCableTer.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemDS.cpp b/diagramCavas/source/graphicsItem/electricSvgItemDS.cpp index 981422f..82e6d32 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemDS.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemDS.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemDTEDS.cpp b/diagramCavas/source/graphicsItem/electricSvgItemDTEDS.cpp index 109fd49..7e40a58 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemDTEDS.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemDTEDS.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemES.cpp b/diagramCavas/source/graphicsItem/electricSvgItemES.cpp index 30babf5..33e566a 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemES.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemES.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemFES.cpp b/diagramCavas/source/graphicsItem/electricSvgItemFES.cpp index 8223451..dd31891 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemFES.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemFES.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemLA.cpp b/diagramCavas/source/graphicsItem/electricSvgItemLA.cpp index 041b937..18edbd6 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemLA.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemLA.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemPI.cpp b/diagramCavas/source/graphicsItem/electricSvgItemPI.cpp index 6fe8c1f..4adac75 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemPI.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemPI.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemPT.cpp b/diagramCavas/source/graphicsItem/electricSvgItemPT.cpp index 43ee07e..0f82cfe 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemPT.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemPT.cpp @@ -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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp b/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp index 3ee2156..26072d2 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp @@ -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) - { - 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); - }*/ +ElectricSvgItemRect::ElectricSvgItemRect(const ElectricSvgItemRect& obj) + : ElectricSvgItem(obj) +{ + 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); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp b/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp index 26850dc..21715ac 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp @@ -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() diff --git a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp index 59976ae..5465812 100644 --- a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp +++ b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp @@ -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) { diff --git a/diagramCavas/source/monitorPanel.cpp b/diagramCavas/source/monitorPanel.cpp new file mode 100644 index 0000000..c39f994 --- /dev/null +++ b/diagramCavas/source/monitorPanel.cpp @@ -0,0 +1,87 @@ +#include +#include "monitorPanel.h" +#include +#include +#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 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 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 mapBay = _pModel->allBayItem(); + for(auto& bayItem:mapBay){ + AbstractProperty* pPro = bayItem->getProperty(); + BayProperty* pBay = dynamic_cast(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) +{ + +} diff --git a/diagramCavas/source/topologyManager.cpp b/diagramCavas/source/topologyManager.cpp index 6927308..3da35ed 100644 --- a/diagramCavas/source/topologyManager.cpp +++ b/diagramCavas/source/topologyManager.cpp @@ -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; } diff --git a/diagramCavas/source/util/baseSelector.cpp b/diagramCavas/source/util/baseSelector.cpp index 8cf0df0..6816e48 100644 --- a/diagramCavas/source/util/baseSelector.cpp +++ b/diagramCavas/source/util/baseSelector.cpp @@ -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 items = scene->selectedItems(); + if (items.count() == 1) //只有一个选中 + { + GraphicsProjectModelItem* item = qgraphicsitem_cast(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(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> lst; //发送已选中的元件 + QList items = scene->selectedItems(); + for(auto& pItem:items){ + GraphicsProjectModelItem* item = qgraphicsitem_cast(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 items = scene->selectedItems(); + + if(items.count() == 1) + { + GraphicsProjectModelItem* item = qgraphicsitem_cast(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) diff --git a/diagramCavas/source/util/movingSelector.cpp b/diagramCavas/source/util/movingSelector.cpp index 853e5ba..e9bfcb2 100644 --- a/diagramCavas/source/util/movingSelector.cpp +++ b/diagramCavas/source/util/movingSelector.cpp @@ -3,6 +3,7 @@ #include #include #include +#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> lst; //发送已选中的元件 QList items = scene->selectedItems(); for(int n = 0; n < items.size(); n++) { AbstractShape* item = qgraphicsitem_cast(items.at(n)); if(item) item->removeOperationCopy(); + + GraphicsProjectModelItem* p = qgraphicsitem_cast(items.at(n)); + if(p){ + auto pPro = p->getProperty(); + if(pPro){ + lst.append(qMakePair(pPro->name(),pPro->uuid())); + } + } } + emit _model->itemSelected(lst); updateConnectLineByTopology(items); diff --git a/diagramUtils/include/dataBase.h b/diagramUtils/include/dataBase.h index 0295c07..a16cc8b 100644 --- a/diagramUtils/include/dataBase.h +++ b/diagramUtils/include/dataBase.h @@ -133,6 +133,13 @@ public: QList 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 getAllMonitor(); + public: /***********************************editor编辑器**********************************************/ bool insertEditorProject(QUuid,QString,QString); diff --git a/diagramUtils/source/dataBase.cpp b/diagramUtils/source/dataBase.cpp index c14bdc0..68d0371 100644 --- a/diagramUtils/source/dataBase.cpp +++ b/diagramUtils/source/dataBase.cpp @@ -2635,6 +2635,126 @@ QList 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 DataBase::getAllMonitor() +{ + QList 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 + " ("; diff --git a/include/mainwindow.h b/include/mainwindow.h index 80606a2..b53e9e7 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -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 diff --git a/include/monitorItemsDlg.h b/include/monitorItemsDlg.h new file mode 100644 index 0000000..548e045 --- /dev/null +++ b/include/monitorItemsDlg.h @@ -0,0 +1,37 @@ +#ifndef MONITORITEMSDLG_H +#define MONITORITEMSDLG_H + +#include +#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>); //生成监控 +public slots: + void onUpdateItems(QList,bool refresh); //更新当前设备列表 + void onSelectItems(QList>); //更新当前选中的设备 + void onGenerateClicked(); + void onMonitorCreated(QList>); //创建后的设备列表 + 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 diff --git a/include/monitorPagesDlg.h b/include/monitorPagesDlg.h new file mode 100644 index 0000000..a33d881 --- /dev/null +++ b/include/monitorPagesDlg.h @@ -0,0 +1,35 @@ +#ifndef MONITORPAGESDLG_H +#define MONITORPAGESDLG_H + +#include +#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>); +public slots: + void onMonitorCreated(QString,QPair,int); + void onItemClicked(const QModelIndex &index); + + void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单 +private: + QStandardItem* findTopLevelItem(const QString& name); //查找顶层项 +private: + Ui::monitorPagesDlg *ui; + QStandardItemModel* _pModel; +}; + +#endif diff --git a/source/diagramView.cpp b/source/diagramView.cpp index 156ed1c..a19a183 100644 --- a/source/diagramView.cpp +++ b/source/diagramView.cpp @@ -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); diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index fb20e7d..a9192ff 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -1,6 +1,4 @@ #include "mainwindow.h" - -#include "graphicsItem/graphicsItemGroup.h" #include "ui_mainwindow.h" #include @@ -14,9 +12,9 @@ #include #include #include +#include #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 +#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); } diff --git a/source/monitorItemsDlg.cpp b/source/monitorItemsDlg.cpp new file mode 100644 index 0000000..1c67f18 --- /dev/null +++ b/source/monitorItemsDlg.cpp @@ -0,0 +1,167 @@ +#include "monitorItemsDlg.h" +#include "ui_monitorItemsDlg.h" +#include "dataBase.h" +#include + + +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 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> 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> 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> 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); + }*/ +} diff --git a/source/monitorPagesDlg.cpp b/source/monitorPagesDlg.cpp new file mode 100644 index 0000000..b7de6e0 --- /dev/null +++ b/source/monitorPagesDlg.cpp @@ -0,0 +1,125 @@ +#include "monitorPagesDlg.h" +#include "ui_monitorPagesDlg.h" +#include +#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 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> 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> 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; +} diff --git a/ui/monitorItemsDlg.ui b/ui/monitorItemsDlg.ui new file mode 100644 index 0000000..ae97171 --- /dev/null +++ b/ui/monitorItemsDlg.ui @@ -0,0 +1,84 @@ + + + monitorItemsDlg + + + + 0 + 0 + 182 + 446 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 12 + + + + 0 + + + + + + + + + + + 80 + 0 + + + + + 80 + 16777215 + + + + 生成监控 + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/monitorPagesDlg.ui b/ui/monitorPagesDlg.ui new file mode 100644 index 0000000..a20caef --- /dev/null +++ b/ui/monitorPagesDlg.ui @@ -0,0 +1,24 @@ + + + monitorPagesDlg + + + + 0 + 0 + 182 + 427 + + + + Dialog + + + + + + + + + +