add bay editor

This commit is contained in:
baiYue 2025-07-11 18:13:54 +08:00
parent 056aede24b
commit 38c8bc51e3
33 changed files with 1311 additions and 243 deletions

View File

@ -27,6 +27,61 @@ protected:
QJsonObject jContext; //存放port信息
};
class BayProperty:public AbstractProperty //间隔属性(待扩展)
{
Q_OBJECT
public:
BayProperty(QObject* parent)
:AbstractProperty(parent){
}
virtual ~BayProperty(){};
public:
virtual void setType(QString s) {sType = s;}
virtual QString getType(){return sType;}
virtual void setLstComponent(QList<QUuid> lst) {lstComponent = lst;}
virtual QList<QUuid>& getLstComponent() {return lstComponent;}
virtual void setVoltage(double d) {dVoltage = d;}
virtual double getVoltage() {return dVoltage;}
virtual void setFla(double d) {dFla = d;}
virtual double getFla() {return dFla;}
virtual void setCapacity(double d) {dCapacity = d;}
virtual double getCapacity() {return dCapacity;}
virtual void setInService(bool b) {bInService = b;}
virtual bool getInService() {return bInService;}
virtual void setLstFrom(QList<QUuid> lst) {lstFrom = lst;}
virtual QList<QUuid>& getLstFrom() {return lstFrom;}
virtual void setLstTo(QList<QUuid> lst) {lstTo = lst;}
virtual QList<QUuid>& getLstTo() {return lstTo;}
virtual void setLstProtect(QList<QUuid> lst) {lstProtect = lst;}
virtual QList<QUuid>& getLstProtect() {return lstProtect;}
virtual void setLstFaultRecord(QList<QUuid> lst) {lstFaultRecord = lst;}
virtual QList<QUuid>& getLstFaultRecord() {return lstFaultRecord;}
virtual void setLstDynSense(QList<QUuid> lst) {lstDynSense = lst;}
virtual QList<QUuid>& getLstDynSense() {return lstDynSense;}
virtual void setLstStatus(QList<QUuid> lst) {lstStatus = lst;}
virtual QList<QUuid>& getLstStatus() {return lstStatus;}
virtual void setLstInstruct(QList<QUuid> lst) {lstInstruct = lst;}
virtual QList<QUuid>& getLstInstruct() {return lstInstruct;}
virtual void setLstEtc(QList<QUuid> lst) {lstEtc = lst;}
virtual QList<QUuid>& getLstEtc() {return lstEtc;}
protected:
QString sType;
QList<QUuid> lstComponent; //包含的设备
double dVoltage; //电压
double dFla; //电流
double dCapacity; //容量
bool bInService; //服役状态
QList<QUuid> lstFrom; //联结 从
QList<QUuid> lstTo; //联结到
QList<QUuid> lstProtect; //综合保护
QList<QUuid> lstFaultRecord; //故障录播
QList<QUuid> lstDynSense; //动态感知
QList<QUuid> lstStatus; //状态检测
QList<QUuid> lstInstruct; //监控
QList<QUuid> lstEtc; //其他设备
};
class ModelProperty:public AbstractProperty //模型基类
{
Q_OBJECT
@ -47,9 +102,12 @@ public:
bool prepareDelete() const {return _prepareDelete;}
void setDataChanged(bool b) {_dataChanged = b;} //数据变换标签
bool dataChanged() const {return _dataChanged;}
void setConnection(Connection con){m_connectState = con;} //保留,用以获取当前图中的连接
Connection getConnection() const {return m_connectState;}
signals:
void updateData(); //通知数据拥有者更新
protected:
Connection m_connectState;
int nType; //设备类型
int nGraphicsType;
QString sModelName; //模型名

View File

@ -31,6 +31,7 @@ enum GraphicsItemType
GIT_itemRect = QGraphicsItem::UserType + 51,
GIT_itemTri = QGraphicsItem::UserType + 52,
GIT_link= QGraphicsItem::UserType + 53,
GIT_bay= QGraphicsItem::UserType + 54, //间隔
//======================================
GIT_baseBus = QGraphicsItem::UserType + 200,
GIT_baseLine = QGraphicsItem::UserType + 201,
@ -53,6 +54,7 @@ class corresbondItem //类型关联函数
{
public:
static QMap<AbstractItemType,GraphicsItemType> linkType;
static QMap<int,GraphicsItemType> typeToProGraphic;
};
enum DiagramMode //组态图模式
@ -457,6 +459,10 @@ struct Connection
srcPos = P_top;
destType = T_none;
destPos = P_top;
nSrcNodeId = QUuid();
nSrcPortId = QUuid();
nDestNodeId = QUuid();
nDestPortId = QUuid();
}
Connection(const Connection& obj)
@ -484,12 +490,12 @@ struct Connection
}
bool operator==(const Connection& obj)
{
return ((obj.nSrcNodeId == nSrcNodeId)&&(obj.nSrcPortId == nSrcPortId)&&(obj.srcType == srcType)&&(obj.nDestNodeId == nDestNodeId)&&(obj.nDestPortId == nDestPortId)&&(obj.destType == destType));
return ((nSrcNodeId == obj.nSrcNodeId)&&(nSrcPortId == obj.nSrcPortId)&&(srcType == obj.srcType)&&(nDestNodeId == obj.nDestNodeId)&&(nDestPortId == obj.nDestPortId)&&(destType == obj.destType));
}
Connection& operator=(const Connection& obj)
{
if(*this == obj)
if(this == &obj)
return *this;
nSrcNodeId = obj.nSrcNodeId;
nSrcPortId = obj.nSrcPortId;

View File

@ -3,3 +3,6 @@
QMap<AbstractItemType,GraphicsItemType> corresbondItem::linkType = {
{AIT_motor,GIT_itemRect},{AIT_bus,GIT_bus},
};
QMap<int,GraphicsItemType> corresbondItem::typeToProGraphic = {
{1,GIT_bus},{3,GIT_itemRect},{8,GIT_link}
};

View File

@ -48,6 +48,7 @@ set(DIAGRAMCAVAS_HEADER_FILES
include/graphicsItem/handleText.h
include/graphicsItem/itemControlHandle.h
include/graphicsItem/itemPort.h
include/graphicsItem/electricBayItem.h
include/baseModelItem/electricBaseModelSvgItem.h
include/baseModelItem/electricBaseModelLineItem.h
include/baseModelItem/electricBaseModelSvgBus.h
@ -117,6 +118,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES
source/graphicsItem/handleText.cpp
source/graphicsItem/itemControlHandle.cpp
source/graphicsItem/itemPort.cpp
source/graphicsItem/electricBayItem.cpp
source/baseModelItem/electricBaseModelSvgItem.cpp
source/baseModelItem/electricBaseModelLineItem.cpp
source/baseModelItem/electricBaseModelSvgBus.cpp
@ -133,6 +135,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES
../common/source/httpInterface.cpp
../common/source/baseProperty.cpp
../common/source/tools.cpp
../common/source/global.cpp
)
set(UI_FILES

View File

@ -20,15 +20,11 @@ public:
void calculatePath();
void resetCurLine(){_curLine = QPoint();}
void setConnection(Connection con){m_connectState = con;}
Connection getConnection() const {return m_connectState;}
protected:
virtual QPainterPath shape() const override;
virtual QRectF boundingRect() const override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
Connection m_connectState;
QPainterPath m_points;
QPainterPath m_pointsBoundingRect; //包裹点的矩形集合
QList<QPointF> m_lstPoints;

View File

@ -25,6 +25,7 @@ public:
auto& getValidType() {return _validType;} //获取可用的量测属性
void setUi();
void addMeasure(MeasurementInfo);
void addOtherMeasure(QStringList); //本间隔的其他量测
public slots:
void onAddClicked();
void onDeleteClicked();

View File

@ -9,6 +9,8 @@ QT_BEGIN_NAMESPACE
namespace Ui { class bayManagerContentDlg; }
QT_END_NAMESPACE
class BayProperty;
class BayManagerContentDlg : public QDialog
{
Q_OBJECT
@ -17,11 +19,13 @@ public:
~BayManagerContentDlg();
void initial();
void setName(const QString& s) {_sBayName = s;}
QString name() {return _sBayName;}
void setProperty(BayProperty* p) {_pData = p;}
BayProperty* getProperty() {return _pData;}
void updateByProperty(); //根据数据更新显示
void saveSetting(); //保存修改
private:
Ui::bayManagerContentDlg *ui;
QString _sBayName; //每页的间隔名称
BayProperty* _pData;
};
#endif

View File

@ -2,6 +2,7 @@
#define BAYMANAGERDLG_H
#include <QDialog>
#include <qlistwidget.h>
/*******************************************************
********************************************************/
@ -10,6 +11,8 @@ namespace Ui { class bayManagerDlg; }
QT_END_NAMESPACE
class BayManagerContentDlg;
class FixedPortsModel;
class BayProperty;
class BayManagerDlg : public QDialog
{
@ -20,14 +23,18 @@ public:
void initial();
void showDlg();
void initData();
void clearData(); //切换打开文件时调用
void setModelController(FixedPortsModel* p) {_modelController = p;}
public slots:
void onOkClicked();
void onCancelClicked();
void onListItemClicked(QListWidgetItem *item);
private:
void generatePage(QStringList); //生成间隔页 <间隔列表>
void generatePage(QList<BayProperty*>); //生成间隔页 <间隔列表>
private:
Ui::bayManagerDlg *ui;
FixedPortsModel* _modelController;
QMap<int,BayManagerContentDlg*> _contentData; //<stack index,bay page>
};

View File

@ -54,6 +54,8 @@ public slots:
EditPanel* onSignal_addEditPanel(QString);
void onSignal_addEditWizard(QString);
void onSignal_wizardFinished(DiagramEditorWizardInfo);
/*********************************间隔**************************************/
void onSignl_openCurrentBay();
private:
void removePanel(PowerEntity*);
private:

View File

@ -16,6 +16,7 @@ class GraphicsItemGroup;
class StatusBar;
class PowerEntity;
class ProjectDiagramNameInput;
class BayManagerDlg;
class DrawingPanel : public QWidget
{

View File

@ -22,6 +22,11 @@ struct Connection;
class PowerEntity;
class ElectricConnectLineItem;
class ProjectModelSetting;
class ElectricBayItem;
class GraphicsNonStandardItem;
class BayProperty;
class BayManagerDlg;
class ModelProperty;
class FixedPortsModel : public BaseModel, public Serializable
{
@ -32,7 +37,7 @@ public:
~FixedPortsModel();
public:
QMap<QUuid,QPointF> allNodePos() const;
QVector<Connection> allConnections();
QVector<ModelProperty*> allConnectionProperty();
QMap<QUuid,GraphicsProjectModelItem*>& allItems();
bool addNodeItem(QUuid uuid,GraphicsProjectModelItem*);
void addNodeItem(QUuid id,/*int type,*/QPointF pos);
@ -40,7 +45,7 @@ public:
QVariant nodeData(QUuid nodeId, NodeRole role) const;
BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据一个data可对应多个itemid,类型,名称,工程模名)
void loadNodeDataFromDataBase(); //从数据库加载数据
void addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort);
void addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort);
void deleteNodeItem(GraphicsProjectModelItem*);
//QJsonObject saveNode(QUuid const) const;
void saveNode(int nPageId);
@ -71,8 +76,19 @@ public:
BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName); //添加图元基模数据
void showProjectModelSettingDlg(GraphicsBaseModelItem*); //在基模拓扑图上打开工程模设置对话框
void generateProjectModel(const QString&,QList<GraphicsBaseModelItem*>); //由基模生成工程模
void generateProjectModel(const QString&,QList<GraphicsBaseModelItem*>,QList<GraphicsNonStandardItem*>); //由基模生成工程模
void addProjectItemByBaseData(DrawingPanel*,GraphicsBaseModelItem*,BaseProperty*); //从基模item生成工程模item
/*************************间隔*****************************/
bool addBayItem(QUuid,ElectricBayItem*);
void addItemsToBay(QList<GraphicsBaseItem*>,ElectricBayItem*); //将对象添加到间隔
BayProperty* addBayData(QUuid uuid);
QMap<QUuid,ElectricBayItem*>& allBayItem(); //返回所有间隔对象
BayProperty* generateBayData(BayProperty*,QList<BaseProperty*>); //生成新间隔数据(间隔数据结构相同)<baseBay,projectData>
QList<QUuid> getCorrespondId(QList<QUuid>,QList<BaseProperty*>); //获取基模id对应的工程模id
QRectF calculateItemsBoundingRect(QList<GraphicsBaseItem*> items); //返回包含所有item的rect
void addBayByData(BayProperty*); //基模bay生成工程模bay
void addTestData(); //生成测试基模
Q_SIGNALS:
void activatePage(const QString&); //激活当前model所在page
@ -87,10 +103,12 @@ public Q_SLOTS:
void onTimeOut();
void onSignal_GetPointData(QString type,QMap<qint64,double> map);
void onSignal_generateDiagram(const QString&); //生成工程组态信号
void onSignal_openBayManager();
private:
QMap<QUuid,GraphicsProjectModelItem*> _nodeItem; //工程模对象
QMap<QUuid,GraphicsBaseModelItem*> _baseItem; //基模对象
QMap<QUuid,ElectricBayItem*> _bayItem; //间隔对象
QString _pageName;
DiagramCavas* _cavas;
@ -104,6 +122,7 @@ private:
QMap<QString,modelStateInfo> _modelStateInfo; //模型结构信息
QMap<QString,modelDataInfo> _modelDataInfo; //模型数据信息
ProjectModelSetting* m_proModelSettingDlg;
BayManagerDlg* m_pBayManager;
public:
static bool _dataInitialised;
};

View File

@ -0,0 +1,27 @@
#ifndef ELECBAYITEM_H
#define ELECBAYITEM_H
#include "graphicsBaseItem.h"
#include "baseProperty.h"
class ElectricBayItem :public GraphicsNonStandardItem
{
Q_OBJECT
public:
ElectricBayItem(const QRectF &rect, QGraphicsItem *parent = 0); //genNewPort生成新接线点
virtual ~ElectricBayItem();
void setText(const QString& s);
protected:
virtual QPainterPath shape();
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
private:
void updateTextShape();
protected:
QRectF _recLabel;
QString m_text;
QFont m_font;
QRectF m_showRect;
};
#endif

View File

@ -19,15 +19,11 @@ public:
void calculatePath();
void resetCurLine(){_curLine = QPoint();}
void setConnection(Connection con){m_connectState = con;} //保留,用以获取当前图中的连接
Connection getConnection() const {return m_connectState;}
protected:
virtual QPainterPath shape() const override;
virtual QRectF boundingRect() const override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private:
Connection m_connectState;
QPainterPath m_points;
QPainterPath m_pointsBoundingRect; //包裹点的矩形集合
QList<QPointF> m_lstPoints;

View File

@ -50,6 +50,8 @@ public:
public:
virtual ShapeType getType() {return m_type;}
virtual QUuid itemId() const {return m_itemId;}
virtual void setItemId(QUuid n){m_itemId = n;}
QPen pen() { return m_pen; }
void setPen(const QPen &pen) { m_pen = pen; }
@ -96,13 +98,17 @@ public:
virtual void syncRotationDataFromParent(const double&) {}
virtual double getSyncRotationDataFromParent() {return m_dSyncRotationByParent;}
virtual void setItemType(GraphicsItemType type){m_Itemtype = type;}
virtual GraphicsItemType getItemType() const {return m_Itemtype;}
protected:
QUuid m_itemId;
ShapeType m_type;
QPen m_pen;
QBrush m_brush;
double m_dWidth;
double m_dHeight;
QRectF m_boundingRect;
GraphicsItemType m_Itemtype; //显示类型
double m_dSyncRotationByParent; //父项(被加入到某一组)的旋转数据,因为加入某一组后,对该组进行旋转,自身的旋转数据不会同步更新
QGraphicsPathItem* m_pOperationCopy; //图元移动和旋转时的操作副本
@ -112,9 +118,33 @@ protected:
class ItemPort;
class ModelProperty;
class PowerEntity;
class AbstractProperty;
typedef AbstractShapeType<QGraphicsItem> AbstractShape;
class GraphicsNonStandardItem:public QObject, public AbstractShapeType<QGraphicsItem> //非标准图元,如间隔
{
Q_OBJECT
public:
GraphicsNonStandardItem(QGraphicsItem *parent = 0)
:AbstractShapeType<QGraphicsItem>(parent)
{
setFlag(QGraphicsItem::ItemIsSelectable, true);
}
virtual ~GraphicsNonStandardItem(){};
virtual void setProperty(AbstractProperty* p){_property = p;}
virtual AbstractProperty* getProperty() {return _property;}
bool containsPoint(const QPointF& pos)
{
QPointF localPos = mapFromScene(pos);
QPainterPath path = shape(); // 或更精确的计算
return path.contains(localPos);
}
protected:
AbstractProperty* _property;
};
class GraphicsBaseItem :public QObject, public AbstractShapeType<QGraphicsItem>
{
Q_OBJECT
@ -122,8 +152,6 @@ class GraphicsBaseItem :public QObject, public AbstractShapeType<QGraphicsItem>
GraphicsBaseItem(QGraphicsItem *parent);
virtual ~GraphicsBaseItem();
public:
virtual QUuid itemId() const {return m_itemId;}
virtual void setItemId(QUuid n){m_itemId = n;}
virtual int addPort(PortState typ,QPointF vec,QString id = "",HandleType hType = T_lineInOut,PortPos pos = P_top); //新建,返回-1失败
virtual void setEntity(PowerEntity*); //设置当前图元的拓扑数据
virtual PowerEntity* entity();
@ -132,8 +160,6 @@ public:
virtual void updateByProperty(){}; //使用data对象更新自己
virtual void setItemChanged(bool b){_itemChanged = b;}
virtual bool itemChanged() const {return _itemChanged;}
virtual void setItemType(GraphicsItemType type){m_Itemtype = type;}
virtual GraphicsItemType getItemType() const {return m_Itemtype;}
virtual void renderSelectBackground(QPainter*);
virtual ItemPort* getPortById(QString) const;
virtual ItemPort* getPortPtr(int) const;
@ -422,8 +448,6 @@ public:
public slots:
void onUpdateData(); //data发送的更新通知
protected:
QUuid m_itemId;
GraphicsItemType m_Itemtype; //显示类型
ModelProperty* _property;
PowerEntity* _pEntity; //图元拓扑
bool _itemChanged; //图元变化标志,判断是否需要保存

View File

@ -1,5 +1,6 @@
#include "baseInfoDlg.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "graphicsItem/electricBayItem.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "ui_baseInfoDlg.h"
#include "dataBase.h"
#include "global.h"
@ -97,14 +98,56 @@ void BaseInfoDlg::setPropertyValue(QVariant var)
QString bay_offset_inner = connectBus["bay_offset_inner"].toString();
QString from_uuid = connectBus["from_uuid"].toString();
QString to_uuid = connectBus["to_uuid"].toString();
ui->le_bayName->setText(bay_name);
//ui->le_bayName->setText(bay_name);
ui->le_idx_1->setText(bay_offset_outer);
ui->le_idx_2->setText(bay_offset_inner);
ui->le_from->setText(from_uuid);
ui->le_to->setText(to_uuid);
//ui->le_from->setText(from_uuid);
//ui->le_to->setText(to_uuid);
if(pPro->inService() == 1)
ui->rb_inService->setChecked(true);
else
ui->rb_outService->setChecked(true);
//间隔处理
BayProperty* pBay = nullptr;
QMap<QUuid,ElectricBayItem*> mapBay = _curModelController->allBayItem();
for(auto& item:mapBay){
AbstractProperty* p = item->getProperty();
BayProperty* pBayPro = dynamic_cast<BayProperty*>(p);
if(pBayPro){
QList<QUuid> lstCompo = pBayPro->getLstComponent(); //获取间隔下的component找到本component对应的间隔
for(auto& id:lstCompo){
if(id == pPro->uuid()){
pBay = pBayPro;
break;
}
}
}
}
if(pBay){
auto lstFrom = pBay->getLstFrom();
auto lstTo = pBay->getLstTo();
QStringList sLstFrom;
for(auto& fromId:lstFrom){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(fromId);
if(pPro){
sLstFrom.append(pPro->tag());
}
}
QStringList sLstTo;
for(auto& toId:lstTo){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(toId);
if(pPro){
sLstTo.append(pPro->tag());
}
}
ui->le_bayName->setText(pBay->tag());
ui->le_from->setText(sLstFrom.join(""));
ui->le_to->setText(sLstTo.join(""));
}
}
}

View File

@ -48,6 +48,7 @@ void ElectricBaseModelSvgBus::updateConnectData()
}
obj["port"] = arr;
obj["metaModel"] = _property->metaModelName();
_property->setContext(obj);
}
}

View File

@ -7,6 +7,9 @@
#include "baseProperty.h"
#include "basePropertyManager.h"
#include "measureSettingDlg.h"
#include "graphicsItem/electricBayItem.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "basePropertyManager.h"
#include "dataBase.h"
BayInfoDlg::BayInfoDlg(QWidget *parent)
@ -51,24 +54,151 @@ QMap<QString,propertyStateInfo> BayInfoDlg::getPropertyValue(BaseProperty* pPro)
void BayInfoDlg::setPropertyValue(QVariant var)
{
BaseProperty* pPro = static_cast<BaseProperty*>(var.value<void*>());
if(pPro)
_mapMeasure.clear();
ui->tableWidget_other->setRowCount(0);;
ui->tableWidget_local->setRowCount(0); //清空列表
ui->le_zhbh->clear();
ui->le_jk->clear();
ui->le_dtgz->clear();
ui->le_gzlb->clear();
ui->le_ztjc->clear();
ui->le_qt->clear();
BaseProperty* property = static_cast<BaseProperty*>(var.value<void*>());
if(property)
{
QList<measureAttributeType> lstType = DataBase::GetInstance()->getMeasureAttributeTypes();
auto map = pPro->getMeasurement();
auto map = property->getMeasurement();
/*QMutableListIterator<measureAttributeType> it(lstType);
while(it.hasNext()){ //设置可用属性
if(map.contains(it.next().name)){
it.remove();
}
}*/
_validType = lstType;
ui->tableWidget_local->clearContents(); //清空列表
for(auto& info:map){
addMeasure(info);
}
//间隔处理
BayProperty* pBay = nullptr;
QMap<QUuid,ElectricBayItem*> mapBay = _curModelController->allBayItem();
for(auto& item:mapBay){
AbstractProperty* pPro = item->getProperty();
BayProperty* pBayPro = dynamic_cast<BayProperty*>(pPro);
if(pBayPro){
QList<QUuid> lstCompo = pBayPro->getLstComponent(); //获取间隔下的component找到本component对应的间隔
for(auto& id:lstCompo){
if(id == property->uuid()){
pBay = pBayPro;
break;
}
}
}
}
if(pBay){
auto lstFrom = pBay->getLstFrom();
auto lstTo = pBay->getLstTo();
auto lstProtect = pBay->getLstProtect();
auto lstFaultRecord = pBay->getLstFaultRecord();
auto lstDynSense = pBay->getLstDynSense();
auto lstStatus = pBay->getLstStatus();
auto lstInstruct = pBay->getLstInstruct();
auto lstEtc = pBay->getLstEtc();
QStringList sLstFrom;
for(auto& fromId:lstFrom){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(fromId);
if(pPro){
sLstFrom.append(pPro->tag());
}
}
QStringList sLstTo;
for(auto& toId:lstTo){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(toId);
if(pPro){
sLstTo.append(pPro->tag());
}
}
QStringList sLstProtect;
for(auto& protectId:lstProtect){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(protectId);
if(pPro){
sLstProtect.append(pPro->tag());
}
}
QStringList sLstFaultRecord;
for(auto& faultRecordId:lstFaultRecord){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(faultRecordId);
if(pPro){
sLstFaultRecord.append(pPro->tag());
}
}
QStringList sLstDynSense;
for(auto& dynSenseId:lstDynSense){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(dynSenseId);
if(pPro){
sLstDynSense.append(pPro->tag());
}
}
QStringList sLstStatus;
for(auto& statusId:lstStatus){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(statusId);
if(pPro){
sLstStatus.append(pPro->tag());
}
}
QStringList sLstInstruct;
for(auto& instructId:lstInstruct){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(instructId);
if(pPro){
sLstInstruct.append(pPro->tag());
}
}
QStringList sLstEtc;
for(auto& etcId:lstEtc){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(etcId);
if(pPro){
sLstEtc.append(pPro->tag());
}
}
QList<BaseProperty*> lstOther;
QList<QUuid> lstCompo = pBay->getLstComponent();
for(auto& compoId:lstCompo){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(compoId);
if(pPro){
if(pPro->uuid() == property->uuid()){ //取本间隔内的其他元件量测
continue;
}
else{
lstOther.append(pPro);
}
}
}
QStringList lstOtherMeasure;
for(auto& compo:lstOther){
auto map = compo->getMeasurement();
for(auto& measure:map){
lstOtherMeasure.append(compo->tag()+"-"+measure.tag);
}
}
ui->le_zhbh->setText(sLstProtect.join(""));
ui->le_jk->setText(sLstInstruct.join(""));
ui->le_dtgz->setText(sLstDynSense.join(""));
ui->le_gzlb->setText(sLstFaultRecord.join(""));
ui->le_ztjc->setText(sLstStatus.join(""));
ui->le_qt->setText(sLstEtc.join(""));
ui->le_bayName->setText(pBay->tag());
addOtherMeasure(lstOtherMeasure);
}
}
}
@ -90,6 +220,22 @@ void BayInfoDlg::setUi()
" white-space: pre-wrap;" // 关键:保留空白符并允许自动换行
"}"
);
headerText.clear();
headerText<<"TAG";
ui->tableWidget_other->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tableWidget_other->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableWidget_other->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableWidget_other->setColumnCount(headerText.count());
ui->tableWidget_other->setHorizontalHeaderLabels(headerText);
ui->tableWidget_other->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableWidget_other->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableWidget_other->setStyleSheet(
"QTableWidget::item {"
" padding: 5px;" // 可选:增加内边距
" white-space: pre-wrap;" // 关键:保留空白符并允许自动换行
"}"
);
}
void BayInfoDlg::addMeasure(MeasurementInfo info)
@ -126,6 +272,17 @@ void BayInfoDlg::addMeasure(MeasurementInfo info)
}
}
void BayInfoDlg::addOtherMeasure(QStringList lst)
{
for(auto& str:lst){
int row = ui->tableWidget_other->rowCount();
ui->tableWidget_other->insertRow(row);
QTableWidgetItem* tagItem = new QTableWidgetItem(str);
ui->tableWidget_local->setItem(row, 0, tagItem);
}
}
void BayInfoDlg::onAddClicked()
{
if(_measureDlg == nullptr){

View File

@ -1,9 +1,12 @@
#include "bayManagerContentDlg.h"
#include "baseProperty.h"
#include "ui_bayManagerContentDlg.h"
#include "basePropertyManager.h"
BayManagerContentDlg::BayManagerContentDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::bayManagerContentDlg)
,_pData(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
@ -17,5 +20,245 @@ BayManagerContentDlg::~BayManagerContentDlg()
void BayManagerContentDlg::initial()
{
QStringList headerText;
headerText<<"选择"<<"名称";
ui->tw_zongHe->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tw_zongHe->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tw_zongHe->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tw_zongHe->setColumnCount(headerText.count());
ui->tw_zongHe->setHorizontalHeaderLabels(headerText);
ui->tw_zongHe->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tw_jianKong->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tw_jianKong->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tw_jianKong->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tw_jianKong->setColumnCount(headerText.count());
ui->tw_jianKong->setHorizontalHeaderLabels(headerText);
ui->tw_jianKong->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tw_dongTai->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tw_dongTai->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tw_dongTai->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tw_dongTai->setColumnCount(headerText.count());
ui->tw_dongTai->setHorizontalHeaderLabels(headerText);
ui->tw_dongTai->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tw_guZhang->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tw_guZhang->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tw_guZhang->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tw_guZhang->setColumnCount(headerText.count());
ui->tw_guZhang->setHorizontalHeaderLabels(headerText);
ui->tw_guZhang->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tw_zhuangTai->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tw_zhuangTai->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tw_zhuangTai->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tw_zhuangTai->setColumnCount(headerText.count());
ui->tw_zhuangTai->setHorizontalHeaderLabels(headerText);
ui->tw_zhuangTai->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tw_qiTa->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tw_qiTa->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tw_qiTa->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tw_qiTa->setColumnCount(headerText.count());
ui->tw_qiTa->setHorizontalHeaderLabels(headerText);
ui->tw_qiTa->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
void BayManagerContentDlg::updateByProperty()
{
if(_pData){
ui->le_name->setText(_pData->tag());
ui->tw_zongHe->setRowCount(0);
ui->tw_jianKong->setRowCount(0);
ui->tw_dongTai->setRowCount(0);
ui->tw_guZhang->setRowCount(0);
ui->tw_zhuangTai->setRowCount(0);
ui->tw_qiTa->setRowCount(0);
QList<BaseProperty*> lstPro;
QList<QUuid> lstId = _pData->getLstComponent();
QList<QUuid> lstProtectId = _pData->getLstProtect(); //综合保护
QList<QUuid> lstInsId = _pData->getLstInstruct(); //监控
QList<QUuid> lstDynSenId = _pData->getLstDynSense(); //动态感知
QList<QUuid> lstFauRecId = _pData->getLstFaultRecord(); //故障录播
QList<QUuid> lstStaId= _pData->getLstStatus(); //状态监测
QList<QUuid> lstEtcId= _pData->getLstEtc(); //其他设备
for(auto& id:lstId){
BaseProperty* pPro = BasePropertyManager::instance().findEntityData(id); //根据id找到对应的设备
if(pPro){
lstPro.append(pPro);
}
}
for(auto& pro:lstPro){ //初始化tablewidget
int row = ui->tw_zongHe->rowCount(); //综合保护
ui->tw_zongHe->insertRow(row);
QTableWidgetItem *checkItemProtec = new QTableWidgetItem();
checkItemProtec->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
checkItemProtec->setCheckState(Qt::Unchecked); // 默认未勾选
checkItemProtec->setData(Qt::UserRole+1,pro->uuid());
ui->tw_zongHe->setItem(row, 0, checkItemProtec); // 设置到第一列
QTableWidgetItem* tagItemProtec = new QTableWidgetItem(pro->tag());
ui->tw_zongHe->setItem(row, 1, tagItemProtec);
row = ui->tw_jianKong->rowCount(); //监控
ui->tw_jianKong->insertRow(row);
QTableWidgetItem *checkItemIns = new QTableWidgetItem();
checkItemIns->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
checkItemIns->setCheckState(Qt::Unchecked);
checkItemIns->setData(Qt::UserRole+1,pro->uuid());
ui->tw_jianKong->setItem(row, 0, checkItemIns);
QTableWidgetItem* tagItemIns = new QTableWidgetItem(pro->tag());
ui->tw_jianKong->setItem(row, 1, tagItemIns);
row = ui->tw_dongTai->rowCount(); //动态感知
ui->tw_dongTai->insertRow(row);
QTableWidgetItem *checkItemDynSen = new QTableWidgetItem();
checkItemDynSen->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
checkItemDynSen->setCheckState(Qt::Unchecked);
checkItemDynSen->setData(Qt::UserRole+1,pro->uuid());
ui->tw_dongTai->setItem(row, 0, checkItemDynSen);
QTableWidgetItem* tagItemDynSen = new QTableWidgetItem(pro->tag());
ui->tw_dongTai->setItem(row, 1, tagItemDynSen);
row = ui->tw_guZhang->rowCount(); //故障录播
ui->tw_guZhang->insertRow(row);
QTableWidgetItem *checkItemFauRec = new QTableWidgetItem();
checkItemFauRec->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
checkItemFauRec->setCheckState(Qt::Unchecked);
checkItemFauRec->setData(Qt::UserRole+1,pro->uuid());
ui->tw_guZhang->setItem(row, 0, checkItemFauRec);
QTableWidgetItem* tagItemFauRec = new QTableWidgetItem(pro->tag());
ui->tw_guZhang->setItem(row, 1, tagItemFauRec);
row = ui->tw_zhuangTai->rowCount(); //状态监测
ui->tw_zhuangTai->insertRow(row);
QTableWidgetItem *checkItemSta = new QTableWidgetItem();
checkItemSta->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
checkItemSta->setCheckState(Qt::Unchecked);
checkItemSta->setData(Qt::UserRole+1,pro->uuid());
ui->tw_zhuangTai->setItem(row, 0, checkItemSta);
QTableWidgetItem* tagItemSta = new QTableWidgetItem(pro->tag());
ui->tw_zhuangTai->setItem(row, 1, tagItemSta);
row = ui->tw_qiTa->rowCount(); //其他设备
ui->tw_qiTa->insertRow(row);
QTableWidgetItem *checkItemEtc = new QTableWidgetItem();
checkItemEtc->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
checkItemEtc->setCheckState(Qt::Unchecked);
checkItemEtc->setData(Qt::UserRole+1,pro->uuid());
ui->tw_qiTa->setItem(row, 0, checkItemEtc);
QTableWidgetItem* tagItemEtc = new QTableWidgetItem(pro->tag());
ui->tw_qiTa->setItem(row, 1, tagItemEtc);
}
for(auto& id:lstProtectId){ //设置勾选状态
for(int i = 0;i < ui->tw_zongHe->rowCount();++i){
if(ui->tw_zongHe->item(i,0)->data(Qt::UserRole+1).toUuid() == id){
ui->tw_zongHe->item(i,0)->setCheckState(Qt::Checked);
break;
}
}
}
for(auto& id:lstInsId){
for(int i = 0;i < ui->tw_jianKong->rowCount();++i){
if(ui->tw_jianKong->item(i,0)->data(Qt::UserRole+1).toUuid() == id){
ui->tw_jianKong->item(i,0)->setCheckState(Qt::Checked);
break;
}
}
}
for(auto& id:lstDynSenId){
for(int i = 0;i < ui->tw_dongTai->rowCount();++i){
if(ui->tw_dongTai->item(i,0)->data(Qt::UserRole+1).toUuid() == id){
ui->tw_dongTai->item(i,0)->setCheckState(Qt::Checked);
break;
}
}
}
for(auto& id:lstFauRecId){
for(int i = 0;i < ui->tw_guZhang->rowCount();++i){
if(ui->tw_guZhang->item(i,0)->data(Qt::UserRole+1).toUuid() == id){
ui->tw_guZhang->item(i,0)->setCheckState(Qt::Checked);
break;
}
}
}
for(auto& id:lstStaId){
for(int i = 0;i < ui->tw_zhuangTai->rowCount();++i){
if(ui->tw_zhuangTai->item(i,0)->data(Qt::UserRole+1).toUuid() == id){
ui->tw_zhuangTai->item(i,0)->setCheckState(Qt::Checked);
break;
}
}
}
for(auto& id:lstEtcId){
for(int i = 0;i < ui->tw_qiTa->rowCount();++i){
if(ui->tw_qiTa->item(i,0)->data(Qt::UserRole+1).toUuid() == id){
ui->tw_qiTa->item(i,0)->setCheckState(Qt::Checked);
break;
}
}
}
}
}
void BayManagerContentDlg::saveSetting()
{
if(_pData){
QList<QUuid> lstProtec;
for(int i = 0;i < ui->tw_zongHe->rowCount();++i){
if(Qt::Checked == ui->tw_zongHe->item(i,0)->checkState()){
lstProtec.append(ui->tw_zongHe->item(i,0)->data(Qt::UserRole+1).toUuid());
}
}
QList<QUuid> lstIns;
for(int i = 0;i < ui->tw_jianKong->rowCount();++i){
if(Qt::Checked == ui->tw_jianKong->item(i,0)->checkState()){
lstIns.append(ui->tw_jianKong->item(i,0)->data(Qt::UserRole+1).toUuid());
}
}
QList<QUuid> lstDynSen;
for(int i = 0;i < ui->tw_dongTai->rowCount();++i){
if(Qt::Checked == ui->tw_dongTai->item(i,0)->checkState()){
lstDynSen.append(ui->tw_dongTai->item(i,0)->data(Qt::UserRole+1).toUuid());
}
}
QList<QUuid> lstFauRec;
for(int i = 0;i < ui->tw_guZhang->rowCount();++i){
if(Qt::Checked == ui->tw_guZhang->item(i,0)->checkState()){
lstFauRec.append(ui->tw_guZhang->item(i,0)->data(Qt::UserRole+1).toUuid());
}
}
QList<QUuid> lstSta;
for(int i = 0;i < ui->tw_zhuangTai->rowCount();++i){
if(Qt::Checked == ui->tw_zhuangTai->item(i,0)->checkState()){
lstSta.append(ui->tw_zhuangTai->item(i,0)->data(Qt::UserRole+1).toUuid());
}
}
QList<QUuid> lstEtc;
for(int i = 0;i < ui->tw_qiTa->rowCount();++i){
if(Qt::Checked == ui->tw_qiTa->item(i,0)->checkState()){
lstEtc.append(ui->tw_qiTa->item(i,0)->data(Qt::UserRole+1).toUuid());
}
}
_pData->setLstProtect(lstProtec);
_pData->setLstInstruct(lstIns);
_pData->setLstDynSense(lstDynSen);
_pData->setLstFaultRecord(lstFauRec);
_pData->setLstStatus(lstSta);
_pData->setLstEtc(lstEtc);
}
}

View File

@ -1,10 +1,13 @@
#include "bayManagerDlg.h"
#include "bayManagerContentDlg.h"
#include "graphicsItem/electricBayItem.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "ui_bayManagerDlg.h"
BayManagerDlg::BayManagerDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::bayManagerDlg)
,_modelController(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
@ -20,11 +23,29 @@ void BayManagerDlg::initial()
{
connect(ui->btn_ok,&QPushButton::clicked,this,&BayManagerDlg::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&BayManagerDlg::onCancelClicked);
connect(ui->listWidget,&QListWidget::itemClicked,this,&BayManagerDlg::onListItemClicked);
}
void BayManagerDlg::showDlg()
{
show();
clearData();
initData();
}
void BayManagerDlg::initData()
{
QList<BayProperty*> lstBay;
QMap<QUuid,ElectricBayItem*> mapBay = _modelController->allBayItem(); //获取当前图中所有bay
for(auto& item:mapBay){
AbstractProperty* p = item->getProperty();
BayProperty* pBayPro = dynamic_cast<BayProperty*>(p);
if(pBayPro){
lstBay.append(pBayPro);
}
}
generatePage(lstBay);
}
void BayManagerDlg::clearData()
@ -41,6 +62,11 @@ void BayManagerDlg::clearData()
void BayManagerDlg::onOkClicked()
{
hide();
for(auto& pDlg:_contentData){
if(pDlg){
pDlg->saveSetting();
}
}
}
void BayManagerDlg::onCancelClicked()
@ -48,14 +74,25 @@ void BayManagerDlg::onCancelClicked()
hide();
}
void BayManagerDlg::generatePage(QStringList lstBay)
void BayManagerDlg::onListItemClicked(QListWidgetItem *item)
{
ui->listWidget->addItems(lstBay);
for(auto& str:lstBay)
int index = item->data(Qt::UserRole+1).toInt();
ui->stackedWidget->setCurrentIndex(index);
}
void BayManagerDlg::generatePage(QList<BayProperty*> lstBay)
{
for(auto& pData:lstBay)
{
BayManagerContentDlg* pBay = new BayManagerContentDlg(this);
pBay->setName(str);
pBay->setProperty(pData);
pBay->updateByProperty();
int index = ui->stackedWidget->addWidget(pBay);
_contentData.insert(index,pBay);
QListWidgetItem* pItem = new QListWidgetItem(pData->tag());
pItem->setData(Qt::UserRole+1,index);
ui->listWidget->addItem(pItem);
}
if(ui->stackedWidget->count() != 0)
ui->stackedWidget->setCurrentIndex(0);
}

View File

@ -10,7 +10,8 @@
#include "topologyManager.h"
#include "powerEntity.h"
#include "diagramEditor/diagramEditorWizard.h"
#include "componentIconManager.h"
//#include "componentIconManager.h"
#include "baseProperty.h"
#include "diagramEditor/editPanel.h"
DiagramCavas::DiagramCavas(QWidget *parent)
@ -109,12 +110,15 @@ void DiagramCavas::onSignal_savePage()
QMap<QUuid,GraphicsProjectModelItem*> map = pPanel->getModelController()->allItems();
for(auto pItem:map)
{
if(pItem->itemChanged())
BaseProperty* pData = dynamic_cast<BaseProperty*>(pItem->getProperty());
if(pData){
if(pItem->itemChanged() || pData->dataChanged())
{
pItem->updateConnectData(); //更新连接状态
pItem->setItemChanged(false);
}
}
}
if(DataBase::GetInstance()->getPageIdByName(_curPage) == -1) //不存在,创建
DataBase::GetInstance()->insertPage(_curPage,_curPage,QJsonObject(),pPanel->getDiagramInfo(),QString("page"),1);
@ -383,3 +387,24 @@ void DiagramCavas::onSignal_wizardFinished(DiagramEditorWizardInfo info)
{
}
/*******************bay************************/
void DiagramCavas::onSignl_openCurrentBay()
{
QWidget* pWindow= currentSubWindow()->widget();
DrawingPanel* pPanel = dynamic_cast<DrawingPanel*>(pWindow);
if(pPanel)
{
if(pPanel->getMode() == DM_run)
{
}
else if(pPanel->getMode() == DM_edit)
{
pPanel->getModelController()->onSignal_openBayManager();
}
else if(pPanel->getMode() == DM_baseModel)
{
}
}
}

View File

@ -5,13 +5,14 @@
#include <QCloseEvent>
#include "designerView.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "util/selectorManager.h"
#include "graphicsItem/electricConnectLineItem.h"
#include "statusBar.h"
#include "dataBase.h"
#include "powerEntity.h"
#include "topologyManager.h"
#include "projectDiagramNameInput.h"
#include "baseProperty.h"
DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: QWidget(parent)
@ -194,14 +195,15 @@ QJsonObject DrawingPanel::getDiagramInfo() const
obj["nodes"] = arr;
QJsonArray arrConnect;
QVector<Connection> vec = _pModel->allConnections();
for(auto iter = vec.begin(); iter != vec.end();++iter)
{
QVector<ModelProperty*> vec = _pModel->allConnectionProperty();
for(auto& pPro:vec){
Connection con = pPro->getConnection();
QJsonObject connect;
connect["SrcNodeId"] = iter->nSrcNodeId.toString();
connect["SrcPortId"] = iter->nSrcPortId.toString();
connect["DestNodeId"] = iter->nDestNodeId.toString();
connect["DestPortId"] = iter->nDestPortId.toString();
connect["id"] = pPro->uuid().toString();
connect["SrcNodeId"] = con.nSrcNodeId.toString();
connect["SrcPortId"] = con.nSrcPortId.toString();
connect["DestNodeId"] = con.nDestNodeId.toString();
connect["DestPortId"] = con.nDestPortId.toString();
arrConnect.append(connect);
}
obj["connections"] = arrConnect;
@ -231,6 +233,7 @@ void DrawingPanel::loadNodes(QJsonObject obj)
for(QJsonValueRef connectJson:connectArr)
{
QJsonObject connect = connectJson.toObject();
QUuid id = QUuid(connect["id"].toString()); //电缆线id关联component中的电缆
QUuid srcId = QUuid(connect["SrcNodeId"].toString());
QUuid srcPortId = QUuid(connect["SrcPortId"].toString());
QUuid destId = QUuid(connect["DestNodeId"].toString());
@ -244,7 +247,7 @@ void DrawingPanel::loadNodes(QJsonObject obj)
//todo:从拓扑结构中查找port的id
if(_pModel)
{
_pModel->addConnectLline(QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
_pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
}
}
else

View File

@ -8,6 +8,7 @@
#include "baseModelItem/electricBaseModelSvgItem.h"
#include "baseModelItem/electricBaseModelSvgBus.h"
#include "baseModelItem/electricBaseModelLineItem.h"
#include "graphicsItem/electricBayItem.h"
#include "graphicsItem/itemPort.h"
#include "designerScene.h"
#include "dataBase.h"
@ -21,8 +22,12 @@
#include "diagramCavas.h"
#include <QJsonArray>
#include <QMessageBox>
#include <QRandomGenerator>
#include "baseProperty.h"
#include "projectModelSetting.h"
#include "bayManagerDlg.h"
#include "projectModelManager.h"
#include "global.h"
bool FixedPortsModel::_dataInitialised = false;
@ -32,6 +37,7 @@ FixedPortsModel::FixedPortsModel(PowerEntity* pEntity)
,_Interface(nullptr)
,_pEntity(pEntity)
,m_proModelSettingDlg(nullptr)
,m_pBayManager(nullptr)
{
_cavas = nullptr;
loadNodeDataFromDataBase();
@ -61,9 +67,9 @@ QMap<QUuid,QPointF> FixedPortsModel::allNodePos() const
return map;
}
QVector<Connection> FixedPortsModel::allConnections()
QVector<ModelProperty*> FixedPortsModel::allConnectionProperty()
{
QVector<Connection> vec;
QVector<ModelProperty*> vec;
for(auto pItem:_nodeItem)
{
if(pItem->getItemType() == GIT_link)
@ -71,7 +77,10 @@ QVector<Connection> FixedPortsModel::allConnections()
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pItem);
if(pLine)
{
vec.push_back(pLine->getConnection());
ModelProperty* pPro = pLine->getProperty();
if(pPro){
vec.push_back(pPro);
}
}
}
}
@ -113,6 +122,10 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
if(pro)
{
int type = pro->graphicsType();
if(type == GIT_link) //连线对象外部处理
return;
QString sMeta = pro->metaModelName();
QString sProModel = pro->modelName();
if(type == GIT_itemTri)
{
item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30));
@ -120,8 +133,19 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
}
else if(type == GIT_itemRect)
{
item = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false);
item->setItemType(GIT_itemRect);
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[3].icon;
}
else{
svg = model.modelSetting.mapSvg.first();
}
auto pCb = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false);
pCb->setItemType(GIT_itemRect);
pCb->loadSvg(svg);
item = pCb;
QJsonArray portArr = pro->context()["port"].toArray();
for(QJsonValueRef portJson:portArr)
{
@ -136,8 +160,19 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
}
else if(type == GIT_bus)
{
item = new ElectricSvgItemBus(QRect(-100, -3, 200, 6));
item->setItemType(GIT_bus);
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[1].icon;
}
else{
svg = model.modelSetting.mapSvg.first();
}
auto pBus = new ElectricSvgItemBus(QRect(-100, -3, 200, 6));
pBus->setItemType(GIT_bus);
pBus->loadSvg(svg);
item = pBus;
QJsonArray portArr = pro->context()["port"].toArray();
for(QJsonValueRef portJson:portArr)
@ -182,8 +217,11 @@ BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QStrin
item->setUuid(id);
item->setModelName(modelName);
item->setType(type);
GraphicsItemType localType = corresbondItem::typeToProGraphic[type]; //将通用类型转换为工程模图元
item->setGraphicsType(localType);
item->setTag(name);
item->setName(name);
item->setDataChanged(true);
BasePropertyManager::instance().insertEntityData(id,item);
}
return item;
@ -211,6 +249,9 @@ void FixedPortsModel::loadNodeDataFromDataBase()
pData->setStation(info.station);
pData->setDataChanged(false);
QString sMeta = info.context["metaModel"].toString();
pData->setMetaModelName(sMeta);
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,info.uuid.toString(),info.name); //首先load所有data和entity全局唯一
if(pEntity){
createTopoTerminalsByData(pEntity,info.context);
@ -236,14 +277,18 @@ void FixedPortsModel::loadNodeDataFromDataBase()
}
}
void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
void FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
{
GraphicsProjectModelItem* src = _nodeItem[srcId];
GraphicsProjectModelItem* dest = _nodeItem[destId];
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData();
if(mapData.contains(lineId))
{
BaseProperty* pPro = mapData.value(lineId);
if(src && dest)
{
ElectricConnectLineItem* pItem = new ElectricConnectLineItem();
pItem->setItemId(QUuid::createUuid());
pItem->setItemId(lineId);
pItem->setItemType(GIT_link);
_scene->addItem(pItem);
@ -256,16 +301,6 @@ void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUu
ItemPort* ptDest = nullptr;
ptDest = dest->getPortById(destPort.toString());
pItem->setEndPoint(ptDest->scenePos());
/*if(dest->getItemType() == GIT_bus) //母线动态创建port
{
ptDest = dest->getPortById(destPort.toString());
pItem->setEndPoint(ptDest->scenePos());
}
else
{
ptDest = dest->getPortById(destPort.toString());
pItem->setEndPoint(ptDest->scenePos());
}*/
if(ptDest != nullptr)
{
@ -273,10 +308,13 @@ void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUu
PortPos destPos = ptDest->portPos();
pItem->calculatePath();
pItem->setConnection(Connection(srcId,srcPort,srcType,srcPos,destId,destPort,destType,destPos));
pPro->setConnection(Connection(srcId,srcPort,srcType,srcPos,destId,destPort,destType,destPos));
ptDest->setConnect(pItem);
addNodeItem(pItem->itemId(),pItem);
pItem->setProperty(pPro);
}
}
}
}
@ -424,12 +462,27 @@ QVariant FixedPortsModel::nodeData(QUuid nodeId, NodeRole role) const
void FixedPortsModel::saveNode(int nPageId)
{
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData();
for(auto &pData:mapData)
QMap<QUuid,GraphicsProjectModelItem*> mapItems = allItems();
for(auto& pItem:mapItems)
{
BaseProperty* pData = dynamic_cast<BaseProperty*>(pItem->getProperty());
if(pData){
Connection con = pData->getConnection();
QString fromPin = con.nSrcPortId.toString();
QString toPin = con.nDestPortId.toString();
QJsonObject context;
context["from_pin"] = fromPin;
context["to_pin"] = toPin;
if(pData->prepareDelete())
{
DataBase::GetInstance()->deleteComponent(pData->uuid().toString());
if(pData->type() == 8){
PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin);
if(pCon){
DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId);
TopologyManager::instance().removeConnection(pCon->id());
}
}
continue;
}
if(pData->dataChanged())
@ -444,6 +497,8 @@ void FixedPortsModel::saveNode(int nPageId)
DataBase::GetInstance()->updateComponent(pData->uuid(),pData->tag(),pData->name(),pData->context());
for(auto &val:dataInfo.groupInfo)
{
if(val.groupName == "component")
continue;
DataBase::GetInstance()->updateDynamicProperty(pData->uuid(),val);
}
}
@ -452,41 +507,23 @@ void FixedPortsModel::saveNode(int nPageId)
DataBase::GetInstance()->insertComponent(pData->uuid(),pData->modelName(),pData->path(),pData->tag(),pData->name(),pData->description(),pData->grid(),pData->zone(),pData->station(),pData->type(),true,pData->state(),pData->status(),pData->connectedBus(),pData->label(),pData->context(),1);
for(auto &val:dataInfo.groupInfo)
{
if(val.groupName == "component")
continue;
DataBase::GetInstance()->insertDynamicProperty(pData->uuid(),val);
}
}
}
}
}
//todo:增加判断,只在设置模式保存连接关系
QVector<Connection> vecCon = allConnections(); //保存当前页面中的连接关系
for(auto &con:vecCon)
{
QString fromPin = con.nSrcPortId.toString();
QString toPin = con.nDestPortId.toString();
QJsonObject context;
context["from_pin"] = fromPin;
context["to_pin"] = toPin;
if(pData->type() == 8){
PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin);
if(pCon)
{
DataState state = pCon->state();
switch (state) {
case DataState::unchanged:
break;
case DataState::prepareDelete:
DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId);
TopologyManager::instance().removeConnection(pCon->id());
break;
case DataState::changed:
if(pCon){
DataBase::GetInstance()->insertTopologic(con.nSrcNodeId,con.nDestNodeId,context,0,"",0);
break;
default:
break;
}
}
}
}
}
//todo:savebay
}
void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,GraphicsProjectModelItem* pitem)
@ -602,7 +639,22 @@ void FixedPortsModel::onSignal_generateDiagram(const QString& sName)
{
lst.append(item);
}
generateProjectModel(sName,lst);
QList<GraphicsNonStandardItem*> lstBay;
for(auto& item:_bayItem)
{
lstBay.append(item);
}
generateProjectModel(sName,lst,lstBay);
}
void FixedPortsModel::onSignal_openBayManager()
{
if(m_pBayManager == nullptr){
m_pBayManager = new BayManagerDlg(_widget);
m_pBayManager->setModelController(this);
}
m_pBayManager->showDlg();
}
void FixedPortsModel::startHttpRequest()
@ -736,7 +788,7 @@ template<typename TypeLine> void FixedPortsModel::establishConnection(GraphicsBa
PowerConnection* pCon = TopologyManager::instance().createConnection(pItem->itemId().toString(),pSrcPort->getId(),pDestPort->getId(),pSrc->itemId().toString(),pDest->itemId().toString(),ModelFunctionType::BaseModel); //创建拓扑连接(逻辑)
if(pCon)
pCon->setState(DataState::changed);
pItem->setConnection(Connection(pSrc->itemId(),QUuid(pSrcPort->getId()),pSrcPort->getType(),pSrcPort->portPos(),pDest->itemId(),QUuid(pDestPort->getId()),pDestPort->getType(),pDestPort->portPos()));
pItem->getProperty()->setConnection(Connection(pSrc->itemId(),QUuid(pSrcPort->getId()),pSrcPort->getType(),pSrcPort->portPos(),pDest->itemId(),QUuid(pDestPort->getId()),pDestPort->getType(),pDestPort->portPos()));
}
}
@ -880,7 +932,7 @@ QVector<Connection> FixedPortsModel::allBaseConnections()
auto pLine = dynamic_cast<ElectricBaseModelLineItem*>(pItem);
if(pLine)
{
vec.push_back(pLine->getConnection());
vec.push_back(pLine->getProperty()->getConnection());
}
}
}
@ -938,7 +990,7 @@ void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem)
m_proModelSettingDlg->showDlg(srcItem);
}
void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<GraphicsBaseModelItem*> lstItem)
void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<GraphicsBaseModelItem*> lstItem,QList<GraphicsNonStandardItem*> lstOther)
{
DrawingPanel* pProPanel = nullptr;
if(_cavas){
@ -951,20 +1003,6 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<Graphi
pProPanel = _cavas->getPanel(sPageName);
}
/*for(auto& pBaseItem:lstItem) //首次循环处理所有非连线对象
{
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
if(pBase->type() != 8){ //不是电缆
QUuid id = QUuid::createUuid();
BaseProperty* pData = pProPanel->getModel()->addNodeData(id,pBase->type(),pBase->name(),pBase->modelName());
if(pData)
{
pData->setDataChanged(true); //数据状态改变
addProjectItemByBaseData(pProPanel,pBaseItem,pData);
}
}
}*/
for(auto& pBaseItem:lstItem) //第二次循环处理所有连线对象
{
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
@ -978,16 +1016,38 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<Graphi
}
}
}
QList<BaseProperty*> lstProData;
QMap<QUuid,GraphicsProjectModelItem*> mapItem = pProPanel->getModelController()->allItems(); //根据item获取data
for(auto& item:mapItem){
BaseProperty* pPro = dynamic_cast<BaseProperty*>(item->getProperty());
if(pPro){
lstProData.append(pPro);
}
}
for(auto& pOtherItem:lstOther)
{
BayProperty* pBay = dynamic_cast<BayProperty*>(pOtherItem->getProperty());
if(pBay){
BayProperty* pData = pProPanel->getModelController()->generateBayData(pBay,lstProData);
if(pData)
{
pProPanel->getModelController()->addBayByData(pData);
}
}
}
}
void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pBaseItem,BaseProperty* pPro)
void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pItem,BaseProperty* pPro)
{
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pItem->getProperty());
if(pBase){
if(_baseItem.contains(pBase->uuid())){
GraphicsProjectModelItem* pProItem = nullptr;
GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid());
pPro->setSourceItemId(pBaseItem->itemId().toString()); //设置被哪个对象生成
pPro->setMetaModelName(pBase->metaModelName()); //传递基模名
int type = pBase->graphicsType();
if(type == GIT_baseBus)
{
@ -1105,6 +1165,10 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
QString proToItemId;
QString proFromTerId;
QString proToTerId;
HandleType proFromType;
PortPos proFromPos;
HandleType proToType;
PortPos proToPos;
for(auto& pPro:mapPro)
{
if(pPro->getSourceItemId() == baseFromComponentId){
@ -1144,6 +1208,8 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
for(auto& port:mapFrom){
if(port->getSourcePortId() == baseFromTerId){
proFromTerId = port->getId();
proFromType = port->getType();
proFromPos = port->portPos();
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pProItem);
if(pLine)
pLine->setStartPoint(port->scenePos());
@ -1156,6 +1222,8 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
for(auto& port:mapTo){
if(port->getSourcePortId() == baseToTerId){
proToTerId = port->getId();
proToType = port->getType();
proToPos = port->portPos();
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pProItem);
if(pLine)
pLine->setEndPoint(port->scenePos());
@ -1167,6 +1235,9 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pProItem);
if(pLine)
pLine->calculatePath();
pPanel->getModelController()->addNodeItem(pBase->uuid(),pProItem);
pProItem->setProperty(pPro);
pPro->setConnection(Connection(QUuid(proFromItemId),QUuid(proFromTerId),proFromType,proFromPos,QUuid(proToItemId),QUuid(proToTerId),proToType,proToPos));
}
}
QString sModel = pBase->getModelProperty().modelSetting.modelName;
@ -1175,6 +1246,159 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase
}
}
bool FixedPortsModel::addBayItem(QUuid id,ElectricBayItem* pBay)
{
if(_bayItem.contains(id))
return false;
else
{
_bayItem.insert(id,pBay);
return true;
}
}
void FixedPortsModel::addItemsToBay(QList<GraphicsBaseItem*> lstItem,ElectricBayItem* pBay)
{
if(pBay == nullptr)
return;
BayProperty* proBay = dynamic_cast<BayProperty*>(pBay->getProperty());
if(proBay){
for(auto& item:lstItem){
if(item){
ModelProperty* p = item->getProperty();
auto lstCom = proBay->getLstComponent();
if(!lstCom.contains(p->uuid())){
proBay->getLstComponent().append(p->uuid());
}
}
}
}
}
BayProperty* FixedPortsModel::addBayData(QUuid uuid)
{
BayProperty* pData = BasePropertyManager::instance().findBayData(uuid); //已存在不不创建
if(pData != nullptr)
return pData;
BayProperty* item = new BayProperty(this);
if(item)
{
item->setUuid(uuid);
BasePropertyManager::instance().insertBayData(uuid,item);
}
return item;
}
QMap<QUuid,ElectricBayItem*>& FixedPortsModel::allBayItem()
{
return _bayItem;
}
BayProperty* FixedPortsModel::generateBayData(BayProperty* pData,QList<BaseProperty*> lst)
{
QUuid id = QUuid::createUuid();
BayProperty* p = addBayData(id);
p->setTag(pData->tag());
p->setName(pData->name());
p->setType(pData->getType());
p->setVoltage(pData->getVoltage());
p->setFla(pData->getFla());
p->setCapacity(pData->getCapacity());
p->setInService(pData->getInService());
QList<QUuid> lstCompo = pData->getLstComponent();
QList<QUuid> lstNewCompo = getCorrespondId(lstCompo,lst); //将基模component替换为工程模component
p->setLstComponent(lstNewCompo);
QList<QUuid> lstFrom = pData->getLstFrom();
QList<QUuid> lstNewFrom = getCorrespondId(lstFrom,lst);
p->setLstFrom(lstNewFrom);
QList<QUuid> lstTo = pData->getLstTo();
QList<QUuid> lstNewTo = getCorrespondId(lstTo,lst);
p->setLstTo(lstNewTo);
QList<QUuid> lstProtect = pData->getLstProtect();
QList<QUuid> lstNewProtect = getCorrespondId(lstProtect,lst);
p->setLstProtect(lstNewProtect);
QList<QUuid> lstFaultRecord = pData->getLstFaultRecord();
QList<QUuid> lstNewFaultRecord = getCorrespondId(lstFaultRecord,lst);
p->setLstFaultRecord(lstNewFaultRecord);
QList<QUuid> lstDynSense = pData->getLstDynSense();
QList<QUuid> lstNewDynSense = getCorrespondId(lstDynSense,lst);
p->setLstDynSense(lstNewDynSense);
QList<QUuid> lstStatus = pData->getLstStatus();
QList<QUuid> lstNewStatus = getCorrespondId(lstStatus,lst);
p->setLstStatus(lstNewStatus);
QList<QUuid> lstInstruct = pData->getLstInstruct();
QList<QUuid> lstNewInstruct = getCorrespondId(lstInstruct,lst);
p->setLstInstruct(lstNewInstruct);
QList<QUuid> lstEtc = pData->getLstEtc();
QList<QUuid> lstNewEtc= getCorrespondId(lstEtc,lst);
p->setLstEtc(lstNewEtc);
return p;
}
QList<QUuid> FixedPortsModel::getCorrespondId(QList<QUuid> lstCompo,QList<BaseProperty*> lst)
{
QList<QUuid> lstNewCompo;
for(auto& uuid:lstCompo)
{
for(auto& basePro:lst)
{
if(basePro->getSourceItemId() == uuid.toString()){ //工程模sourceid等于基模存储的componentid
lstNewCompo.append(basePro->uuid());
break;
}
}
}
return lstNewCompo;
}
QRectF FixedPortsModel::calculateItemsBoundingRect(QList<GraphicsBaseItem*> items)
{
if (items.isEmpty())
return QRectF();
// 初始化矩形为第一个item的场景边界矩形
QRectF boundingRect = items.first()->sceneBoundingRect();
// 遍历剩余item扩展矩形以包含所有item
for (int i = 1; i < items.size(); ++i) {
QGraphicsItem* item = items.at(i);
// 确保item在场景中且有效
if (item && item->scene()) {
boundingRect = boundingRect.united(item->sceneBoundingRect());
}
}
return boundingRect.adjusted(-10,-10,10,10);
}
void FixedPortsModel::addBayByData(BayProperty* pData)
{
QList<GraphicsBaseItem*> items;
QList<QUuid> lstCompo = pData->getLstComponent();
for(auto& id:lstCompo){
if(_nodeItem.contains(id)){
items.append(_nodeItem.value(id));
}
}
QRectF rec = calculateItemsBoundingRect(items);
auto pBay = new ElectricBayItem(rec);
pBay->setItemType(GIT_bay);
pBay->setProperty(pData);
pBay->setText(pData->tag());
addBayItem(pData->uuid(),pBay);
getScene()->addItem(pBay);
}
void FixedPortsModel::addTestData()
{
QUuid breakerId = QUuid::createUuid();
@ -1236,4 +1460,20 @@ void FixedPortsModel::addTestData()
addBaseItem(lineId,pLine);
establishConnection(pBreaker,pBus,pLine);
_scene->addItem(pLine);
QList<GraphicsBaseItem*> lst;
lst.append(pBreaker);
QRectF rec = calculateItemsBoundingRect(lst);
ElectricBayItem* pBay = new ElectricBayItem(rec);
pBay->setItemType(GIT_bay);
pBay->setText("间隔1");
QUuid bayId = QUuid::createUuid();
BayProperty* pBayData = addBayData(bayId);
pBay->setProperty(pBayData);
pBayData->setName("间隔1");
pBayData->setTag("间隔1");
pBayData->getLstComponent().append(breakerId);
addBayItem(bayId,pBay);
addItemsToBay(lst,pBay);
_scene->addItem(pBay);
}

View File

@ -0,0 +1,53 @@
#include "graphicsItem/electricBayItem.h"
#include <QPainter>
#include <QDebug>
#include <QStyleOption>
ElectricBayItem::ElectricBayItem(const QRectF &rect,QGraphicsItem *parent)
: GraphicsNonStandardItem(parent)
{
m_showRect = rect;
m_dWidth = rect.width();
m_dHeight = rect.height();
m_font.setPointSize(12);
}
ElectricBayItem::~ElectricBayItem()
{
}
void ElectricBayItem::setText(const QString& text)
{
prepareGeometryChange(); // 通知框架几何变化
m_text = text;
updateTextShape();
}
QPainterPath ElectricBayItem::shape()
{
QPainterPath path;
path.addRect(_recLabel);
return path;
}
void ElectricBayItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
painter->setPen(m_pen);
painter->drawText(_recLabel,m_text);
m_pen.setStyle(Qt::DashLine);
if (option->state & QStyle::State_Selected) //是选中状态,绘制选中框
{
painter->drawRect(m_showRect);
}
}
void ElectricBayItem::updateTextShape()
{
QFontMetricsF metrics(m_font);
QRectF recText = metrics.boundingRect(m_text);
//_recLabel = recText.translated(g_offsetX,g_offsetY);
_recLabel = recText;
shape();
}

