diff --git a/common/include/global.h b/common/include/global.h index 8f516d1..66cc8d3 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -461,12 +461,21 @@ struct DiagramEditorComponentInfo //组态设备信息 QString sName; int nType = 0; //类型 1母线2异步电动机3断路器4电缆5电流互感器6电压互感器7隔离开关8接地开关9快速接地开关10双掷接地隔离开关11带电指示器12避雷器13电缆出线套筒14电缆端 QString sBindObj; //所关联的实体名 (母线block,间隔block) + int nBindType = 0; //关联实体的类型 1母线2间隔3变压器 QStringList sUsedRoute; //使用设备的线路名 int nUsedDirection = 0; //被占用的方向 8421 上下左右 QPoint deltaPos = QPoint(0,0); //相对坐标(相对间隔) QUuid uid; int nFlag = 0; //标志0未使用1新建2修改 int nRotate = 0; //旋转角 + + bool operator ==(const DiagramEditorComponentInfo& obj) const { + if(nCategory == obj.nCategory && sName == obj.sName && nType == obj.nType && sBindObj == obj.sBindObj && nBindType == obj.nBindType && + sUsedRoute == obj.sUsedRoute && nUsedDirection == obj.nUsedDirection && deltaPos == obj.deltaPos && uid == obj.uid && nFlag == obj.nFlag && nRotate == obj.nRotate) + return true; + else + return false; + } }; struct DiagramEditorRouteInfo //间隔中单条线路信息 @@ -478,6 +487,14 @@ struct DiagramEditorRouteInfo //间隔中单条线路信息 QList lstReverse; //逆序容器(计算用) }; +struct DiagramEditorBayInfo //组态编辑间隔信息 +{ + QString name; + int nLayout; //布局 0纵向1横向 + QMap mapRoute; //线路信息 + QMap mapComponent; //设备信息 +}; + enum class DiagramEditorStructType { block = 0, //模块(母线段、间隔、变压器) @@ -508,12 +525,12 @@ struct DiagramEditorBriefConnect //组态编辑时连接信息 return false; } - QString getOppositeName(const QString& s){ //获取另一端名称 + DiagramEditorConnectType getOpposite(const QString& s){ //获取另一端名称 if(con1.sName == s) - return con2.sName; + return con2; else if(con2.sName == s) - return con1.sName; - return QString(); + return con1; + return DiagramEditorConnectType(); } }; diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h index 5c6c405..77dc9bb 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h @@ -65,14 +65,11 @@ public: virtual ~DiagramEditorBayBlock(); virtual void setBayType(BayType typ) {nBayType = typ;} virtual BayType getBayType() {return nBayType;} - virtual void setRouteInfoMap(QMap info) {mapRouteInfo = info;} - virtual QMap& getRouteInfoMap() {return mapRouteInfo;} - virtual void setComponentMap(QMap info) {mapComponents = info;} - virtual QMap& getComponentMap() {return mapComponents;} + virtual void setBayInfo(DiagramEditorBayInfo info) {bayInfo = info;} + virtual DiagramEditorBayInfo& getBayInfo(){return bayInfo;} protected: BayType nBayType; - QMap mapRouteInfo; //间隔中的线路信息 - QMap mapComponents; //间隔中的所有设备信息 + DiagramEditorBayInfo bayInfo; //间隔信息 }; /***************************transformer单元****************************/ diff --git a/diagramCavas/include/diagramEditor/diagramEditorBayDetailAddDlg.h b/diagramCavas/include/diagramEditor/diagramEditorBayDetailAddDlg.h index 3077fd3..6fbc94c 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBayDetailAddDlg.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBayDetailAddDlg.h @@ -21,6 +21,8 @@ public: void showDlg(); void showDlg(DiagramEditorRouteInfo info); //编辑 void setParent(DiagramEditorBayDetailSettingDlg* p) {_pParent = p;} +private: + void updateBindLst(); //刷新关联列表 public slots: void onAddClicked(); void onDeleteClicked(); @@ -38,6 +40,7 @@ private: QStandardItemModel* _selectedModel; DiagramEditorBayDetailSettingDlg* _pParent; int _curMode; //0新建1修改 + QStandardItemModel* _bindItemModel; //绑定的对象模型 }; #endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorBayDetailSettingDlg.h b/diagramCavas/include/diagramEditor/diagramEditorBayDetailSettingDlg.h index 4f5bd31..294a7f4 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBayDetailSettingDlg.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBayDetailSettingDlg.h @@ -24,13 +24,15 @@ public: void initial(); void refreshModel(); //刷新view显示的model void showDlg(DiagramEditorBayBlock*); - void setParent(DiagramEditorWizard* p) {_pWizard = p;} + void setWizard(DiagramEditorWizard* p) {_pWizard = p;} QStandardItemModel* getComponentModel() {return _compoModel;} QStandardItemModel* getRouteModel() {return _routeModel;} - void setRouteMap(QMap map) {_mapRouteInfo = map;} - QMap& getRouteMap(){return _mapRouteInfo;} + void setBayInfo(DiagramEditorBayInfo info){_curBayInfo = info;} + DiagramEditorBayInfo& getBayInfo(){return _curBayInfo;} void setModelDelegate(DiagramEditorModel* p){_pModel = p;} DiagramEditorModel* getModel() {return _pModel;} + DiagramEditorBayBlock* getCurBlock(){return _curOperateObj;} + DiagramEditorWizard* getWizard() {return _pWizard;} public slots: void onAddClicked(); void onOkClicked(); @@ -48,7 +50,7 @@ private: DiagramEditorBayBlock* _curOperateObj; //当前加载的block对象 QStandardItemModel* _compoModel; //设备库model name中的data:1为占用方向,2为相对坐标,3为uuid,4为item标志位(1新建2修改),5旋转角度 QStandardItemModel* _routeModel; //所有线路model - QMap _mapRouteInfo; //所有线路信息 + DiagramEditorBayInfo _curBayInfo; //当前使用的间隔信息 DiagramEditorModel* _pModel; }; diff --git a/diagramCavas/include/diagramEditor/diagramEditorBayPreviewDlg.h b/diagramCavas/include/diagramEditor/diagramEditorBayPreviewDlg.h index 5eae336..b91cfa8 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBayPreviewDlg.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBayPreviewDlg.h @@ -18,7 +18,7 @@ public: ~DiagramEditorBayPreviewDlg(); void initial(); - void showDlg(); + void showDlg(int nLayout); //0纵向1横向 void setParent(DiagramEditorBayDetailSettingDlg* p) {_pParent = p;} //void updateModelData(); //根据设置更新data中布局、方向 private: diff --git a/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h b/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h index 258b0a8..e75f4f7 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h +++ b/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h @@ -1,13 +1,13 @@ #ifndef DIAGRAMEDITORPREVIEWDLG_H #define DIAGRAMEDITORPREVIEWDLG_H -//间隔预览窗口 +//组态图预览 #include #include #include #include "global.h" class EditView; -class EditPreviewScene; +class EditScene; class EditPanel; class DiagramEditorPreviewDlg : public QDialog @@ -22,7 +22,7 @@ public: void setParent(EditPanel* p) {_pParent = p;} private: EditView* _pView; - EditPreviewScene* _pScene; + EditScene* _pScene; QVBoxLayout* _pMainLayout; EditPanel* _pParent; }; diff --git a/diagramCavas/include/diagramEditor/editPanel.h b/diagramCavas/include/diagramEditor/editPanel.h index 6606ec2..b68d2c8 100644 --- a/diagramCavas/include/diagramEditor/editPanel.h +++ b/diagramCavas/include/diagramEditor/editPanel.h @@ -20,6 +20,7 @@ class EditBaseItem; class DiagramEditorBayDetailSettingDlg; class DiagramEditorTransDetailSettingDlg; class DiagramEditorModel; +class DiagramEditorPreviewDlg; class EditPanel : public QWidget { @@ -31,6 +32,7 @@ public: void initByWizardInfo(); void initBlockConnection(); //初始化block之间的连接信息 void setOperateWizard(QPointer p) {_curWizard = p;} + void showPreview(); //展示预览 DiagramEditorModel* getModel() {return _pModel;} EditScene* getScene() {return m_pEditScene;} @@ -59,6 +61,7 @@ private: QMap> _mapStruct; QPointer _curWizard; DiagramEditorModel* _pModel; + DiagramEditorPreviewDlg* _pPreview; }; #endif diff --git a/diagramCavas/include/diagramEditor/editScene.h b/diagramCavas/include/diagramEditor/editScene.h index 91c252e..b98fd04 100644 --- a/diagramCavas/include/diagramEditor/editScene.h +++ b/diagramCavas/include/diagramEditor/editScene.h @@ -2,6 +2,9 @@ #define EDITSCENE_H #include +#include + +class DiagramEditorModel; class EditBaseScene : public QGraphicsScene { @@ -9,6 +12,9 @@ class EditBaseScene : public QGraphicsScene public: EditBaseScene(QObject *parent = 0); virtual ~EditBaseScene(); + virtual void setModel(QPointer p){_pModel = p;} +protected: + QPointer _pModel; }; class EditScene : public EditBaseScene //editor主界面scene @@ -17,6 +23,8 @@ class EditScene : public EditBaseScene //editor主界面scene public: EditScene(QObject *parent = 0); virtual ~EditScene(); +protected: + virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); }; class EditPreviewScene : public EditBaseScene //bay预览scene diff --git a/diagramCavas/include/graphicsDataModel/baseModel.h b/diagramCavas/include/graphicsDataModel/baseModel.h index 6032c3c..2be3505 100644 --- a/diagramCavas/include/graphicsDataModel/baseModel.h +++ b/diagramCavas/include/graphicsDataModel/baseModel.h @@ -12,6 +12,7 @@ #include "global.h" class GraphicsBaseItem; +class ItemPort; class BaseModel : public QObject { @@ -27,6 +28,7 @@ public: QPointF diff = center1 - center2; return qSqrt(diff.x() * diff.x() + diff.y() * diff.y()); } + ItemPort* getClosestUnusedPort(QMap,GraphicsBaseItem* item,ModelFunctionType); //返回距离item最近未使用端点 }; diff --git a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h index e0d6e15..257b721 100644 --- a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h +++ b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h @@ -1,14 +1,16 @@ #pragma once /**组态编辑时的数据模型*/ #include "graphicsDataModel/baseModel.h" +#include class GraphicsBaseModelItem; class DiagramEditorItemProperty; class GraphicsBaseItem; -class EditPreviewScene; +class EditBaseScene; class ElectricBaseModelLineItem; class DiagramEditorTransformerBlock; class EditPanel; +class DiagramEditorWizard; class DiagramEditorModel : public BaseModel { @@ -17,17 +19,19 @@ public: DiagramEditorModel(); ~DiagramEditorModel(); - bool addTempPreviewItem(QUuid uuid,GraphicsBaseModelItem*); - DiagramEditorItemProperty* addTempPreviewData(QUuid id,int type,QString name,QString metaName,QString sBlock = QString()); //添加图元基模数据 + bool addPreviewItem(QUuid uuid,GraphicsBaseModelItem*,int mode); //mode 0局部1整体 + DiagramEditorItemProperty* addPreviewData(QUuid id,int type,QString name,QString metaName,QString sBlock,int mode = 0); //添加图元基模数据 mode:0局部1整体 void createTopoTerminalsByItem(GraphicsBaseItem*,ModelFunctionType funType = ModelFunctionType::ProjectModel); //通过图形对象创建port接线点(新建) void generateTempBay(); //通过设置生成间隔预览对象 void generateTempTrans(int nType,DiagramEditorTransformerBlock* block = nullptr); //0高压侧1中压侧2低压侧3整个变压器 void connectTransToNeutral(DiagramEditorTransformerBlock* block); //连接变压器与中性点设备 void linkTransItem(GraphicsBaseModelItem*,QStandardItemModel*); //连接中性点与设备点 - void generateTempComponent(QUuid uid,QString sName,int nCategory,int nType,QPoint pos,int nRotate = 0); //生成设备 uid,分类(设备、逻辑点),类型,旋转 - ElectricBaseModelLineItem* generateTempLine(QUuid uid,QString sName); //生成连线 + 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整体 void clearCurPreview(); void setPanel(EditPanel* p) {_pPanel = p;} + void setWizard(QPointer p){_pWizard = p;} + void generatePreview(); //生成预览 void setCurBayRouteModel(QStandardItemModel* p) {_pCurBayRoute = p;} QStandardItemModel* getCurBayRouteModel() {return _pCurBayRoute;} @@ -38,19 +42,24 @@ public: QMap getCurTransRouteModels() {return _pCurTransLRoutes;} void setCurTransComponentModel(QStandardItemModel* p) {_pCurTransComponent = p;} QStandardItemModel* setCurTransComponentModel() {return _pCurTransComponent;} - void setCurPreviewScene(EditPreviewScene* p) {_pCurPreviewScene = p;} + void setCurPreviewScene(EditBaseScene* p) {_pCurPreviewScene = p;} 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变压器 - void generateItemByInfo(QMap mapRoute,QMap mapCompo,QPoint delta = QPoint(0,0)); //根据data生成item + void generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item void updateTarget(QMap&,int nLayout,int nSource); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 +private: + void bulidAndLinkComponent(QList); //生成并连接线路上的设备 + //DiagramEditorComponentInfo getCompoDataFromName(const QString&,QMap); //根据名称获取数据 private: QMap _tempItem; //临时预览对象 + QMap _previewItem; //预览对象 QStandardItemModel* _pCurBayRoute; //当前使用的间隔路线 QStandardItemModel* _pCurBayComponent; //当前使用的间隔设备库 QMap _pCurTransLRoutes; //变压器中性点路线 QStandardItemModel* _pCurTransComponent; //当前使用的变压器设备库 - EditPreviewScene* _pCurPreviewScene; //当前预览scene + EditBaseScene* _pCurPreviewScene; //当前预览scene EditPanel* _pPanel; //主界面 + QPointer _pWizard; //向导界面数据 }; diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index c2bae99..b28c029 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -89,6 +89,7 @@ public: virtual void updateCoordinate() {} + virtual void setBoundingRect(QRectF rec){m_boundingRect = rec;} virtual QRectF boundingRect() const { return m_boundingRect; } virtual QPainterPath shape() { diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index 8ade56c..8f6acc8 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -13,6 +13,7 @@ //#include "componentIconManager.h" #include "baseProperty.h" #include "diagramEditor/editPanel.h" +#include "graphicsDataModel/diagramEditorModel.h" DiagramCavas::DiagramCavas(QWidget *parent) : QMdiArea(parent) @@ -378,6 +379,9 @@ void DiagramCavas::onSignal_addEditWizard(QString name) connect(_pEditorWizard,&DiagramEditorWizard::wizardFinish,this,[&,name](){ EditPanel* pPanel = onSignal_addEditPanel(name); pPanel->setOperateWizard(_pEditorWizard); + auto pModel = pPanel->getModel(); + if(pModel) + pModel->setWizard(_pEditorWizard); pPanel->initByWizardInfo(); }); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp index 09e74f1..f285feb 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp @@ -1,14 +1,19 @@ #include #include +#include #include "diagramEditor/diagramEditorBayDetailAddDlg.h" #include "diagramEditor/diagramEditorBayDetailSettingDlg.h" #include "ui_diagramEditorBayDetailAddDlg.h" +#include "diagramEditor/diagramEditorBaseBlock.h" +#include "diagramEditor/diagramEditorWizard.h" +#include "diagramEditor/diagramEditorStructContainer.h" DiagramEditorBayDetailAddDlg::DiagramEditorBayDetailAddDlg(QWidget *parent) : QDialog(parent) , ui(new Ui::diagramEditorBayDetailAddDlg) ,_selectedModel(nullptr) ,_pParent(nullptr) + ,_bindItemModel(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); @@ -64,6 +69,63 @@ void DiagramEditorBayDetailAddDlg::initial() ui->tableView_selected->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableView_selected->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableView_selected->verticalHeader()->setVisible(false); + + ui->cb_lineType->setItemData(0,1); //设置主线支线 + ui->cb_lineType->setItemData(1,0); + //_bindItemModel = new QStandardItemModel(this); + //ui->cb_bindObj->setModel(_bindItemModel); +} + +void DiagramEditorBayDetailAddDlg::updateBindLst() +{ + ui->cb_bindObj->clear(); + ui->cb_bindObj->addItem("无"); + DiagramEditorBayBlock* pBlock = _pParent->getCurBlock(); + if(pBlock){ + QList lstCon = pBlock->getConnect(); + DiagramEditorWizard* pWizard = _pParent->getWizard(); + if(pWizard){ + QMap mapCon = pWizard->getConnection(); + for(auto& uid:lstCon){ + if(mapCon.contains(uid)){ + auto con = mapCon.value(uid); + DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName()); + if(conOp.nType == 1){ //母线单block单item + ui->cb_bindObj->addItem(conOp.sName,conOp.nType); + } + else if(conOp.nType == 3){ //变压器,选择对应进/出线口 + + } + } + } + } + } + ui->cb_bindObj->setCurrentIndex(0); + + //_bindItemModel->clear(); + /** pBlock = _pParent->getCurBlock(); + if(pBlock){ + QList lstCon = pBlock->getConnect(); + DiagramEditorWizard* pWizard = _pParent->getWizard(); + if(pWizard){ + QMap mapCon = pWizard->getConnection(); + for(auto& uid:lstCon){ + if(mapCon.contains(uid)){ + auto con = mapCon.value(uid); + DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName()); + auto container = pWizard->getContainerByBlock_all(conOp.sName); + + if(conOp.nType == 1){ + //ui->cb_bindObj->addItem(conOp.sName,conOp.nType); + auto pItem = new QStandardItem(conOp.sName); + pItem->setData(conOp.nType,Qt::UserRole); + pItem->setData(container->getId(),Qt::UserRole+1); + } + } + } + } + } + ui->cb_bindObj->setCurrentIndex(0);*/ } void DiagramEditorBayDetailAddDlg::showDlg() @@ -80,6 +142,16 @@ void DiagramEditorBayDetailAddDlg::showDlg() ui->label->setText("新建线路"); ui->le_routeName->setReadOnly(true); _curMode = 0; + updateBindLst(); + + int nCount = pRoute->rowCount(); + for(int i = 0;i < nCount;++i){ + QStandardItem *itemRouteName = pRoute->item(i, 0); + int nMain = itemRouteName->data().toInt(); + if(nMain == 1){ //主线已存在 + ui->cb_lineType->setCurrentIndex(1); + } + } } } @@ -164,6 +236,23 @@ void DiagramEditorBayDetailAddDlg::showDlg(DiagramEditorRouteInfo info) ui->label->setText("编辑线路"); ui->le_routeName->setReadOnly(false); _curMode = 1; + updateBindLst(); + + auto pRoute = _pParent->getRouteModel(); + int nCount = pRoute->rowCount(); + for(int i = 0;i < nCount;++i){ + QStandardItem *itemRouteName = pRoute->item(i, 0); + if(itemRouteName->text() == info.sRouteName){ + int nMain = itemRouteName->data().toInt(); + if(nMain == 1){ //读取并设置是否主线 + ui->cb_lineType->setCurrentIndex(1); + } + else{ + ui->cb_lineType->setCurrentIndex(0); + } + } + + } } } @@ -234,6 +323,7 @@ void DiagramEditorBayDetailAddDlg::onSaveClicked() QString sType = ui->cb_type->currentText(); int nType = ui->cb_type->currentData().toInt(); QString sBindObj = ui->cb_bindObj->currentText(); + int nBindType = ui->cb_bindObj->currentData().toInt(); if(_pParent){ auto pCompoModel = _pParent->getComponentModel(); @@ -287,6 +377,7 @@ void DiagramEditorBayDetailAddDlg::onSaveClicked() itemType->setText(sType); itemType->setData(nType); itemObj->setText(sBindObj); + itemObj->setData(nBindType); QList lstItems; lstItems<le_routeName->text(); - auto& mapRoute = _pParent->getRouteMap(); + auto& mapRoute = _pParent->getBayInfo().mapRoute; QStringList lstName; //线路的设备列表 DiagramEditorRouteInfo routeInfo; routeInfo.sRouteName = sRoute; @@ -315,7 +406,9 @@ void DiagramEditorBayDetailAddDlg::onOkClicked() QString sName = itemName->text(); QString sType = itemType->text(); QString sBind = itemBind->text(); + int nBindType = itemBind->data().toInt(); QString sAllRoute = itemAllRoute->text(); + QUuid uid = itemName->data(Qt::UserRole+3).toUuid(); int nCate = 0; if(sCate == "电气设备") @@ -330,6 +423,8 @@ void DiagramEditorBayDetailAddDlg::onOkClicked() compoInfo.sName = sName; compoInfo.nType = nType; compoInfo.sBindObj = sBind; + compoInfo.nBindType = nBindType; + compoInfo.uid = uid; compoInfo.sUsedRoute = sAllRoute.split(","); routeInfo.lstCompo.append(compoInfo); @@ -337,6 +432,17 @@ void DiagramEditorBayDetailAddDlg::onOkClicked() } QString strCompoNames = lstName.join(","); + int nMain = ui->cb_lineType->currentData().toInt(); //是否主线 + if(nMain == 1){ //设本线路为主线,重置其他线路主线标志 + auto pRoute = _pParent->getRouteModel(); + int nCount = pRoute->rowCount(); + for(int i = 0;i < rowCount;++i){ + QStandardItem *itemRouteName = pRoute->item(i, 0); + if(itemRouteName) + itemRouteName->setData(0); + } + } + routeInfo.bMainRoute = nMain; if(_curMode == 0){ if(mapRoute.contains(sRoute)){ @@ -349,6 +455,7 @@ void DiagramEditorBayDetailAddDlg::onOkClicked() QStandardItem *itemRoute = new QStandardItem(); QStandardItem *itemNames = new QStandardItem(); itemRoute->setText(sRoute); + itemRoute->setData(nMain); itemNames->setText(strCompoNames); QList lstItems; @@ -364,6 +471,7 @@ void DiagramEditorBayDetailAddDlg::onOkClicked() for(int i = 0;i < rowCount;++i){ QStandardItem *itemName = pRoute->item(i, 0); if(itemName->text() == sRoute){ + itemName->setData(nMain); QStandardItem *itemRoutes = pRoute->item(i, 1); itemRoutes->setText(strCompoNames); break; @@ -427,7 +535,7 @@ void DiagramEditorBayDetailAddDlg::onComponentDeleteClicked() QString sName = indexName.data().toString(); bool bUsed = false; - auto& mapRoute = _pParent->getRouteMap(); //检索所有路线,判断设备占用情况 + auto& mapRoute = _pParent->getBayInfo().mapRoute; //检索所有路线,判断设备占用情况 for(auto& route:mapRoute){ QString sRoute = route.sRouteName; for(auto& compo:route.lstCompo){ diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp index b360adc..93a9d59 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp @@ -18,6 +18,7 @@ DiagramEditorBayDetailSettingDlg::DiagramEditorBayDetailSettingDlg(QWidget *pare ,_routeModel(nullptr) ,_pPreviewDlg(nullptr) ,_pModel(nullptr) + ,_pWizard(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); @@ -48,6 +49,9 @@ void DiagramEditorBayDetailSettingDlg::initial() ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableView->verticalHeader()->setVisible(false); + + ui->cb_layout->addItem("纵向",0); + ui->cb_layout->addItem("横向",1); } void DiagramEditorBayDetailSettingDlg::refreshModel() @@ -56,7 +60,7 @@ void DiagramEditorBayDetailSettingDlg::refreshModel() _compoModel->clear(); _compoModel->setColumnCount(5); _compoModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"}); - auto mapComponent = _curOperateObj->getComponentMap(); + auto mapComponent = _curOperateObj->getBayInfo().mapComponent; for(auto& comp:mapComponent){ DiagramEditorComponentInfo info = comp; QStandardItem *itemCate = new QStandardItem(); @@ -142,8 +146,10 @@ void DiagramEditorBayDetailSettingDlg::refreshModel() _routeModel->clear(); _routeModel->setColumnCount(2); _routeModel->setHorizontalHeaderLabels({"线路名", "包含设备"}); - auto mapRoute = _curOperateObj->getRouteInfoMap(); - setRouteMap(mapRoute); //更新路径数据到本界面 + auto info = _curOperateObj->getBayInfo(); + setBayInfo(info); + auto mapRoute = info.mapRoute; //更新路径数据到本界面 + for(auto& route:mapRoute){ QString sRoute = route.sRouteName; QStringList lstComp; @@ -168,6 +174,10 @@ void DiagramEditorBayDetailSettingDlg::showDlg(DiagramEditorBayBlock* p) { show(); _curOperateObj = p; + if(p->getBayType() == BayType::busSectionBay) //分段间隔默认水平 + ui->cb_layout->setCurrentIndex(1); + else + ui->cb_layout->setCurrentIndex(0); refreshModel(); } @@ -184,7 +194,6 @@ void DiagramEditorBayDetailSettingDlg::onOkClicked() { //将ui设置的参数更新到对应block if(_curOperateObj){ - _curOperateObj->setRouteInfoMap(_mapRouteInfo); QMap mapComponents; int nRowCount = _compoModel->rowCount(); @@ -210,6 +219,7 @@ void DiagramEditorBayDetailSettingDlg::onOkClicked() compoInfo.sName = itemName->text(); compoInfo.nType = itemType->data().toInt(); compoInfo.sBindObj = itemBind->text(); + compoInfo.nBindType = itemBind->data().toInt(); compoInfo.sUsedRoute = itemRoute->text().split(","); compoInfo.nUsedDirection = nDir; compoInfo.deltaPos = deltaPos; @@ -219,7 +229,10 @@ void DiagramEditorBayDetailSettingDlg::onOkClicked() mapComponents.insert(compoInfo.sName,compoInfo); } - _curOperateObj->setComponentMap(mapComponents); + int nLayout = ui->cb_layout->currentData().toInt(); + _curBayInfo.nLayout = nLayout; + _curBayInfo.mapComponent = mapComponents; + _curOperateObj->setBayInfo(_curBayInfo); TopologyManager::instance().clearGlobalBlockData(_curOperateObj->getName()); TopologyManager::instance().moveTempBlockData(); _curOperateObj = nullptr; @@ -268,7 +281,7 @@ void DiagramEditorBayDetailSettingDlg::onRouteDeleteClicked() _routeModel->removeRow(row); } - _mapRouteInfo.remove(sName); //同步移除数据 + _curBayInfo.mapRoute.remove(sName); //同步移除数据 } void DiagramEditorBayDetailSettingDlg::onRouteRbtnClicked(const QPoint &pos) @@ -313,12 +326,13 @@ void DiagramEditorBayDetailSettingDlg::onRouteEditClicked() QModelIndex indexName = index.sibling(index.row(),0); QString sName = indexName.data().toString(); - auto routeInfo = _mapRouteInfo.value(sName); + auto routeInfo = _curBayInfo.mapRoute.value(sName); _pAddDlg->showDlg(routeInfo); } void DiagramEditorBayDetailSettingDlg::onPreviewClicked() { + int nLayout = ui->cb_layout->currentData().toInt(); if(_pPreviewDlg == nullptr){ _pPreviewDlg = new DiagramEditorBayPreviewDlg(this); _pPreviewDlg->setParent(this); @@ -326,7 +340,7 @@ void DiagramEditorBayDetailSettingDlg::onPreviewClicked() _pModel->setCurBayRouteModel(_routeModel); } if(!_pPreviewDlg->isVisible()){ - _pPreviewDlg->showDlg(); + _pPreviewDlg->showDlg(nLayout); _pModel->generateTempBay(); } else diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp index 94608f9..d4d3435 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp @@ -32,13 +32,20 @@ void DiagramEditorBayPreviewDlg::initial() _pView->setScene(_pScene); } -void DiagramEditorBayPreviewDlg::showDlg() +void DiagramEditorBayPreviewDlg::showDlg(int nLayout) { if(_pParent){ _pParent->getModel()->setCurPreviewScene(_pScene); } show(); - _pParent->getModel()->updateTarget(_pParent->getRouteMap(),41,0); //1下2右 + int nDir = 0; + if(nLayout == 0){ //纵,下右 + nDir = 41; + } + else if(nLayout == 1){ //横,右下 + nDir = 14; + } + _pParent->getModel()->updateTarget(_pParent->getBayInfo().mapRoute,nDir,0); //updateModelData(); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp index 53a219d..eb32a62 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp @@ -53,7 +53,7 @@ void DiagramEditorBaySettingDlg::showDlg(int nLevel,DiagramEditorBayBlock* p) for(auto& conId:lstCon){ if(_pWizard->getConnection().contains(conId)){ auto con = _pWizard->getConnection().value(conId); - QString sOpposite = con.getOppositeName(p->getName()); + QString sOpposite = con.getOpposite(p->getName()).sName; lst.append(sOpposite); } } diff --git a/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp index 356df25..78438d4 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp @@ -30,7 +30,7 @@ void DiagramEditorPreviewDlg::initial() _pMainLayout = new QVBoxLayout(this); _pView = new EditView(this); _pMainLayout->addWidget(_pView); - _pScene = new EditPreviewScene(this); + _pScene = new EditScene(this); _pScene->setSceneRect(_pParent->getScene()->sceneRect()); //使用父窗口scene大小 _pView->setScene(_pScene); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp index 60d9f5c..9796a88 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp @@ -56,7 +56,7 @@ void DiagramEditorTransSettingDlg::showDlg(DiagramEditorTransformerBlock* p) for(auto& conId:lstCon){ if(_pWizard->getConnection().contains(conId)){ auto con = _pWizard->getConnection().value(conId); - QString sOpposite = con.getOppositeName(p->getName()); + QString sOpposite = con.getOpposite(p->getName()).sName; QString sPos; if(con.nPara == 0){ diff --git a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp index 34474ca..c2facae 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp @@ -239,7 +239,7 @@ void DiagramEditorWizard::flushTransPage() for(auto& conId:lstCon){ if(_mapConnect.contains(conId)){ auto con = _mapConnect.value(conId); - QString sOpposite = con.getOppositeName(pItem->getName()); + QString sOpposite = con.getOpposite(pItem->getName()).sName; QString sPos; if(con.nPara == 0){ @@ -903,7 +903,7 @@ bool DiagramEditorWizard::removeBlockByName(int nLevel,int nType,const QString& QList lstUid = lst[i]->getConnect(); for(auto uid:lstUid){ //删除对象前删除连接 auto con = _mapConnect.value(uid); - QString sOppo = con.getOppositeName(sName); //删除相连的对象中连接信息 + QString sOppo = con.getOpposite(sName).sName; //删除相连的对象中连接信息 auto pBlock = getBlockByName_all(sOppo); if(pBlock){ pBlock->removeConnect(uid); diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index e68bf33..dc8dfae 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -18,6 +18,7 @@ #include "diagramEditor/diagramEditorBayDetailSettingDlg.h" #include "diagramEditor/diagramEditorTransDetailSettingDlg.h" #include "graphicsDataModel/diagramEditorModel.h" +#include "diagramEditor/diagramEditorPreviewDlg.h" #include "global.h" #include @@ -27,6 +28,7 @@ EditPanel::EditPanel(QWidget *parent) ,_bayDetailSetting(nullptr) ,_transDetailSetting(nullptr) ,_pModel(nullptr) + ,_pPreview(nullptr) { _pModel = new DiagramEditorModel(); _pModel->setPanel(this); @@ -34,6 +36,7 @@ EditPanel::EditPanel(QWidget *parent) _maxHeight = 0; _layout = new QVBoxLayout(this); m_pEditScene = new EditScene(this); + m_pEditScene->setModel(_pModel); //设置场景大小.前两个参数为scene的坐标远点,设置到view的中心点后,无论view如何缩放,secne的坐标原点都不会动,方便后续的位置计算 //m_pEditScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height); m_pEditScene->setSceneRect(0, 0, g_dGriaphicsScene_Width*2, g_dGriaphicsScene_Height*2); @@ -350,6 +353,14 @@ void EditPanel::initBlockConnection() } } +void EditPanel::showPreview() +{ + if(!_pPreview){ + _pPreview = new DiagramEditorPreviewDlg(this); + } + _pPreview->showDlg(); +} + QList EditPanel::getBlockItems(EditorItemType typ) { QList lst; @@ -410,6 +421,7 @@ void EditPanel::onItemDbClicked(QPointer pBlock) if(_bayDetailSetting == nullptr){ _bayDetailSetting = new DiagramEditorBayDetailSettingDlg(this); _bayDetailSetting->setModelDelegate(_pModel); + _bayDetailSetting->setWizard(_curWizard); } auto pBay = dynamic_cast(pBlock.data()); if(pBay) diff --git a/diagramCavas/source/diagramEditor/editScene.cpp b/diagramCavas/source/diagramEditor/editScene.cpp index 214dbec..8a4a49b 100644 --- a/diagramCavas/source/diagramEditor/editScene.cpp +++ b/diagramCavas/source/diagramEditor/editScene.cpp @@ -1,4 +1,8 @@ #include "diagramEditor/editScene.h" +#include +#include +#include +#include "graphicsDataModel/diagramEditorModel.h" EditBaseScene::EditBaseScene(QObject *parent) : QGraphicsScene(parent) @@ -20,6 +24,21 @@ EditScene::~EditScene() { } +void EditScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +{ + QMenu menu; + QAction *previewAction = menu.addAction("预览"); + QAction *generateAction = menu.addAction("生成"); + QAction *selectedAction = menu.exec(event->screenPos()); + if (selectedAction == previewAction) { + if(_pModel){ + //_pModel->setCurPreviewScene(this); + _pModel->generatePreview(); + } + } else if (selectedAction == generateAction) { + + } +} /************************预览*********************/ EditPreviewScene::EditPreviewScene(QObject *parent) diff --git a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp index 9f043e5..b8becea 100644 --- a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp +++ b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp @@ -98,7 +98,7 @@ void WizardBayContentDlg::flushData(int nLevel) for(auto& conId:lstCon){ if(_pWizard->getConnection().contains(conId)){ auto con = _pWizard->getConnection().value(conId); - QString sOpposite = con.getOppositeName(pItem->getName()); + QString sOpposite = con.getOpposite(pItem->getName()).sName; info.lstBindObj.append(sOpposite); } } diff --git a/diagramCavas/source/graphicsDataModel/baseModel.cpp b/diagramCavas/source/graphicsDataModel/baseModel.cpp index c9e5063..f9272e5 100644 --- a/diagramCavas/source/graphicsDataModel/baseModel.cpp +++ b/diagramCavas/source/graphicsDataModel/baseModel.cpp @@ -39,7 +39,51 @@ void BaseModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,ModelFunctionT QPointF BaseModel::calculateBusPortPos(GraphicsBaseItem* pBus,GraphicsBaseItem* item) { - return QPointF(item->pos().x(),pBus->pos().y()); + //return QPointF(item->pos().x(),pBus->pos().y()); + QRectF recBus = pBus->sceneBoundingRect(); + QLineF busLine = QLineF(recBus.left(),recBus.y(),recBus.right(),recBus.y()); + + QPointF p1 = busLine.p1(); + QPointF p2 = busLine.p2(); + + // 计算item的中心点在垂直于线段方向上的投影 + QPointF itemCenter = item->pos() + QPointF(item->boundingRect().width()/2, item->boundingRect().height()/2); + + // 计算投影点在线段上的位置 + QPointF projection; + if (busLine.length() == 0) { // 如果线段长度为0,直接返回端点 + projection = p1; + } else { + // 计算投影点 + QPointF vec = p2 - p1; + QPointF relPos = itemCenter - p1; + qreal dot = QPointF::dotProduct(relPos, vec) / (busLine.length() * busLine.length()); + + // 限制投影点在线段范围内 + dot = qBound(0.0, dot, 1.0); + projection = p1 + dot * vec; + } + + return projection; +} + +ItemPort* BaseModel::getClosestUnusedPort(QMap mapPorts,GraphicsBaseItem* item,ModelFunctionType nType) +{ + QMap mapDistance; + + // 收集所有端口及其距离 + for(auto& port: mapPorts) { + double dis = distanceBetweenItems(port, item); + mapDistance.insert(dis, port); + } + + for(auto& port:mapDistance){ //从小到大遍历 + auto lst = TopologyManager::instance().getConnectionsForTerminal(port->getId(),nType); + if(lst.isEmpty()){ //没被占用 + return port; + } + } + return nullptr; } template void BaseModel::establishConnection(GraphicsBaseItem* pSrc,GraphicsBaseItem* pDest,TypeLine* pItem,ModelFunctionType nType,int nMode,int nParam) @@ -49,7 +93,7 @@ template void BaseModel::establishConnection(GraphicsBaseItem int nTypeSrc = pSrc->getProperty()->type(); int nTypeDest = pDest->getProperty()->type(); //if(pSrc->getItemType() == GIT_baseBus) - if((nTypeSrc == 1 || nTypeSrc == 0) && (nTypeDest != 1 && nTypeDest != 0)) //母线或节点 + if((nTypeSrc == 1 || nTypeSrc == 0) && (nTypeDest != 1 && nTypeDest != 0)) //src是母线或节点 { int index = 0; if(nTypeSrc == 1 ) @@ -62,15 +106,17 @@ template void BaseModel::establishConnection(GraphicsBaseItem QMap mapPorts = pDest->getPorts(); if(nMode == 0){ - double minDis = 999; + /*double minDis = 999; for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点 { - double dis = distanceBetweenItems(port,pDest); + double dis = distanceBetweenItems(port,pSrc); if(dis < minDis){ minDis = dis; pDestPort = port; } - } + }*/ + + pDestPort = getClosestUnusedPort(mapPorts,pSrc,nType); } else if(nMode == 1){ for(auto& port:mapPorts) //连接中性点 @@ -110,7 +156,7 @@ template void BaseModel::establishConnection(GraphicsBaseItem QMap mapPorts = pSrc->getPorts(); if(nMode == 0){ - double minDis = 999; + /*double minDis = 999; for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点 { double dis = distanceBetweenItems(port,pDest); @@ -118,12 +164,9 @@ template void BaseModel::establishConnection(GraphicsBaseItem minDis = dis; pSrcPort = port; } - /*if(port->getType() == T_lineOut) - { - pSrcPort = port; - break; }*/ - } + + pSrcPort = getClosestUnusedPort(mapPorts,pDest,nType); } else if(nMode == 1){ for(auto& port:mapPorts) //连接中性点 diff --git a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp index 2ce7bbd..85e8222 100644 --- a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp +++ b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp @@ -31,20 +31,39 @@ DiagramEditorModel::~DiagramEditorModel() } -bool DiagramEditorModel::addTempPreviewItem(QUuid uuid,GraphicsBaseModelItem* pItem) +bool DiagramEditorModel::addPreviewItem(QUuid uuid,GraphicsBaseModelItem* pItem,int mode) { - if(_tempItem.contains(uuid)) - return false; - else - { - _tempItem.insert(uuid,pItem); - return true; + if(mode == 0){ + if(_tempItem.contains(uuid)) + return false; + else + { + _tempItem.insert(uuid,pItem); + return true; + } } + else if(mode == 1){ + if(_previewItem.contains(uuid)) + return false; + else + { + _previewItem.insert(uuid,pItem); + return true; + } + } + return false; } -DiagramEditorItemProperty* DiagramEditorModel::addTempPreviewData(QUuid id,int type,QString name,QString metaName,QString sBlock) +DiagramEditorItemProperty* DiagramEditorModel::addPreviewData(QUuid id,int type,QString name,QString metaName,QString sBlock,int mode) { - DiagramEditorItemProperty* pData = BasePropertyManager::instance().findTempEditorData(id); //已存在不不创建 + DiagramEditorItemProperty* pData = nullptr; + if(mode == 0){ + pData = BasePropertyManager::instance().findTempEditorData(id); //已存在不不创建 + } + else if(mode == 1){ + pData = BasePropertyManager::instance().findEditorData(id); + } + if(pData != nullptr) return pData; @@ -59,7 +78,13 @@ DiagramEditorItemProperty* DiagramEditorModel::addTempPreviewData(QUuid id,int t itemData->setName(name); if(!sBlock.isEmpty()) itemData->setBlock(sBlock); - BasePropertyManager::instance().insertTempEditorData(id,itemData); + if(mode == 0){ + BasePropertyManager::instance().insertTempEditorData(id,itemData); + } + else if(mode == 1){ + BasePropertyManager::instance().insertEditorData(id,itemData); + } + } return itemData; } @@ -100,7 +125,7 @@ void DiagramEditorModel::generateTempBay() generateItemByModel(_pCurBayRoute); } -void DiagramEditorModel::generateTempComponent(QUuid uid,QString sName,int nCategory,int nType,QPoint pos,int nRotate) +GraphicsBaseModelItem* DiagramEditorModel::generateComponent(QUuid uid,QString sName,int nCategory,int nType,QPointF pos,int nRotate,int mode) { GraphicsBaseModelItem* pItem = nullptr; if(nCategory == 0) @@ -196,42 +221,50 @@ void DiagramEditorModel::generateTempComponent(QUuid uid,QString sName,int nCate if(pItem){ pItem->setItemId(uid); pItem->setRotation(nRotate); - PowerEntity* pEntityData = TopologyManager::instance().createEntity(EntityType::Component,uid.toString(),sName,ModelFunctionType::BlockEditorModel); + ModelFunctionType typ; + if(mode == 0){ + typ = ModelFunctionType::BlockEditorModel; + } + else if(mode == 1){ + typ = ModelFunctionType::EditorModel; + } + PowerEntity* pEntityData = TopologyManager::instance().createEntity(EntityType::Component,uid.toString(),sName,typ); if(pEntityData) pItem->setEntity(pEntityData); DiagramEditorItemProperty* pData = nullptr; if(nCategory == 1){ - pData = addTempPreviewData(uid,0,sName,"node"); + pData = addPreviewData(uid,0,sName,"node","",mode); } else if(nCategory == 0){ //设备 - pData = addTempPreviewData(uid,nType,sName,DataBase::GetInstance()->ModelType()[nType].modelType); + pData = addPreviewData(uid,nType,sName,DataBase::GetInstance()->ModelType()[nType].modelType,"",mode); pData->setGraphicsType(pItem->getItemType()); } if(pData) { pItem->setProperty(pData); - createTopoTerminalsByItem(pItem,ModelFunctionType::BlockEditorModel); + createTopoTerminalsByItem(pItem,typ); pData->setDataChanged(true); //数据状态改变 } - addTempPreviewItem(uid,pItem); + addPreviewItem(uid,pItem,mode); _pCurPreviewScene->addItem(pItem); pItem->setPos(pos); } + return pItem; } -ElectricBaseModelLineItem* DiagramEditorModel::generateTempLine(QUuid uid,QString sName) +ElectricBaseModelLineItem* DiagramEditorModel::generateLine(QUuid uid,QString sName,int mode) { ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem(); pLine->setItemId(uid); pLine->setItemType(GIT_baseLine); - DiagramEditorItemProperty* pData = addTempPreviewData(uid,8,sName,DataBase::GetInstance()->ModelType()[4].modelType); + DiagramEditorItemProperty* pData = addPreviewData(uid,8,sName,DataBase::GetInstance()->ModelType()[4].modelType,"",mode); pData->setGraphicsType(GIT_baseLine); if(pData) { pLine->setProperty(pData); pData->setDataChanged(true); //数据状态改变 } - addTempPreviewItem(uid,pLine); + addPreviewItem(uid,pLine,mode); //establishConnection(pBreaker,pBus,pLine,ModelFunctionType::BaseModel); _pCurPreviewScene->addItem(pLine); return pLine; @@ -280,7 +313,7 @@ void DiagramEditorModel::connectTransToNeutral(DiagramEditorTransformerBlock* bl else if(typ == TransformerType::threeWinding){ nT = 16; } - generateTempComponent(uid,sName,0,nT,QPoint(0,0),0); + generateComponent(uid,sName,0,nT,QPoint(0,0),0,1); auto pTransItem = _tempItem.value(uid); if(typ == TransformerType::twoWinding){ @@ -323,7 +356,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt auto pLineData = TopologyManager::instance().ifConnection(uid1.toString(),uid2.toString()); //判断两个item是否有连接 if(pLineData != nullptr){ if(!_tempItem.contains(QUuid(pLineData->id()))){ //connectdata已存在,item未绘制 - auto pLine = generateTempLine(QUuid(pLineData->id()),""); //重新绘制 + auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制 if(pLine) establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos); } @@ -331,7 +364,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt } } else{ //connectdata不存在,新建 - auto pLine = generateTempLine(QUuid::createUuid(),""); + auto pLine = generateLine(QUuid::createUuid(),"",1); if(pLine) establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos); } @@ -341,6 +374,51 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt } } +void DiagramEditorModel::generatePreview() +{ + if(_pPanel){ + _pPanel->showPreview(); + QList lst = _pPanel->getBlockItems(); + for(auto item:lst){ + if(item->getType() == EditorItemType::bus){ //首次循环生成母线 + auto p = item->getBlockData(); //获取blockitem对应的data + if(p){ + QUuid uid = p->getId(); + QString name = p->getName(); + + QPointF pos = item->scenePos(); + auto pItem = generateComponent(uid,name,0,1,pos,0,1); + pItem->setBoundingRect(item->boundingRect()); + } + } + } + + for(auto item:lst){ + if(item->getType() == EditorItemType::bay){ //第二次生成间隔,部分接线 + auto p = item->getBlockData(); //获取blockitem对应的data + DiagramEditorBayBlock* pBay = dynamic_cast(p.data()); + if(pBay){ + auto mapRoute = pBay->getBayInfo().mapRoute; + auto mapCompo = pBay->getBayInfo().mapComponent; + + QRectF rect = item->boundingRect(); + // 计算中心点(本地坐标系) + QPointF centerLocal = rect.center(); + // 转换为场景坐标系 + QPointF centerScene = item->mapToScene(centerLocal); + generateItemByInfo(mapRoute,mapCompo,centerScene); + } + } + } + + for(auto item:lst){ + if(item->getType() == EditorItemType::trans){ //第三次生成变压器,部分接线 + + } + } + } +} + QStandardItem* DiagramEditorModel::getNameItem(const QString& sName,int nFrom) { QStandardItemModel* pModel = nullptr; @@ -389,7 +467,7 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro pos += delta; QUuid uid = pItem->data(Qt::UserRole+3).toUuid(); if(!_tempItem.contains(uid)) - generateTempComponent(uid,name,nCate,nType,pos,nRotate); + generateComponent(uid,name,nCate,nType,pos,nRotate,0); } } @@ -405,20 +483,20 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro if(_tempItem.contains(uid1) && _tempItem.contains(uid2)){ GraphicsBaseModelItem* p1 = _tempItem.value(uid1); GraphicsBaseModelItem* p2 = _tempItem.value(uid2); - auto pLineData = TopologyManager::instance().ifConnection(uid1.toString(),uid2.toString()); //判断两个item是否有连接 + 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 = generateTempLine(QUuid(pLineData->id()),""); //重新绘制 + auto pLine = generateLine(QUuid(pLineData->id()),"",0); //重新绘制 if(pLine) - establishConnection(p1,p2,pLine,ModelFunctionType::BaseModel); + establishConnection(p1,p2,pLine,ModelFunctionType::BlockEditorModel); } else{ //已绘制,略过 } } else{ //connectdata不存在,新建 - auto pLine = generateTempLine(QUuid::createUuid(),""); + auto pLine = generateLine(QUuid::createUuid(),"",0); if(pLine) - establishConnection(p1,p2,pLine,ModelFunctionType::BaseModel); + establishConnection(p1,p2,pLine,ModelFunctionType::BlockEditorModel); } } } @@ -427,13 +505,85 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro } } -void DiagramEditorModel::generateItemByInfo(QMap mapRoute,QMap mapCompo,QPoint delta) +void DiagramEditorModel::generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta) { - if(_pPanel){ - QList lst = _pPanel->getBlockItems(); - for(auto item:lst){ - if(item->getType() == EditorItemType::bus){ + QList lstBind; //连接外部对象的component + QString sMain; + for(auto& route:mapRoute){ //总路线中包含主路,首次生成主路 + if(route.bMainRoute == true){ + sMain = route.sRouteName; + for(auto& compo:route.lstCompo){ //首先生成设备 + auto info = mapCompo.value(compo.sName); + generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1); + if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"无")){ //非空且不是无 + if(!lstBind.contains(info)) + lstBind.append(info); + } + } + if(route.lstCompo.size() > 1){ + bulidAndLinkComponent(route.lstCompo); + } + } + } + + for(auto &route:mapRoute){ //二次生成其他路线 + if(route.bMainRoute == true){ + continue; + } + for(auto &compo:route.lstOrder){ //生成正序设备 + auto info = mapCompo.value(compo.sName); + generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1); + if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"无")){ //非空且不是无 + if(!lstBind.contains(info)) + lstBind.append(info); + } + } + + for(auto &compo:route.lstReverse){ //生成逆序设备 + auto info = mapCompo.value(compo.sName); + generateComponent(info.uid,info.sName,info.nCategory,info.nType,info.deltaPos+delta,info.nRotate,1); + if(!info.sBindObj.isEmpty() && info.sBindObj != QString::fromWCharArray(L"无")){ //非空且不是无 + if(!lstBind.contains(info)) + lstBind.append(info); + } + } + + if(route.lstOrder.size() > 1){ + bulidAndLinkComponent(route.lstOrder); + } + + if(route.lstReverse.size() > 1){ + bulidAndLinkComponent(route.lstReverse); + } + } + + for(auto& compo:lstBind){ //遍历关联外部的item,进行连线 + if(compo.nBindType == 1){ //关联的是母线 母线没有数据,获取绘制的母线item + for(auto& pItem:_previewItem){ + auto pro = pItem->getProperty(); + if(pro){ + QString sName = pro->name(); + if(sName == compo.sBindObj){ + GraphicsBaseModelItem* pSrc = _previewItem.value(compo.uid); + GraphicsBaseModelItem* pTarget = pItem; + 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); //重新绘制 + if(pLine) + establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel); + } + else{ //已绘制,略过 + } + } + else{ //connectdata不存在,新建 + auto pLine = generateLine(QUuid::createUuid(),"",1); + if(pLine) + establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel); + } + } + } } } } @@ -443,12 +593,22 @@ void DiagramEditorModel::updateTarget(QMap& data { auto& mapRoute = data; QString sMainRoute; - int nCount = 0; - for(auto& route:mapRoute){ //寻找包含设备最多的线路 - if(nCount < route.lstCompo.count()){ - nCount = route.lstCompo.count(); + + bool hasMain = false; + for(auto& route:mapRoute){ + if(route.bMainRoute == true){ sMainRoute = route.sRouteName; - route.bMainRoute = true; + hasMain = true; + } + } + if(!hasMain){ //没设置主线将最长设为主线 + int nCount = 0; + for(auto& route:mapRoute){ //寻找包含设备最多的线路 + if(nCount < route.lstCompo.count()){ + nCount = route.lstCompo.count(); + sMainRoute = route.sRouteName; + route.bMainRoute = true; + } } } int nMainDir = nLayout/10; //主朝向倾向 8421上下左右 @@ -483,10 +643,14 @@ void DiagramEditorModel::updateTarget(QMap& data int nVal = pItemName->data().toInt(); pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) pItemName->setData(QPoint(0,deltaY),Qt::UserRole+2); //设置相对位置 - if(nMainDir == 4) + if(nMainDir == 4){ + maoCompo[i].nRotate = 0; pItemName->setData(0,Qt::UserRole+5); - else + } + else{ + maoCompo[i].nRotate = 180; pItemName->setData(180,Qt::UserRole+5); + } } if(nMainDir == 8) nSegIndex -= 1; @@ -555,6 +719,7 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } else if((nVal & 1) == 1){ @@ -562,18 +727,21 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } else{ //左右都没被占,放到倾向位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); if(nSubDir == 1){ - nOrderPolarity = -1; - pNextItem->setData(90,Qt::UserRole+5); + nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); } else if(nSubDir == 2){ - nOrderPolarity = 1; - pNextItem->setData(-90,Qt::UserRole+5); + nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); } } int deltaX = nXOrderIndex*nOrderPolarity*g_nHDiagramSpacing; @@ -588,22 +756,26 @@ void DiagramEditorModel::updateTarget(QMap& data //左被占用,右空 pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 + route.lstOrder[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } else if((nVal & 1) == 1){ //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); + route.lstOrder[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } else{ //左右都没被占,放到设定位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); if(nSubDir == 1){ - pNextItem->setData(90,Qt::UserRole+5); + route.lstOrder[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); } else if(nSubDir == 2){ - pNextItem->setData(-90,Qt::UserRole+5); + route.lstOrder[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); } } int deltaX = nXOrderIndex*nOrderPolarity*g_nHDiagramSpacing; @@ -634,6 +806,7 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 nReversePolarity = 1; + route.lstReverse[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } else if((nVal & 1) == 1){ @@ -641,18 +814,21 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } else{ //左右都没被占,放到倾向位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); if(nSubDir == 1){ - nOrderPolarity = -1; - pNextItem->setData(90,Qt::UserRole+5); + nReversePolarity = 1; + route.lstReverse[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); } else if(nSubDir == 2){ - nOrderPolarity = 1; - pNextItem->setData(-90,Qt::UserRole+5); + nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); } } int deltaX = nXReverseIndex*nReversePolarity*g_nHDiagramSpacing; @@ -661,28 +837,32 @@ void DiagramEditorModel::updateTarget(QMap& data } if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ - qDebug()<setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 + route.lstReverse[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } else if((nVal & 1) == 1){ //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); + route.lstReverse[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } else{ //左右都没被占,放到设定位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); if(nSubDir == 1){ - pNextItem->setData(90,Qt::UserRole+5); + route.lstReverse[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); } else if(nSubDir == 2){ - pNextItem->setData(-90,Qt::UserRole+5); + route.lstReverse[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); } } int deltaX = nXReverseIndex*nReversePolarity*g_nHDiagramSpacing; @@ -721,10 +901,14 @@ void DiagramEditorModel::updateTarget(QMap& data int nVal = pItemName->data().toInt(); pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) pItemName->setData(QPoint(deltaX,0),Qt::UserRole+2); //设置相对位置 - if(nMainDir == 1) + if(nMainDir == 1){ + maoCompo[i].nRotate = -90; pItemName->setData(-90,Qt::UserRole+5); //转至水平 - else + } + else{ + maoCompo[i].nRotate = 90; pItemName->setData(90,Qt::UserRole+5); + } } if(nMainDir == 2) nSegIndex -= 1; @@ -793,6 +977,7 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 4)); pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if((nVal & 4) == 1){ @@ -800,6 +985,7 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 8)); pNextItem->setData(QString::number(nNextVal | 4)); nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } else{ //上下都没占,放到设定位置 @@ -807,10 +993,12 @@ void DiagramEditorModel::updateTarget(QMap& data pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); if(nSubDir == 4){ nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if(nSubDir == 8){ nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } } @@ -838,11 +1026,13 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); if(nSubDir == 4){ - nOrderPolarity = 1; + //nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if(nSubDir == 8){ - nOrderPolarity = -1; + //nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } } @@ -874,6 +1064,7 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 4)); pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 nReversePolarity = 1; + route.lstReverse[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if((nVal & 1) == 4){ @@ -881,17 +1072,20 @@ void DiagramEditorModel::updateTarget(QMap& data pItem->setData(QString::number(nVal | 8)); pNextItem->setData(QString::number(nNextVal | 4)); nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } else{ //上下都没被占,放到设定位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); if(nSubDir == 4){ - nOrderPolarity = 1; + nReversePolarity = 1; + route.lstReverse[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if(nSubDir == 8){ - nOrderPolarity = -1; + nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } } @@ -907,23 +1101,27 @@ void DiagramEditorModel::updateTarget(QMap& data //上被占用,下空 pItem->setData(QString::number(nVal | 4)); pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 + route.lstReverse[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if((nVal & 4) == 1){ //下被占用,上空 pItem->setData(QString::number(nVal | 8)); pNextItem->setData(QString::number(nNextVal | 4)); + route.lstReverse[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } else{ //上下都没被占,默认放到下边 pItem->setData(QString::number(nVal | 4)); pNextItem->setData(QString::number(nNextVal | 8)); if(nSubDir == 4){ - nOrderPolarity = 1; + //nReversePolarity = 1; + route.lstReverse[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if(nSubDir == 8){ - nOrderPolarity = -1; + //nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } } @@ -934,5 +1132,31 @@ void DiagramEditorModel::updateTarget(QMap& data } } } - +} + +void DiagramEditorModel::bulidAndLinkComponent(QList lst) +{ + for(int i = 0;i < lst.size()-1;++i){ + auto item1 = lst[i]; + auto item2 = lst[i+1]; + if(_previewItem.contains(item1.uid) && _previewItem.contains(item2.uid)){ + GraphicsBaseModelItem* p1 = _previewItem.value(item1.uid); + GraphicsBaseModelItem* p2 = _previewItem.value(item2.uid); + auto pLineData = TopologyManager::instance().ifConnection(item1.uid.toString(),item2.uid.toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接 + if(pLineData != nullptr){ + if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在,item未绘制 + auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制 + if(pLine) + establishConnection(p1,p2,pLine,ModelFunctionType::EditorModel); + } + else{ //已绘制,略过 + } + } + else{ //connectdata不存在,新建 + auto pLine = generateLine(QUuid::createUuid(),"",1); + if(pLine) + establishConnection(p1,p2,pLine,ModelFunctionType::EditorModel); + } + } + } } diff --git a/diagramCavas/ui/diagramEditorBayDetailSettingDlg.ui b/diagramCavas/ui/diagramEditorBayDetailSettingDlg.ui index be61750..9b3d3a8 100644 --- a/diagramCavas/ui/diagramEditorBayDetailSettingDlg.ui +++ b/diagramCavas/ui/diagramEditorBayDetailSettingDlg.ui @@ -101,6 +101,16 @@ 0 + + + + 间隔布局: + + + + + + diff --git a/diagramUtils/include/basePropertyManager.h b/diagramUtils/include/basePropertyManager.h index 85268b8..d5c4788 100644 --- a/diagramUtils/include/basePropertyManager.h +++ b/diagramUtils/include/basePropertyManager.h @@ -41,6 +41,11 @@ public: DiagramEditorItemProperty* findTempEditorData(QUuid); void deleteTempEditorData(QUuid); QMap getTempEditorData() const; + + void insertEditorData(QUuid,DiagramEditorItemProperty*); //预览对象数据 + DiagramEditorItemProperty* findEditorData(QUuid); + void deleteEditorData(QUuid); + QMap getEditorData() const; signals: void dataCreated(QString uuid); void dataChanged(QString uuid); @@ -51,5 +56,6 @@ private: QMap m_baseEntityData; //基模实例元件数据 QMap m_bayData; //间隔数据 QMap m_editorTempData; //编辑时临时预览对象 + QMap m_editorData; //编辑时预览对象 }; #endif // BASEPROPERTYMANAGER_H diff --git a/diagramUtils/source/basePropertyManager.cpp b/diagramUtils/source/basePropertyManager.cpp index f521917..22f8d4d 100644 --- a/diagramUtils/source/basePropertyManager.cpp +++ b/diagramUtils/source/basePropertyManager.cpp @@ -118,3 +118,27 @@ QMap BasePropertyManager::getTempEditorData() { return m_editorTempData; } + +/*****************************预览数据*******************************/ +void BasePropertyManager::insertEditorData(QUuid id,DiagramEditorItemProperty* p) +{ + if(!m_editorData.contains(id)) + m_editorData.insert(id,p); +} + +DiagramEditorItemProperty* BasePropertyManager::findEditorData(QUuid id) +{ + return m_editorData.value(id,nullptr); +} + +void BasePropertyManager::deleteEditorData(QUuid id) +{ + DiagramEditorItemProperty* pData = m_editorData.value(id,nullptr); + if(pData) + delete pData; +} + +QMap BasePropertyManager::getEditorData() const +{ + return m_editorData; +}