From 20814d00a614edf2d64dc441ba5ec9afac69b000 Mon Sep 17 00:00:00 2001 From: baiYue Date: Fri, 17 Oct 2025 18:14:44 +0800 Subject: [PATCH] add project model icon manager --- common/include/global.h | 28 +- diagramCavas/CMakeLists.txt | 9 + diagramCavas/include/baseInfoDlg.h | 7 + diagramCavas/include/diagramCavas.h | 1 + .../graphicsDataModel/diagramEditorModel.h | 3 +- .../graphicsDataModel/fixedPortsModel.h | 4 + .../include/graphicsItem/electricSvgGroup.h | 4 +- .../include/graphicsItem/electricSvgGroupCT.h | 2 +- .../include/graphicsItem/electricSvgGroupPT.h | 22 + .../include/graphicsItem/electricSvgItem.h | 7 +- .../include/graphicsItem/electricSvgItemPT.h | 19 + .../graphicsItem/electricSvgItemRect.h | 2 - .../include/graphicsItem/graphicsBaseItem.h | 2 +- diagramCavas/include/itemPropertyDlg.h | 1 + diagramCavas/include/powerEntity.h | 5 +- diagramCavas/include/powerTerminal.h | 6 +- .../include/projectIconSelectionDlg.h | 21 + diagramCavas/include/projectIconSetting.h | 37 ++ diagramCavas/source/baseInfoDlg.cpp | 15 + .../electricBaseModelPortItem.cpp | 1 + .../electricBaseModelSvgItem.cpp | 1 + diagramCavas/source/diagramCavas.cpp | 26 +- .../diagramEditorBayDetailSettingDlg.cpp | 3 +- .../diagramEditorBayPreviewDlg.cpp | 1 + .../diagramEditor/diagramEditorPreviewDlg.cpp | 1 + .../diagramEditorTransDetailSettingDlg.cpp | 14 +- .../diagramEditorTransPreviewDlg.cpp | 16 +- .../source/graphicsDataModel/baseModel.cpp | 202 ++++++++- .../graphicsDataModel/diagramEditorModel.cpp | 123 +++--- .../graphicsDataModel/fixedPortsModel.cpp | 320 +++++++++----- .../source/graphicsItem/electricSvgGroup.cpp | 17 +- .../graphicsItem/electricSvgGroupCT.cpp | 11 +- .../graphicsItem/electricSvgGroupPT.cpp | 140 ++++++ .../source/graphicsItem/electricSvgItem.cpp | 9 +- .../graphicsItem/electricSvgItemBus.cpp | 1 + .../source/graphicsItem/electricSvgItemPT.cpp | 30 ++ .../graphicsItem/electricSvgItemRect.cpp | 2 +- diagramCavas/source/itemPropertyDlg.cpp | 36 +- .../source/projectIconSelectionDlg.cpp | 54 +++ diagramCavas/source/projectIconSetting.cpp | 139 ++++++ diagramCavas/source/projectModelSetting.cpp | 29 +- diagramCavas/ui/baseInfoDlg.ui | 407 +++++++++--------- diagramCavas/ui/projectIconSetting.ui | 139 ++++++ diagramCavas/ui/projectModelSetting.ui | 3 + diagramUtils/source/projectModelManager.cpp | 20 + 45 files changed, 1523 insertions(+), 417 deletions(-) create mode 100644 diagramCavas/include/graphicsItem/electricSvgGroupPT.h create mode 100644 diagramCavas/include/graphicsItem/electricSvgItemPT.h create mode 100644 diagramCavas/include/projectIconSelectionDlg.h create mode 100644 diagramCavas/include/projectIconSetting.h create mode 100644 diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp create mode 100644 diagramCavas/source/graphicsItem/electricSvgItemPT.cpp create mode 100644 diagramCavas/source/projectIconSelectionDlg.cpp create mode 100644 diagramCavas/source/projectIconSetting.cpp create mode 100644 diagramCavas/ui/projectIconSetting.ui diff --git a/common/include/global.h b/common/include/global.h index 23171ff..eef8c30 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -19,8 +19,8 @@ const int g_dEditorItem_Height = 80; const int g_nEditorBus_Height = 10; -const int g_nVDiagramSpacing = 50; -const int g_nHDiagramSpacing = 50; +const int g_nVDiagramSpacing = 80; +const int g_nHDiagramSpacing = 80; //Q_NAMESPACE enum GraphicsItemType @@ -38,16 +38,18 @@ enum GraphicsItemType GIT_link= QGraphicsItem::UserType + 53, GIT_ctItem= QGraphicsItem::UserType + 54, GIT_ctGroup= QGraphicsItem::UserType + 55, - GIT_ES= QGraphicsItem::UserType + 56, - GIT_DS= QGraphicsItem::UserType + 57, - GIT_FES= QGraphicsItem::UserType + 58, - GIT_DTEDS= QGraphicsItem::UserType + 59, - GIT_PI= QGraphicsItem::UserType + 60, - GIT_LA= QGraphicsItem::UserType + 61, - GIT_cableTer= QGraphicsItem::UserType + 62, - GIT_cableEnd= QGraphicsItem::UserType + 63, - GIT_2wTransformer= QGraphicsItem::UserType + 64, - GIT_3wTransformer= QGraphicsItem::UserType + 65, + GIT_ptItem= QGraphicsItem::UserType + 56, + GIT_ptGroup= QGraphicsItem::UserType + 57, + GIT_ES= QGraphicsItem::UserType + 58, + GIT_DS= QGraphicsItem::UserType + 59, + GIT_FES= QGraphicsItem::UserType + 60, + GIT_DTEDS= QGraphicsItem::UserType + 61, + GIT_PI= QGraphicsItem::UserType + 62, + GIT_LA= QGraphicsItem::UserType + 63, + GIT_cableTer= QGraphicsItem::UserType + 64, + GIT_cableEnd= QGraphicsItem::UserType + 65, + GIT_2wTransformer= QGraphicsItem::UserType + 66, + GIT_3wTransformer= QGraphicsItem::UserType + 67, GIT_node= QGraphicsItem::UserType + 79, GIT_bay= QGraphicsItem::UserType + 80, //间隔 //====================================== @@ -233,6 +235,7 @@ struct projectModelSetting //工程模设定类,如图标 { QString modelName; //工程模名 QMap mapSvg; //存放选择的svg图片 + QMap mapUsedSvg; //存放使用的svg }; /*struct baseModelSelectManger @@ -287,6 +290,7 @@ struct PropertyModel //工程模 { PropertyModel copy; copy.mapProperty = mapProperty; + copy.nType = nType; copy.pBase = deepCloneModel(pBase); copy.pSelect = deepCloneModel(pSelect); copy.formerMeta = formerMeta; diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index fc1140f..d68bad4 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -23,6 +23,8 @@ set(DIAGRAMCAVAS_HEADER_FILES include/bayManagerContentDlg.h include/measureSettingDlg.h include/projectModelSetting.h + include/projectIconSetting.h + include/projectIconSelectionDlg.h include/projectDiagramNameInput.h include/diagramEditor/editPanel.h include/diagramEditor/editView.h @@ -70,6 +72,8 @@ set(DIAGRAMCAVAS_HEADER_FILES include/graphicsItem/electricSvgGroup.h include/graphicsItem/electricSvgGroupCT.h include/graphicsItem/electricSvgItemCT.h + include/graphicsItem/electricSvgGroupPT.h + include/graphicsItem/electricSvgItemPT.h include/graphicsItem/electricSvgItemES.h include/graphicsItem/electricSvgItemDS.h include/graphicsItem/electricSvgItemFES.h @@ -125,6 +129,8 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/bayManagerContentDlg.cpp source/measureSettingDlg.cpp source/projectModelSetting.cpp + source/projectIconSetting.cpp + source/projectIconSelectionDlg.cpp source/projectDiagramNameInput.cpp source/diagramEditor/editPanel.cpp source/diagramEditor/editView.cpp @@ -172,6 +178,8 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/graphicsItem/electricSvgGroup.cpp source/graphicsItem/electricSvgGroupCT.cpp source/graphicsItem/electricSvgItemCT.cpp + source/graphicsItem/electricSvgGroupPT.cpp + source/graphicsItem/electricSvgItemPT.cpp source/graphicsItem/electricSvgItemES.cpp source/graphicsItem/electricSvgItemDS.cpp source/graphicsItem/electricSvgItemFES.cpp @@ -223,6 +231,7 @@ set(UI_FILES ui/diagramEditorTransDetailSettingDlg.ui ui/diagramEditorTransDetailAddDlg.ui ui/confirmEditorDlg.ui + ui/projectIconSetting.ui ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/diagramCavas/include/baseInfoDlg.h b/diagramCavas/include/baseInfoDlg.h index 5f15b56..5265a3a 100644 --- a/diagramCavas/include/baseInfoDlg.h +++ b/diagramCavas/include/baseInfoDlg.h @@ -9,6 +9,7 @@ namespace Ui { class baseInfoDlg; } QT_END_NAMESPACE class QButtonGroup; +class ItemPropertyDlg; class BaseInfoDlg : public BaseContentDlg { @@ -17,12 +18,18 @@ public: BaseInfoDlg(QWidget *parent = nullptr); ~BaseInfoDlg(); + void initial(); + virtual void createGroupView(groupStateInfo); virtual QMap getPropertyValue(BaseProperty* = nullptr); virtual void setPropertyValue(QVariant); + void setParentDlg(ItemPropertyDlg* p) {_parentDlg = p;} +public slots: + void onIconManagerClicked(); private: Ui::baseInfoDlg *ui; QButtonGroup* _stateGroup; + ItemPropertyDlg* _parentDlg; }; #endif diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index 87622aa..e6253ac 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -59,6 +59,7 @@ public slots: void onSignl_openCurrentBay(); private: void removePanel(PowerEntity*); + void autoSetModelName(GraphicsBaseModelItem*); //如果此页的工程模已被设置,将projectName更新到item private: QMap> m_mapDrawPanel; int _pageIndex; diff --git a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h index e5ba9a1..1153bb5 100644 --- a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h +++ b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h @@ -59,7 +59,8 @@ public: 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 void generateOutConnection(QList,int nTypeTransCon,int nPos = 0); //生成外部连接(手动bind的连接) nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置 - QRectF updateTarget(QMap&,QMap&,int nLayout,int nSource,bool regenerate = true,bool saveToModel = true); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 regenerate重新生成标志 saveToModel:生成到模型或map + 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前调用) private: void bulidAndLinkComponent(QList,QMap); //生成并连接线路上的设备 lst,mapComponents(从map中获取正确数据) //DiagramEditorComponentInfo getCompoDataFromName(const QString&,QMap); //根据名称获取数据 diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index cae9456..03f14fd 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -22,6 +22,7 @@ struct Connection; class PowerEntity; class ElectricConnectLineItem; class ProjectModelSetting; +class ProjectIconSetting; class ElectricBayItem; class GraphicsNonStandardItem; class BayProperty; @@ -64,6 +65,8 @@ public: bool isItemValid(GraphicsProjectModelItem*); //判断item是否可以连接 void insertProjectModelName(QString,QString); //插入工程模类型(生成工程模时调用) + void showProjectIconSettingDlg(GraphicsProjectModelItem*); //显示工程模图标设置(设置使用图标) + void updateItemIcon(QString sMeta,QString sModel); //更新指定模型的图标 /********************baseModel相关**********************/ QMap& allBaseItems(); //获取所有基模对象 QVector allBaseConnections(); @@ -124,6 +127,7 @@ private: QMap _modelStateInfo; //模型结构信息 QMap _modelDataInfo; //模型数据信息 ProjectModelSetting* m_proModelSettingDlg; + ProjectIconSetting* m_projectIconSettingDlg; BayManagerDlg* m_pBayManager; public: static bool _dataInitialised; diff --git a/diagramCavas/include/graphicsItem/electricSvgGroup.h b/diagramCavas/include/graphicsItem/electricSvgGroup.h index 9d52f36..240b5b2 100644 --- a/diagramCavas/include/graphicsItem/electricSvgGroup.h +++ b/diagramCavas/include/graphicsItem/electricSvgGroup.h @@ -15,8 +15,8 @@ public: void resize(int,double, double, const QPointF&); void updateCoordinate(); void move(const QPointF&); - virtual void loadSvg(const QByteArray& data); virtual void addSvgItem(ElectricSvgItem* item); + virtual void updateMapSvg(QMap map); //工程模property不含图片,额外存储 protected: virtual QPainterPath shape(); @@ -24,7 +24,7 @@ protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); protected: QRectF m_lastBoudingRect; //记录上一时刻的boundingRect - QByteArray m_curSvg; //当前存储的svg + QMap m_mapSvg; }; #endif diff --git a/diagramCavas/include/graphicsItem/electricSvgGroupCT.h b/diagramCavas/include/graphicsItem/electricSvgGroupCT.h index 2ba0314..6c5fb5e 100644 --- a/diagramCavas/include/graphicsItem/electricSvgGroupCT.h +++ b/diagramCavas/include/graphicsItem/electricSvgGroupCT.h @@ -9,7 +9,7 @@ class ElectricSvgGroupCT :public ElectricSvgGroup public: ElectricSvgGroupCT(const QRect &rect,QGraphicsItem *parent = 0); virtual ~ElectricSvgGroupCT(); - virtual void setupFinish(int nType,int nSize) override; + virtual void setupFinish(QVariant) override; virtual void updateItem() override; void setCtType(int n){_nType = n;} void setCtSize(int n){_nSize = n;} diff --git a/diagramCavas/include/graphicsItem/electricSvgGroupPT.h b/diagramCavas/include/graphicsItem/electricSvgGroupPT.h new file mode 100644 index 0000000..c2d45cf --- /dev/null +++ b/diagramCavas/include/graphicsItem/electricSvgGroupPT.h @@ -0,0 +1,22 @@ +#ifndef ELECTRICSVGGROUPPT_H +#define ELECTRICSVGGROUPPT_H + +#include "graphicsItem/electricSvgGroup.h" + +class ElectricSvgGroupPT :public ElectricSvgGroup +{ + Q_OBJECT +public: + ElectricSvgGroupPT(const QRect &rect,QGraphicsItem *parent = 0); + virtual ~ElectricSvgGroupPT(); + virtual void setupFinish(QVariant) override; + virtual void updateItem() override; + virtual void updateLayout() override; + QList& getLstType() {return m_lstType;} +protected: + virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; +protected: + QList m_lstType; //绕组类型 1星型 0三角 +}; + +#endif diff --git a/diagramCavas/include/graphicsItem/electricSvgItem.h b/diagramCavas/include/graphicsItem/electricSvgItem.h index fc384af..cccdcc0 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItem.h +++ b/diagramCavas/include/graphicsItem/electricSvgItem.h @@ -13,8 +13,9 @@ public: void resize(int,double, double, const QPointF&); void updateCoordinate(); void move(const QPointF&); - virtual void loadSvg(const QByteArray& data); - + virtual void loadSvg(){}; + virtual void loadSvg(QByteArray); //第二种load直接加载图片 + virtual void updateMapSvg(QMap map); protected: virtual QPainterPath shape(); virtual void editShape(int, const QPointF&); @@ -22,7 +23,7 @@ protected: protected: QRectF m_lastBoudingRect; //记录上一时刻的boundingRect QSvgRenderer* m_pRender; - + QMap m_mapSvg; }; #endif diff --git a/diagramCavas/include/graphicsItem/electricSvgItemPT.h b/diagramCavas/include/graphicsItem/electricSvgItemPT.h new file mode 100644 index 0000000..503011d --- /dev/null +++ b/diagramCavas/include/graphicsItem/electricSvgItemPT.h @@ -0,0 +1,19 @@ +#ifndef ELECTRICSVGITEMPT_H +#define ELECTRICSVGITEMPT_H + +#include "electricSvgItem.h" + +class ElectricSvgItemPT :public ElectricSvgItem +{ + Q_OBJECT +public: + ElectricSvgItemPT(const QRect &rect,QGraphicsItem *parent = 0); + virtual ~ElectricSvgItemPT(); + void setItemType(int n){_itemType = n;} +protected: + virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); + + int _itemType = 0; //1星型 0三角 +}; + +#endif diff --git a/diagramCavas/include/graphicsItem/electricSvgItemRect.h b/diagramCavas/include/graphicsItem/electricSvgItemRect.h index c5f27b6..645a426 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItemRect.h +++ b/diagramCavas/include/graphicsItem/electricSvgItemRect.h @@ -12,8 +12,6 @@ public: ElectricSvgItemRect(const QRect &rect, bool genNewPort = true,QGraphicsItem *parent = 0); virtual ~ElectricSvgItemRect(); - //virtual void updateByProperty(); - protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); private: diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index 6f71815..5c5cd8b 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -556,7 +556,7 @@ public: virtual void updateConnectData(); //更新连接关系数据 virtual void setModelName(QString sName){_modelName = sName;} virtual QString getModelName() const {return _modelName;} - virtual void setupFinish(int nType,int nSize){} //设置完成后调用(如ct,pt) + virtual void setupFinish(QVariant){} //设置完成后调用(如ct,pt) virtual void updateItem(){}; //更新自身(如ct,pt) virtual void updateTerPos(); //ct,pt等item大小变动后重新计算端点位置 protected: diff --git a/diagramCavas/include/itemPropertyDlg.h b/diagramCavas/include/itemPropertyDlg.h index 2a1caeb..9d754af 100644 --- a/diagramCavas/include/itemPropertyDlg.h +++ b/diagramCavas/include/itemPropertyDlg.h @@ -28,6 +28,7 @@ public: void showDlg(modelDataInfo,QUuid,GraphicsProjectModelItem*); //显示属性页面 void setModelController(FixedPortsModel* p) {_curModelController = p;} auto getModelController() {return _curModelController;} + auto getCurItem() {return _curItem;} public slots: void onOkClicked(); void onCancelClicked(); diff --git a/diagramCavas/include/powerEntity.h b/diagramCavas/include/powerEntity.h index f77a5ac..33f016d 100644 --- a/diagramCavas/include/powerEntity.h +++ b/diagramCavas/include/powerEntity.h @@ -46,7 +46,10 @@ public: if(pTer == nullptr){ //BaseModel中不存在则拷贝 double dX = terminal->getPerX(); double dY = terminal->getPerY(); - TopologyManager::instance().createTerminal(m_id,terminal->type(),terminal->name(),terminal->relativePosition(),terminal->id(),ModelFunctionType::BaseModel,dX,dY); + auto newTer = TopologyManager::instance().createTerminal(m_id,terminal->type(),terminal->name(),terminal->relativePosition(),terminal->id(),ModelFunctionType::BaseModel,dX,dY); + if(newTer){ + newTer->setPortLocate(terminal->getPortLocate()); + } } } diff --git a/diagramCavas/include/powerTerminal.h b/diagramCavas/include/powerTerminal.h index b8236af..5c77586 100644 --- a/diagramCavas/include/powerTerminal.h +++ b/diagramCavas/include/powerTerminal.h @@ -13,7 +13,8 @@ enum class TerminalType { PowerOutput, PowerConnect, ControlSignal, - ProtectiveGround + ProtectiveGround, + NewTral }; class PowerTerminal : public QObject { @@ -50,6 +51,8 @@ public: double getPerX() {return m_dPerX;} void setPerY(double d) {m_dPerY = d;} double getPerY() {return m_dPerY;} + void setPortLocate(int n) {m_portLocate = n;} + int getPortLocate() {return m_portLocate;} signals: void positionChanged(const QPointF& newPosition); @@ -62,6 +65,7 @@ private: QString m_generateBy; //被哪个Terminal生成 double m_dPerX = 0.0; //横向百分比位置 double m_dPerY = 0.0; //纵向百分比位置 + int m_portLocate = 0; //所处位置(上下左右) }; #endif //POWERTERMINAL_H diff --git a/diagramCavas/include/projectIconSelectionDlg.h b/diagramCavas/include/projectIconSelectionDlg.h new file mode 100644 index 0000000..4cd8977 --- /dev/null +++ b/diagramCavas/include/projectIconSelectionDlg.h @@ -0,0 +1,21 @@ +#ifndef PROJECTICONSELECTIONDLG_H +#define PROJECTICONSELECTIONDLG_H + +#include +#include +#include +#include + +class ProjectIconSelectionDlg : public QDialog { + Q_OBJECT +public: + ProjectIconSelectionDlg(const QMap,QWidget* parent = nullptr); + QByteArray selectedSVG() const; + +private: + QListWidget* listWidget; + QMap svgMap; +}; + + +#endif diff --git a/diagramCavas/include/projectIconSetting.h b/diagramCavas/include/projectIconSetting.h new file mode 100644 index 0000000..453150d --- /dev/null +++ b/diagramCavas/include/projectIconSetting.h @@ -0,0 +1,37 @@ +#ifndef PROJECTICONSETTING_H +#define PROJECTICONSETTING_H + +/*********工程模使用的图标设置*********/ +#include + +class FixedPortsModel; +class GraphicsProjectModelItem; + +QT_BEGIN_NAMESPACE +namespace Ui { class projectIconSetting; } +QT_END_NAMESPACE + +class ProjectIconSetting : public QDialog +{ + Q_OBJECT +public: + ProjectIconSetting(QWidget *parent = nullptr); + ~ProjectIconSetting(); + + void showDlg(GraphicsProjectModelItem*); + void initial(); + void addItems(QMap); + void selectImage(int row); + void setController(FixedPortsModel* p){_controller = p;} +public slots: + void onOkClicked(); + void onCellClicked(int row,int col); +private: + Ui::projectIconSetting *ui; + QSize _iconSize; + FixedPortsModel* _controller; + QString _sMetaModel; + QString _sModel; +}; + +#endif diff --git a/diagramCavas/source/baseInfoDlg.cpp b/diagramCavas/source/baseInfoDlg.cpp index 47cc12f..260cf6a 100644 --- a/diagramCavas/source/baseInfoDlg.cpp +++ b/diagramCavas/source/baseInfoDlg.cpp @@ -6,17 +6,20 @@ #include "global.h" #include "baseProperty.h" #include "basePropertyManager.h" +#include "itemPropertyDlg.h" #include BaseInfoDlg::BaseInfoDlg(QWidget *parent) : BaseContentDlg(parent) , ui(new Ui::baseInfoDlg) + ,_parentDlg(nullptr) { ui->setupUi(this); _stateGroup = new QButtonGroup(this); _stateGroup->addButton(ui->rb_inService,1); _stateGroup->addButton(ui->rb_outService,0); _stateGroup->setExclusive(true); + initial(); } BaseInfoDlg::~BaseInfoDlg() @@ -24,6 +27,11 @@ BaseInfoDlg::~BaseInfoDlg() delete ui; } +void BaseInfoDlg::initial() +{ + connect(ui->btn_icon,&QPushButton::clicked,this,&BaseInfoDlg::onIconManagerClicked); +} + void BaseInfoDlg::createGroupView(groupStateInfo infos) { QList lstGrid = DataBase::GetInstance()->getAllGrid(); @@ -152,3 +160,10 @@ void BaseInfoDlg::setPropertyValue(QVariant var) } } } + +void BaseInfoDlg::onIconManagerClicked() +{ + if(_parentDlg){ + _parentDlg->getModelController()->showProjectIconSettingDlg(_parentDlg->getCurItem()); + } +} diff --git a/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp b/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp index 966acea..83093fc 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp @@ -25,6 +25,7 @@ ElectricBaseModelPortItem::ElectricBaseModelPortItem(const ElectricBaseModelPort setHandleVisible(false); setFunctionHandleIfShow(false); setFunctionHandleEnaable(false); + setPos(obj.pos()); } ElectricBaseModelPortItem* ElectricBaseModelPortItem::clone() const diff --git a/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp b/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp index eb28370..74bddce 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp @@ -21,6 +21,7 @@ ElectricBaseModelSvgItem::ElectricBaseModelSvgItem(const ElectricBaseModelSvgIte m_lastBoudingRect = obj.m_lastBoudingRect; m_icon = obj.m_icon; m_pRender = new QSvgRenderer(m_icon); + setRotation(obj.rotation()); } ElectricBaseModelSvgItem* ElectricBaseModelSvgItem::clone() const diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index a98306c..abd28c7 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -9,7 +9,7 @@ #include "topologyManager.h" #include "powerEntity.h" #include "diagramEditor/diagramEditorWizard.h" -//#include "componentIconManager.h" +#include "projectModelManager.h" #include "baseProperty.h" #include "diagramEditor/editPanel.h" #include "graphicsDataModel/diagramEditorModel.h" @@ -110,10 +110,18 @@ void DiagramCavas::onSignal_savePage() case QMessageBox::Save: //todo:已存在更新 { QMap map = pPanel->getModelController()->allItems(); + QList updatedModel; //更新过图标的模型 for(auto pItem:map) { BaseProperty* pData = dynamic_cast(pItem->getProperty()); if(pData){ + QString sMeta = pData->metaModelName(); + QString sModel = pData->modelName(); + if(!updatedModel.contains(sModel)){ + ProjectModelManager::instance().updateSetting(sMeta,sModel); //更新使用的图标数据 + updatedModel.append(sModel); + } + if(pItem->itemChanged() || pData->dataChanged()) { pItem->updateConnectData(); //更新连接状态 @@ -340,6 +348,21 @@ void DiagramCavas::removePanel(PowerEntity* pEntity) } } +void DiagramCavas::autoSetModelName(GraphicsBaseModelItem* pItem) +{ + ModelProperty* p = pItem->getProperty(); + BaseModelProperty* pro = dynamic_cast(p); + if(pro){ + QString sMeta = pro->metaModelName(); + QString sModel = sMeta+"_"+_curPage; + bool exist = ProjectModelManager::instance().getData()[sMeta].contains(sModel); + if(exist){ + pro->setModelName(sModel); + pro->getModelProperty().modelSetting.modelName = sModel; + } + } +} + void DiagramCavas::onCreateTestBaseModelDiagram() { PowerEntity* pEntity; @@ -424,6 +447,7 @@ void DiagramCavas::onSignal_wizardFinished(QString sName,QMapsetPos(pItem->pos()); pPanel->getModelController()->addBaseItem(cloneItem->itemId(),cloneItem); pPro->setDataChanged(true); + autoSetModelName(cloneItem); if(pPro->type() != 8){ PowerEntity* pEntity = TopologyManager::instance().findEntity(pPro->uuid().toString(),ModelFunctionType::BaseModel); diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp index d5d0e73..e60f225 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp @@ -256,7 +256,8 @@ void DiagramEditorBayDetailSettingDlg::onOkClicked() else if(nLayout == 1){ //横,右下 nDir = 14; } - QRectF recBounding = getModel()->updateTarget(_curBayInfo.mapRoute,_curBayInfo.mapComponent,nDir,0,true,false); + getModel()->clearCompoDir(_curBayInfo.mapRoute,_curBayInfo.mapComponent,0); + QRectF recBounding = getModel()->updateTarget(_curBayInfo.mapRoute,_curBayInfo.mapComponent,nDir,0,false); if(_curOperateObj->getRecSize().isEmpty()) _curOperateObj->setRecSize(recBounding); _curOperateObj->setBayInfo(_curBayInfo); diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp index a13467b..4953ab3 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp @@ -45,6 +45,7 @@ void DiagramEditorBayPreviewDlg::showDlg(int nLayout) else if(nLayout == 1){ //横,右下 nDir = 14; } + _pParent->getModel()->clearCompoDir(_pParent->getBayInfo().mapRoute,_pParent->getBayInfo().mapComponent,0); _pParent->getModel()->updateTarget(_pParent->getBayInfo().mapRoute,_pParent->getBayInfo().mapComponent,nDir,0); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp index 356df25..8f8c114 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp @@ -33,6 +33,7 @@ void DiagramEditorPreviewDlg::initial() _pScene = new EditPreviewScene(this); _pScene->setSceneRect(_pParent->getScene()->sceneRect()); //使用父窗口scene大小 _pView->setScene(_pScene); + _pView->centerOn(QPointF(0,0)); } void DiagramEditorPreviewDlg::showDlg() diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp index 23b48c5..5cb805a 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp @@ -275,11 +275,19 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() QRectF rec2; QRectF rec3; QRectF result; + + if(_transInfo.mapNeutral.contains(0)) + getModel()->clearCompoDir(_transInfo.mapNeutral[0].mapRoute,_transInfo.mapComponent,1); + if(_transInfo.mapNeutral.contains(1)) + getModel()->clearCompoDir(_transInfo.mapNeutral[1].mapRoute,_transInfo.mapComponent,1); + if(_transInfo.mapNeutral.contains(2)) + getModel()->clearCompoDir(_transInfo.mapNeutral[2].mapRoute,_transInfo.mapComponent,1); + if(_transInfo.mapNeutral.contains(0)){ QPointF delta = QPointF(100,-25); _transInfo.mapNeutral[0].nType = 0; _transInfo.mapNeutral[0].delPoint = delta; - rec1 = getModel()->updateTarget(_transInfo.mapNeutral[0].mapRoute,_transInfo.mapComponent,18,1,true,false); //1右2上 + rec1 = getModel()->updateTarget(_transInfo.mapNeutral[0].mapRoute,_transInfo.mapComponent,14,1,false); //1右2下 rec1.translate(delta); //相对trans偏移 result = result.united(rec1); } @@ -287,7 +295,7 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() QPointF delta = QPointF(-150,0); _transInfo.mapNeutral[1].nType = 1; _transInfo.mapNeutral[1].delPoint = delta; - rec2 = getModel()->updateTarget(_transInfo.mapNeutral[1].mapRoute,_transInfo.mapComponent,14,1,true,false); //1右2下 + rec2 = getModel()->updateTarget(_transInfo.mapNeutral[1].mapRoute,_transInfo.mapComponent,24,1,false); //1左2下 rec2.translate(delta); result = result.united(rec2); } @@ -295,7 +303,7 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() QPointF delta = QPointF(100,25); _transInfo.mapNeutral[2].nType = 2; _transInfo.mapNeutral[2].delPoint = delta; - rec3 = getModel()->updateTarget(_transInfo.mapNeutral[2].mapRoute,_transInfo.mapComponent,24,1,true,false); //1左2下 + rec3 = getModel()->updateTarget(_transInfo.mapNeutral[2].mapRoute,_transInfo.mapComponent,14,1,false); //1右2下 rec3.translate(delta); result = result.united(rec3); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp index 43cb901..23bc930 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp @@ -44,11 +44,19 @@ void DiagramEditorTransPreviewDlg::showDlg(int nType) void DiagramEditorTransPreviewDlg::updateModelData(int nType) { if(nType == 0 || nType == 1 || nType == 2){ - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[nType].mapRoute,_pParent->getTransInfo().mapComponent,14,1); //1右2下 + _pParent->getModel()->clearCompoDir(_pParent->getTransInfo().mapNeutral[nType].mapRoute,_pParent->getTransInfo().mapComponent,1); + if(nType == 0 || nType == 2) + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[nType].mapRoute,_pParent->getTransInfo().mapComponent,14,1); //1右2下 + else if(nType == 1) + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[nType].mapRoute,_pParent->getTransInfo().mapComponent,24,1); //1左2下 } else if(nType == 3){ //整个变压器 - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[0].mapRoute,_pParent->getTransInfo().mapComponent,18,1); //1右2上 - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[1].mapRoute,_pParent->getTransInfo().mapComponent,14,1); //1右2下 - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[2].mapRoute,_pParent->getTransInfo().mapComponent,24,1); //1左2下 + _pParent->getModel()->clearCompoDir(_pParent->getTransInfo().mapNeutral[0].mapRoute,_pParent->getTransInfo().mapComponent,1); + _pParent->getModel()->clearCompoDir(_pParent->getTransInfo().mapNeutral[1].mapRoute,_pParent->getTransInfo().mapComponent,1); + _pParent->getModel()->clearCompoDir(_pParent->getTransInfo().mapNeutral[2].mapRoute,_pParent->getTransInfo().mapComponent,1); + + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[0].mapRoute,_pParent->getTransInfo().mapComponent,14,1); //1右2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[1].mapRoute,_pParent->getTransInfo().mapComponent,24,1); //1左2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[2].mapRoute,_pParent->getTransInfo().mapComponent,14,1); //1右2下 } } diff --git a/diagramCavas/source/graphicsDataModel/baseModel.cpp b/diagramCavas/source/graphicsDataModel/baseModel.cpp index 2457122..c876902 100644 --- a/diagramCavas/source/graphicsDataModel/baseModel.cpp +++ b/diagramCavas/source/graphicsDataModel/baseModel.cpp @@ -28,11 +28,16 @@ void BaseModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,ModelFunctionT case T_lineInOut: terType = TerminalType::PowerConnect; break; + case T_newTral: + terType = TerminalType::NewTral; + break; default: break; } QPointF f = port->pos(); - TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType); + auto pTer = TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType); + if(pTer) + pTer->setPortLocate(port->portPos()); } } } @@ -241,24 +246,193 @@ template void BaseModel::establishConnection(GraphicsBaseItem else { QMap mapSrc = pSrc->getPorts(); + QMap mapDest = pDest->getPorts(); pSrcPort = nullptr; - for(auto& port:mapSrc) - { - if(port->getType() == T_lineOut) - { - pSrcPort = port; - break; + pDestPort = nullptr; + + if(nMode == 1){ //连接中性点 + if(nTypeSrc == 15 || nTypeSrc == 16){ //src是变压器中性点 + for(auto& port:mapSrc) //连接中性点 + { + int nTpe = port->getType(); + int nPos = port->portPos(); + if(nTpe == T_newTral){ + if(nParam == 0){ + if(nPos == P_top){ + pSrcPort = port; + } + } + else if(nParam == 1){ + if(nPos == P_left || nPos == P_right){ + pSrcPort = port; + } + } + else if(nParam == 2){ + if(nPos == P_down){ + pSrcPort = port; + } + } + } + } + + for(auto& port:mapDest) + { + if(port->getType() == T_lineIn) + { + pDestPort = port; + break; + } + } + } + else if(nTypeDest == 15 || nTypeDest == 16){ //dest是变压器中性点 + + for(auto& port:mapSrc) + { + if(port->getType() == T_lineIn) //始终从中性点出 + { + pSrcPort = port; + break; + } + } + + for(auto& port:mapDest) //连接中性点 + { + int nTpe = port->getType(); + int nPos = port->portPos(); + if(nTpe == T_newTral){ + if(nParam == 0){ + if(nPos == P_top){ + pDestPort = port; + } + } + else if(nParam == 1){ + if(nPos == P_left || nPos == P_right){ + pDestPort = port; + } + } + else if(nParam == 2){ + if(nPos == P_down){ + pDestPort = port; + } + } + } + } } } + else if(nMode == 2){ //连接变压器 + if(nTypeSrc == 15 || nTypeSrc == 16){ //src是变压器 + for(auto& port:mapSrc) + { + int nTpe = port->getType(); + int nPos = port->portPos(); + if(nTpe != T_newTral){ + if(nParam == 0){ + if(nPos == P_top){ + pSrcPort = port; + } + } + else if(nParam == 1){ + if(nPos == P_left || nPos == P_right){ + pSrcPort = port; + } + } + else if(nParam == 2){ + if(nPos == P_down){ + pSrcPort = port; + } + } + } + } - QMap mapDest = pDest->getPorts(); - pDestPort = nullptr; - for(auto& port:mapDest) - { - if(port->getType() == T_lineIn) + int transType = 0; + if(pSrcPort){ + transType = pSrcPort->getType(); + } + for(auto& port:mapDest) //根据变压器端点选择连接端点类型 + { + if(transType == T_lineOut) + { + if(port->getType() == T_lineIn) + { + pDestPort = port; + break; + } + } + else{ + if(port->getType() == T_lineOut) + { + pDestPort = port; + break; + } + } + } + } + else if(nTypeDest == 15 || nTypeDest == 16){ //dest是变压器 + + for(auto& port:mapDest) + { + int nTpe = port->getType(); + int nPos = port->portPos(); + if(nTpe != T_newTral){ + if(nParam == 0){ + if(nPos == P_top){ + pDestPort = port; + } + } + else if(nParam == 1){ + if(nPos == P_left || nPos == P_right){ + pDestPort = port; + } + } + else if(nParam == 2){ + if(nPos == P_down){ + pDestPort = port; + } + } + } + } + + int transType = 0; + if(pDestPort){ + transType = pDestPort->getType(); + } + for(auto& port:mapSrc) //根据变压器端点选择连接端点类型 + { + if(transType == T_lineOut) + { + if(port->getType() == T_lineIn) + { + pSrcPort = port; + break; + } + } + else{ + if(port->getType() == T_lineOut) + { + pSrcPort = port; + break; + } + } + } + } + } + else{ + for(auto& port:mapSrc) { - pDestPort = port; - break; + if(port->getType() == T_lineOut) + { + pSrcPort = port; + break; + } + } + + for(auto& port:mapDest) + { + if(port->getType() == T_lineIn) + { + pDestPort = port; + break; + } } } } diff --git a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp index fe270a8..d79c4a3 100644 --- a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp +++ b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp @@ -18,6 +18,9 @@ #include "diagramEditor/diagramEditorWizard.h" #include "diagramEditor/diagramEditorStructContainer.h" +int g_nCompoWidth = 50; //元件默认宽度(计算布局使用) +int g_nCompoHeight = 50; + DiagramEditorModel::DiagramEditorModel() :_pCurBayRoute(nullptr) ,_pCurBayComponent(nullptr) @@ -115,11 +118,16 @@ void DiagramEditorModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,Model case T_lineInOut: terType = TerminalType::PowerConnect; break; + case T_newTral: + terType = TerminalType::NewTral; + break; default: break; } QPointF f = port->pos(); - TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType,port->getXPercent(),port->getYPercent()); + auto pTer = TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType,port->getXPercent(),port->getYPercent()); + if(pTer) + pTer->setPortLocate(port->portPos()); } } } @@ -347,16 +355,21 @@ void DiagramEditorModel::generateTempTrans(int nType,DiagramEditorTransformerBlo if(typ == TransformerType::twoWinding){ generateItemByModel(_pCurTransLRoutes.value(0),1,QPoint(100,-25)); generateItemByModel(_pCurTransLRoutes.value(2),1,QPoint(100,25)); - pInfo.mapNeutral[0].delPoint = QPoint(100,-25); - pInfo.mapNeutral[2].delPoint = QPoint(100,25); + if(pInfo.mapNeutral.contains(0)) + pInfo.mapNeutral[0].delPoint = QPoint(100,-25); + if(pInfo.mapNeutral.contains(2)) + pInfo.mapNeutral[2].delPoint = QPoint(100,25); } else if(typ == TransformerType::threeWinding){ generateItemByModel(_pCurTransLRoutes.value(0),1,QPoint(100,-25)); generateItemByModel(_pCurTransLRoutes.value(1),1,QPoint(-150,0)); generateItemByModel(_pCurTransLRoutes.value(2),1,QPoint(100,25)); - pInfo.mapNeutral[0].delPoint = QPoint(100,-25); - pInfo.mapNeutral[1].delPoint = QPoint(-150,0); - pInfo.mapNeutral[2].delPoint = QPoint(100,25); + if(pInfo.mapNeutral.contains(0)) + pInfo.mapNeutral[0].delPoint = QPoint(100,-25); + if(pInfo.mapNeutral.contains(1)) + pInfo.mapNeutral[1].delPoint = QPoint(-150,0); + if(pInfo.mapNeutral.contains(2)) + pInfo.mapNeutral[2].delPoint = QPoint(100,25); } connectTransToNeutral(block); @@ -646,7 +659,7 @@ void DiagramEditorModel::calculateBlockPos() pCon->setMidUpY(deltaY); pCon->setMidDownY(deltaY+50); pCon->setStartX(dDeltaX); - dDeltaX += pCon->getWidth(); + dDeltaX += pCon->getWidth()+100; //计算container中block中心点的位置 auto mapBlocks = pCon->getBlockMap(); @@ -820,10 +833,12 @@ void DiagramEditorModel::refreshConnection() auto pFromData = pFromItem->getProperty(); auto pToData = pToItem->getProperty(); if(pFromData->type() == 1){ //from是母线 - pFromItem->movePort(fromTerId,pFromItem->mapFromScene(calculateBusPortPos(pFromItem,pToItem))); + QPointF p = calculateBusPortPos(pFromItem,pToItem); + pFromItem->movePort(fromTerId,pFromItem->mapFromScene(p)); } else if(pToData->type() == 1){ //to是母线 - pToItem->movePort(toTerId,pToItem->mapFromScene(calculateBusPortPos(pToItem,pFromItem))); + QPointF p = calculateBusPortPos(pToItem,pFromItem); + pToItem->movePort(toTerId,pToItem->mapFromScene(p)); } auto portsFrom = pFromItem->getPorts(); @@ -835,6 +850,15 @@ void DiagramEditorModel::refreshConnection() pLine->setStartPoint(pFrom->scenePos()); pLine->setEndPoint(pTo->scenePos()); pLine->calculatePath(); + + PowerTerminal* pTopoFrom = TopologyManager::instance().getTerminal(fromTerId,ModelFunctionType::EditorModel); + PowerTerminal* pTopoTo = TopologyManager::instance().getTerminal(toTerId,ModelFunctionType::EditorModel); + if(pTopoFrom && pTopoTo){ + QPointF p1 = pFrom->pos(); + QPointF p2 = pTo->pos(); + pTopoFrom->setRelativePosition(p1); + pTopoTo->setRelativePosition(p2); + } } } } @@ -1059,47 +1083,48 @@ void DiagramEditorModel::generateOutConnection(QList } } -QRectF DiagramEditorModel::updateTarget(QMap& data,QMap& compos,int nLayout,int nSource,bool regenerate,bool saveToModel) +void DiagramEditorModel::clearCompoDir(QMap& data,QMap& compos,int nSource) +{ + for(auto &routeInfo:data){ + routeInfo.lstOrder.clear(); + routeInfo.lstReverse.clear(); + for(auto &compo:routeInfo.lstCompo){ + compo.nUsedDirection = 0; + + auto pItemName = getNameItem(compo.sName,nSource); + if(pItemName){ //手动清空item数据 + int nVal = pItemName->data().toInt(); + pItemName->setData(QString::number(0)); //在公用模型中更新设备方向占用(重要) + //pItemName->setData(QPoint(0,0),Qt::UserRole+2); //设置相对位置 + pItemName->setData(0,Qt::UserRole+5); //旋转 + } + } + + for(auto &compoInfo:compos){ + compoInfo.nUsedDirection = 0; + compoInfo.nRotate = 0; + } + } + /*for(auto &routeInfo:data){ + routeInfo.lstOrder.clear(); + routeInfo.lstReverse.clear(); + for(auto &compo:routeInfo.lstCompo){ + compo.nUsedDirection = 0; + } + } + + for(auto &compoInfo:compos){ + compoInfo.nUsedDirection = 0; + compoInfo.nRotate = 0; + }*/ +} + +QRectF DiagramEditorModel::updateTarget(QMap& data,QMap& compos,int nLayout,int nSource,bool saveToModel) { QRectF recBounding; //包含所有元件的矩形 auto& mapRoute = data; QString sMainRoute; - if(regenerate){ //清空方位数据 - if(saveToModel){ - for(auto &routeInfo:data){ - routeInfo.lstOrder.clear(); - routeInfo.lstReverse.clear(); - for(auto &compo:routeInfo.lstCompo){ - compo.nUsedDirection = 0; - - auto pItemName = getNameItem(compo.sName,nSource); - if(pItemName){ //手动清空item数据 - int nVal = pItemName->data().toInt(); - pItemName->setData(QString::number(0)); //在公用模型中更新设备方向占用(重要) - //pItemName->setData(QPoint(0,0),Qt::UserRole+2); //设置相对位置 - pItemName->setData(0,Qt::UserRole+5); //旋转 - } - } - } - } - else{ - for(auto &routeInfo:data){ - routeInfo.lstOrder.clear(); - routeInfo.lstReverse.clear(); - for(auto &compo:routeInfo.lstCompo){ - compo.nUsedDirection = 0; - } - } - - for(auto &compoInfo:compos){ - compoInfo.nUsedDirection = 0; - compoInfo.nRotate = 0; - //compoInfo.deltaPos = QPoint(0,0); - } - } - } - bool hasMain = false; for(auto& route:mapRoute){ if(route.bMainRoute == true){ @@ -2123,15 +2148,15 @@ QRectF DiagramEditorModel::updateTarget(QMap& da if(!points.empty()){ qreal minX = points[0].x(); - qreal maxX = points[0].x(); + qreal maxX = points[0].x()+g_nCompoWidth; qreal minY = points[0].y(); - qreal maxY = points[0].y(); + qreal maxY = points[0].y()+g_nCompoHeight; for (const QPointF& point : points) { minX = qMin(minX, point.x()); - maxX = qMax(maxX, point.x()); + maxX = qMax(maxX, point.x()+g_nCompoWidth); minY = qMin(minY, point.y()); - maxY = qMax(maxY, point.y()); + maxY = qMax(maxY, point.y()+g_nCompoHeight); } recBounding = QRectF(QPointF(minX, minY), QPointF(maxX, maxY)); diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index 191b294..6ec7ee7 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -6,6 +6,7 @@ #include "graphicsItem/electricConnectLineItem.h" #include "graphicsItem/electricPortItem.h" #include "graphicsItem/electricSvgGroupCT.h" +#include "graphicsItem/electricSvgGroupPT.h" #include "graphicsItem/electricSvgItemDS.h" #include "graphicsItem/electricSvgItemES.h" #include "graphicsItem/electricSvgItemFES.h" @@ -39,6 +40,7 @@ #include "projectModelSetting.h" #include "bayManagerDlg.h" #include "projectModelManager.h" +#include "projectIconSetting.h" #include "global.h" bool FixedPortsModel::_dataInitialised = false; @@ -49,6 +51,7 @@ FixedPortsModel::FixedPortsModel(PowerEntity* pEntity) ,_Interface(nullptr) ,_pEntity(pEntity) ,m_proModelSettingDlg(nullptr) + ,m_projectIconSettingDlg(nullptr) ,m_pBayManager(nullptr) { _cavas = nullptr; @@ -156,7 +159,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[3].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["cb"]; } if(width == 0 && height == 0){ @@ -168,21 +171,11 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pCb = new ElectricSvgItemRect(QRect(0, 0, dX, dY),false); + auto pCb = new ElectricSvgItemRect(QRect(-dX*0.5, -dY*0.5, dX, dY),false); pCb->setItemType(GIT_itemRect); pCb->loadSvg(svg); item = pCb; QJsonArray portArr = pro->context()["port"].toArray(); - /*for(QJsonValueRef portJson:portArr) - { - QJsonObject portObj = portJson.toObject(); - QString portId = portObj["portId"].toString(); - int x = portObj["x"].toInt(); - int y = portObj["y"].toInt(); - HandleType tye = HandleType(portObj["portType"].toInt()); - PortPos locate = PortPos(portObj["locate"].toInt()); - item->addPort(P_const,QPointF(x,y),portId,tye,locate); - }*/ addPortsToItem_json(P_const,portArr,item); } else if(type == GIT_node) @@ -192,14 +185,6 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width item = pNode; QJsonArray portArr = pro->context()["port"].toArray(); - /*for(QJsonValueRef portJson:portArr) - { - QJsonObject portObj = portJson.toObject(); - QString portId = portObj["portId"].toString(); - int x = portObj["x"].toInt(); - int y = portObj["y"].toInt(); - item->addPort(p_movable,QPointF(x,y),portId); - }*/ addPortsToItem_json(p_movable,portArr,item); } else if(type == GIT_bus) @@ -210,7 +195,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[1].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["bus"]; } if(width == 0 && height == 0){ @@ -258,9 +243,8 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pCt = new ElectricSvgGroupCT(QRect(0, 0, dX, dY)); + auto pCt = new ElectricSvgGroupCT(QRect(-dX*0.5, -dY*0.5, dX, dY)); pCt->setItemType(GIT_ctGroup); - pCt->loadSvg(svg); item = pCt; QJsonArray portArr = pro->context()["port"].toArray(); @@ -274,7 +258,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[7].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["ds"]; } if(width == 0 && height == 0){ @@ -286,7 +270,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pDs = new ElectricSvgItemDS(QRect(0, 0, dX, dY)); + auto pDs = new ElectricSvgItemDS(QRect(-dX*0.5, -dY*0.5, dX, dY)); pDs->setItemType(GIT_DS); pDs->loadSvg(svg); item = pDs; @@ -302,7 +286,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[8].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["es"]; } if(width == 0 && height == 0){ @@ -314,7 +298,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pEs = new ElectricSvgItemES(QRect(0, 0, dX, dY)); + auto pEs = new ElectricSvgItemES(QRect(-dX*0.5, -dY*0.5, dX, dY)); pEs->setItemType(GIT_ES); pEs->loadSvg(svg); item = pEs; @@ -330,7 +314,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[9].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["fes"]; } if(width == 0 && height == 0){ @@ -342,7 +326,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pFes = new ElectricSvgItemFES(QRect(0, 0, dX, dY)); + auto pFes = new ElectricSvgItemFES(QRect(-dX*0.5, -dY*0.5, dX, dY)); pFes->setItemType(GIT_FES); pFes->loadSvg(svg); item = pFes; @@ -358,7 +342,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[10].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["dteds"]; } if(width == 0 && height == 0){ @@ -370,7 +354,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pDteds = new ElectricSvgItemDTEDS(QRect(0, 0, dX, dY)); + auto pDteds = new ElectricSvgItemDTEDS(QRect(-dX*0.5, -dY*0.5, dX, dY)); pDteds->setItemType(GIT_DTEDS); pDteds->loadSvg(svg); item = pDteds; @@ -386,7 +370,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[11].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["potential_indicator"]; } if(width == 0 && height == 0){ @@ -398,7 +382,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pPi = new ElectricSvgItemPI(QRect(0, 0, dX, dY)); + auto pPi = new ElectricSvgItemPI(QRect(-dX*0.5, -dY*0.5, dX, dY)); pPi->setItemType(GIT_PI); pPi->loadSvg(svg); item = pPi; @@ -414,7 +398,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[12].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["lightning_arrester"]; } if(width == 0 && height == 0){ @@ -426,7 +410,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pLa = new ElectricSvgItemLA(QRect(0, 0, dX, dY)); + auto pLa = new ElectricSvgItemLA(QRect(-dX*0.5, -dY*0.5, dX, dY)); pLa->setItemType(GIT_LA); pLa->loadSvg(svg); item = pLa; @@ -442,7 +426,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[13].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["cable_termination"]; } if(width == 0 && height == 0){ @@ -454,7 +438,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pCt = new ElectricSvgItemCableTer(QRect(0, 0, dX, dY)); + auto pCt = new ElectricSvgItemCableTer(QRect(-dX*0.5, -dY*0.5, dX, dY)); pCt->setItemType(GIT_cableTer); pCt->loadSvg(svg); item = pCt; @@ -470,7 +454,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width svg = DataBase::GetInstance()->ModelType()[14].icon; } else{ - svg = model.modelSetting.mapSvg.first(); + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["cable_end"]; } if(width == 0 && height == 0){ @@ -482,7 +466,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width dY = height; } - auto pCe = new ElectricSvgItemCableEnd(QRect(0, 0, dX, dY)); + auto pCe = new ElectricSvgItemCableEnd(QRect(-dX*0.5, -dY*0.5, dX, dY)); pCe->setItemType(GIT_cableEnd); pCe->loadSvg(svg); item = pCe; @@ -490,7 +474,62 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width addPortsToItem_json(P_const,portArr,item); } + else if(type == GIT_2wTransformer) + { + PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel]; + QByteArray svg; + if(model.modelSetting.mapSvg.isEmpty()){ + svg = DataBase::GetInstance()->ModelType()[15].icon; + } + else{ + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["transformer_2w"]; + } + if(width == 0 && height == 0){ + dX = 100; + dY = 100; + } + else{ + dX = width; + dY = height; + } + + auto p2w = new ElectricSvgItem2wTransformer(QRect(-dX*0.5, -dY*0.5, dX, dY)); + p2w->setItemType(GIT_2wTransformer); + p2w->loadSvg(svg); + item = p2w; + QJsonArray portArr = pro->context()["port"].toArray(); + + addPortsToItem_json(P_const,portArr,item); + } + else if(type == GIT_3wTransformer) + { + PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel]; + QByteArray svg; + if(model.modelSetting.mapSvg.isEmpty()){ + svg = DataBase::GetInstance()->ModelType()[15].icon; + } + else{ + svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["transformer_3w"]; + } + + if(width == 0 && height == 0){ + dX = 100; + dY = 100; + } + else{ + dX = width; + dY = height; + } + + auto p3w = new ElectricSvgItem3wTransformer(QRect(-dX*0.5, -dY*0.5, dX, dY)); + p3w->setItemType(GIT_3wTransformer); + p3w->loadSvg(svg); + item = p3w; + QJsonArray portArr = pro->context()["port"].toArray(); + + addPortsToItem_json(P_const,portArr,item); + } if(item) { item->setItemId(id); @@ -974,6 +1013,9 @@ void FixedPortsModel::onSignal_generateDiagram(const QString& sName) for(auto& item:_baseItem){ BaseModelProperty* pBase = dynamic_cast(item->getProperty()); if(pBase){ + int nType = pBase->type(); + if(nType == 0) //为节点等无属性对象时跳过 + continue; QString sModel = pBase->getModelProperty().modelSetting.modelName; if(sModel.isEmpty()){ lstInfo.append(pBase->name()); @@ -1023,8 +1065,8 @@ void FixedPortsModel::addPortsToItem_json(PortState sta,QJsonArray jArr,Graphics { QJsonObject portObj = portJson.toObject(); QString portId = portObj["portId"].toString(); - int x = portObj["x"].toInt(); - int y = portObj["y"].toInt(); + double x = portObj["x"].toDouble(); + double y = portObj["y"].toDouble(); if(sta == P_const){ HandleType tye = HandleType(portObj["portType"].toInt()); PortPos locate = PortPos(portObj["locate"].toInt()); @@ -1151,10 +1193,15 @@ void FixedPortsModel::createTopoTerminalsByData(PowerEntity* pParent,QJsonObject case T_lineInOut: terType = TerminalType::PowerConnect; break; + case T_newTral: + terType = TerminalType::NewTral; + break; default: break; } - TopologyManager::instance().createTerminal(pParent->id(),terType,"",QPointF(x,y),portId,funType); + auto pTer = TopologyManager::instance().createTerminal(pParent->id(),terType,"",QPointF(x,y),portId,funType); + if(pTer) + pTer->setPortLocate(locate); } } @@ -1171,6 +1218,35 @@ void FixedPortsModel::insertProjectModelName(QString uuid,QString name) if(!_projectModelName.contains(uuid)) _projectModelName.insert(uuid,name); } + +void FixedPortsModel::showProjectIconSettingDlg(GraphicsProjectModelItem* pItem) +{ + if(m_projectIconSettingDlg == nullptr) + { + m_projectIconSettingDlg = new ProjectIconSetting(_widget); + m_projectIconSettingDlg->setController(this); + } + m_projectIconSettingDlg->showDlg(pItem); +} + +void FixedPortsModel::updateItemIcon(QString sMeta,QString sModel) +{ + for(auto &pItem:_nodeItem){ + auto pro = pItem->getProperty(); + QString sMe = pro->metaModelName(); + QString sMo = pro->modelName(); + if(sMeta == sMe && sModel == sMo){ + auto pI = dynamic_cast(pItem); + auto pG = dynamic_cast(pItem); + if(pI){ + pI->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg); + } + if(pG){ + pG->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg); + } + } + } +} /*********************baseModel**********************/ QMap& FixedPortsModel::allBaseItems() @@ -1308,6 +1384,9 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid()); pPro->setSourceItemId(pBaseItem->itemId().toString()); //设置被哪个对象生成 pPro->setMetaModelName(pBase->metaModelName()); //传递基模名 + + QString sMeta = pBase->metaModelName(); + QString sModel = pBase->modelName(); int type = pBase->graphicsType(); if(type == GIT_baseNode) { @@ -1324,8 +1403,10 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["bus"] = svg; //初始化使用的图标 QRectF rec = pBaseItem->boundingRect(); auto pBus = new ElectricSvgItemBus(rec.toRect()); + pBus->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg); pBus->loadSvg(svg); pProItem = pBus; pProItem->setItemType(GIT_bus); @@ -1339,8 +1420,10 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["cb"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pBreaker = new ElectricSvgItemRect(rec.toRect()); + pBreaker->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg); pBreaker->loadSvg(svg); pProItem = pBreaker; pProItem->setItemType(GIT_itemRect); @@ -1354,14 +1437,35 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["ct"] = svg; + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["zsct"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pCtGroup = new ElectricSvgGroupCT(rec.toRect()); + pCtGroup->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg); pCtGroup->setGroupType(1); pCtGroup->setLayout(1); - pCtGroup->loadSvg(svg); pProItem = pCtGroup; pProItem->setItemType(GIT_ctGroup); } + else if(type == GIT_basePT) + { + QByteArray svg; + if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){ + svg = DataBase::GetInstance()->ModelType()[6].icon; + } + else{ + svg = pBase->getModelProperty().modelSetting.mapSvg.first(); + } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["y"] = svg; + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["z"] = svg; + QRectF rec = pBaseItem->boundingRect(); + auto pPtGroup = new ElectricSvgGroupPT(rec.toRect()); + pPtGroup->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg); + pPtGroup->setGroupType(1); + pPtGroup->setLayout(1); + pProItem = pPtGroup; + pProItem->setItemType(GIT_ctGroup); + } else if(type == GIT_baseES) { QByteArray svg; @@ -1371,8 +1475,10 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["es"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pEs = new ElectricSvgItemES(rec.toRect()); + pEs->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg); pEs->loadSvg(svg); pProItem = pEs; pProItem->setItemType(GIT_ES); @@ -1386,6 +1492,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["ds"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pDs = new ElectricSvgItemDS(rec.toRect()); pDs->loadSvg(svg); @@ -1401,6 +1508,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["fes"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pFes = new ElectricSvgItemFES(rec.toRect()); pFes->loadSvg(svg); @@ -1416,6 +1524,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["dteds"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pDteds = new ElectricSvgItemDTEDS(rec.toRect()); pDteds->loadSvg(svg); @@ -1431,6 +1540,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["potential_indicator"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pPi = new ElectricSvgItemPI(rec.toRect()); pPi->loadSvg(svg); @@ -1446,6 +1556,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["lightning_arrester"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pLa = new ElectricSvgItemLA(rec.toRect()); pLa->loadSvg(svg); @@ -1461,6 +1572,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["cable_termination"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pCt = new ElectricSvgItemCableTer(rec.toRect()); pCt->loadSvg(svg); @@ -1476,6 +1588,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["cable_end"] = svg; QRectF rec = pBaseItem->boundingRect(); auto pCe = new ElectricSvgItemCableEnd(rec.toRect()); pCe->loadSvg(svg); @@ -1491,6 +1604,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["transformer_2w"] = svg; QRectF rec = pBaseItem->boundingRect(); auto p2w = new ElectricSvgItem2wTransformer(rec.toRect()); p2w->loadSvg(svg); @@ -1506,6 +1620,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } + ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["transformer_3w"] = svg; QRectF rec = pBaseItem->boundingRect(); auto p3w = new ElectricSvgItem3wTransformer(rec.toRect()); p3w->loadSvg(svg); @@ -1522,65 +1637,73 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase if(pBase->graphicsType() != GIT_baseLine) //非连接线对象 { - PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,pPro->uuid().toString(),pBase->name()); - QList lstBase = TopologyManager::instance().getTerminalsForEntity(pBase->uuid().toString(),ModelFunctionType::BaseModel); //获取基模的逻辑点 - for(auto& baseTer:lstBase) - { - QUuid uid = QUuid::createUuid(); - double dPerX = baseTer->getPerX(); - double dPerY = baseTer->getPerY(); - PowerTerminal* proTer = TopologyManager::instance().createTerminal(pEntity->id(),baseTer->type(),"",baseTer->relativePosition(),uid.toString(),ModelFunctionType::ProjectModel,dPerX,dPerY); - proTer->setGenerateBy(baseTer->id()); - if(proTer->type() == TerminalType::PowerConnect) + if(pProItem){ + PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,pPro->uuid().toString(),pBase->name()); + QList lstBase = TopologyManager::instance().getTerminalsForEntity(pBase->uuid().toString(),ModelFunctionType::BaseModel); //获取基模的逻辑点 + for(auto& baseTer:lstBase) { - pProItem->addPort(p_movable,proTer->relativePosition(),proTer->id()); - ItemPort* pPort = pProItem->getPortById(proTer->id()); - pPort->setSourcePortId(baseTer->id()); - } - else if(proTer->type() == TerminalType::PowerInput || proTer->type() == TerminalType::PowerOutput) - { - HandleType typ; - if(proTer->type() == TerminalType::PowerInput){ - typ = T_lineIn; - } - else{ - typ = T_lineOut; - } - QPointF pos = proTer->relativePosition(); - PortPos locate; - if(pos.x() < 0) + QUuid uid = QUuid::createUuid(); + double dPerX = baseTer->getPerX(); + double dPerY = baseTer->getPerY(); + QPointF pRelaPos = baseTer->relativePosition(); + PowerTerminal* proTer = TopologyManager::instance().createTerminal(pEntity->id(),baseTer->type(),"",pRelaPos,uid.toString(),ModelFunctionType::ProjectModel,dPerX,dPerY); + proTer->setGenerateBy(baseTer->id()); + if(proTer->type() == TerminalType::PowerConnect) { - locate = P_left; + pProItem->addPort(p_movable,proTer->relativePosition(),proTer->id()); + ItemPort* pPort = pProItem->getPortById(proTer->id()); + pPort->setSourcePortId(baseTer->id()); } - else if(pos.x() > 0) + else if(proTer->type() == TerminalType::NewTral){ + pProItem->addPort(P_const,proTer->relativePosition(),proTer->id(),T_newTral,PortPos(baseTer->getPortLocate())); + ItemPort* pPort = pProItem->getPortById(proTer->id()); + pPort->setSourcePortId(baseTer->id()); + } + else if(proTer->type() == TerminalType::PowerInput || proTer->type() == TerminalType::PowerOutput) { - 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); + HandleType typ; + if(proTer->type() == TerminalType::PowerInput){ + typ = T_lineIn; + } + else{ + typ = T_lineOut; + } + 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()); - pPort->setSourcePortId(baseTer->id()); + ItemPort* pPort = pProItem->getPortById(proTer->id()); + pPort->setSourcePortId(baseTer->id()); + } } + + pProItem->setItemId(QUuid(pEntity->id())); + pProItem->updateHandles(); + pProItem->setPos(pBaseItem->pos()); + 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); } - - pProItem->setItemId(QUuid(pEntity->id())); - pProItem->updateHandles(); - pProItem->setPos(pBaseItem->pos()); - 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); } else //连接线对象 { @@ -1675,8 +1798,11 @@ 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; - pProItem->setModelName(sModel); + //QString sModel = pBase->getModelProperty().modelSetting.modelName; + if(pProItem){ + pProItem->setModelName(sModel); + pProItem->setRotation(pItem->rotation()); + } } } } diff --git a/diagramCavas/source/graphicsItem/electricSvgGroup.cpp b/diagramCavas/source/graphicsItem/electricSvgGroup.cpp index 3177ab0..61fb2a9 100644 --- a/diagramCavas/source/graphicsItem/electricSvgGroup.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgGroup.cpp @@ -102,28 +102,15 @@ void ElectricSvgGroup::move(const QPointF& point) moveBy(point.x(), point.y()); } -void ElectricSvgGroup::loadSvg(const QByteArray& data) +void ElectricSvgGroup::updateMapSvg(QMap map) { - if(_groupType == 0){ //联合 - - } - else if(_groupType == 1){ //聚合 - m_curSvg = data; //保存图片到组 - for(auto pItem:m_childItems){ - auto pSvg = dynamic_cast(pItem); - if(pSvg){ - pSvg->loadSvg(data); - } - } - } + m_mapSvg = map; } void ElectricSvgGroup::addSvgItem(ElectricSvgItem* item) { item->setParentItem(this); // 关键:设置父项 m_childItems.append(item); - if(!m_curSvg.isEmpty()) - item->loadSvg(m_curSvg); updateLayout(); } diff --git a/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp b/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp index c969b80..0daf843 100644 --- a/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgGroupCT.cpp @@ -23,10 +23,13 @@ ElectricSvgGroupCT::~ElectricSvgGroupCT() } -void ElectricSvgGroupCT::setupFinish(int nType,int nSize) +void ElectricSvgGroupCT::setupFinish(QVariant var) { - _nType = nType; - _nSize = nSize; + if(var.canConvert>()){ + QPair pair = var.value>(); + _nType = pair.first; + _nSize = pair.second; + } updateItem(); } @@ -56,6 +59,7 @@ void ElectricSvgGroupCT::updateItem() ElectricSvgItemCT* p = new ElectricSvgItemCT(rec); p->setItemType(_nType); p->setMoveable(false); + p->loadSvg(m_mapSvg["ct"]); addSvgItem(p); } } @@ -63,6 +67,7 @@ void ElectricSvgGroupCT::updateItem() ElectricSvgItemCT* p = new ElectricSvgItemCT(rec); p->setItemType(_nType); p->setMoveable(false); + p->loadSvg(m_mapSvg["zsct"]); addSvgItem(p); } updateTerPos(); diff --git a/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp b/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp new file mode 100644 index 0000000..aed3ec2 --- /dev/null +++ b/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp @@ -0,0 +1,140 @@ +#include "graphicsItem/electricSvgGroupPT.h" +#include "graphicsItem/electricSvgItemPT.h" +#include "global.h" + +#include +#include +#include +#include + +ElectricSvgGroupPT::ElectricSvgGroupPT(const QRect &rect, QGraphicsItem *parent) + : ElectricSvgGroup(rect,parent) +{ + setHandleIfShow(H_textCaption,false); + setHandleVisible(false); + setFunctionHandleIfShow(false); + setFunctionHandleEnaable(false); +} + +ElectricSvgGroupPT::~ElectricSvgGroupPT() +{ + +} + +void ElectricSvgGroupPT::setupFinish(QVariant var) +{ + if(var.canConvert>()){ + QList lst = var.value>(); + m_lstType = lst; + } + updateItem(); +} + +void ElectricSvgGroupPT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + ElectricSvgGroup::paint(painter,option,widget); + + if(m_childItems.isEmpty()){ //无对象时绘制提示框 + QPen pen(Qt::lightGray); + pen.setStyle(Qt::DotLine); + painter->setPen(pen); + painter->drawRect(m_boundingRect); + } +} + +void ElectricSvgGroupPT::updateItem() +{ + for(auto pItem:m_childItems){ + delete pItem; + } + m_childItems.clear(); + + QRect rec(0,0,30,30); + for(int i = 0;i < m_lstType.size();++i){ + + ElectricSvgItemPT* p = new ElectricSvgItemPT(rec); + if(m_lstType[i] == 1){ + p->loadSvg(m_mapSvg["y"]); + p->setItemType(1); + } + else{ + p->loadSvg(m_mapSvg["z"]); + p->setItemType(0); + } + p->setMoveable(false); + addSvgItem(p); + } + updateTerPos(); +} + +void ElectricSvgGroupPT::updateLayout() +{ + if (m_childItems.isEmpty()) return; + + // 获取所有子项 + //QList children = childItems(); + int n = m_childItems.size(); + + if (n == 0) return; + + // 中心点 + QPointF center(0, 0); // 假设以当前item的坐标系中心为布局中心 + + // 圆的半径(假设所有子项大小相同) + qreal radius = m_childItems.first()->boundingRect().width()*0.5; // 根据需要调整 + + // 布局半径(子项中心到布局中心的距离) + qreal layoutRadius = radius * 1; // 根据需要调整 + + switch(n) { + case 1: + // 单个子项放在中心 + m_childItems[0]->setPos(center); + break; + + case 2: + // 两个子项上下排列 + m_childItems[0]->setPos(center.x(), center.y() - layoutRadius); + m_childItems[1]->setPos(center.x(), center.y() + layoutRadius); + break; + + case 3: + // 三个子项三角形排列 + for (int i = 0; i < 3; ++i) { + qreal angle = 2 * M_PI * i / 3 - M_PI / 2; // 从顶部开始 + m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), + center.y() + layoutRadius * sin(angle)); + } + break; + + case 4: + // 四个子项正方形排列 + for (int i = 0; i < 4; ++i) { + qreal angle = 2 * M_PI * i / 4 - M_PI / 4; // 从右上角开始 + m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), + center.y() + layoutRadius * sin(angle)); + } + break; + + case 5: + // 五个子项五角星排列 + for (int i = 0; i < 5; ++i) { + qreal angle = 2 * M_PI * i / 5 - M_PI / 2; // 从顶部开始 + m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), + center.y() + layoutRadius * sin(angle)); + } + break; + + default: + // 对于多于5个的情况,使用圆形排列 + for (int i = 0; i < n; ++i) { + qreal angle = 2 * M_PI * i / n; + m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), + center.y() + layoutRadius * sin(angle)); + } + break; + } + + updateBoundRect(); +} + diff --git a/diagramCavas/source/graphicsItem/electricSvgItem.cpp b/diagramCavas/source/graphicsItem/electricSvgItem.cpp index fdfeaa4..81e3986 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItem.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItem.cpp @@ -113,9 +113,14 @@ void ElectricSvgItem::move(const QPointF& point) moveBy(point.x(), point.y()); } -void ElectricSvgItem::loadSvg(const QByteArray& data) +void ElectricSvgItem::loadSvg(QByteArray b) { - m_pRender = new QSvgRenderer(data); + m_pRender = new QSvgRenderer(b); +} + +void ElectricSvgItem::updateMapSvg(QMap map) +{ + m_mapSvg = map; } void ElectricSvgItem::editShape(int nHandle,const QPointF& ptMouse) diff --git a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp index f839e92..a4dba6d 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp @@ -3,6 +3,7 @@ #include "graphicsItem/itemPort.h" #include "graphicsItem/electricConnectLineItem.h" +#include #include #include #include diff --git a/diagramCavas/source/graphicsItem/electricSvgItemPT.cpp b/diagramCavas/source/graphicsItem/electricSvgItemPT.cpp new file mode 100644 index 0000000..43ee07e --- /dev/null +++ b/diagramCavas/source/graphicsItem/electricSvgItemPT.cpp @@ -0,0 +1,30 @@ +#include "graphicsItem/electricSvgItemPT.h" +#include "global.h" + +#include +#include +#include +#include +#include + +ElectricSvgItemPT::ElectricSvgItemPT(const QRect &rect, QGraphicsItem *parent) + : ElectricSvgItem(rect,parent) +{ + setFlag(QGraphicsItem::ItemIsSelectable, false); + setFlag(QGraphicsItem::ItemIsFocusable, false); + setAcceptedMouseButtons(Qt::NoButton); +} + +ElectricSvgItemPT::~ElectricSvgItemPT() +{ + +} + +void ElectricSvgItemPT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + if (!m_pRender || !m_pRender->isValid()) + return; + m_pRender->render(painter, m_boundingRect); +} + + diff --git a/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp b/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp index 74c3492..3ee2156 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp @@ -2,6 +2,7 @@ #include "graphicsItem/itemPort.h" #include "global.h" +#include #include #include #include @@ -32,7 +33,6 @@ ElectricSvgItemRect::~ElectricSvgItemRect() } - void ElectricSvgItemRect::updateHandles() { ElectricSvgItem::updateHandles(); diff --git a/diagramCavas/source/itemPropertyDlg.cpp b/diagramCavas/source/itemPropertyDlg.cpp index 55c405f..6f4cdad 100644 --- a/diagramCavas/source/itemPropertyDlg.cpp +++ b/diagramCavas/source/itemPropertyDlg.cpp @@ -23,7 +23,7 @@ ItemPropertyDlg::ItemPropertyDlg(QWidget *parent) ,_curModelController(nullptr) { ui->setupUi(this); - this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + this->setWindowFlags(Qt::FramelessWindowHint |Qt::WindowStaysOnTopHint | windowFlags()); initial(); } @@ -88,8 +88,7 @@ void ItemPropertyDlg::onOkClicked() if(!mapPro.empty()) DataManager::instance().updateModelData(_curModel,curUuid_,iter.key(),mapPro); - - if(nType == 4){ //ct + if(nType == 4 && iter.key() == "base_extend"){ //ct int nCtSize = 0; //ct设置的个数 int nCtType = 0; //ct类型 1三相0零相 if(mapPro.contains("ct_winding")){ @@ -105,11 +104,34 @@ void ItemPropertyDlg::onOkClicked() nCtType = val.defaultValue.toInt(); } - if(_curItem){ - _curItem->setupFinish(nCtType,nCtSize); + QPair pair(nCtType,nCtSize); + QVariant var = QVariant::fromValue(pair); + _curItem->setupFinish(var); + } + else if(nType == 5 && iter.key() == "base_extend"){ //pt + QList lst; //二次绕组接法 + if(mapPro.contains("pt_sec_winding")){ + propertyStateInfo val = mapPro.value("pt_sec_winding"); + QJsonObject obj = val.defaultValue.toJsonObject(); + QJsonArray arr = obj["winding"].toArray(); + for (QJsonValueRef jsonObj : arr) + { + QJsonObject node = jsonObj.toObject(); + QString sWinding = node["windingConnectionMethod"].toString(); + if(sWinding == "Y"){ + lst.append(1); + } + else{ + lst.append(0); + } + } + + QVariant var = QVariant::fromValue(lst); + _curItem->setupFinish(var); } } } + _curItem = nullptr; hide(); } @@ -152,7 +174,9 @@ void ItemPropertyDlg::createGroupView(const QString& str) BaseContentDlg* contentDlg = nullptr; BaseProperty* pPro = BasePropertyManager::instance().findEntityData(curUuid_); if(str == QString("component") || str == QString::fromWCharArray(L"基本信息")){ - contentDlg = new BaseInfoDlg(ui->stackedWidget); + auto pDlg = new BaseInfoDlg(ui->stackedWidget); + pDlg->setParentDlg(this); + contentDlg = pDlg; } else if(str == "base_extend" || str == QString::fromWCharArray(L"扩展信息")){ if(pPro->type() == 4) diff --git a/diagramCavas/source/projectIconSelectionDlg.cpp b/diagramCavas/source/projectIconSelectionDlg.cpp new file mode 100644 index 0000000..4e087c3 --- /dev/null +++ b/diagramCavas/source/projectIconSelectionDlg.cpp @@ -0,0 +1,54 @@ +#include "projectIconSelectionDlg.h" +#include +#include +#include + +ProjectIconSelectionDlg::ProjectIconSelectionDlg(const QMap mapSvg,QWidget* parent) + : QDialog(parent),svgMap(mapSvg) +{ + + this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint| windowFlags()); + setWindowTitle("选择SVG图标"); + resize(400, 300); + + QVBoxLayout* layout = new QVBoxLayout(this); + + listWidget = new QListWidget(this); + listWidget->setIconSize(QSize(32, 32)); + listWidget->setViewMode(QListWidget::IconMode); + listWidget->setResizeMode(QListWidget::Adjust); + listWidget->setStyleSheet( + "QListWidget::item:selected {" + " background: #4e72b8;" + " color: palette(HighlightedText);" + "}" + ); + + for (auto& svgData : svgMap) { + QSvgRenderer renderer(svgData); + QPixmap pixmap(32, 32); + pixmap.fill(Qt::white); + QPainter painter(&pixmap); + renderer.render(&painter); + + QListWidgetItem* item = new QListWidgetItem(QIcon(pixmap), ""); + item->setData(Qt::UserRole, svgData); + listWidget->addItem(item); + } + + QDialogButtonBox* buttonBox = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); + + layout->addWidget(listWidget); + layout->addWidget(buttonBox); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +} + +QByteArray ProjectIconSelectionDlg::selectedSVG() const { + if (listWidget->currentItem()) { + return listWidget->currentItem()->data(Qt::UserRole).toByteArray(); + } + return QByteArray(); +} diff --git a/diagramCavas/source/projectIconSetting.cpp b/diagramCavas/source/projectIconSetting.cpp new file mode 100644 index 0000000..1e39664 --- /dev/null +++ b/diagramCavas/source/projectIconSetting.cpp @@ -0,0 +1,139 @@ +#include "projectIconSetting.h" +#include "ui_projectIconSetting.h" +#include "graphicsDataModel/fixedPortsModel.h" +#include "projectIconSelectionDlg.h" +#include "graphicsItem/graphicsBaseItem.h" +#include "baseProperty.h" +#include "projectModelManager.h" +#include +#include + +ProjectIconSetting::ProjectIconSetting(QWidget *parent) + : QDialog(parent) + , ui(new Ui::projectIconSetting) + ,_controller(nullptr) +{ + ui->setupUi(this); + this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | windowFlags()); + initial(); +} + +ProjectIconSetting::~ProjectIconSetting() +{ + delete ui; +} + +void ProjectIconSetting::showDlg(GraphicsProjectModelItem* pItem) +{ + ui->tableWidget->clear(); + ui->tableWidget->setRowCount(0); + show(); + ModelProperty* p = pItem->getProperty(); + BaseProperty* pro = dynamic_cast(p); + if(pro) + { + QString sName = pro->name(); + QString sMetaModel = pro->metaModelName(); + QString sModel = pro->modelName(); + _sMetaModel = sMetaModel; + _sModel = sModel; + + bool bExist = ProjectModelManager::instance().ifProjectExsit(sModel); + if(bExist){ + auto mapUsed = ProjectModelManager::instance().getData()[sMetaModel][sModel].modelSetting.mapUsedSvg; + addItems(mapUsed); + } + } +} + +void ProjectIconSetting::initial() +{ + QStringList headerText; + headerText<<"类别"<<"图标"; + ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems); + ui->tableWidget->setColumnCount(headerText.count()); + ui->tableWidget->setHorizontalHeaderLabels(headerText); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + connect(ui->tableWidget, &QTableWidget::cellClicked, this, &ProjectIconSetting::onCellClicked); + connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectIconSetting::onOkClicked); + _iconSize = QSize(32,32); +} + +void ProjectIconSetting::addItems(QMap mapSvg) +{ + for(auto iter = mapSvg.begin();iter != mapSvg.end();++iter){ + int row = ui->tableWidget->rowCount(); + ui->tableWidget->insertRow(row); + + QTableWidgetItem* tagItem = new QTableWidgetItem(iter.key()); + ui->tableWidget->setItem(row, 0, tagItem); + + QTableWidgetItem* iconItem = new QTableWidgetItem(); + ui->tableWidget->setItem(row, 1, iconItem); + QByteArray arr = iter.value(); + iconItem->setData(Qt::UserRole, arr); + if(!arr.isEmpty()){ + QSvgRenderer renderer(arr); + + // 创建目标大小的pixmap + QPixmap pixmap(_iconSize); + //pixmap.fill(Qt::transparent); // 透明背景 + + // 创建画家并在pixmap上绘制SVG + QPainter painter(&pixmap); + renderer.render(&painter, pixmap.rect()); + + iconItem->setIcon(pixmap); + } + } +} + +void ProjectIconSetting::selectImage(int row) +{ + if(!_sMetaModel.isEmpty() && !_sModel.isEmpty()){ + auto mapAllSvg = ProjectModelManager::instance().getData()[_sMetaModel][_sModel].modelSetting.mapSvg; + ProjectIconSelectionDlg dialog(mapAllSvg, this); + if (dialog.exec() == QDialog::Accepted) { + QByteArray selectedSVG = dialog.selectedSVG(); + if (!selectedSVG.isEmpty()) { + QSvgRenderer renderer(selectedSVG); + QPixmap pixmap(32, 32); + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + renderer.render(&painter); + + ui->tableWidget->item(row, 1)->setIcon(QIcon(pixmap)); + // 如果需要保存原始SVG数据,可以这样: + ui->tableWidget->item(row, 1)->setData(Qt::UserRole, selectedSVG); + } + } + } +} + +void ProjectIconSetting::onOkClicked() +{ + QMap mapUsedSvg; + for (int row = 0; row < ui->tableWidget->rowCount(); ++row) { + QTableWidgetItem *itemTag = ui->tableWidget->item(row, 0); + if (itemTag) { + QTableWidgetItem *itemSvg = ui->tableWidget->item(row, 1); + if(itemSvg){ + QByteArray svg = itemSvg->data(Qt::UserRole).toByteArray(); + mapUsedSvg.insert(itemTag->text(),svg); + } + } + } + ProjectModelManager::instance().getData()[_sMetaModel][_sModel].modelSetting.mapUsedSvg = mapUsedSvg; + _controller->updateItemIcon(_sMetaModel,_sModel); + hide(); +} + +void ProjectIconSetting::onCellClicked(int row,int col) +{ + if (col == 1) { // 如果是按钮列 + selectImage(row); + } +} diff --git a/diagramCavas/source/projectModelSetting.cpp b/diagramCavas/source/projectModelSetting.cpp index 7a7c11d..d8e2b85 100644 --- a/diagramCavas/source/projectModelSetting.cpp +++ b/diagramCavas/source/projectModelSetting.cpp @@ -50,6 +50,12 @@ void ProjectModelSetting::initial() /*QRegularExpression regExp("[a-zA-Z0-9]+"); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this); ui->le_saveAs->setValidator(validator);*/ + ui->listWidget_icon->setStyleSheet( + "QListWidget::item:selected {" + " background: #4e72b8;" + " color: palette(HighlightedText);" + "}" + ); } void ProjectModelSetting::loadPicture() @@ -65,7 +71,9 @@ void ProjectModelSetting::loadPicture() for(int i=0;i lstItem = ui->listWidget_icon->findItems(lst.first(),Qt::MatchExactly); + /*QList lstItem = ui->listWidget_icon->findItems(lst.first(),Qt::MatchExactly); if(!lstItem.empty()) { ui->listWidget_icon->setCurrentItem(lstItem.first()); + }*/ + + foreach(const QString &name, lst) { + QList items = ui->listWidget_icon->findItems(name, Qt::MatchExactly); + foreach(QListWidgetItem* item, items) { + item->setSelected(true); + } } } void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode) { show(); + ui->label_infoIcon->clear(); ui->treeView_base->setModel(nullptr); ui->treeView_sub->setModel(nullptr); ModelProperty* p = srcNode->getProperty(); @@ -181,14 +197,19 @@ void ProjectModelSetting::onCancelClicked() void ProjectModelSetting::onSelectClicked() { QList items = ui->listWidget_icon->selectedItems(); + QStringList lst; for(auto& item:items) { if(!_curItemData->getModelProperty().modelSetting.mapSvg.contains(item->text())) { QByteArray data = item->data(Qt::UserRole + 1).toByteArray(); _curItemData->getModelProperty().modelSetting.mapSvg.insert(item->text(),data); - ui->label_infoIcon->setText("当前选择:"+item->text()); } + lst.append(item->text()); + } + + if(!lst.isEmpty()){ + ui->label_infoIcon->setText("当前选择:"+lst.join(",")); } } @@ -337,10 +358,10 @@ void ProjectModelSetting::onSaveClicked() if(pro){ if(pro->metaModelName() == _curItemData->metaModelName()){ //将相同基模item的工程模名称都置为相同(改一个全变) pro->setModelName(sModel); + pro->getModelProperty().modelSetting.modelName = sModel; } } } - //_controller->getScene()->update(); } } } diff --git a/diagramCavas/ui/baseInfoDlg.ui b/diagramCavas/ui/baseInfoDlg.ui index 98864d8..d1b205a 100644 --- a/diagramCavas/ui/baseInfoDlg.ui +++ b/diagramCavas/ui/baseInfoDlg.ui @@ -37,19 +37,10 @@ 10 - - - - - 16777215 - 30 - - - - border:4px double dark; - - - + + + + false @@ -60,149 +51,6 @@ - - - - true - - - - - - - border:2px dashed black; -border-radius:5px; - - - - - - - TAG - - - - - - - true - - - - - - - 命名空间 - - - - - - - false - - - - - - - 名称 - - - - - - - false - - - - - - - 标签 - - - - - - - false - - - - - - - 注释 - - - - - - - false - - - - - - - 电网 - - - - - - - - - - 区域 - - - - - - - - - - 子站 - - - - - - - - - - 间隔名称 - - - - - - - false - - - - - - - 序号 - - - - - - - false - - - @@ -219,17 +67,115 @@ border-radius:5px; - - + + + + true + + + + + + + 标签 + + + + + + + 间隔名称 + + + + + false - - + + - 联结 从 + OUT 服役外 + + + + + + + + + + 区域 + + + + + + + 序号 + + + + + + + false + + + + + + + border:2px dashed black; +border-radius:5px; + + + + + + + 名称 + + + + + + + + + + 电网 + + + + + + + false + + + + + + + false + + + + + + + 服役状态 + + + + + + + 状态 @@ -240,6 +186,13 @@ border-radius:5px; + + + + false + + + @@ -262,38 +215,17 @@ border-radius:5px; - - + + - false + true - - + + - 服役状态 - - - - - - - IN 服役中 - - - - - - - OUT 服役外 - - - - - - - 状态 + 子站 @@ -304,8 +236,83 @@ border-radius:5px; - - + + + + 注释 + + + + + + + TAG + + + + + + + border:1px dashed black; + + + + + + + 命名空间 + + + + + + + 联结 从 + + + + + + + false + + + + + + + + + + IN 服役中 + + + + + + + false + + + + + + + + 16777215 + 30 + + + + border:4px double dark; + + + + + + + + 0 @@ -325,10 +332,24 @@ border-radius:5px; - - + + + + + 0 + 30 + + + + + 12 + + - border:1px dashed black; + + + + 图标库 diff --git a/diagramCavas/ui/projectIconSetting.ui b/diagramCavas/ui/projectIconSetting.ui new file mode 100644 index 0000000..806c09d --- /dev/null +++ b/diagramCavas/ui/projectIconSetting.ui @@ -0,0 +1,139 @@ + + + projectIconSetting + + + + 0 + 0 + 441 + 324 + + + + + 12 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 21 + + + + + 0 + 21 + + + + background-color: rgb(180, 180, 180); + + + + 0 + + + 0 + + + 0 + + + + + + 12 + + + + color: rgb(0, 0, 0); + + + 工程模图标设置 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 确定 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + diff --git a/diagramCavas/ui/projectModelSetting.ui b/diagramCavas/ui/projectModelSetting.ui index eaefd0f..af51d88 100644 --- a/diagramCavas/ui/projectModelSetting.ui +++ b/diagramCavas/ui/projectModelSetting.ui @@ -266,6 +266,9 @@ color: rgb(8, 8, 8); QAbstractItemView::DragDropMode::DragDrop + + QAbstractItemView::SelectionMode::ExtendedSelection + 100 diff --git a/diagramUtils/source/projectModelManager.cpp b/diagramUtils/source/projectModelManager.cpp index ed4fe17..d15ff08 100644 --- a/diagramUtils/source/projectModelManager.cpp +++ b/diagramUtils/source/projectModelManager.cpp @@ -270,7 +270,9 @@ void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sPro { QJsonObject object; QJsonArray arr; + QJsonArray arrUsed; QMap mapSvg = m_mapTotalData[sMeta][sProject].modelSetting.mapSvg; + QMap mapUsedSvg = m_mapTotalData[sMeta][sProject].modelSetting.mapUsedSvg; for(auto iter = mapSvg.begin();iter != mapSvg.end();++iter) { @@ -281,6 +283,15 @@ void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sPro } object["picture"] = arr; + for(auto iter = mapUsedSvg.begin();iter != mapUsedSvg.end();++iter) + { + QJsonObject obj; + obj["name"] = iter.key(); + obj["data"] = QString::fromUtf8(iter.value()); + arrUsed.push_back(obj); + } + object["usingPicture"] = arrUsed; + QJsonObject jsVal = DataBase::GetInstance()->getProjectSetting(sMeta,sProject); if(jsVal.empty()){ DataBase::GetInstance()->insertProjectSetting(sMeta,sProject,object); @@ -823,5 +834,14 @@ projectModelSetting ProjectModelManager::getModelSetting(const QString& sMeta,co QByteArray bData = QByteArray::fromHex(node["data"].toString().toUtf8()); setting.mapSvg.insert(sName,bData); } + + QJsonArray arrUsed = obj["usingPicture"].toArray(); + for (QJsonValueRef jsonObj : arrUsed) + { + QJsonObject node = jsonObj.toObject(); + QString sName = node["name"].toString(); + QByteArray bData = QByteArray::fromHex(node["data"].toString().toUtf8()); + setting.mapUsedSvg.insert(sName,bData); + } return setting; }