add custom HMI generate logic
This commit is contained in:
parent
8b5be362ae
commit
80cfa5e815
|
|
@ -51,6 +51,10 @@ public:
|
||||||
|
|
||||||
PowerEntity* getEntity() {return _pEntity;}
|
PowerEntity* getEntity() {return _pEntity;}
|
||||||
BasePannelPropertyProxy* getPropertyProxy();
|
BasePannelPropertyProxy* getPropertyProxy();
|
||||||
|
|
||||||
|
void moveItemsAlignment(Qt::Alignment alignment = Qt::AlignTop | Qt::AlignLeft,
|
||||||
|
const QMarginsF& margins = QMarginsF(0, 0, 0, 0)); //整体移动函数(会破坏对象结构,只用来预览)
|
||||||
|
void centerOnTopLeft(); //聚焦到左上角
|
||||||
signals:
|
signals:
|
||||||
void panelDelete(const QString&,int);
|
void panelDelete(const QString&,int);
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@ QT_BEGIN_NAMESPACE
|
||||||
namespace Ui { class createHMIdlg; }
|
namespace Ui { class createHMIdlg; }
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class DiagramCavasPrivate;
|
||||||
|
|
||||||
class CreateHMIdlg : public QDialog
|
class CreateHMIdlg : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
@ -16,6 +18,7 @@ public:
|
||||||
|
|
||||||
void initial();
|
void initial();
|
||||||
void showDlg();
|
void showDlg();
|
||||||
|
void setCavasPtr(DiagramCavasPrivate* p){_pCavasPtr = p;}
|
||||||
signals:
|
signals:
|
||||||
void createHMI(QString,QString,int type = 0); //HMI名称,系统图名称,模板类型
|
void createHMI(QString,QString,int type = 0); //HMI名称,系统图名称,模板类型
|
||||||
void createCustomHMI(QString,QString,int type = 0); //HMI名称,系统图名称,模板类型
|
void createCustomHMI(QString,QString,int type = 0); //HMI名称,系统图名称,模板类型
|
||||||
|
|
@ -23,8 +26,12 @@ public slots:
|
||||||
void onSaveClicked();
|
void onSaveClicked();
|
||||||
void onCancelClicked();
|
void onCancelClicked();
|
||||||
void onCustomClicked();
|
void onCustomClicked();
|
||||||
|
private:
|
||||||
|
void showInfoTip(const QString& text, int durationMs = 3000);
|
||||||
private:
|
private:
|
||||||
Ui::createHMIdlg *ui;
|
Ui::createHMIdlg *ui;
|
||||||
|
QTimer* m_timer = nullptr;
|
||||||
|
DiagramCavasPrivate* _pCavasPtr = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ class PowerEntity;
|
||||||
class DiagramCavas;
|
class DiagramCavas;
|
||||||
class CustomHMIList;
|
class CustomHMIList;
|
||||||
struct HierarchyItem;
|
struct HierarchyItem;
|
||||||
|
class DiagramCavasPrivate;
|
||||||
|
|
||||||
class CustomHMIGenerateDlg : public QDialog
|
class CustomHMIGenerateDlg : public QDialog
|
||||||
{
|
{
|
||||||
|
|
@ -22,12 +23,15 @@ public:
|
||||||
|
|
||||||
void initial();
|
void initial();
|
||||||
void showDlg(QString,QString,int); //hmi名,系统图名,模板
|
void showDlg(QString,QString,int); //hmi名,系统图名,模板
|
||||||
|
void setCavasPtr(DiagramCavasPrivate* p){_pCavasPtr = p;}
|
||||||
signals:
|
signals:
|
||||||
void backCreateHMI(); //退回初始界面信号
|
void backCreateHMI(); //退回初始界面信号
|
||||||
public slots:
|
public slots:
|
||||||
void onGenerateClicked();
|
void onGenerateClicked();
|
||||||
void onBackClicked();
|
void onBackClicked();
|
||||||
void onPreviewHMI(QList<HierarchyItem>);
|
void onPreviewHMI(QList<HierarchyItem>);
|
||||||
|
private:
|
||||||
|
void showInfoTip(const QString& text, int durationMs = 3000);
|
||||||
private:
|
private:
|
||||||
Ui::customHMIGenerateDlg *ui;
|
Ui::customHMIGenerateDlg *ui;
|
||||||
SelectPanel* _pOperatePanel; //操作界面
|
SelectPanel* _pOperatePanel; //操作界面
|
||||||
|
|
@ -35,7 +39,10 @@ private:
|
||||||
PowerEntity* _pPe;
|
PowerEntity* _pPe;
|
||||||
PowerEntity* _pOe;
|
PowerEntity* _pOe;
|
||||||
DiagramCavas* _pCanvas = nullptr;
|
DiagramCavas* _pCanvas = nullptr;
|
||||||
|
DiagramCavasPrivate* _pCavasPtr = nullptr;
|
||||||
CustomHMIList* _pItemList;
|
CustomHMIList* _pItemList;
|
||||||
|
QList<HierarchyItem> _tempLst;
|
||||||
|
QTimer* m_timer = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ private:
|
||||||
QStandardItemModel* _modelAll; //图中所有item
|
QStandardItemModel* _modelAll; //图中所有item
|
||||||
// 存储间隔名称到树节点的映射,提高查找效率
|
// 存储间隔名称到树节点的映射,提高查找效率
|
||||||
QHash<QString, QStandardItem*> m_mapBayItems;
|
QHash<QString, QStandardItem*> m_mapBayItems;
|
||||||
|
bool m_isProgrammaticChange = false; //程序设置标志
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ public slots:
|
||||||
|
|
||||||
void updateHMIlstFromDB(); //从数据库更新HMI列表
|
void updateHMIlstFromDB(); //从数据库更新HMI列表
|
||||||
|
|
||||||
//QMap<QString,QPair<MonitorPanel*,QMdiSubWindow*>> getMapMonitor() {return m_mapMonitorPanel;}
|
QMdiSubWindow* getSubWindow(const QString&);
|
||||||
|
|
||||||
void onTargetSelected(QObject*); //选中事件(属性显示)
|
void onTargetSelected(QObject*); //选中事件(属性显示)
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ public:
|
||||||
PluginItemFactory* m_itemFactory = nullptr;
|
PluginItemFactory* m_itemFactory = nullptr;
|
||||||
QMap<QString, PluginTypeInfo> m_pluginInfo;
|
QMap<QString, PluginTypeInfo> m_pluginInfo;
|
||||||
QMdiArea* m_mdiArea = nullptr;
|
QMdiArea* m_mdiArea = nullptr;
|
||||||
int _curMode = 0;
|
int _curMode = 0; //0编辑1运行
|
||||||
|
|
||||||
// 私有方法
|
// 私有方法
|
||||||
void initialImpl();
|
void initialImpl();
|
||||||
|
|
@ -68,6 +68,7 @@ public:
|
||||||
void updateHMIListFormDB(); //从DB更新HMI列表(page中load)
|
void updateHMIListFormDB(); //从DB更新HMI列表(page中load)
|
||||||
void deletePanel(const QString& name,int nType);
|
void deletePanel(const QString& name,int nType);
|
||||||
void setCurMode(int);
|
void setCurMode(int);
|
||||||
|
int getCurMode() const {return _curMode;}
|
||||||
|
|
||||||
//显示属性相关
|
//显示属性相关
|
||||||
void showPropertyDlgImpl(); // 显示属性页
|
void showPropertyDlgImpl(); // 显示属性页
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,9 @@ public:
|
||||||
QMap<QUuid,QString>& getMonitorParaRef(){return m_monitorParaRef;}
|
QMap<QUuid,QString>& getMonitorParaRef(){return m_monitorParaRef;}
|
||||||
void setMonitorRelation(QList<HierarchyItem> lst){m_lstMonitorRelation = lst;}
|
void setMonitorRelation(QList<HierarchyItem> lst){m_lstMonitorRelation = lst;}
|
||||||
QList<HierarchyItem> getMonitorRelation() {return m_lstMonitorRelation;}
|
QList<HierarchyItem> getMonitorRelation() {return m_lstMonitorRelation;}
|
||||||
|
void setBayHierachy(QList<HierarchyItem> lst) {m_bayHierachy = lst;}
|
||||||
|
void setItemHierachy(QList<HierarchyItem> lst) {m_itemHierachy = lst;}
|
||||||
|
void activePanelHierachy(); //激活当前界面的层级关系
|
||||||
|
|
||||||
void monitorItemSelected(QUuid); //运行时item选中事件
|
void monitorItemSelected(QUuid); //运行时item选中事件
|
||||||
void monitorItemDetailAttr(QUuid); //显示属性详情
|
void monitorItemDetailAttr(QUuid); //显示属性详情
|
||||||
|
|
@ -127,6 +130,7 @@ public:
|
||||||
QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>>& getMonitorDisplaySetting(){return m_monitorDisplaySetting;}
|
QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>>& getMonitorDisplaySetting(){return m_monitorDisplaySetting;}
|
||||||
|
|
||||||
void previewHMI(SelectPanel* pPreview,QList<HierarchyItem>); //customHMI 生成预览
|
void previewHMI(SelectPanel* pPreview,QList<HierarchyItem>); //customHMI 生成预览
|
||||||
|
void customGenerateHMI(QString,QPair<int,int>,QList<HierarchyItem>); //自定义生成HMI
|
||||||
QList<HMIImageRef>& getHMIimageRef(){return _HMIimageRef;}
|
QList<HMIImageRef>& getHMIimageRef(){return _HMIimageRef;}
|
||||||
QList<HMICustomImageRef>& getHMICustomImageRef(){return _HMICustomImageRef;}
|
QList<HMICustomImageRef>& getHMICustomImageRef(){return _HMICustomImageRef;}
|
||||||
int imageRefExist(QString model,QByteArray hash256);
|
int imageRefExist(QString model,QByteArray hash256);
|
||||||
|
|
@ -207,7 +211,9 @@ private:
|
||||||
QMap<QUuid,QString> m_monitorParaRef; //监控参数的引用关系(文字item等) <itemId,connectPara>
|
QMap<QUuid,QString> m_monitorParaRef; //监控参数的引用关系(文字item等) <itemId,connectPara>
|
||||||
QMap<int,QList<QPair<MonitorItemState,QString>>> m_monitorStateMap; //元件状态对照表 <type,<state,状态名>>
|
QMap<int,QList<QPair<MonitorItemState,QString>>> m_monitorStateMap; //元件状态对照表 <type,<state,状态名>>
|
||||||
QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> m_monitorDisplaySetting; //元件设置
|
QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> m_monitorDisplaySetting; //元件设置
|
||||||
QList<HierarchyItem> m_lstMonitorRelation; //监控item层级关系
|
QList<HierarchyItem> m_lstMonitorRelation; //监控item层级关系(暂无使用)
|
||||||
|
QList<HierarchyItem> m_bayHierachy; //间隔层级信息
|
||||||
|
QList<HierarchyItem> m_itemHierachy; //元件层级信息
|
||||||
|
|
||||||
ItemPropertyDlg* m_curPropertyDlg;
|
ItemPropertyDlg* m_curPropertyDlg;
|
||||||
QTimer* m_dataTimer; //获取数据的定时器
|
QTimer* m_dataTimer; //获取数据的定时器
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,10 @@ class GraphicsFunctionModelGroup : public GraphicsFunctionModelItem //
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
GraphicsFunctionModelGroup(QGraphicsItem *parent);
|
GraphicsFunctionModelGroup(QGraphicsItem *parent);
|
||||||
|
GraphicsFunctionModelGroup(const GraphicsFunctionModelGroup&);
|
||||||
virtual ~GraphicsFunctionModelGroup();
|
virtual ~GraphicsFunctionModelGroup();
|
||||||
virtual void addItem(GraphicsFunctionModelItem* item);
|
virtual void addItem(GraphicsFunctionModelItem* item);
|
||||||
|
virtual GraphicsFunctionModelGroup* clone() const override;
|
||||||
virtual void updateLayout();
|
virtual void updateLayout();
|
||||||
virtual void setLayout(int n) {m_direction = n;}
|
virtual void setLayout(int n) {m_direction = n;}
|
||||||
virtual void setGroupType(int n) {_groupType = n;}
|
virtual void setGroupType(int n) {_groupType = n;}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ class PluginSvgItemWrapper : public ElectricFunctionModelSvgItem
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PluginSvgItemWrapper(ICanvasItem *pluginItem, QGraphicsItem *parent = nullptr);
|
explicit PluginSvgItemWrapper(ICanvasItem *pluginItem, QGraphicsItem *parent = nullptr);
|
||||||
|
PluginSvgItemWrapper(ICanvasItem *pluginItem,const PluginSvgItemWrapper& obj);
|
||||||
virtual ~PluginSvgItemWrapper();
|
virtual ~PluginSvgItemWrapper();
|
||||||
|
|
||||||
virtual void setImage_1(QFileInfo) override;
|
virtual void setImage_1(QFileInfo) override;
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ public:
|
||||||
void initDisplaySetting(); //初始化显示状态设置
|
void initDisplaySetting(); //初始化显示状态设置
|
||||||
|
|
||||||
MonitorConfigDlg* getMonitorConfigDlg() {return _pConfigDlg;}
|
MonitorConfigDlg* getMonitorConfigDlg() {return _pConfigDlg;}
|
||||||
|
void setToobarlVisible(bool); //设置运行模式
|
||||||
public:
|
public:
|
||||||
//对层级关系的序列化与反序列化
|
//对层级关系的序列化与反序列化
|
||||||
QJsonArray serializeRelationToJsonArray(const QList<HierarchyItem>& data) const;
|
QJsonArray serializeRelationToJsonArray(const QList<HierarchyItem>& data) const;
|
||||||
|
|
@ -61,6 +62,7 @@ protected:
|
||||||
void closeEvent(QCloseEvent *closeEvent) override;
|
void closeEvent(QCloseEvent *closeEvent) override;
|
||||||
private:
|
private:
|
||||||
void createToolBar();
|
void createToolBar();
|
||||||
|
QGraphicsItem* findCentralItem();
|
||||||
private:
|
private:
|
||||||
QString _sParentPage; //派生自哪个工程
|
QString _sParentPage; //派生自哪个工程
|
||||||
QToolBar* _toolBar;
|
QToolBar* _toolBar;
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,8 @@ public:
|
||||||
|
|
||||||
FixedPortsModel* getModel() {return _model;}
|
FixedPortsModel* getModel() {return _model;}
|
||||||
void updateConnectLineByTopology(QList<QGraphicsItem *>); //通过拓扑关系更新位置
|
void updateConnectLineByTopology(QList<QGraphicsItem *>); //通过拓扑关系更新位置
|
||||||
|
// 辅助函数:根据已知点计算缺失点的位置
|
||||||
|
QPointF calculateMissingPointByKnownPoint(const QPointF& knownPoint, const QRectF& itemSceneRect, qint32 offset, bool isFromPoint);
|
||||||
signals:
|
signals:
|
||||||
void setWorkingSelector(SelectorType);
|
void setWorkingSelector(SelectorType);
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,56 @@ BasePannelPropertyProxy* BaseDrawingPanel::getPropertyProxy()
|
||||||
return _pPropertyProxy.data();
|
return _pPropertyProxy.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaseDrawingPanel::moveItemsAlignment(Qt::Alignment alignment,const QMarginsF& margins)
|
||||||
|
{
|
||||||
|
QList<QGraphicsItem*> items = m_pGraphicsScene->items();
|
||||||
|
if (items.isEmpty() || !m_pGraphicsScene) return;
|
||||||
|
|
||||||
|
// 1. 创建组
|
||||||
|
QGraphicsItemGroup* group = m_pGraphicsScene->createItemGroup(items);
|
||||||
|
|
||||||
|
// 2. 获取边界矩形
|
||||||
|
QRectF groupRect = group->boundingRect();
|
||||||
|
QRectF sceneRect = m_pGraphicsScene->sceneRect();
|
||||||
|
|
||||||
|
// 3. 计算新位置
|
||||||
|
QPointF targetPos = group->pos();
|
||||||
|
|
||||||
|
// 水平对齐
|
||||||
|
if (alignment & Qt::AlignLeft) {
|
||||||
|
targetPos.setX(sceneRect.left() + margins.left());
|
||||||
|
} else if (alignment & Qt::AlignRight) {
|
||||||
|
targetPos.setX(sceneRect.right() - groupRect.width() - margins.right());
|
||||||
|
} else if (alignment & Qt::AlignHCenter) {
|
||||||
|
targetPos.setX(sceneRect.center().x() - groupRect.width() / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 垂直对齐
|
||||||
|
if (alignment & Qt::AlignTop) {
|
||||||
|
targetPos.setY(sceneRect.top() + margins.top());
|
||||||
|
} else if (alignment & Qt::AlignBottom) {
|
||||||
|
targetPos.setY(sceneRect.bottom() - groupRect.height() - margins.bottom());
|
||||||
|
} else if (alignment & Qt::AlignVCenter) {
|
||||||
|
targetPos.setY(sceneRect.center().y() - groupRect.height() / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 计算偏移量
|
||||||
|
QPointF offset = targetPos - groupRect.topLeft();
|
||||||
|
group->setPos(group->pos() + offset);
|
||||||
|
|
||||||
|
// 5. 取消分组
|
||||||
|
m_pGraphicsScene->destroyItemGroup(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseDrawingPanel::centerOnTopLeft() {
|
||||||
|
// 获取场景左上角
|
||||||
|
QRectF sceneRect = m_pGraphicsScene->sceneRect();
|
||||||
|
QPointF topLeft = sceneRect.topLeft();
|
||||||
|
|
||||||
|
// 将视图中心对准左上角
|
||||||
|
m_pGraphicsView->centerOn(topLeft);
|
||||||
|
}
|
||||||
|
|
||||||
SelectorManager* BaseDrawingPanel::selectorManager() const
|
SelectorManager* BaseDrawingPanel::selectorManager() const
|
||||||
{
|
{
|
||||||
if(m_pSelectorManager)
|
if(m_pSelectorManager)
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
#include "common/frontend/monitor_item.h"
|
#include "common/frontend/monitor_item.h"
|
||||||
#include "dataBase.h"
|
#include "dataBase.h"
|
||||||
#include "ui_createHMIdlg.h"
|
#include "ui_createHMIdlg.h"
|
||||||
|
#include "diagramCavas_p.h"
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
CreateHMIdlg::CreateHMIdlg(QWidget *parent)
|
CreateHMIdlg::CreateHMIdlg(QWidget *parent)
|
||||||
: QDialog(parent)
|
: QDialog(parent)
|
||||||
|
|
@ -22,6 +24,10 @@ void CreateHMIdlg::initial()
|
||||||
connect(ui->btn_cancel,&QPushButton::clicked,this,&CreateHMIdlg::onCancelClicked);
|
connect(ui->btn_cancel,&QPushButton::clicked,this,&CreateHMIdlg::onCancelClicked);
|
||||||
connect(ui->btn_ok,&QPushButton::clicked,this,&CreateHMIdlg::onSaveClicked);
|
connect(ui->btn_ok,&QPushButton::clicked,this,&CreateHMIdlg::onSaveClicked);
|
||||||
connect(ui->btn_custom,&QPushButton::clicked,this,&CreateHMIdlg::onCustomClicked);
|
connect(ui->btn_custom,&QPushButton::clicked,this,&CreateHMIdlg::onCustomClicked);
|
||||||
|
|
||||||
|
m_timer = new QTimer(this);
|
||||||
|
m_timer->setSingleShot(true);
|
||||||
|
connect(m_timer, &QTimer::timeout, ui->label_info, &QLabel::hide);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreateHMIdlg::showDlg()
|
void CreateHMIdlg::showDlg()
|
||||||
|
|
@ -49,7 +55,37 @@ void CreateHMIdlg::onCustomClicked()
|
||||||
|
|
||||||
void CreateHMIdlg::onSaveClicked()
|
void CreateHMIdlg::onSaveClicked()
|
||||||
{
|
{
|
||||||
QString sName = ui->cb_structure->currentText();
|
auto lstHMI = DataBase::GetInstance()->getAllHMI();
|
||||||
emit createHMI(ui->lineEdit->text(),sName);
|
QString sSysName = ui->cb_structure->currentText(); //系统图名
|
||||||
|
QString sName = ui->lineEdit->text();
|
||||||
|
|
||||||
|
if(sName.isEmpty()){
|
||||||
|
showInfoTip("名称不能为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(_pCavasPtr->m_mapMonitorPanel.contains(sName)){
|
||||||
|
showInfoTip("名称已存在");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(auto& info:lstHMI){
|
||||||
|
if(sName == info.name || sName == info.tag)
|
||||||
|
{
|
||||||
|
showInfoTip("名称已存在");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emit createHMI(sName,sSysName);
|
||||||
hide();
|
hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CreateHMIdlg::showInfoTip(const QString& text,int durationMs)
|
||||||
|
{
|
||||||
|
ui->label_info->setText(text);
|
||||||
|
ui->label_info->show();
|
||||||
|
|
||||||
|
// 停止之前的定时器
|
||||||
|
m_timer->stop();
|
||||||
|
// 重新启动定时器
|
||||||
|
m_timer->start(durationMs);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include "diagramCavas.h"
|
#include "diagramCavas.h"
|
||||||
#include "customHMIList.h"
|
#include "customHMIList.h"
|
||||||
#include "ui_customHMIGenerateDlg.h"
|
#include "ui_customHMIGenerateDlg.h"
|
||||||
|
#include "diagramCavas_p.h"
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
CustomHMIGenerateDlg::CustomHMIGenerateDlg(QWidget *parent)
|
CustomHMIGenerateDlg::CustomHMIGenerateDlg(QWidget *parent)
|
||||||
|
|
@ -17,6 +18,7 @@ CustomHMIGenerateDlg::CustomHMIGenerateDlg(QWidget *parent)
|
||||||
,_pItemList(nullptr)
|
,_pItemList(nullptr)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
setWindowModality(Qt::ApplicationModal);
|
||||||
_pCanvas = dynamic_cast<DiagramCavas*>(parent);
|
_pCanvas = dynamic_cast<DiagramCavas*>(parent);
|
||||||
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
|
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
|
||||||
initial();
|
initial();
|
||||||
|
|
@ -56,6 +58,10 @@ void CustomHMIGenerateDlg::initial()
|
||||||
connect(_pOperatePanel->getModelController(),&FixedPortsModel::updateCurrentItems,_pItemList,&CustomHMIList::onUpdateItems);
|
connect(_pOperatePanel->getModelController(),&FixedPortsModel::updateCurrentItems,_pItemList,&CustomHMIList::onUpdateItems);
|
||||||
connect(_pOperatePanel->getModelController(),&FixedPortsModel::itemSelected,_pItemList,&CustomHMIList::onSelectItems);
|
connect(_pOperatePanel->getModelController(),&FixedPortsModel::itemSelected,_pItemList,&CustomHMIList::onSelectItems);
|
||||||
connect(_pItemList,&CustomHMIList::previewHMI,this,&CustomHMIGenerateDlg::onPreviewHMI);
|
connect(_pItemList,&CustomHMIList::previewHMI,this,&CustomHMIGenerateDlg::onPreviewHMI);
|
||||||
|
|
||||||
|
m_timer = new QTimer(this);
|
||||||
|
m_timer->setSingleShot(true);
|
||||||
|
connect(m_timer, &QTimer::timeout, ui->label_info, &QLabel::hide);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CustomHMIGenerateDlg::showDlg(QString sHmi,QString sSys,int nModel)
|
void CustomHMIGenerateDlg::showDlg(QString sHmi,QString sSys,int nModel)
|
||||||
|
|
@ -69,13 +75,49 @@ void CustomHMIGenerateDlg::showDlg(QString sHmi,QString sSys,int nModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
_pOperatePanel->getModelController()->clearCurItems(); //先清空
|
_pOperatePanel->getModelController()->clearCurItems(); //先清空
|
||||||
|
_pPreviewPanel->getModelController()->clearCurItems();
|
||||||
QJsonObject context = db->getHMIContextByTag(sSys);
|
QJsonObject context = db->getHMIContextByTag(sSys);
|
||||||
_pOperatePanel->loadNodes(context);
|
_pOperatePanel->loadNodes(context);
|
||||||
|
_pOperatePanel->centerOnTopLeft();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CustomHMIGenerateDlg::onGenerateClicked()
|
void CustomHMIGenerateDlg::onGenerateClicked()
|
||||||
{
|
{
|
||||||
hide();
|
auto lstHMI = DataBase::GetInstance()->getAllHMI();
|
||||||
|
QString sName = ui->le_hmiName->text();
|
||||||
|
|
||||||
|
if(sName.isEmpty()){
|
||||||
|
showInfoTip("名称不能为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(_pCavasPtr->m_mapMonitorPanel.contains(sName)){
|
||||||
|
showInfoTip("名称已存在");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(auto& info:lstHMI){
|
||||||
|
if(sName == info.name || sName == info.tag)
|
||||||
|
{
|
||||||
|
showInfoTip("名称已存在");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int nWidth = 0;
|
||||||
|
int nHeight = 0;
|
||||||
|
QStringList lstSize = ui->cb_size->currentText().split("*");
|
||||||
|
if(lstSize.size() == 2){
|
||||||
|
nWidth = lstSize.first().toInt();
|
||||||
|
nHeight = lstSize.last().toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_tempLst.size() > 0){
|
||||||
|
QObject::connect(_pOperatePanel->getModelController(), &FixedPortsModel::updateTopologyItems, _pCanvas,&DiagramCavas::onSignal_updateTopology);
|
||||||
|
_pOperatePanel->getModelController()->customGenerateHMI(ui->le_hmiName->text(),qMakePair(nWidth,nHeight),_tempLst);
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
showInfoTip("未选中生成对象");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CustomHMIGenerateDlg::onBackClicked()
|
void CustomHMIGenerateDlg::onBackClicked()
|
||||||
|
|
@ -88,4 +130,17 @@ void CustomHMIGenerateDlg::onPreviewHMI(QList<HierarchyItem> lst)
|
||||||
{
|
{
|
||||||
_pPreviewPanel->clearItems();
|
_pPreviewPanel->clearItems();
|
||||||
_pOperatePanel->getModelController()->previewHMI(_pPreviewPanel,lst);
|
_pOperatePanel->getModelController()->previewHMI(_pPreviewPanel,lst);
|
||||||
|
_pPreviewPanel->moveItemsAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||||
|
_tempLst = lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomHMIGenerateDlg::showInfoTip(const QString& text,int durationMs)
|
||||||
|
{
|
||||||
|
ui->label_info->setText(text);
|
||||||
|
ui->label_info->show();
|
||||||
|
|
||||||
|
// 停止之前的定时器
|
||||||
|
m_timer->stop();
|
||||||
|
// 重新启动定时器
|
||||||
|
m_timer->start(durationMs);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,10 @@ void CustomHMIList::onUpdateItems(QList<HierarchyItem> lst,bool refresh)
|
||||||
pBayItem->setData(curItem.nCategory, Qt::UserRole+1); // 存储类别
|
pBayItem->setData(curItem.nCategory, Qt::UserRole+1); // 存储类别
|
||||||
pBayItem->setData(curItem.nEquipType, Qt::UserRole+2); // 存储设备类型
|
pBayItem->setData(curItem.nEquipType, Qt::UserRole+2); // 存储设备类型
|
||||||
pBayItem->setData(curItem.uid, Qt::UserRole+3); // 存储UUID
|
pBayItem->setData(curItem.uid, Qt::UserRole+3); // 存储UUID
|
||||||
|
pBayItem->setData(curItem.grid, Qt::UserRole+4); //grid
|
||||||
|
pBayItem->setData(curItem.zone, Qt::UserRole+5); //zone
|
||||||
|
pBayItem->setData(curItem.station, Qt::UserRole+6); //station
|
||||||
|
pBayItem->setData(curItem.sVoltageLevel, Qt::UserRole+7); //电压层级
|
||||||
|
|
||||||
// 存储到缓存中
|
// 存储到缓存中
|
||||||
m_mapBayItems[curItem.sName] = pBayItem;
|
m_mapBayItems[curItem.sName] = pBayItem;
|
||||||
|
|
@ -99,6 +103,7 @@ void CustomHMIList::onUpdateItems(QList<HierarchyItem> lst,bool refresh)
|
||||||
|
|
||||||
void CustomHMIList::onSelectItems(QList<HierarchyItem> lst)
|
void CustomHMIList::onSelectItems(QList<HierarchyItem> lst)
|
||||||
{
|
{
|
||||||
|
m_isProgrammaticChange = true;
|
||||||
resetSelect();
|
resetSelect();
|
||||||
for(auto& info:lst){
|
for(auto& info:lst){
|
||||||
QModelIndex itemIndex = findIndex(_modelAll,info.item.uid,Qt::UserRole+3);
|
QModelIndex itemIndex = findIndex(_modelAll,info.item.uid,Qt::UserRole+3);
|
||||||
|
|
@ -109,6 +114,7 @@ void CustomHMIList::onSelectItems(QList<HierarchyItem> lst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
generatePreview();
|
generatePreview();
|
||||||
|
m_isProgrammaticChange = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CustomHMIList::generatePreview()
|
void CustomHMIList::generatePreview()
|
||||||
|
|
@ -118,17 +124,38 @@ void CustomHMIList::generatePreview()
|
||||||
for(auto& pItem:lstItem){
|
for(auto& pItem:lstItem){
|
||||||
HierarchyItem info;
|
HierarchyItem info;
|
||||||
auto pParent = pItem->parent();
|
auto pParent = pItem->parent();
|
||||||
|
|
||||||
if(pParent){
|
if(pParent){
|
||||||
|
// 设置父节点信息
|
||||||
info.parent.nCategory = pParent->data(Qt::UserRole+1).toInt();
|
info.parent.nCategory = pParent->data(Qt::UserRole+1).toInt();
|
||||||
info.parent.nEquipType = pParent->data(Qt::UserRole+2).toInt();
|
info.parent.nEquipType = pParent->data(Qt::UserRole+2).toInt();
|
||||||
info.parent.uid = pParent->data(Qt::UserRole+3).toUuid();
|
info.parent.uid = pParent->data(Qt::UserRole+3).toUuid();
|
||||||
info.parent.sName = pParent->text();
|
info.parent.sName = pParent->text();
|
||||||
|
|
||||||
|
// 如果是间隔节点(nCategory==1),还需要获取其附加属性
|
||||||
|
if(info.parent.nCategory == 1){
|
||||||
|
info.parent.grid = pParent->data(Qt::UserRole+4).toString();
|
||||||
|
info.parent.zone = pParent->data(Qt::UserRole+5).toString();
|
||||||
|
info.parent.station = pParent->data(Qt::UserRole+6).toString();
|
||||||
|
info.parent.sVoltageLevel = pParent->data(Qt::UserRole+7).toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置当前项信息
|
||||||
info.item.nCategory = pItem->data(Qt::UserRole+1).toInt();
|
info.item.nCategory = pItem->data(Qt::UserRole+1).toInt();
|
||||||
info.item.nEquipType = pItem->data(Qt::UserRole+2).toInt();
|
info.item.nEquipType = pItem->data(Qt::UserRole+2).toInt();
|
||||||
info.item.uid = pItem->data(Qt::UserRole+3).toUuid();
|
info.item.uid = pItem->data(Qt::UserRole+3).toUuid();
|
||||||
info.item.sName = pItem->text();
|
info.item.sName = pItem->text();
|
||||||
|
|
||||||
|
// 如果是间隔节点,还需要获取其附加属性
|
||||||
|
if(info.item.nCategory == 1){
|
||||||
|
info.item.grid = pItem->data(Qt::UserRole+4).toString();
|
||||||
|
info.item.zone = pItem->data(Qt::UserRole+5).toString();
|
||||||
|
info.item.station = pItem->data(Qt::UserRole+6).toString();
|
||||||
|
info.item.sVoltageLevel = pItem->data(Qt::UserRole+7).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取所有子节点
|
||||||
auto lstChild = getAllChildren(pItem);
|
auto lstChild = getAllChildren(pItem);
|
||||||
for(auto &child:lstChild){
|
for(auto &child:lstChild){
|
||||||
HierarchyStructItem stru;
|
HierarchyStructItem stru;
|
||||||
|
|
@ -136,6 +163,7 @@ void CustomHMIList::generatePreview()
|
||||||
stru.nEquipType = child->data(Qt::UserRole+2).toInt();
|
stru.nEquipType = child->data(Qt::UserRole+2).toInt();
|
||||||
stru.uid = child->data(Qt::UserRole+3).toUuid();
|
stru.uid = child->data(Qt::UserRole+3).toUuid();
|
||||||
stru.sName = child->text();
|
stru.sName = child->text();
|
||||||
|
|
||||||
info.subList.append(stru);
|
info.subList.append(stru);
|
||||||
}
|
}
|
||||||
lst.append(info);
|
lst.append(info);
|
||||||
|
|
@ -157,6 +185,11 @@ void CustomHMIList::onItemChanged(QStandardItem *item)
|
||||||
Qt::CheckState newState = item->checkState();
|
Qt::CheckState newState = item->checkState();
|
||||||
// 设置所有子项与父项相同的状态
|
// 设置所有子项与父项相同的状态
|
||||||
setChildrenCheckState(item, newState);
|
setChildrenCheckState(item, newState);
|
||||||
|
|
||||||
|
// 只在非程序设置时发送信号
|
||||||
|
if (!m_isProgrammaticChange) {
|
||||||
|
generatePreview();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_tree->repaint();
|
_tree->repaint();
|
||||||
|
|
|
||||||
|
|
@ -467,3 +467,9 @@ void DiagramCavas::updateHMIlstFromDB()
|
||||||
Q_D(DiagramCavas);
|
Q_D(DiagramCavas);
|
||||||
d->updateHMIFromDB();
|
d->updateHMIFromDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QMdiSubWindow* DiagramCavas::getSubWindow(const QString& name)
|
||||||
|
{
|
||||||
|
Q_D(DiagramCavas);
|
||||||
|
return d->getSubWindow(name);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -155,11 +155,13 @@ void DiagramCavasPrivate::initialImpl()
|
||||||
QObject::connect(_createHMIDlg, &CreateHMIdlg::createCustomHMI, q, [this](QString sName,QString sSys,int nModel){
|
QObject::connect(_createHMIDlg, &CreateHMIdlg::createCustomHMI, q, [this](QString sName,QString sSys,int nModel){
|
||||||
_customCreateHMIDlg->showDlg(sName,sSys,nModel);
|
_customCreateHMIDlg->showDlg(sName,sSys,nModel);
|
||||||
});
|
});
|
||||||
|
_createHMIDlg->setCavasPtr(this);
|
||||||
|
|
||||||
_customCreateHMIDlg = new CustomHMIGenerateDlg(q);
|
_customCreateHMIDlg = new CustomHMIGenerateDlg(q);
|
||||||
QObject::connect(_customCreateHMIDlg, &CustomHMIGenerateDlg::backCreateHMI, q, [this](){
|
QObject::connect(_customCreateHMIDlg, &CustomHMIGenerateDlg::backCreateHMI, q, [this](){
|
||||||
_createHMIDlg->showDlg();
|
_createHMIDlg->showDlg();
|
||||||
});
|
});
|
||||||
|
_customCreateHMIDlg->setCavasPtr(this);
|
||||||
// 13. 从数据库更新HMI列表
|
// 13. 从数据库更新HMI列表
|
||||||
q->updateHMIlstFromDB();
|
q->updateHMIlstFromDB();
|
||||||
|
|
||||||
|
|
@ -191,6 +193,11 @@ void DiagramCavasPrivate::initialImpl()
|
||||||
QHBoxLayout* mainLayout = new QHBoxLayout(q);
|
QHBoxLayout* mainLayout = new QHBoxLayout(q);
|
||||||
mainLayout->addWidget(m_mdiArea, 1); // 主工作区占主要空间
|
mainLayout->addWidget(m_mdiArea, 1); // 主工作区占主要空间
|
||||||
mainLayout->addWidget(_pPropertyDlg, 0); // 属性栏占次要空间
|
mainLayout->addWidget(_pPropertyDlg, 0); // 属性栏占次要空间
|
||||||
|
|
||||||
|
QTimer::singleShot(100, q, [this]() {
|
||||||
|
updateCornerPos();
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiagramCavasPrivate::removePanel(PowerEntity* pEntity)
|
void DiagramCavasPrivate::removePanel(PowerEntity* pEntity)
|
||||||
|
|
@ -441,6 +448,18 @@ void DiagramCavasPrivate::setCurMode(int nMode)
|
||||||
else { // 编辑模式
|
else { // 编辑模式
|
||||||
q->hidePropertyDlg();
|
q->hidePropertyDlg();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(auto& pair:m_mapMonitorPanel){
|
||||||
|
auto pPanel = pair.first;
|
||||||
|
if(pPanel){
|
||||||
|
if(nMode == 0){ //编辑
|
||||||
|
pPanel->setToobarlVisible(true);
|
||||||
|
}
|
||||||
|
else{ //运行
|
||||||
|
pPanel->setToobarlVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiagramCavasPrivate::initPropertyPage()
|
void DiagramCavasPrivate::initPropertyPage()
|
||||||
|
|
@ -460,35 +479,6 @@ void DiagramCavasPrivate::initPropertyPage()
|
||||||
|
|
||||||
void DiagramCavasPrivate::showPropertyDlgImpl()
|
void DiagramCavasPrivate::showPropertyDlgImpl()
|
||||||
{
|
{
|
||||||
/*Q_Q(DiagramCavas);
|
|
||||||
|
|
||||||
// 确保属性页面已初始化
|
|
||||||
initPropertyPage();
|
|
||||||
|
|
||||||
// 确保属性对话框已创建
|
|
||||||
if (_pPropertyDlg == nullptr) {
|
|
||||||
_pPropertyDlg = new PropertyDlg(q->parentWidget());
|
|
||||||
_pPropertyDlg->setWindowTitle("属性设置");
|
|
||||||
_pPropertyDlg->setModal(false); // 非模态对话框
|
|
||||||
|
|
||||||
// 连接对话框关闭信号
|
|
||||||
QObject::connect(_pPropertyDlg, &PropertyDlg::finished, q, [this]() {
|
|
||||||
// 对话框关闭时的处理
|
|
||||||
qDebug() << "Property dialog closed";
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置内容
|
|
||||||
_pPropertyDlg->show();
|
|
||||||
_pPropertyDlg->setContent(_pPropertyPage);*/
|
|
||||||
//_pPropertyPage->setObject(q_ptr);
|
|
||||||
|
|
||||||
// 居中显示
|
|
||||||
//centerPropertyDialogOnScreen();
|
|
||||||
|
|
||||||
// 激活窗口
|
|
||||||
//_pPropertyDlg->raise();
|
|
||||||
//_pPropertyDlg->activateWindow();
|
|
||||||
Q_Q(DiagramCavas);
|
Q_Q(DiagramCavas);
|
||||||
|
|
||||||
initPropertyPage();
|
initPropertyPage();
|
||||||
|
|
@ -1086,6 +1076,13 @@ bool DiagramCavasPrivate::createAndLoadMonitor(PowerEntity* p, const QJsonObject
|
||||||
QJsonObject pageAttr = context["pageAttr"].toObject();
|
QJsonObject pageAttr = context["pageAttr"].toObject();
|
||||||
applyPageGeometry(panel, subWindow, pageAttr);
|
applyPageGeometry(panel, subWindow, pageAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_curMode == 0){ //编辑
|
||||||
|
panel->setToobarlVisible(true);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
panel->setToobarlVisible(false);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "No context data for monitor, using default:" << monitorName;
|
qDebug() << "No context data for monitor, using default:" << monitorName;
|
||||||
}
|
}
|
||||||
|
|
@ -1108,6 +1105,7 @@ bool DiagramCavasPrivate::loadExistingMonitor(const QString& name)
|
||||||
|
|
||||||
// 显示面板
|
// 显示面板
|
||||||
panel->show();
|
panel->show();
|
||||||
|
panel->getModelController()->activePanelHierachy(); //激活当前层级关系
|
||||||
|
|
||||||
// 设置为活动子窗口
|
// 设置为活动子窗口
|
||||||
Q_Q(DiagramCavas);
|
Q_Q(DiagramCavas);
|
||||||
|
|
|
||||||
|
|
@ -2529,6 +2529,12 @@ void FixedPortsModel::generateMonitorConfig(MonitorPanel* pPanel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FixedPortsModel::activePanelHierachy()
|
||||||
|
{
|
||||||
|
emit updateTopologyItems(m_bayHierachy, true,true);
|
||||||
|
emit updateTopologyItems(m_itemHierachy, false,true);
|
||||||
|
}
|
||||||
|
|
||||||
void FixedPortsModel::monitorItemSelected(QUuid uid)
|
void FixedPortsModel::monitorItemSelected(QUuid uid)
|
||||||
{
|
{
|
||||||
auto pMonitor = dynamic_cast<MonitorPanel*>(_widget);
|
auto pMonitor = dynamic_cast<MonitorPanel*>(_widget);
|
||||||
|
|
@ -2776,8 +2782,97 @@ void FixedPortsModel::previewHMI(SelectPanel* pPanel,QList<HierarchyItem> lst)
|
||||||
auto pSubWin = map.value(sPage).second;
|
auto pSubWin = map.value(sPage).second;
|
||||||
pSubWin->resize(itemsRect.width(),itemsRect.height());
|
pSubWin->resize(itemsRect.width(),itemsRect.height());
|
||||||
}*/
|
}*/
|
||||||
|
//pPanel->getView()->fitInView(itemsRect, Qt::KeepAspectRatio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixedPortsModel::customGenerateHMI(QString sPage,QPair<int,int> size,QList<HierarchyItem> lst)
|
||||||
|
{
|
||||||
|
MonitorPanel* pPanel = nullptr;
|
||||||
|
if(_cavas){
|
||||||
|
DiagramInfo info;
|
||||||
|
info.id = QUuid::createUuid();
|
||||||
|
info.sName = sPage;
|
||||||
|
info.sTag = sPage;
|
||||||
|
info.sBasePageName = _pageName;
|
||||||
|
info.parentId = _pEntity->id();
|
||||||
|
_cavas->onSignal_createDiagram(info,DiagramMode::DM_run);
|
||||||
|
pPanel = _cavas->getMonitorPanel(sPage);
|
||||||
|
pPanel->getModelController()->setMonitorRelation(lst);
|
||||||
|
|
||||||
|
QList<HierarchyItem> lstFirst;
|
||||||
|
QList<HierarchyItem> lstSecond;
|
||||||
|
for(auto& itemInfo:lst) //第一次循环处理间隔
|
||||||
|
{
|
||||||
|
if(itemInfo.item.nCategory == 1){ //间隔
|
||||||
|
if(_bayItem.contains(itemInfo.item.uid)){
|
||||||
|
auto pBay = _bayItem.value(itemInfo.item.uid);
|
||||||
|
BayProperty* pPro = dynamic_cast<BayProperty*>(pBay->getProperty());
|
||||||
|
if(pPro){
|
||||||
|
pPanel->getModelController()->addBayByData(pPro);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lstFirst.append(itemInfo); //在lst插入时判断重复
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(auto& itemInfo:lst)
|
||||||
|
{
|
||||||
|
if(itemInfo.item.nCategory == 0){ //设备
|
||||||
|
if(_nodeItem.contains(itemInfo.item.uid)){
|
||||||
|
auto pItem = _nodeItem.value(itemInfo.item.uid);
|
||||||
|
BaseProperty* pPro = dynamic_cast<BaseProperty*>(pItem->getProperty());
|
||||||
|
if(pPro){
|
||||||
|
auto pNewItem = pItem->clone();
|
||||||
|
if(pPro->type() == 8){
|
||||||
|
auto pLine = dynamic_cast<ElectricFunctionModelConnectLineItem*>(pNewItem);
|
||||||
|
if(pLine)
|
||||||
|
pLine->calculatePath();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
pNewItem->updateItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pNewItem && pPanel){
|
||||||
|
pNewItem->bindProperty(pPro);
|
||||||
|
pNewItem->updateHandles();
|
||||||
|
pNewItem->updateByProperty(); //使用模型更新自身
|
||||||
|
pPanel->getModelController()->addNodeItem(pPro->uuid(),pNewItem);
|
||||||
|
pPanel->getScene()->addItem(pNewItem); //绑定模型
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lstSecond.append(itemInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pPanel){
|
||||||
|
if (!pPanel->getScene()->items().isEmpty()) {
|
||||||
|
//pPanel->moveItemsAlignment();
|
||||||
|
QRectF itemsRect = pPanel->getScene()->itemsBoundingRect();
|
||||||
|
itemsRect.adjust(-100, -100, 100, 100);
|
||||||
|
|
||||||
|
auto pSubWin = _cavas->getSubWindow(sPage);
|
||||||
|
if(pSubWin)
|
||||||
|
pSubWin->resize(size.first,size.second);
|
||||||
pPanel->getView()->fitInView(itemsRect, Qt::KeepAspectRatio);
|
pPanel->getView()->fitInView(itemsRect, Qt::KeepAspectRatio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emit pPanel->getModelController()->monitorCreated(_pageName,qMakePair(sPage,info.id.toUuid()));
|
||||||
|
|
||||||
|
generateMonitorConfig(pPanel);
|
||||||
|
|
||||||
|
emit updateTopologyItems(lstFirst, true,true);
|
||||||
|
emit updateTopologyItems(lstSecond, false,true);
|
||||||
|
pPanel->getModelController()->setBayHierachy(lstFirst); //保存生成的间隔层级
|
||||||
|
pPanel->getModelController()->setItemHierachy(lstSecond); //保存生成的对象层级
|
||||||
|
|
||||||
|
pPanel->initDisplayState();
|
||||||
|
pPanel->initDisplaySetting();
|
||||||
|
|
||||||
|
_cavas->onSignal_createHMI(sPage,info.id.toUuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,16 @@ void ElectricFunctionModelSvgItem::paint(QPainter* painter, const QStyleOptionGr
|
||||||
{
|
{
|
||||||
m_pRender->render(painter,m_boundingRect);
|
m_pRender->render(painter,m_boundingRect);
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
painter->setBrush(QBrush(QColor(248, 248, 248))); // 浅灰白
|
||||||
|
// 2. 设置虚线画笔
|
||||||
|
QPen pen(QColor(160, 160, 160));
|
||||||
|
pen.setStyle(Qt::DashLine);
|
||||||
|
pen.setWidth(1);
|
||||||
|
painter->setPen(pen);
|
||||||
|
// 3. 绘制基础矩形
|
||||||
|
painter->drawRoundedRect(boundingRect(), 2, 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
painter->setPen(m_pen);
|
painter->setPen(m_pen);
|
||||||
|
|
|
||||||
|
|
@ -93,25 +93,34 @@ void ElectricFunctionModelSvgItemCT::paint(QPainter* painter, const QStyleOption
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (!m_pRender || !m_pRender->isValid())
|
if (!m_pRender || !m_pRender->isValid()){
|
||||||
return;
|
painter->setBrush(QBrush(QColor(230, 230, 230))); // 浅灰白,未设置图片
|
||||||
|
// 2. 设置虚线画笔
|
||||||
// 绘制第一个图形
|
QPen pen(QColor(160, 160, 160));
|
||||||
if(_itemType == 1){
|
pen.setStyle(Qt::DashLine);
|
||||||
QRectF rect1(m_boundingRect.x(), m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
pen.setWidth(1);
|
||||||
m_pRender->render(painter, rect1);
|
painter->setPen(pen);
|
||||||
|
// 3. 绘制基础矩形
|
||||||
// 绘制第二个图形
|
painter->drawRoundedRect(boundingRect(), 2, 2);
|
||||||
QRectF rect2(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
|
||||||
m_pRender->render(painter, rect2);
|
|
||||||
|
|
||||||
// 绘制第三个图形
|
|
||||||
QRectF rect3(m_boundingRect.x() + 2 * singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
|
||||||
m_pRender->render(painter, rect3);
|
|
||||||
}
|
}
|
||||||
else if(_itemType == 0){
|
else{
|
||||||
QRectF rect(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
// 绘制第一个图形
|
||||||
m_pRender->render(painter, rect);
|
if(_itemType == 1){
|
||||||
|
QRectF rect1(m_boundingRect.x(), m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
||||||
|
m_pRender->render(painter, rect1);
|
||||||
|
|
||||||
|
// 绘制第二个图形
|
||||||
|
QRectF rect2(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
||||||
|
m_pRender->render(painter, rect2);
|
||||||
|
|
||||||
|
// 绘制第三个图形
|
||||||
|
QRectF rect3(m_boundingRect.x() + 2 * singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
||||||
|
m_pRender->render(painter, rect3);
|
||||||
|
}
|
||||||
|
else if(_itemType == 0){
|
||||||
|
QRectF rect(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
|
||||||
|
m_pRender->render(painter, rect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,18 @@ void ElectricFunctionModelSvgItemPT::paint(QPainter* painter, const QStyleOption
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (!m_pRender || !m_pRender->isValid())
|
if (!m_pRender || !m_pRender->isValid())
|
||||||
return;
|
{
|
||||||
m_pRender->render(painter, m_boundingRect);
|
painter->setBrush(QBrush(QColor(230, 230, 230))); // 浅灰白,未设置图片
|
||||||
|
// 2. 设置虚线画笔
|
||||||
|
QPen pen(QColor(160, 160, 160));
|
||||||
|
pen.setStyle(Qt::DashLine);
|
||||||
|
pen.setWidth(1);
|
||||||
|
painter->setPen(pen);
|
||||||
|
// 3. 绘制基础矩形
|
||||||
|
painter->drawRoundedRect(boundingRect(), 2, 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_pRender->render(painter, m_boundingRect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -95,11 +95,29 @@ GraphicsFunctionModelGroup::GraphicsFunctionModelGroup(QGraphicsItem *parent)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GraphicsFunctionModelGroup::GraphicsFunctionModelGroup(const GraphicsFunctionModelGroup& obj)
|
||||||
|
:GraphicsFunctionModelItem(obj)
|
||||||
|
{
|
||||||
|
m_direction = obj.m_direction;
|
||||||
|
m_spacing = obj.m_spacing;
|
||||||
|
_groupType = obj.m_spacing;
|
||||||
|
|
||||||
|
for(auto &pItem:obj.m_childItems){
|
||||||
|
auto newItem = pItem->clone();
|
||||||
|
m_childItems.append(newItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GraphicsFunctionModelGroup::~GraphicsFunctionModelGroup()
|
GraphicsFunctionModelGroup::~GraphicsFunctionModelGroup()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GraphicsFunctionModelGroup* GraphicsFunctionModelGroup::clone() const
|
||||||
|
{
|
||||||
|
return new GraphicsFunctionModelGroup(*this);
|
||||||
|
}
|
||||||
|
|
||||||
void GraphicsFunctionModelGroup::addItem(GraphicsFunctionModelItem* item)
|
void GraphicsFunctionModelGroup::addItem(GraphicsFunctionModelItem* item)
|
||||||
{
|
{
|
||||||
item->setParentItem(this); // 关键:设置父项
|
item->setParentItem(this); // 关键:设置父项
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,29 @@ PluginSvgItemWrapper::PluginSvgItemWrapper(ICanvasItem *pluginItem, QGraphicsIte
|
||||||
qDebug() << "PluginItemWrapper created for:" << m_pluginItem->typeId();
|
qDebug() << "PluginItemWrapper created for:" << m_pluginItem->typeId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PluginSvgItemWrapper::PluginSvgItemWrapper(ICanvasItem *pluginItem,const PluginSvgItemWrapper& obj)
|
||||||
|
:ElectricFunctionModelSvgItem(obj)
|
||||||
|
, m_pluginItem(pluginItem)
|
||||||
|
{
|
||||||
|
if (!m_pluginItem) {
|
||||||
|
qWarning() << "PluginItemWrapper: pluginItem is null!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 设置类型
|
||||||
|
m_Itemtype = GIT_PluginItem;
|
||||||
|
|
||||||
|
// 设置初始名称
|
||||||
|
setName(m_pluginItem->displayName());
|
||||||
|
|
||||||
|
// 连接信号
|
||||||
|
connectSignals();
|
||||||
|
|
||||||
|
// 更新坐标
|
||||||
|
updateCoordinate();
|
||||||
|
|
||||||
|
qDebug() << "PluginItemWrapper created for:" << m_pluginItem->typeId();
|
||||||
|
}
|
||||||
|
|
||||||
PluginSvgItemWrapper::~PluginSvgItemWrapper()
|
PluginSvgItemWrapper::~PluginSvgItemWrapper()
|
||||||
{
|
{
|
||||||
// 删除插件项
|
// 删除插件项
|
||||||
|
|
@ -109,7 +132,7 @@ ElectricFunctionModelSvgItem* PluginSvgItemWrapper::clone() const
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建新的包装器
|
// 创建新的包装器
|
||||||
PluginSvgItemWrapper *clone = new PluginSvgItemWrapper(newPluginItem, parentItem());
|
PluginSvgItemWrapper *clone = new PluginSvgItemWrapper(newPluginItem, *this);
|
||||||
|
|
||||||
// 复制变换属性
|
// 复制变换属性
|
||||||
clone->setPos(pos());
|
clone->setPos(pos());
|
||||||
|
|
@ -411,8 +434,8 @@ void PluginSvgItemWrapper::copyPropertiesFrom(const PluginSvgItemWrapper *source
|
||||||
// 复制自定义数据
|
// 复制自定义数据
|
||||||
setData(0, source->data(0));
|
setData(0, source->data(0));
|
||||||
|
|
||||||
// 生成新的ID
|
// 复制id
|
||||||
setItemId(QUuid::createUuid());
|
setItemId(source->itemId());
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginSvgItemWrapper::onPluginPropertyChanged(const QString &key, const QVariant &value)
|
void PluginSvgItemWrapper::onPluginPropertyChanged(const QString &key, const QVariant &value)
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "projectModelManager.h"
|
#include "projectModelManager.h"
|
||||||
#include "diagramCavas.h"
|
#include "diagramCavas.h"
|
||||||
#include "extraPropertyManager.h"
|
#include "extraPropertyManager.h"
|
||||||
|
#include "designerView.h"
|
||||||
|
|
||||||
MonitorPanel::MonitorPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
|
MonitorPanel::MonitorPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
|
||||||
: BaseDrawingPanel(pEntity,parent,mode)
|
: BaseDrawingPanel(pEntity,parent,mode)
|
||||||
|
|
@ -63,6 +64,29 @@ void MonitorPanel::closeEvent(QCloseEvent *closeEvent)
|
||||||
emit panelDelete(_name,2);
|
emit panelDelete(_name,2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QGraphicsItem* MonitorPanel::findCentralItem() {
|
||||||
|
QList<QGraphicsItem*> items = getScene()->items();
|
||||||
|
if (items.isEmpty()) return nullptr;
|
||||||
|
|
||||||
|
// 场景中心
|
||||||
|
QPointF sceneCenter = getScene()->sceneRect().center();
|
||||||
|
|
||||||
|
QGraphicsItem* centralItem = nullptr;
|
||||||
|
qreal minDistance = std::numeric_limits<qreal>::max();
|
||||||
|
|
||||||
|
foreach(QGraphicsItem* item, items) {
|
||||||
|
QPointF itemCenter = item->sceneBoundingRect().center();
|
||||||
|
qreal distance = QLineF(sceneCenter, itemCenter).length();
|
||||||
|
|
||||||
|
if (distance < minDistance) {
|
||||||
|
minDistance = distance;
|
||||||
|
centralItem = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return centralItem;
|
||||||
|
}
|
||||||
|
|
||||||
void MonitorPanel::createToolBar()
|
void MonitorPanel::createToolBar()
|
||||||
{
|
{
|
||||||
_toolBar = new QToolBar(this);
|
_toolBar = new QToolBar(this);
|
||||||
|
|
@ -547,6 +571,7 @@ void MonitorPanel::loadNodes(QJsonObject obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
emit _pModel->updateTopologyItems(lstFirst, true,true);
|
emit _pModel->updateTopologyItems(lstFirst, true,true);
|
||||||
|
_pModel->setBayHierachy(lstFirst);
|
||||||
|
|
||||||
// 第二阶段:处理所有设备
|
// 第二阶段:处理所有设备
|
||||||
QList<HierarchyItem> lstSecond;
|
QList<HierarchyItem> lstSecond;
|
||||||
|
|
@ -607,6 +632,7 @@ void MonitorPanel::loadNodes(QJsonObject obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
emit _pModel->updateTopologyItems(lstSecond, false,true);
|
emit _pModel->updateTopologyItems(lstSecond, false,true);
|
||||||
|
_pModel->setItemHierachy(lstSecond);
|
||||||
|
|
||||||
QList<HMIImageRef> lstRef = DataBase::GetInstance()->getHMIRefAll(QUuid(_pEntity->id()));
|
QList<HMIImageRef> lstRef = DataBase::GetInstance()->getHMIRefAll(QUuid(_pEntity->id()));
|
||||||
_pModel->getHMIimageRef() = lstRef;
|
_pModel->getHMIimageRef() = lstRef;
|
||||||
|
|
@ -632,6 +658,10 @@ void MonitorPanel::loadNodes(QJsonObject obj)
|
||||||
_pModel->updateModelIcon("",model,svgMap); //更新全部 //***暂没有判断基模名称
|
_pModel->updateModelIcon("",model,svgMap); //更新全部 //***暂没有判断基模名称
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto pCenter = findCentralItem();
|
||||||
|
if(pCenter)
|
||||||
|
getView()->centerOn(pCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MonitorPanel::saveNodes(int pageId)
|
void MonitorPanel::saveNodes(int pageId)
|
||||||
|
|
@ -882,6 +912,14 @@ void MonitorPanel::initDisplayState()
|
||||||
mapState.insert(16,lst_transformer3w);
|
mapState.insert(16,lst_transformer3w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MonitorPanel::setToobarlVisible(bool b)
|
||||||
|
{
|
||||||
|
if(b)
|
||||||
|
_toolBar->setVisible(true);
|
||||||
|
else
|
||||||
|
_toolBar->setVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
void MonitorPanel::initDisplaySetting()
|
void MonitorPanel::initDisplaySetting()
|
||||||
{
|
{
|
||||||
auto stateMap = _pModel->getMonitorStateMap();
|
auto stateMap = _pModel->getMonitorStateMap();
|
||||||
|
|
|
||||||
|
|
@ -709,6 +709,46 @@ void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor)
|
||||||
view->setCursor(cursor);
|
view->setCursor(cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*void BaseSelector::updateConnectLineByTopology(QList<QGraphicsItem *> lst)
|
||||||
|
{
|
||||||
|
for(auto iter:lst) //更新连接线
|
||||||
|
{
|
||||||
|
auto item = dynamic_cast<GraphicsProjectModelItem*>(iter);
|
||||||
|
if(item)
|
||||||
|
{
|
||||||
|
if(item->getItemType() != GIT_link) //获取非电缆对象
|
||||||
|
{
|
||||||
|
QUuid nId = item->itemId();
|
||||||
|
auto lstConnect = TopologyManager::instance().getConnectionsFor(nId.toString());
|
||||||
|
for(auto &pConnect:lstConnect)
|
||||||
|
{
|
||||||
|
if(pConnect)
|
||||||
|
{
|
||||||
|
QString fromTerminalId = pConnect->fromTerminalId(); //connect自身包含头尾巴顺序
|
||||||
|
QString toTerminalId = pConnect->toTerminalId();
|
||||||
|
|
||||||
|
QPointF fromPos = _model->getTerminalPos(fromTerminalId);
|
||||||
|
QPointF toPos = _model->getTerminalPos(toTerminalId);
|
||||||
|
|
||||||
|
QRectF itemRect = item->boundingRect();
|
||||||
|
QPointF itemPos = item->scenePos();
|
||||||
|
|
||||||
|
ElectricFunctionModelConnectLineItem* connectItem = _model->getLineItemById(fromTerminalId);
|
||||||
|
if(connectItem)
|
||||||
|
{
|
||||||
|
connectItem->setStartPoint(fromPos);
|
||||||
|
connectItem->setEndPoint(toPos);
|
||||||
|
qDebug()<<nId<<"start:"<<fromPos.x()<<","<<fromPos.y()<<"end:"<<toPos.x()<<","<<toPos.y();
|
||||||
|
qDebug()<<itemRect<<","<<itemPos;
|
||||||
|
connectItem->calculatePath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
void BaseSelector::updateConnectLineByTopology(QList<QGraphicsItem *> lst)
|
void BaseSelector::updateConnectLineByTopology(QList<QGraphicsItem *> lst)
|
||||||
{
|
{
|
||||||
for(auto iter:lst) //更新连接线
|
for(auto iter:lst) //更新连接线
|
||||||
|
|
@ -730,12 +770,56 @@ void BaseSelector::updateConnectLineByTopology(QList<QGraphicsItem *> lst)
|
||||||
QPointF fromPos = _model->getTerminalPos(fromTerminalId);
|
QPointF fromPos = _model->getTerminalPos(fromTerminalId);
|
||||||
QPointF toPos = _model->getTerminalPos(toTerminalId);
|
QPointF toPos = _model->getTerminalPos(toTerminalId);
|
||||||
|
|
||||||
|
// 获取item的位置和大小
|
||||||
|
QRectF itemRect = item->boundingRect();
|
||||||
|
QPointF itemPos = item->scenePos();
|
||||||
|
|
||||||
|
// 正确计算item在场景中的矩形
|
||||||
|
QRectF itemSceneRect(itemPos.x() + itemRect.x(),
|
||||||
|
itemPos.y() + itemRect.y(),
|
||||||
|
itemRect.width(),
|
||||||
|
itemRect.height());
|
||||||
|
|
||||||
|
qDebug() << "处理连接线:";
|
||||||
|
qDebug() << "fromPos:" << fromPos << "toPos:" << toPos;
|
||||||
|
qDebug() << "itemRect(局部):" << itemRect;
|
||||||
|
qDebug() << "itemPos(场景):" << itemPos;
|
||||||
|
qDebug() << "itemSceneRect:" << itemSceneRect;
|
||||||
|
|
||||||
|
// 定义固定的偏移距离
|
||||||
|
const qint32 fixedOffset = 20; // 可以根据需要调整这个值
|
||||||
|
|
||||||
|
// 检查点是否有有效值(非0,0)
|
||||||
|
bool fromValid = !(fromPos.isNull() || (fromPos.x() == 0 && fromPos.y() == 0));
|
||||||
|
bool toValid = !(toPos.isNull() || (toPos.x() == 0 && toPos.y() == 0));
|
||||||
|
|
||||||
|
if(fromValid && !toValid)
|
||||||
|
{
|
||||||
|
// fromPos有效,toPos无效
|
||||||
|
qDebug() << "fromPos有效,toPos无效";
|
||||||
|
toPos = calculateMissingPointByKnownPoint(fromPos, itemSceneRect, fixedOffset, false);
|
||||||
|
}
|
||||||
|
else if(!fromValid && toValid)
|
||||||
|
{
|
||||||
|
// toPos有效,fromPos无效
|
||||||
|
qDebug() << "toPos有效,fromPos无效";
|
||||||
|
fromPos = calculateMissingPointByKnownPoint(toPos, itemSceneRect, fixedOffset, true);
|
||||||
|
}
|
||||||
|
else if(!fromValid && !toValid)
|
||||||
|
{
|
||||||
|
// 两个点都无效,使用默认位置
|
||||||
|
qDebug() << "两个点都无效";
|
||||||
|
fromPos = QPointF(itemSceneRect.left() - fixedOffset, itemSceneRect.center().y());
|
||||||
|
toPos = QPointF(itemSceneRect.right() + fixedOffset, itemSceneRect.center().y());
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "最终: fromPos:" << fromPos << "toPos:" << toPos;
|
||||||
|
|
||||||
ElectricFunctionModelConnectLineItem* connectItem = _model->getLineItemById(fromTerminalId);
|
ElectricFunctionModelConnectLineItem* connectItem = _model->getLineItemById(fromTerminalId);
|
||||||
if(connectItem)
|
if(connectItem)
|
||||||
{
|
{
|
||||||
connectItem->setStartPoint(fromPos);
|
connectItem->setStartPoint(fromPos);
|
||||||
connectItem->setEndPoint(toPos);
|
connectItem->setEndPoint(toPos);
|
||||||
//qDebug()<<nId<<"start:"<<fromPos.x()<<","<<fromPos.y()<<"end:"<<toPos.x()<<","<<toPos.y();
|
|
||||||
connectItem->calculatePath();
|
connectItem->calculatePath();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -745,3 +829,54 @@ void BaseSelector::updateConnectLineByTopology(QList<QGraphicsItem *> lst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPointF BaseSelector::calculateMissingPointByKnownPoint(const QPointF& knownPoint,
|
||||||
|
const QRectF& itemSceneRect,
|
||||||
|
qint32 offset,
|
||||||
|
bool isFromPoint)
|
||||||
|
{
|
||||||
|
QPointF missingPoint;
|
||||||
|
QPointF itemCenter = itemSceneRect.center();
|
||||||
|
|
||||||
|
// 计算相对中心的位置
|
||||||
|
qreal dx = knownPoint.x() - itemCenter.x();
|
||||||
|
qreal dy = knownPoint.y() - itemCenter.y();
|
||||||
|
|
||||||
|
qDebug() << "相对中心: dx=" << dx << "dy=" << dy;
|
||||||
|
|
||||||
|
// 判断主要方向
|
||||||
|
if(qAbs(dx) > qAbs(dy))
|
||||||
|
{
|
||||||
|
// 主要是水平方向
|
||||||
|
if(dx > 0)
|
||||||
|
{
|
||||||
|
// 在中心右侧 → 放在更右侧
|
||||||
|
missingPoint = QPointF(itemSceneRect.right() + offset, knownPoint.y());
|
||||||
|
qDebug() << "右侧 → 更右侧";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 在中心左侧 → 放在更左侧
|
||||||
|
missingPoint = QPointF(itemSceneRect.left() - offset, knownPoint.y());
|
||||||
|
qDebug() << "左侧 → 更左侧";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 主要是垂直方向
|
||||||
|
if(dy > 0)
|
||||||
|
{
|
||||||
|
// 在中心下方 → 放在更下方
|
||||||
|
missingPoint = QPointF(knownPoint.x(), itemSceneRect.bottom() + offset);
|
||||||
|
qDebug() << "下方 → 更下方";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 在中心上方 → 放在更上方
|
||||||
|
missingPoint = QPointF(knownPoint.x(), itemSceneRect.top() - offset);
|
||||||
|
qDebug() << "上方 → 更上方";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "计算出的缺失点:" << missingPoint;
|
||||||
|
return missingPoint;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -267,6 +267,13 @@ QWidget QLabel {
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_info">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
<item>
|
<item>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue