add project model edit

This commit is contained in:
baiYue 2025-06-27 19:17:04 +08:00
parent f311795535
commit 49991aa476
30 changed files with 1129 additions and 65 deletions

View File

@ -68,8 +68,11 @@ public:
virtual ~BaseModelProperty(); virtual ~BaseModelProperty();
virtual void addProData(QString sPage,BaseProperty* pData) {_generatedData.insert(sPage,pData);} virtual void addProData(QString sPage,BaseProperty* pData) {_generatedData.insert(sPage,pData);}
virtual PropertyModel& getModelProperty() {return pm;}
virtual void setModelProperty(PropertyModel pro) {pm = pro;}
private: private:
QMap<QString,BaseProperty*> _generatedData; //该数据生成过的工程模数据 QMap<QString,BaseProperty*> _generatedData; //该数据生成过的工程模数据
PropertyModel pm; //工程模的选择状态
}; };
class BaseProperty:public ModelProperty //图像工程模模属性类,存放电路元件属性 class BaseProperty:public ModelProperty //图像工程模模属性类,存放电路元件属性

View File

@ -9,12 +9,14 @@
#include <QJsonObject> #include <QJsonObject>
#include <QWidget> #include <QWidget>
#include <QStandardItemModel> #include <QStandardItemModel>
#include "tools.h"
const double g_dGriaphicsScene_Width = 800; const double g_dGriaphicsScene_Width = 800;
const double g_dGriaphicsScene_Height = 600; const double g_dGriaphicsScene_Height = 600;
const int g_dEditorItem_Width = 150; const int g_dEditorItem_Width = 150;
const int g_dEditorItem_Height = 80; const int g_dEditorItem_Height = 80;
//Q_NAMESPACE //Q_NAMESPACE
enum GraphicsItemType enum GraphicsItemType
{ {
@ -194,6 +196,12 @@ struct projectManager //工程模管理类
QJsonObject checkState; //属性选择状态 QJsonObject checkState; //属性选择状态
}; };
struct projectModelSetting //工程模设定类,如图标
{
QString modelName; //工程模名
QMap<QString,QByteArray> mapSvg; //存放选择的svg图片
};
/*struct baseModelSelectManger /*struct baseModelSelectManger
{ {
int id = 0; int id = 0;
@ -236,11 +244,31 @@ struct PropertyModel //工程模
{ {
MapProperty mapProperty; MapProperty mapProperty;
int nType = 0; //工程模类型,选择图标后确定 int nType = 0; //工程模类型,选择图标后确定
QStandardItemModel* pBase; //基础属性 QStandardItemModel* pBase = nullptr; //基础属性
QStandardItemModel* pSelect; //已选择属性 QStandardItemModel* pSelect = nullptr; //已选择属性
FormerName formerMeta; //曾用元模名 FormerName formerMeta; //曾用元模名
FormerName formerProject; //曾用工程模名 FormerName formerProject; //曾用工程模名
QMap<QString,projectManager> dataInfo; //存放数据库内容 QMap<QString,projectManager> dataInfo; //存放数据库内容
projectModelSetting modelSetting;
PropertyModel deepCopy() //深拷贝
{
PropertyModel copy;
copy.mapProperty = mapProperty;
copy.pBase = deepCloneModel(pBase);
copy.pSelect = deepCloneModel(pSelect);
copy.formerMeta = formerMeta;
copy.formerProject = formerProject;
copy.dataInfo = dataInfo;
copy.modelSetting = modelSetting;
return copy;
}
void release()
{
delete pBase;
delete pSelect;
pBase = nullptr;
pSelect = nullptr;
}
}; };
typedef QMap<QString,PropertyModel> MapProject; //str为工程名PropertyModel为工程属性 typedef QMap<QString,PropertyModel> MapProject; //str为工程名PropertyModel为工程属性
typedef QMap<QString,MapProject> MapMeta; //str为元模名,PropertyModel为工程模集 typedef QMap<QString,MapProject> MapMeta; //str为元模名,PropertyModel为工程模集

View File

@ -69,4 +69,10 @@ private:
int getLevel(QStandardItem *item); int getLevel(QStandardItem *item);
QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target, QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target,
int role = Qt::DisplayRole, const QModelIndex& parent = QModelIndex()); int role = Qt::DisplayRole, const QModelIndex& parent = QModelIndex());
// 使用 clone() 方法深拷贝item
QStandardItem* deepCloneItem(const QStandardItem* source);
// 深拷贝整个模型(不复制表头)
QStandardItemModel* deepCloneModel(const QStandardItemModel* source);
#endif // DATABASE_H #endif // DATABASE_H

View File

@ -33,3 +33,41 @@ QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target,
} }
return QModelIndex(); // 未找到 return QModelIndex(); // 未找到
} }
QStandardItem* deepCloneItem(const QStandardItem* source) {
if (!source) return nullptr;
// 使用 clone() 方法创建副本
QStandardItem* clone = source->clone();
// 递归复制所有子项
for (int row = 0; row < source->rowCount(); ++row) {
for (int col = 0; col < source->columnCount(); ++col) {
if (QStandardItem* child = source->child(row, col)) {
clone->setChild(row, col, deepCloneItem(child));
}
}
}
return clone;
}
QStandardItemModel* deepCloneModel(const QStandardItemModel* source) {
if (source == nullptr) return nullptr;
// 设置相同的行列数
QStandardItemModel* dest = new QStandardItemModel(source->parent());
dest->setRowCount(source->rowCount());
dest->setColumnCount(source->columnCount());
// 复制所有数据项
for (int row = 0; row < source->rowCount(); ++row) {
for (int col = 0; col < source->columnCount(); ++col) {
if (QStandardItem* item = source->item(row, col)) {
dest->setItem(row, col, deepCloneItem(item));
}
}
}
return dest;
}

View File

@ -19,6 +19,7 @@ set(DIAGRAMCAVAS_HEADER_FILES
include/ptExtraInfoDlg.h include/ptExtraInfoDlg.h
include/ctExtraInfoDlg.h include/ctExtraInfoDlg.h
include/projectModelSetting.h include/projectModelSetting.h
include/projectDiagramNameInput.h
include/diagramEditor/editPanel.h include/diagramEditor/editPanel.h
include/diagramEditor/editView.h include/diagramEditor/editView.h
include/diagramEditor/editScene.h include/diagramEditor/editScene.h
@ -57,6 +58,7 @@ set(DIAGRAMCAVAS_HEADER_FILES
include/util/selectorManager.h include/util/selectorManager.h
include/util/subMovingSelector.h include/util/subMovingSelector.h
../common/include/httpInterface.h ../common/include/httpInterface.h
../common/include/tools.h
../common/include/global.h ../common/include/global.h
../common/include/baseProperty.h ../common/include/baseProperty.h
../common/include/compiler.hpp ../common/include/compiler.hpp
@ -82,6 +84,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES
source/ptExtraInfoDlg.cpp source/ptExtraInfoDlg.cpp
source/ctExtraInfoDlg.cpp source/ctExtraInfoDlg.cpp
source/projectModelSetting.cpp source/projectModelSetting.cpp
source/projectDiagramNameInput.cpp
source/diagramEditor/editPanel.cpp source/diagramEditor/editPanel.cpp
source/diagramEditor/editView.cpp source/diagramEditor/editView.cpp
source/diagramEditor/editScene.cpp source/diagramEditor/editScene.cpp
@ -121,6 +124,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES
source/util/subMovingSelector.cpp source/util/subMovingSelector.cpp
../common/source/httpInterface.cpp ../common/source/httpInterface.cpp
../common/source/baseProperty.cpp ../common/source/baseProperty.cpp
../common/source/tools.cpp
) )
set(UI_FILES set(UI_FILES
@ -132,6 +136,7 @@ set(UI_FILES
ui/editorSettingDlg.ui ui/editorSettingDlg.ui
ui/diagramEditorWizard.ui ui/diagramEditorWizard.ui
ui/projectModelSetting.ui ui/projectModelSetting.ui
ui/projectDiagramNameInput.ui
) )
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)

View File

@ -15,6 +15,7 @@ class SelectorManager;
class GraphicsItemGroup; class GraphicsItemGroup;
class StatusBar; class StatusBar;
class PowerEntity; class PowerEntity;
class ProjectDiagramNameInput;
class DrawingPanel : public QWidget class DrawingPanel : public QWidget
{ {
@ -45,12 +46,15 @@ public:
QJsonObject getDiagramInfo() const; //返回图元位置信息 QJsonObject getDiagramInfo() const; //返回图元位置信息
void loadNodes(QJsonObject obj); //加载图元信息 void loadNodes(QJsonObject obj); //加载图元信息
void saveNodes(int pageId); //保存到数据库 void saveNodes(int pageId); //保存到数据库
DesignerScene* getScene() {return m_pGraphicsScene;}
signals: signals:
void panelDelete(const QString&); void panelDelete(const QString&);
protected: protected:
void closeEvent(QCloseEvent *closeEvent); void closeEvent(QCloseEvent *closeEvent);
public slots: public slots:
void onSignal_addGraphicsItem(modelStateInfo&); void onSignal_addGraphicsItem(modelStateInfo&);
void onSignal_Generate(); //由基模组态生成工程模组态
private: private:
Ui::drawingPanel *ui; Ui::drawingPanel *ui;
DesignerView* m_pGraphicsView; DesignerView* m_pGraphicsView;
@ -61,6 +65,7 @@ private:
DiagramMode _mode; DiagramMode _mode;
QString _name; QString _name;
PowerEntity* _pEntity; //组态图拓扑对象 PowerEntity* _pEntity; //组态图拓扑对象
ProjectDiagramNameInput* m_pDiagramNameInputer;
}; };
#endif #endif

View File

@ -44,6 +44,7 @@ public:
//QJsonObject saveNode(QUuid const) const; //QJsonObject saveNode(QUuid const) const;
void saveNode(int nPageId); void saveNode(int nPageId);
void setScene(DesignerScene* p){_scene = p;} void setScene(DesignerScene* p){_scene = p;}
DesignerScene* getScene() {return _scene;}
void setTopWidget(DrawingPanel* p) {_widget = p;} void setTopWidget(DrawingPanel* p) {_widget = p;}
QWidget* getTopWidget(); QWidget* getTopWidget();
QPointF getTerminalPos(const QString& sTerminalId); //获取拓扑接线点在当前diagram中的位置 QPointF getTerminalPos(const QString& sTerminalId); //获取拓扑接线点在当前diagram中的位置
@ -69,7 +70,8 @@ public:
BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName); //添加图元基模数据 BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName); //添加图元基模数据
void showProjectModelSettingDlg(GraphicsBaseModelItem*); //在基模拓扑图上打开工程模设置对话框 void showProjectModelSettingDlg(GraphicsBaseModelItem*); //在基模拓扑图上打开工程模设置对话框
void generateProjectModel(const QString&,QList<BaseModelProperty*>); //由基模生成工程模 void generateProjectModel(const QString&,QList<GraphicsBaseModelItem*>); //由基模生成工程模
void addProjectItemByBaseData(DrawingPanel*,GraphicsBaseModelItem*,BaseProperty*); //从基模item生成工程模item
void addTestData(); //生成测试基模 void addTestData(); //生成测试基模
Q_SIGNALS: Q_SIGNALS:
void activatePage(const QString&); //激活当前model所在page void activatePage(const QString&); //激活当前model所在page
@ -83,7 +85,6 @@ public Q_SLOTS:
void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsProjectModelItem*); //判断用户输入的名称是否已存在 void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsProjectModelItem*); //判断用户输入的名称是否已存在
void onTimeOut(); void onTimeOut();
void onSignal_GetPointData(QString type,QMap<qint64,double> map); void onSignal_GetPointData(QString type,QMap<qint64,double> map);
private: private:
QMap<QUuid,GraphicsProjectModelItem*> _nodeItem; //工程模对象 QMap<QUuid,GraphicsProjectModelItem*> _nodeItem; //工程模对象

View File

@ -13,12 +13,12 @@ public:
void resize(int,double, double, const QPointF&); void resize(int,double, double, const QPointF&);
void updateCoordinate(); void updateCoordinate();
void move(const QPointF&); void move(const QPointF&);
virtual void loadSvg(const QByteArray& data);
protected: protected:
virtual QPainterPath shape(); virtual QPainterPath shape();
virtual void editShape(int, const QPointF&); virtual void editShape(int, const QPointF&);
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
virtual void loadSvg(const QString&);
protected: protected:
QRectF m_lastBoudingRect; //记录上一时刻的boundingRect QRectF m_lastBoudingRect; //记录上一时刻的boundingRect
QSvgRenderer* m_pRender; QSvgRenderer* m_pRender;

View File

@ -461,8 +461,6 @@ public:
virtual bool itemChanged() const {return _itemChanged;} virtual bool itemChanged() const {return _itemChanged;}
virtual void setItemType(GraphicsItemType type){m_Itemtype = type;} virtual void setItemType(GraphicsItemType type){m_Itemtype = type;}
virtual GraphicsItemType getItemType() const {return m_Itemtype;} virtual GraphicsItemType getItemType() const {return m_Itemtype;}
virtual void setInnerType(int type){m_inerType = type;}
virtual int getInnerType() const {return m_inerType;}
virtual void renderSelectBackground(QPainter*); virtual void renderSelectBackground(QPainter*);
virtual ItemPort* getPortById(QString) const; virtual ItemPort* getPortById(QString) const;
virtual ItemPort* getPortPtr(int) const; virtual ItemPort* getPortPtr(int) const;
@ -475,7 +473,6 @@ public slots:
protected: protected:
QUuid m_itemId; QUuid m_itemId;
GraphicsItemType m_Itemtype; //显示类型 GraphicsItemType m_Itemtype; //显示类型
int m_inerType; //实际类型
ModelProperty* _property; ModelProperty* _property;
PowerEntity* _pEntity; //图元拓扑 PowerEntity* _pEntity; //图元拓扑
bool _itemChanged; //图元变化标志,判断是否需要保存 bool _itemChanged; //图元变化标志,判断是否需要保存

View File

@ -41,6 +41,8 @@ public:
QJsonObject toJson() const; QJsonObject toJson() const;
static PowerTerminal* fromJson(const QJsonObject& json, QObject* parent = nullptr); static PowerTerminal* fromJson(const QJsonObject& json, QObject* parent = nullptr);
void setGenerateBy(const QString& sName) {m_generateBy = sName;}
QString getGenerateBy() {return m_generateBy;}
signals: signals:
void positionChanged(const QPointF& newPosition); void positionChanged(const QPointF& newPosition);
@ -50,5 +52,6 @@ private:
const TerminalType m_type; const TerminalType m_type;
QString m_name; QString m_name;
QPointF m_relativePosition; QPointF m_relativePosition;
QString m_generateBy; //被哪个Terminal生成
}; };
#endif //POWERTERMINAL_H #endif //POWERTERMINAL_H

View File

@ -0,0 +1,30 @@
#ifndef PROJECTDIAGRAMNAMEINPUT_H
#define PROJECTDIAGRAMNAMEINPUT_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class projectDiagramNameInput; }
QT_END_NAMESPACE
class FixedPortsModel;
class ProjectDiagramNameInput : public QDialog
{
Q_OBJECT
public:
ProjectDiagramNameInput(QWidget *parent = nullptr);
~ProjectDiagramNameInput();
void initial();
void setModel(FixedPortsModel* p) {_model = p;}
public slots:
void onOkClicked();
void onCancelClicked();
void onNameEdited(const QString&);
private:
Ui::projectDiagramNameInput *ui;
FixedPortsModel* _model;
};
#endif

View File

@ -8,6 +8,7 @@ namespace Ui { class projectModelSetting; }
QT_END_NAMESPACE QT_END_NAMESPACE
class GraphicsBaseModelItem; class GraphicsBaseModelItem;
class BaseModelProperty;
class ProjectModelSetting : public QDialog class ProjectModelSetting : public QDialog
{ {
@ -17,16 +18,27 @@ public:
~ProjectModelSetting(); ~ProjectModelSetting();
void initial(); void initial();
void loadPicture();
void setSelectedItems(QStringList);
void showDlg(GraphicsBaseModelItem*); void showDlg(GraphicsBaseModelItem*);
void loadProject(const QString& sMeta);
protected: protected:
void onOkClicked(); void onOkClicked();
void onCancelClicked(); void onCancelClicked();
void onSaveAsClicked(); void onSaveAsClicked();
void onSelectClicked(); //选择图片
void onAddClicked(); //添加属性 void onAddClicked(); //添加属性
void onDecreaseClicked(); //减少属性 void onDecreaseClicked(); //减少属性
public slots:
void onSaveAsFinished(); //另存输入完毕
void onCurrentTextChanged(const QString&);
private:
void showTestPic(QByteArray);
private: private:
Ui::projectModelSetting *ui; Ui::projectModelSetting *ui;
BaseModelProperty* _curItemData; //当前操作对象的属性
QString _curPath;
}; };
#endif #endif

View File

@ -4,6 +4,7 @@
#include <QStatusBar> #include <QStatusBar>
class QLabel; class QLabel;
class QPushButton;
class StatusBar : public QStatusBar class StatusBar : public QStatusBar
{ {
@ -12,9 +13,16 @@ class StatusBar : public QStatusBar
public: public:
explicit StatusBar(QWidget *parent = nullptr); explicit StatusBar(QWidget *parent = nullptr);
~StatusBar(); ~StatusBar();
void initial();
void setButtonVisible(bool);
signals:
void generateDiagram();
public slots: public slots:
void onScaleLevelChanged(double f); void onScaleLevelChanged(double f);
void onGenerateClicked();
private: private:
QLabel *m_pScaleLevel; QLabel *m_pScaleLevel;
QPushButton *m_pButtonGenerate;
}; };
#endif // STATUSBAR_H #endif // STATUSBAR_H

View File

@ -11,6 +11,7 @@
#include "dataBase.h" #include "dataBase.h"
#include "powerEntity.h" #include "powerEntity.h"
#include "topologyManager.h" #include "topologyManager.h"
#include "projectDiagramNameInput.h"
DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode) DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: QWidget(parent) : QWidget(parent)
@ -18,6 +19,7 @@ DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode
,_pModel(nullptr) ,_pModel(nullptr)
,_mode(mode) ,_mode(mode)
,_pEntity(pEntity) ,_pEntity(pEntity)
,m_pDiagramNameInputer(nullptr)
{ {
ui->setupUi(this); ui->setupUi(this);
@ -37,9 +39,11 @@ DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode
_pModel->setScene(m_pGraphicsScene); _pModel->setScene(m_pGraphicsScene);
m_pStatusBar = new StatusBar(this); m_pStatusBar = new StatusBar(this);
if(mode == DM_edit)
m_pStatusBar->setButtonVisible(false);
ui->mainLayout->addWidget(m_pStatusBar); ui->mainLayout->addWidget(m_pStatusBar);
connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged); connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged);
connect(m_pStatusBar,&StatusBar::generateDiagram,this,&DrawingPanel::onSignal_Generate);
} }
DrawingPanel::~DrawingPanel() DrawingPanel::~DrawingPanel()
@ -162,6 +166,15 @@ void DrawingPanel::onSignal_addGraphicsItem(modelStateInfo& info)
} }
} }
void DrawingPanel::onSignal_Generate()
{
if(m_pDiagramNameInputer == nullptr){
m_pDiagramNameInputer = new ProjectDiagramNameInput(this);
m_pDiagramNameInputer->setModel(_pModel);
}
m_pDiagramNameInputer->show();
}
QJsonObject DrawingPanel::getDiagramInfo() const QJsonObject DrawingPanel::getDiagramInfo() const
{ {
QJsonObject obj; QJsonObject obj;

View File

@ -107,7 +107,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
pro = mapData[id]; pro = mapData[id];
if(pro) if(pro)
{ {
int type = pro->type(); int type = pro->graphicsType();
if(type == GIT_itemTri) if(type == GIT_itemTri)
{ {
item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30)); item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30));
@ -783,6 +783,7 @@ void FixedPortsModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,ModelFun
default: default:
break; break;
} }
QPointF f = port->pos();
TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType); TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType);
} }
} }
@ -906,7 +907,7 @@ void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem)
m_proModelSettingDlg->showDlg(srcItem); m_proModelSettingDlg->showDlg(srcItem);
} }
void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<BaseModelProperty*> lstData) void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<GraphicsBaseModelItem*> lstItem)
{ {
DrawingPanel* pProPanel = nullptr; DrawingPanel* pProPanel = nullptr;
if(_cavas){ if(_cavas){
@ -919,19 +920,117 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<BaseMo
pProPanel = _cavas->getPanel(sPageName); pProPanel = _cavas->getPanel(sPageName);
} }
for(auto& pBase:lstData) for(auto& pBaseItem:lstItem) //首次循环处理所有非连线对象
{ {
QUuid id = QUuid::createUuid(); BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
BaseProperty* pData = addNodeData(id,pBase->type(),pBase->name(),pBase->modelName()); if(pBase->type() != 8){ //不是电缆
if(pData) QUuid id = QUuid::createUuid();
{ BaseProperty* pData = pProPanel->getModel()->addNodeData(id,pBase->type(),pBase->name(),pBase->modelName());
//pitem->setProperty(pData); if(pData)
pData->setDataChanged(true); //数据状态改变 {
pData->setDataChanged(true); //数据状态改变
addProjectItemByBaseData(pProPanel,pBaseItem,pData);
}
}
}
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,id.toString(),pBase->name()); for(auto& pBaseItem:lstItem) //第二次循环处理所有连线对象
//if(pEntity) {
//pitem->setEntity(pEntity); BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
//createTopoTerminalsByItem(pitem); //创建item对象的逻辑接线点 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);
}
}
}
}
void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pBaseItem,BaseProperty* pPro)
{
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
if(pBase){
if(_baseItem.contains(pBase->uuid())){
GraphicsProjectModelItem* pProItem = nullptr;
GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid());
int type = pBase->graphicsType();
if(type == GIT_baseBus)
{
QRectF rec = pBaseItem->boundingRect();
pProItem = new ElectricSvgItemBus(rec.toRect());
pProItem->setItemType(GIT_bus);
QByteArray svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
else if(type == GIT_baseBreaker)
{
QRectF rec = pBaseItem->boundingRect();
pProItem = new ElectricSvgItemRect(rec.toRect());
pProItem->setItemType(GIT_itemRect);
QByteArray svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
if(pBase->graphicsType() == GIT_baseLine)
{
}
else
{
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,pPro->uuid().toString(),pBase->name());
QList<PowerTerminal*> lstBase = TopologyManager::instance().getTerminalsForEntity(pBase->uuid().toString(),ModelFunctionType::BaseModel); //获取基模的逻辑点
for(auto& baseTer:lstBase)
{
QUuid uid = QUuid::createUuid();
PowerTerminal* proTer = TopologyManager::instance().createTerminal(pEntity->id(),baseTer->type(),"",baseTer->relativePosition(),uid.toString(),ModelFunctionType::ProjectModel);
proTer->setGenerateBy(baseTer->id());
if(proTer->type() == TerminalType::PowerConnect)
{
pProItem->addPort(p_movable,proTer->relativePosition(),proTer->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)
{
locate = P_left;
}
else if(pos.x() > 0)
{
locate = P_right;
}
else if(pos.y() > 0)
{
locate = P_top;
}
else if(pos.y() < 0)
{
locate = P_down;
}
pProItem->addPort(P_const,pos,proTer->id(),typ,locate);
}
}
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->getModel()->addNodeItem(QUuid(pEntity->id()),pProItem);
}
} }
} }
} }
@ -942,18 +1041,17 @@ void FixedPortsModel::addTestData()
ElectricBaseModelSvgItem* pBreaker = new ElectricBaseModelSvgItem(QRect(-15, -15, 30, 30)); ElectricBaseModelSvgItem* pBreaker = new ElectricBaseModelSvgItem(QRect(-15, -15, 30, 30));
pBreaker->setItemId(breakerId); pBreaker->setItemId(breakerId);
pBreaker->setItemType(GIT_baseBreaker); pBreaker->setItemType(GIT_baseBreaker);
pBreaker->setInnerType(3);
pBreaker->initialPortsByDatabase();
QByteArray byte = DataBase::GetInstance()->ModelType()[3].icon; QByteArray byte = DataBase::GetInstance()->ModelType()[3].icon;
pBreaker->loadSvg(byte); pBreaker->loadSvg(byte);
PowerEntity* pEntityBreaker = TopologyManager::instance().createEntity(EntityType::Component,breakerId.toString(),"断路器1",ModelFunctionType::BaseModel); PowerEntity* pEntityBreaker = TopologyManager::instance().createEntity(EntityType::Component,breakerId.toString(),"断路器1",ModelFunctionType::BaseModel);
if(pEntityBreaker) if(pEntityBreaker)
pBreaker->setEntity(pEntityBreaker); pBreaker->setEntity(pEntityBreaker);
createTopoTerminalsByItem(pBreaker,ModelFunctionType::BaseModel);
BaseModelProperty* pBreakerData = addBaseNodeData(breakerId,3,"断路器1",DataBase::GetInstance()->ModelType()[3].modelType); BaseModelProperty* pBreakerData = addBaseNodeData(breakerId,3,"断路器1",DataBase::GetInstance()->ModelType()[3].modelType);
if(pBreakerData) if(pBreakerData)
{ {
pBreaker->setProperty(pBreakerData); pBreaker->setProperty(pBreakerData);
pBreaker->initialPortsByDatabase();
createTopoTerminalsByItem(pBreaker,ModelFunctionType::BaseModel);
pBreakerData->setDataChanged(true); //数据状态改变 pBreakerData->setDataChanged(true); //数据状态改变
} }
addBaseItem(breakerId,pBreaker); addBaseItem(breakerId,pBreaker);
@ -965,7 +1063,6 @@ void FixedPortsModel::addTestData()
ElectricBaseModelSvgBus* pBus = new ElectricBaseModelSvgBus(QRect(-200, -3, 400, 6)); ElectricBaseModelSvgBus* pBus = new ElectricBaseModelSvgBus(QRect(-200, -3, 400, 6));
pBus->setItemId(busId); pBus->setItemId(busId);
pBus->setItemType(GIT_baseBus); pBus->setItemType(GIT_baseBus);
pBus->setInnerType(1);
//pBreaker->initialPortsByDatabase(); //pBreaker->initialPortsByDatabase();
QByteArray byte1 = DataBase::GetInstance()->ModelType()[1].icon; QByteArray byte1 = DataBase::GetInstance()->ModelType()[1].icon;
pBus->loadSvg(byte1); pBus->loadSvg(byte1);
@ -987,8 +1084,7 @@ void FixedPortsModel::addTestData()
ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem(); ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem();
pLine->setItemId(lineId); pLine->setItemId(lineId);
pLine->setItemType(GIT_baseLine); pLine->setItemType(GIT_baseLine);
pLine->setInnerType(4); BaseModelProperty* pLineData = addBaseNodeData(lineId,8,"电缆1",DataBase::GetInstance()->ModelType()[4].modelType);
BaseModelProperty* pLineData = addBaseNodeData(lineId,4,"电缆1",DataBase::GetInstance()->ModelType()[4].modelType);
if(pLineData) if(pLineData)
{ {
pLine->setProperty(pLineData); pLine->setProperty(pLineData);

View File

@ -76,11 +76,6 @@ void ElectricSvgItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* o
} }
} }
void ElectricSvgItem::loadSvg(const QString& str)
{
m_pRender = new QSvgRenderer(str);
}
void ElectricSvgItem::resize(int nHandle,double dSX, double dSY, const QPointF& basePoint) void ElectricSvgItem::resize(int nHandle,double dSX, double dSY, const QPointF& basePoint)
{ {
switch (nHandle) switch (nHandle)
@ -115,6 +110,11 @@ void ElectricSvgItem::move(const QPointF& point)
moveBy(point.x(), point.y()); moveBy(point.x(), point.y());
} }
void ElectricSvgItem::loadSvg(const QByteArray& data)
{
m_pRender = new QSvgRenderer(data);
}
void ElectricSvgItem::editShape(int nHandle,const QPointF& ptMouse) void ElectricSvgItem::editShape(int nHandle,const QPointF& ptMouse)
{ {
prepareGeometryChange(); prepareGeometryChange();

View File

@ -10,7 +10,7 @@
ElectricSvgItemBus::ElectricSvgItemBus(const QRect &rect, QGraphicsItem *parent) ElectricSvgItemBus::ElectricSvgItemBus(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent) : ElectricSvgItem(rect,parent)
{ {
loadSvg(":/images/element/svg_bus.svg"); //loadSvg(":/images/element/svg_bus.svg");
setHandleIfShow(H_textCaption,false); setHandleIfShow(H_textCaption,false);
setHandleVisible(false); setHandleVisible(false);
setFunctionHandleIfShow(false); setFunctionHandleIfShow(false);

View File

@ -10,7 +10,7 @@
ElectricSvgItemRect::ElectricSvgItemRect(const QRect &rect, bool genNewPort, QGraphicsItem *parent) ElectricSvgItemRect::ElectricSvgItemRect(const QRect &rect, bool genNewPort, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent) : ElectricSvgItem(rect,parent)
{ {
loadSvg(":/images/element/svg_rect.svg"); //loadSvg(":/images/element/svg_rect.svg");
setHandleIfShow(H_textCaption,false); setHandleIfShow(H_textCaption,false);
setHandleIfShow(H_textCurrent,false); setHandleIfShow(H_textCurrent,false);
setHandleIfShow(h_textVoltage,false); setHandleIfShow(h_textVoltage,false);

View File

@ -7,7 +7,7 @@
ElectricSvgItemTriangle::ElectricSvgItemTriangle(const QRect &rect, QGraphicsItem *parent) ElectricSvgItemTriangle::ElectricSvgItemTriangle(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent) : ElectricSvgItem(rect,parent)
{ {
loadSvg(":/images/element/svg_triangle.svg"); //loadSvg(":/images/element/svg_triangle.svg");
setHandleIfShow(H_textCaption,false); setHandleIfShow(H_textCaption,false);
setHandleVisible(false); setHandleVisible(false);
setFunctionHandleIfShow(false); setFunctionHandleIfShow(false);

View File

@ -158,9 +158,13 @@ void GraphicsBaseItem::initialPortsByDatabase()
{ {
QMap<int,componentTypeInfo> mapType = DataBase::GetInstance()->getAllComponentType(); QMap<int,componentTypeInfo> mapType = DataBase::GetInstance()->getAllComponentType();
if(mapType.contains(m_inerType)) if(_property == nullptr){
qDebug()<<"item property null";
return;
}
if(mapType.contains(_property->type()))
{ {
QJsonArray nodesJsonArray = mapType[m_inerType].config["port"].toArray(); QJsonArray nodesJsonArray = mapType[_property->type()].config["port"].toArray();
for (QJsonValueRef nodeJson : nodesJsonArray) for (QJsonValueRef nodeJson : nodesJsonArray)
{ {

View File

@ -0,0 +1,51 @@
#include <QPushButton>
#include "projectDiagramNameInput.h"
#include "dataBase.h"
#include "ui_projectDiagramNameInput.h"
ProjectDiagramNameInput::ProjectDiagramNameInput(QWidget *parent)
: QDialog(parent)
,ui(new Ui::projectDiagramNameInput)
,_model(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
initial();
}
ProjectDiagramNameInput::~ProjectDiagramNameInput()
{
}
void ProjectDiagramNameInput::initial()
{
connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectDiagramNameInput::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectDiagramNameInput::onCancelClicked);
connect(ui->le_name,&QLineEdit::textEdited,this,&ProjectDiagramNameInput::onNameEdited);
}
void ProjectDiagramNameInput::onOkClicked()
{
if(DataBase::GetInstance()->getPageIdByName(ui->le_name->text()) != -1)
{
hide();
}
}
void ProjectDiagramNameInput::onCancelClicked()
{
hide();
}
void ProjectDiagramNameInput::onNameEdited(const QString& text)
{
if(_model)
{
if(DataBase::GetInstance()->getPageIdByName(text) == -1){ //不存在,可以创建
ui->label_info->setText("名称可用");
}else{
ui->label_info->setText("名称重复!");
}
}
}

View File

@ -1,13 +1,27 @@
#include <QPushButton>
#include <QMessageBox>
#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QSvgRenderer>
#include <QPainter>
#include "projectModelSetting.h" #include "projectModelSetting.h"
#include "ui_projectModelSetting.h" #include "ui_projectModelSetting.h"
#include <QPushButton> #include "baseProperty.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "projectModelManager.h"
#include "tools.h"
#include "global.h"
#include "logger.h"
ProjectModelSetting::ProjectModelSetting(QWidget *parent) ProjectModelSetting::ProjectModelSetting(QWidget *parent)
: QDialog(parent) : QDialog(parent)
,ui(new Ui::projectModelSetting) ,ui(new Ui::projectModelSetting)
,_curItemData(nullptr)
{ {
setWindowFlags(Qt::Widget); ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
initial();
} }
ProjectModelSetting::~ProjectModelSetting() ProjectModelSetting::~ProjectModelSetting()
@ -20,14 +34,100 @@ void ProjectModelSetting::initial()
connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectModelSetting::onOkClicked); connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectModelSetting::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectModelSetting::onCancelClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectModelSetting::onCancelClicked);
connect(ui->btn_saveAs,&QPushButton::clicked,this,&ProjectModelSetting::onSaveAsClicked); connect(ui->btn_saveAs,&QPushButton::clicked,this,&ProjectModelSetting::onSaveAsClicked);
connect(ui->btn_select,&QPushButton::clicked,this,&ProjectModelSetting::onSelectClicked);
connect(ui->btn_apply,&QPushButton::clicked,this,&ProjectModelSetting::onAddClicked); connect(ui->btn_apply,&QPushButton::clicked,this,&ProjectModelSetting::onAddClicked);
connect(ui->btn_revoke,&QPushButton::clicked,this,&ProjectModelSetting::onDecreaseClicked); connect(ui->btn_revoke,&QPushButton::clicked,this,&ProjectModelSetting::onDecreaseClicked);
connect(ui->le_saveAs,&QLineEdit::editingFinished,this,&ProjectModelSetting::onSaveAsFinished);
connect(ui->cb_modelType,&QComboBox::currentTextChanged,this,&ProjectModelSetting::onCurrentTextChanged);
_curPath = QCoreApplication::applicationDirPath()+"/proModelImage/";
ui->cb_modelType->setPlaceholderText(" ");
}
void ProjectModelSetting::loadPicture()
{
ui->listWidget_icon->clear();
QString path = _curPath+_curItemData->metaModelName()+"/";
QDir dir(path);
QStringList namefiles;
namefiles<<"*.png"<<"*.svg";
QStringList files=dir.entryList(namefiles,QDir::Files|QDir::Readable,QDir::Name);
//动态添加item到QListWidget里
for(int i=0;i<files.size();i++)
{
QString sPath = path+files.at(i);
QListWidgetItem *newitem=new QListWidgetItem(QIcon(QPixmap(sPath).scaled(100, 100)),files.at(i));
QFile file(sPath);
if (!file.open(QIODevice::ReadOnly)) {
LOG_WARN("File", QString("%1 svgfile open failed").arg(sPath));
return;
}
// Read SVG content
QByteArray svgData = file.readAll().toHex();
file.close();
newitem->setData(Qt::UserRole + 1,svgData); //item附带二进制数据
QFileInfo fi(path+files.at(i)); //获取文件信息
newitem->setText(fi.baseName());//Returns the base name of the file without the path
newitem->setTextAlignment(Qt::AlignHCenter);//设置文字对齐方式:水平居中
ui->listWidget_icon->addItem(newitem);
}
}
void ProjectModelSetting::setSelectedItems(QStringList lst)
{
QList<QListWidgetItem*> lstItem = ui->listWidget_icon->findItems(lst.first(),Qt::MatchExactly);
if(!lstItem.empty())
{
ui->listWidget_icon->setCurrentItem(lstItem.first());
}
} }
void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode) void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode)
{ {
show(); show();
ui->treeView_base->setModel(nullptr);
ui->treeView_sub->setModel(nullptr);
ModelProperty* p = srcNode->getProperty();
BaseModelProperty* pro = dynamic_cast<BaseModelProperty*>(p);
if(pro)
{
QString sName = pro->name();
QString sMetaModel = pro->metaModelName();
QString sModel = pro->modelName();
_curItemData = pro;
loadProject(sMetaModel);
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModel);
if(bExist){ //使用存在的属性
ui->cb_modelType->setCurrentText(sModel);
}
else{ //新建当前对象的属性
if(pro->getModelProperty().pBase == nullptr && pro->getModelProperty().pSelect == nullptr){
pro->getModelProperty().pBase = new QStandardItemModel(this);
pro->getModelProperty().pSelect = new QStandardItemModel(this);
pro->getModelProperty().mapProperty = ProjectModelManager::instance().addNewProject(sMetaModel,sModel,pro->getModelProperty());
}
ui->treeView_base->setModel(pro->getModelProperty().pBase);
ui->treeView_sub->setModel(pro->getModelProperty().pSelect);
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
}
ui->le_saveAs->clear();
ui->le_name->setText(sName);
ui->le_base->setText(sMetaModel);
}
loadPicture();
}
void ProjectModelSetting::loadProject(const QString& sMeta)
{
ui->cb_modelType->blockSignals(true);
ui->cb_modelType->clear();
QStringList lst = ProjectModelManager::instance().getProjectModelLst(sMeta);
ui->cb_modelType->addItems(lst);
ui->cb_modelType->blockSignals(false);
} }
void ProjectModelSetting::onOkClicked() void ProjectModelSetting::onOkClicked()
@ -42,15 +142,176 @@ void ProjectModelSetting::onCancelClicked()
void ProjectModelSetting::onSaveAsClicked() void ProjectModelSetting::onSaveAsClicked()
{ {
QString sModelName = ui->le_saveAs->text();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
if(bExist){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"该模型已存在"));
}
else{ //新建的模型拷贝当前内容到全局队列
_curItemData->getModelProperty().modelSetting.modelName = sModelName;
PropertyModel pro = _curItemData->getModelProperty().deepCopy();
ProjectModelManager::instance().getData()[_curItemData->metaModelName()].insert(sModelName,pro);
ProjectModelManager::instance().generate(_curItemData->metaModelName(),sModelName);
ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName);
ui->cb_modelType->blockSignals(true);
ui->cb_modelType->addItem(sModelName);
ui->cb_modelType->setCurrentText(sModelName);
ui->cb_modelType->blockSignals(false);
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"另存成功"));
}
ui->label_info->clear();
}
void ProjectModelSetting::onSelectClicked()
{
QList<QListWidgetItem*> items = ui->listWidget_icon->selectedItems();
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());
}
}
} }
void ProjectModelSetting::onAddClicked() void ProjectModelSetting::onAddClicked()
{ {
if(_curItemData == nullptr)
return;
QModelIndex selected = ui->treeView_base->currentIndex();
QStandardItem* pItem = _curItemData->getModelProperty().pBase->itemFromIndex(selected);
if(pItem)
{
int nLevel = getLevel(pItem);
if(nLevel != 1) //不是二级节点就返回
return;
else{
QString strGroup = pItem->parent()->text();
QStandardItem *parentItem = pItem->parent();
if (parentItem) {
parentItem->takeRow(pItem->row());
}
QList<QStandardItem*> groupItem = _curItemData->getModelProperty().pSelect->findItems(strGroup);
if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加
{
QStandardItem* pGroup = new QStandardItem(strGroup);
_curItemData->getModelProperty().pSelect->appendRow(pGroup);
pGroup->appendRow(pItem);
}
else{
QStandardItem* pGroup = groupItem[0];
pGroup->appendRow(pItem);
}
_curItemData->getModelProperty().mapProperty[strGroup].mCheckState[pItem->text()].checkState = true; //选择状态设为1
}
}
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
} }
void ProjectModelSetting::onDecreaseClicked() void ProjectModelSetting::onDecreaseClicked()
{ {
if(_curItemData == nullptr)
return;
QStringList lstPub = ProjectModelManager::instance().getPublicGroupList();
QModelIndex selected = ui->treeView_sub->currentIndex();
QStandardItem* pItem = _curItemData->getModelProperty().pSelect->itemFromIndex(selected);
if(pItem)
{
if(lstPub.contains(pItem->parent()->text())){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"公共属性无法编辑"));
return;
}
int nLevel = getLevel(pItem);
if(nLevel != 1) //不是二级节点就返回
return;
else{
QString strGroup = pItem->parent()->text();
QStandardItem *parentItem = pItem->parent();
if (parentItem) {
parentItem->takeRow(pItem->row());
if(!parentItem->hasChildren()){
_curItemData->getModelProperty().pSelect->takeRow(parentItem->row());
}
}
QList<QStandardItem*> groupItem = _curItemData->getModelProperty().pBase->findItems(strGroup);
if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加
{
QStandardItem* pGroup = new QStandardItem(strGroup);
_curItemData->getModelProperty().pBase->appendRow(pGroup);
pGroup->appendRow(pItem);
}
else{
QStandardItem* pGroup = groupItem[0];
pGroup->appendRow(pItem);
}
_curItemData->getModelProperty().mapProperty[strGroup].mCheckState[pItem->text()].checkState = false; //选择状态设为1
}
}
ui->treeView_base->expandAll();
}
void ProjectModelSetting::onSaveAsFinished()
{
QString sModelName = ui->le_saveAs->text();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
if(bExist){
ui->label_info->setText(QString::fromWCharArray(L"名称已存在"));
}
else{
ui->label_info->setText(QString::fromWCharArray(L"名称可用"));
}
}
void ProjectModelSetting::onCurrentTextChanged(const QString& text)
{
if(text.isEmpty())
return;
if(_curItemData)
{
_curItemData->getModelProperty().release();
PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text].deepCopy();
_curItemData->setModelProperty(model);
ui->treeView_base->setModel(_curItemData->getModelProperty().pBase);
ui->treeView_sub->setModel(_curItemData->getModelProperty().pSelect);
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
loadPicture();
setSelectedItems(_curItemData->getModelProperty().modelSetting.mapSvg.keys());
showTestPic(_curItemData->getModelProperty().modelSetting.mapSvg.first());
}
}
void ProjectModelSetting::showTestPic(QByteArray arr)
{
QSvgRenderer renderer(arr);
bool a = renderer.isValid();
qreal dipScale = qApp->devicePixelRatio();
QSize scaledSize = ui->modelImagePreview->size() * dipScale;
//创建透明背景的高分辨率图像
QImage image(scaledSize, QImage::Format_A2BGR30_Premultiplied);
image.fill(Qt::transparent);
//高质量渲染设置
QPainter painter(&image);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
//渲染到目标对象
renderer.render(&painter, QRect(0, 0, scaledSize.width(), scaledSize.height()));
//转换为像素图
QPixmap pixmap = QPixmap::fromImage(image);
pixmap.setDevicePixelRatio(dipScale);
//显示图片
ui->modelImagePreview->clear();
ui->modelImagePreview->setPixmap(pixmap);
} }

View File

@ -1,13 +1,18 @@
#include <QLabel> #include <QLabel>
#include <QPushButton>
#include "statusBar.h" #include "statusBar.h"
StatusBar::StatusBar(QWidget *parent) StatusBar::StatusBar(QWidget *parent)
: QStatusBar(parent) : QStatusBar(parent)
,m_pScaleLevel(nullptr) ,m_pScaleLevel(nullptr)
,m_pButtonGenerate(nullptr)
{ {
m_pScaleLevel = new QLabel("当前级数:10",this); m_pScaleLevel = new QLabel("当前级数:10",this);
m_pScaleLevel->setMinimumWidth(250); m_pScaleLevel->setMinimumWidth(250);
m_pButtonGenerate = new QPushButton("生成工程组态",this);
addWidget(m_pScaleLevel); addWidget(m_pScaleLevel);
addPermanentWidget(m_pButtonGenerate);
initial();
} }
StatusBar::~StatusBar() StatusBar::~StatusBar()
@ -15,7 +20,22 @@ StatusBar::~StatusBar()
} }
void StatusBar::initial()
{
connect(m_pButtonGenerate,&QPushButton::clicked,this,&StatusBar::onGenerateClicked);
}
void StatusBar::setButtonVisible(bool val)
{
setVisible(m_pButtonGenerate);
}
void StatusBar::onScaleLevelChanged(double f) void StatusBar::onScaleLevelChanged(double f)
{ {
m_pScaleLevel->setText(QString::fromWCharArray(L"当前级数:")+QString::number(f)); m_pScaleLevel->setText(QString::fromWCharArray(L"当前级数:")+QString::number(f));
} }
void StatusBar::onGenerateClicked()
{
emit generateDiagram();
}

View File

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>projectDiagramNameInput</class>
<widget class="QDialog" name="projectDiagramNameInput">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>330</width>
<height>138</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="widget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>25</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(200, 200, 200);</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(0, 0, 0);</string>
</property>
<property name="text">
<string>输入组态图名称</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>227</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(0, 0, 0);</string>
</property>
<property name="text">
<string>名称</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="le_name"/>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_info_2">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(0, 0, 0);</string>
</property>
<property name="text">
<string>提示:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_info">
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(0, 0, 0);</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_ok">
<property name="text">
<string>确定</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_cancel">
<property name="text">
<string>取消</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>634</width> <width>814</width>
<height>596</height> <height>723</height>
</rect> </rect>
</property> </property>
<property name="font"> <property name="font">
@ -236,23 +236,103 @@ color: rgb(8, 8, 8);</string>
<attribute name="title"> <attribute name="title">
<string>其他设置</string> <string>其他设置</string>
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="1,1"> <layout class="QVBoxLayout" name="verticalLayout_3" stretch="1,0,1">
<item> <item>
<widget class="QGroupBox" name="groupBox_3"> <widget class="QGroupBox" name="groupBox_3">
<property name="title"> <property name="title">
<string>工程图标设置</string> <string>工程图标设置</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item> <item>
<widget class="QListWidget" name="listWidget_icon"> <widget class="QListWidget" name="listWidget_icon">
<property name="dragDropMode">
<enum>QAbstractItemView::DragDropMode::DragDrop</enum>
</property>
<property name="iconSize">
<size>
<width>100</width>
<height>100</height>
</size>
</property>
<property name="viewMode"> <property name="viewMode">
<enum>QListView::ViewMode::IconMode</enum> <enum>QListView::ViewMode::IconMode</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_infoIcon">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_select">
<property name="text">
<string>选择</string>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="modelImagePreview">
<property name="minimumSize">
<size>
<width>0</width>
<height>100</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>100</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer_3"> <spacer name="verticalSpacer_3">
<property name="orientation"> <property name="orientation">
@ -298,7 +378,20 @@ color: rgb(8, 8, 8);</string>
<item> <item>
<widget class="QLineEdit" name="le_saveAs"> <widget class="QLineEdit" name="le_saveAs">
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_info">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -86,6 +86,12 @@ public:
QMap<int,modelAttributePublic> ModelAttributePublic() const {return _modelAttributePublic;} QMap<int,modelAttributePublic> ModelAttributePublic() const {return _modelAttributePublic;}
QMap<int,modelConnectivity> ModelConnectivity() const {return _modelConnectivity;} QMap<int,modelConnectivity> ModelConnectivity() const {return _modelConnectivity;}
//***********工程模 //***********工程模
bool insertProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting); //插入工程模设置信息(图标等选择信息)
bool updateProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting);
QJsonObject getProjectSetting(const QString& baseModel,const QString& modelName);
QStringList getProjectWithinBase(const QString& baseModel); //获取基模下的所有工程模名称
bool deleteProjectSetting(const QString& baseModel,const QString& modelName);
bool createProjectManager(); //生成记录表,包含工程模名称,属性组名,启用和关闭的属性字段(json类型)[一个属性组建一个表] bool createProjectManager(); //生成记录表,包含工程模名称,属性组名,启用和关闭的属性字段(json类型)[一个属性组建一个表]
bool insertProjectManager(const QString& name,const QString& tag,const QString& metaModel,const QString& groupName,int linkType,QJsonObject checkState,bool isPublic = false); bool insertProjectManager(const QString& name,const QString& tag,const QString& metaModel,const QString& groupName,int linkType,QJsonObject checkState,bool isPublic = false);
bool updateCheckState(const QString& tableName,QJsonObject checkState); //更新属性选中状态 bool updateCheckState(const QString& tableName,QJsonObject checkState); //更新属性选中状态

View File

@ -23,6 +23,8 @@ public:
QList<QStandardItem*> getGroupSub(QStandardItemModel*,const QString&); //返回指定组下的属性(如果存在) QList<QStandardItem*> getGroupSub(QStandardItemModel*,const QString&); //返回指定组下的属性(如果存在)
MapMeta& getData() {return m_mapTotalData;} MapMeta& getData() {return m_mapTotalData;}
void deleteData(const QString& meta,const QString& proj); void deleteData(const QString& meta,const QString& proj);
void updateSetting(const QString& sMeta,const QString& sPro); //更新模型数据(图片
QStringList getProjectModelLst(const QString& sMeta);
public: public:
QStringList getModelList() const; //获取元模型列表 QStringList getModelList() const; //获取元模型列表
QStringList getGroupList(const QString& model) const; //返回该元模下的属性组列表 QStringList getGroupList(const QString& model) const; //返回该元模下的属性组列表
@ -42,6 +44,7 @@ private:
int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList<QStandardItem*> lstSelect,QList<QStandardItem*> lstBase,int nLinkType,bool isPublic = false); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList<QStandardItem*> lstSelect,QList<QStandardItem*> lstBase,int nLinkType,bool isPublic = false); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型)
QJsonObject getSelectedState(QList<QStandardItem*> select,QList<QStandardItem*> base); //返回json格式的选中状态 QJsonObject getSelectedState(QList<QStandardItem*> select,QList<QStandardItem*> base); //返回json格式的选中状态
QString getItemDataType(const QStandardItem* pItem); //返回数据类型 QString getItemDataType(const QStandardItem* pItem); //返回数据类型
projectModelSetting getModelSetting(const QString& sMeta,const QString& sProject); //获取指定工程模的设定
private: private:
MapMeta m_mapTotalData; MapMeta m_mapTotalData;
bool _bInitialised; bool _bInitialised;

View File

@ -1427,6 +1427,121 @@ bool DataBase::getModelConnectivity()
} }
} }
//=================================工程模===========================================// //=================================工程模===========================================//
bool DataBase::insertProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting)
{
QString strSQL = "INSERT INTO diagramui_projectmodelSetting(base_name,model_name, context) VALUES (?, ?, ?)";
QJsonDocument contextDoc(setting);
QString strContext = contextDoc.toJson(QJsonDocument::Compact);
QVariantList params;
params.append(baseModel);
params.append(modelName);
params.append(strContext);
try
{
executeSQL(strSQL,false,params);
return true;
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("Insert diagramui_projectmodelSetting fail"));
return false;
}
}
bool DataBase::updateProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting)
{
QJsonDocument contextDoc(setting);
QString strContext = contextDoc.toJson(QJsonDocument::Compact);
QString strSQL = "UPDATE diagramui_projectmodelsetting SET context = ? WHERE base_name = ? AND model_name = ?";
QVariantList params;
params.append(strContext);
params.append(baseModel);
params.append(modelName);
try
{
executeSQL(strSQL,false,params);
return true;
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("Update model %1 setting %2 fail").arg(modelName,strContext));
return false;
}
}
QJsonObject DataBase::getProjectSetting(const QString& baseModel,const QString& modelName)
{
QString strSQL = "SELECT context FROM diagramui_projectmodelsetting WHERE base_name = ? AND model_name = ?";
QVariantList params;
params.append(baseModel);
params.append(modelName);
try
{
QJsonObject obj;
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
QString con = query.value(0).toString();
obj= QstringToJson(con);
}
return obj;
}
catch (const std::exception& e)
{
return QJsonObject();
}
}
QStringList DataBase::getProjectWithinBase(const QString& baseModel)
{
QStringList lst;
QString strSQL = "SELECT model_name FROM diagramui_projectmodelsetting WHERE base_name = ?";
QVariantList params;
params.append(baseModel);
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
QString name = query.value(0).toString();
lst.append(name);
}
return lst;
}
catch (const std::exception& e)
{
return lst;
}
}
bool DataBase::deleteProjectSetting(const QString& baseModel,const QString& modelName)
{
QString strSQL = "DELETE FROM diagramui_projectmodelsetting WHERE base_name = ? AND model_name = ?";
QVariantList params;
params.append(baseModel);
params.append(modelName);
try
{
executeSQL(strSQL,false,params);
LOG_INFO("DB", QString("Delete row %1 success").arg(modelName));
return true;
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("Delete row %1 failed").arg(modelName));
return false;
}
}
bool DataBase::createProjectManager() bool DataBase::createProjectManager()
{ {
QString strSQL = R"( QString strSQL = R"(

View File

@ -27,30 +27,28 @@ void ProjectModelManager::initialModel()
if(_bInitialised) if(_bInitialised)
return; return;
QStringList lstModel = getModelList(); QStringList lstModel = getModelList();
for(auto &model:lstModel) for(auto &sModel:lstModel)
{ {
MapProject mp; MapProject mp;
QMap<QString,int> mapProject = DataBase::GetInstance()->getProjectFromManager(model); QMap<QString,int> mapProject = DataBase::GetInstance()->getProjectFromManager(sModel);
QMap<QString,int>::Iterator iter; QMap<QString,int>::Iterator iter;
for(iter = mapProject.begin();iter != mapProject.end(); ++iter) for(iter = mapProject.begin();iter != mapProject.end(); ++iter)
{ {
//QStandardItem* propertyItem = new QStandardItem(iter.key());
PropertyModel pm; PropertyModel pm;
pm.pBase = new QStandardItemModel(this); pm.pBase = new QStandardItemModel(this);
pm.pSelect = new QStandardItemModel(this); pm.pSelect = new QStandardItemModel(this);
pm.mapProperty = addNewProject(model,iter.key(),pm); pm.mapProperty = addNewProject(sModel,iter.key(),pm);
pm.nType = iter.value(); pm.nType = iter.value();
pm.formerMeta.sName = model; pm.formerMeta.sName = sModel;
pm.formerProject.sName = iter.key(); pm.formerProject.sName = iter.key();
pm.dataInfo = DataBase::GetInstance()->getProjectModelGroupInfo(iter.key()); pm.dataInfo = DataBase::GetInstance()->getProjectModelGroupInfo(iter.key());
pm.modelSetting = getModelSetting(sModel,iter.key());
mp.insert(iter.key(),pm); mp.insert(iter.key(),pm);
} }
//todo:读取存储,按分类遍历名称 m_mapTotalData.insert(sModel,mp);
m_mapTotalData.insert(model,mp);
} }
_bInitialised = true; _bInitialised = true;
@ -266,6 +264,42 @@ void ProjectModelManager::deleteData(const QString& sMeta,const QString& sProjec
m_mapTotalData[sMeta].remove(sProject); m_mapTotalData[sMeta].remove(sProject);
} }
void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sProject)
{
QJsonObject object;
QJsonArray arr;
QMap<QString,QByteArray> mapSvg = m_mapTotalData[sMeta][sProject].modelSetting.mapSvg;
for(auto iter = mapSvg.begin();iter != mapSvg.end();++iter)
{
QJsonObject obj;
obj["name"] = iter.key();
obj["data"] = QString::fromUtf8(iter.value());
arr.push_back(obj);
}
object["picture"] = arr;
QJsonObject jsVal = DataBase::GetInstance()->getProjectSetting(sMeta,sProject);
if(jsVal.empty()){
DataBase::GetInstance()->insertProjectSetting(sMeta,sProject,object);
}
else{
DataBase::GetInstance()->updateProjectSetting(sMeta,sProject,object);
}
}
QStringList ProjectModelManager::getProjectModelLst(const QString& sMeta)
{
//return DataBase::GetInstance()->getProjectWithinBase(sMeta);
QStringList lst;
QMap<QString,PropertyModel> mapPro = m_mapTotalData.value(sMeta);
for(auto it = mapPro.begin();it != mapPro.end();++it)
{
lst.append(it.key());
}
return lst;
}
QStringList ProjectModelManager::getModelList() const QStringList ProjectModelManager::getModelList() const
{ {
QMap<int,modelType> modelMap = DataBase::GetInstance()->ModelType(); QMap<int,modelType> modelMap = DataBase::GetInstance()->ModelType();
@ -588,7 +622,7 @@ QString ProjectModelManager::modifyProjectModel(const QString& sMeta,const QStri
} }
} }
else{ //非空且库模型中不存在,新增 else{ //非空且库模型中不存在,新增
bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,nType); bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,iter->isPublic);
if(res) if(res)
{ {
sRes = QString::fromWCharArray(L"修改模型成功"); sRes = QString::fromWCharArray(L"修改模型成功");
@ -681,14 +715,8 @@ int ProjectModelManager::createPropertyTable(const QString& sMeta,const QString&
if(!DataBase::GetInstance()->ifDynamicTableExist(sName)) if(!DataBase::GetInstance()->ifDynamicTableExist(sName))
{ {
bool val = DataBase::GetInstance()->createDynamicTable(sName,fields); bool val = DataBase::GetInstance()->createDynamicTable(sName,fields);
if(val) DataBase::GetInstance()->insertProjectManager(sName,sName,"NULL",sGroup,0,objState,true);
{ return val;
DataBase::GetInstance()->insertProjectManager(sName,sName,"NULL",sGroup,0,objState,true);
return int(AlertInfo::success);
}
else {
return int(AlertInfo::fail);
}
} }
else else
{ {
@ -776,3 +804,19 @@ QString ProjectModelManager::getItemDataType(const QStandardItem* pItem)
} }
return dataTypePart; return dataTypePart;
} }
projectModelSetting ProjectModelManager::getModelSetting(const QString& sMeta,const QString& sProject)
{
projectModelSetting setting;
setting.modelName = sProject;
QJsonObject obj = DataBase::GetInstance()->getProjectSetting(sMeta,sProject);
QJsonArray arr = obj["picture"].toArray();
for (QJsonValueRef jsonObj : arr)
{
QJsonObject node = jsonObj.toObject();
QString sName = node["name"].toString();
QByteArray bData = QByteArray::fromHex(node["data"].toString().toUtf8());
setting.mapSvg.insert(sName,bData);
}
return setting;
}

View File

@ -687,8 +687,8 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri
} }
else //新建 else //新建
{ {
_curModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,_curModel); _curModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,_curModel); //新建(不添加到队列
ProjectModelManager::instance().getData()[value].insert(_curProject,_curModel); ProjectModelManager::instance().getData()[value].insert(_curProject,_curModel); //添加
ui->treeView_base->setModel(nullptr); ui->treeView_base->setModel(nullptr);
ui->treeView_sub->setModel(nullptr); ui->treeView_sub->setModel(nullptr);