View File

@ -35,13 +35,13 @@ void ElectricSvgItemBus::updateConnectData()
QJsonArray arr;
if(_property)
{
for(auto ptr:m_mapPort)
for(auto &ptr:m_mapPort)
{
//if(ptr->connected())
{
QJsonObject port;
port["portId"] = ptr->getId();
auto pLine = ptr->getConnectPtr();
//auto pLine = ptr->getConnectPtr();
port["x"] = ptr->pos().x();
port["y"] = ptr->pos().y();
port["portType"] = ptr->getType();
@ -50,6 +50,7 @@ void ElectricSvgItemBus::updateConnectData()
}
obj["port"] = arr;
obj["metaModel"] = _property->metaModelName();
_property->setContext(obj);
}
}

View File

@ -414,6 +414,7 @@ void GraphicsProjectModelItem::updateConnectData()
}
obj["port"] = arr;
obj["metaModel"] = _property->metaModelName();
_property->setContext(obj);
}
}

View File

@ -10,6 +10,7 @@
#include "topologyManager.h"
#include "graphicsItem/itemPort.h"
#include "graphicsItem/electricConnectLineItem.h"
#include "graphicsItem/electricBayItem.h"
#include "topologyManager.h"
QPointF BaseSelector::ms_ptMouseDown(0.0,0.0);
@ -129,6 +130,21 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
}
}
}
else
{
QPointF pos = event->scenePos();
// 遍历所有项检测点击
for (QGraphicsItem* item : scene->items()) {
ElectricBayItem* pItem = dynamic_cast<ElectricBayItem*>(item);
if (pItem) {
if(pItem->containsPoint(pos)){
// 处理命中
pItem->setSelected(true);
return;
}
}
}
}
}
if(m_opMode == OM_move) //可以多个选中同时移动
@ -166,6 +182,20 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
item->updateHandles();
}
}
else{
QPointF pos = event->scenePos();
// 遍历所有项检测点击
for (QGraphicsItem* item : scene->items()) {
ElectricBayItem* pItem = dynamic_cast<ElectricBayItem*>(item);
if (pItem) {
if(pItem->containsPoint(pos)){
// 处理命中
pItem->setSelected(true);
return;
}
}
}
}
}
}
@ -182,6 +212,8 @@ void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene
GraphicsBaseItem* item = qgraphicsitem_cast<GraphicsBaseItem*>(items.first());
if(item)
{
if(item->getItemType() == GIT_bay)
return;
if(ms_nDragHandle == H_none)
{
//设置光标样式
@ -409,6 +441,8 @@ void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, Design
GraphicsProjectModelItem* item = qgraphicsitem_cast<GraphicsProjectModelItem*>(items.first());
if(item)
{
if(item->getItemType() == GIT_bay) //间隔暂时返回
return;
QString modelName = item->getModelName(); //todo:additem时填写模型类型
QUuid uuid = item->itemId();
_model->showModelDlg(modelName,uuid,item);
@ -421,7 +455,7 @@ void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, Design
if(items.count() == 1)
{
GraphicsBaseModelItem* item = qgraphicsitem_cast<GraphicsBaseModelItem*>(items.first());
if(item)
if(item && item->getItemType() != GIT_bay)
{
_model->showProjectModelSettingDlg(item);
}

View File

@ -6,6 +6,7 @@
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <graphicsItem/graphicsBaseItem.h>
#include "baseProperty.h"
#include <QMessageBox>
ConnectingSelector::ConnectingSelector(FixedPortsModel* model,QObject *parent)
@ -135,7 +136,7 @@ void ConnectingSelector::createConnectLline(GraphicsProjectModelItem* connecting
pCon->setState(DataState::changed);
}
pItem->setConnection(Connection(connectingItem->itemId(),QUuid(srcPortId),ptSrc->getType(),ptSrc->portPos(),touchedItem->itemId(),QUuid(destPortId),ptDest->getType(),ptDest->portPos()));
pItem->getProperty()->setConnection(Connection(connectingItem->itemId(),QUuid(srcPortId),ptSrc->getType(),ptSrc->portPos(),touchedItem->itemId(),QUuid(destPortId),ptDest->getType(),ptDest->portPos()));
_model->addNodeItem(pItem->itemId(),pItem);
auto srcParent = ptSrc->getParentPtr();
auto destParent = ptDest->getParentPtr();

View File

@ -147,7 +147,14 @@
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableWidget_other"/>
<widget class="QTableWidget" name="tableWidget_other">
<attribute name="horizontalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</item>
@ -173,9 +180,6 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="cb_jk"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
@ -186,9 +190,6 @@
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="cb_qt"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
@ -221,9 +222,6 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="cb_dtgz"/>
</item>
<item row="7" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,0,0,0">
<item>
@ -237,7 +235,11 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="le_bayName"/>
<widget class="QLineEdit" name="le_bayName">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
@ -267,9 +269,6 @@
</item>
</layout>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="cb_gzlb"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
@ -280,12 +279,6 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="cb_ztjc"/>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="cb_zhbh"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
@ -296,6 +289,48 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="le_zhbh">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="le_jk">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="le_dtgz">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="le_gzlb">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="le_ztjc">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="le_qt">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>

View File

@ -28,33 +28,16 @@
<property name="horizontalSpacing">
<number>10</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<item row="2" column="1">
<widget class="QLineEdit" name="le_from"/>
</item>
<item row="4" column="3">
<widget class="QLineEdit" name="le_fla"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>名称</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="le_name"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>间隔序号</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="le_index"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>类型</string>
<string>联结 从</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
@ -64,12 +47,8 @@
<item row="1" column="1">
<widget class="QLineEdit" name="le_type"/>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>服役状态</string>
</property>
</widget>
<item row="0" column="3">
<widget class="QLineEdit" name="le_index"/>
</item>
<item row="1" column="3">
<layout class="QHBoxLayout" name="horizontalLayout">
@ -89,18 +68,19 @@
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_8">
<item row="0" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>联结 从</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
<string>间隔序号</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="le_from"/>
<item row="3" column="0" colspan="4">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_9">
@ -112,13 +92,13 @@
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLineEdit" name="le_to"/>
</item>
<item row="3" column="0" colspan="4">
<widget class="QSlider" name="horizontalSlider">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>类型</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@ -135,6 +115,9 @@
<item row="4" column="1">
<widget class="QLineEdit" name="le_voltage"/>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="le_capacity"/>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
@ -145,8 +128,25 @@
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QLineEdit" name="le_fla"/>
<item row="0" column="1">
<widget class="QLineEdit" name="le_name"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>名称</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>服役状态</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
@ -158,8 +158,8 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="le_capacity"/>
<item row="2" column="3">
<widget class="QLineEdit" name="le_to"/>
</item>
</layout>
</widget>

View File

@ -36,6 +36,12 @@
</property>
<item>
<widget class="QWidget" name="widget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
@ -46,6 +52,15 @@
<string notr="true">background-color: rgb(209, 209, 209);</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="font">

View File

@ -8,6 +8,7 @@
class BaseProperty;
class BaseModelProperty;
class BayProperty;
class DIAGRAM_DESIGNER_PUBLIC BasePropertyManager : public QObject
{
@ -29,6 +30,11 @@ public:
BaseModelProperty* findBaseEntityData(QUuid);
void deleteBaseEntityData(QUuid);
QMap<QUuid,BaseModelProperty*> getBaseEntityData() const;
void insertBayData(QUuid,BayProperty*);
BayProperty* findBayData(QUuid);
void deleteBayData(QUuid);
QMap<QUuid,BayProperty*> getBayData() const;
signals:
void dataCreated(QString uuid);
void dataChanged(QString uuid);
@ -37,5 +43,6 @@ public slots:
private:
QMap<QUuid,BaseProperty*> m_entityData; //工程模实例化元件的唯一数据
QMap<QUuid,BaseModelProperty*> m_baseEntityData; //基模实例元件数据
QMap<QUuid,BayProperty*> m_bayData; //间隔数据
};
#endif // BASEPROPERTYMANAGER_H

View File

@ -69,3 +69,27 @@ QMap<QUuid,BaseModelProperty*> BasePropertyManager::getBaseEntityData() const
{
return m_baseEntityData;
}
/************************************************************/
void BasePropertyManager::insertBayData(QUuid id,BayProperty* p)
{
if(!m_bayData.contains(id))
m_bayData.insert(id,p);
}
BayProperty* BasePropertyManager::findBayData(QUuid id)
{
return m_bayData.value(id,nullptr);
}
void BasePropertyManager::deleteBayData(QUuid id)
{
BayProperty* pData = m_bayData.value(id,nullptr);
if(pData)
delete pData;
}
QMap<QUuid,BayProperty*> BasePropertyManager::getBayData() const
{
return m_bayData;
}

View File

@ -152,7 +152,7 @@ void CMainWindow::initializeAction()
QAction* actEdit = ui->menuProject->addAction(QString::fromWCharArray(L"编辑工程模"));
connect(actEdit,&QAction::triggered,this,&CMainWindow::onAction_editProject);
QAction* actEditBay = ui->menuBay->addAction(QString::fromWCharArray(L"编辑间隔"));
QAction* actEditBay = ui->menuBay->addAction(QString::fromWCharArray(L"管理间隔"));
connect(actEditBay,&QAction::triggered,this,&CMainWindow::onAction_editBay);
QAction* testAct = ui->menuTest->addAction(QString::fromWCharArray(L"生成测试基模"));
@ -212,6 +212,7 @@ void CMainWindow::onAction_editProject()
void CMainWindow::onAction_editBay()
{
m_pDiagramCavas->onSignl_openCurrentBay();
}
void CMainWindow::onSignal_addItem(QGraphicsItem* item)