123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- #include "DialogPortValue.h"
- #include "PouManager.h"
- #include "GvlManager.h"
- DialogPortValue::DialogPortValue(const TOOL* port, POU* localPou, QWidget *parent)
- : QDialog(parent)
- , portInfo(port)
- , m_pLocalPou(localPou)
- {
- ui.setupUi(this);
- // 对话框风格初始化
- initUI();
- //// 添加兼容的工具到树形结构中
- //AddCompatibleToolsToTree();
- //ui.treeTool->installEventFilter(this);
- }
- DialogPortValue::~DialogPortValue()
- {
- }
- /// <summary>
- /// 对话框初始化
- /// </summary>
- void DialogPortValue::initUI()
- {
- // 设置对话框标题
- this->setWindowTitle(("Port Interface Selection"));
- this->setAttribute(Qt::WA_QuitOnClose);
- this->setWindowModality(Qt::ApplicationModal);
- // ComboBox
- // 分别添加当前的Pou和全局变量(每一个全局变量是一个页面,Pou接口和全局变量是一个页面)
- // 2022-4-2 修改,默认显示本Port所属Pou的分组
- ui.comboValueGroup->addItem(m_pLocalPou->pouName());
-
- // 获取全部的GVL分组,并添加其中的全局变量分组
- m_pAllVariables = g_pGvlManager->getAllGvls();
- QMapIterator<QString, GVL*> it(*m_pAllVariables);
- while (it.hasNext())
- {
- const GVL* pGvl = it.next().value();
- if (pGvl->Type == TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE)
- {
- ui.comboValueGroup->addItem(it.key());
- }
- }
- // 硬件组态分组
- ui.comboValueGroup->addItem(GROUP_NAME_HARDWARE);
- ui.comboValueGroup->setCurrentIndex(0);
- this->onComboGroupChanged(0);
- //ui.comboValueGroup->addItem(("Global Variables"));
- //// 初始化为按Pou来选择
- //ui.comboValueGroup->setCurrentIndex(COMBO_INDEX_POU);
- //// 添加当前Pou兼容的工具到树形结构中
- // AddCompatibleToolsToTree();
- // m_SelMode = PORT_SEL_MODE::PORT_SEL_POU;
- // 添加当前兼容的Gvl变量到树形结构中
- // AddCompatibleVariablesToTree();
- // ui.comboValueGroup->setCurrentIndex(0);
- // m_SelMode = PORT_SEL_MODE::PORT_SEL_GVL;
- // Tree
- // 1列
- ui.treeTool->setColumnCount(1);
- // 隐藏表头
- ui.treeTool->setHeaderHidden(true);
- // 显示虚线
- ui.treeTool->setStyle(QStyleFactory::create("windows"));
- // 槽函数
- connect(ui.selectButton, SIGNAL(clicked()), this, SLOT(onButtonSelectClicked()));
- connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
- connect(ui.comboValueGroup, SIGNAL(currentIndexChanged(int)),this,SLOT(onComboGroupChanged(int)));
- // 设置固定窗体大小
- this->setFixedSize(484, 487);
- //this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
- }
- /// <summary>
- /// 添加兼容的工具到树形结构中
- /// </summary>
- void DialogPortValue::AddPouToolsToTree(const POU* pPou)
- {
- // 添加适配的标准工具
- const QVector<TOOL*>& allTools = pPou->GetAllStandardTools();
- QVectorIterator<TOOL*> i(allTools);
- while (i.hasNext())
- {
- const TOOL* pTool = i.next();
- //// 只添加标准工具(允许绑定goto工具)
- //if (!pTool->isStandardTool())
- //{
- // continue;
- //}
- // 按照工具名称添加节点
- QTreeWidgetItem* pToolItem = AddToolTreeItem(pTool->strInstanceName);
- // 继续添加接口
- int nInfCount = 0;
- for (_INTERFACE* pInf : pTool->Interfaces)
- {
- // 只添加和Port输入输出类型相同的接口
- // 而且隐藏的也不显示
- if (pInf->Direction == portInfo->Interfaces[0]->Direction
- && pInf->bEnable)
- {
- // 如果Port已经绑定了变量类型,那么变量类型也需要相同
- if (portInfo->Interfaces[0]->value.type != VALUE_TYPE::Type_Unknown
- && !pInf->isSameTypeTo(portInfo->Interfaces[0]))
- {
- continue;
- }
- // 所有条件都符合,才会出现在列表中
- AddInterfaceTreeItem(pToolItem, pInf);
- nInfCount++;
- }
- }
- // 如果没有有效的接口,则删除掉刚刚添加的Tool节点
- if (nInfCount <= 0)
- {
- ui.treeTool->removeItemWidget(pToolItem, 0);
- delete(pToolItem);
- }
- }
- // 将树形结构展开
- ui.treeTool->expandAll();
- }
- /// <summary>
- /// 添加兼容的Pou变量到树形结构中(返回是全局变量、局部变量)
- /// </summary>
- bool DialogPortValue::AddPouVariablesToTree(const QString& strGroup)
- {
- bool bIsGlobal = false;
- // 获取全部的GVL变量
- m_pAllVariables = g_pGvlManager->getAllGvls();
- // 首先找到用户选择的分组
- QMapIterator<QString, GVL*> it(*m_pAllVariables);
- while (it.hasNext())
- {
- if (it.next().key() != strGroup)
- {
- continue;
- }
- // 找到当前变量集
- const GVL* pGvl = it.value();
- // 首先判断是全局变量还是局部变量
- if (pGvl->Type == TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE)
- {
- bIsGlobal = true;
- }
- else
- {
- bIsGlobal = false;
- }
- // 将变量信息添加到树形结构中
- QTreeWidgetItem* pGroupItem = AddVariableGroupTreeItem(pGvl->Type);
- const VARIABLES& vars = it.value()->Variables;
- // 继续添加变量
- for (const VARIABLE* var : vars)
- {
- // 如果Port已经绑定了变量类型,那么变量类型也需要相同
- // 注:全局变量无需考虑方向,所有方向都可以设置
- if (portInfo->Interfaces[0]->value.type != VALUE_TYPE::Type_Unknown
- && var->value.type != portInfo->Interfaces[0]->value.type)
- {
- continue;
- }
- // 所有条件都符合,才会出现在列表中
- AddVariableTreeItem(pGroupItem, var);
- }
- // 将树形结构展开
- ui.treeTool->expandAll();
- break;
- }
- return bIsGlobal;
- //// 获取全部的GVL分组,并添加
- //m_pAllVariables = g_pVariablesManager->getAllGlobalVariables();
- //QHashIterator<QString, GVL*> it(*m_pAllVariables);
- //while (it.hasNext())
- //{
- // // ui.comboValueGroup->addItem(it.next().key());
- // QTreeWidgetItem* pGroupItem = AddVariableGroupTreeItem(it.next().key());
- // const VARIABLES& vars = it.value()->Variables;
- // // 继续添加变量
- // for (const VARIABLE* var : vars)
- // {
- // // 如果Port已经绑定了变量类型,那么变量类型也需要相同
- // // 注:全局变量无需考虑方向,所有方向都可以设置
- // if (portInfo->Interface->value.Type != VALUE_TYPE::Unknown_Type
- // && var->value.Type!=portInfo->Interface->value.Type)
- // {
- // continue;
- // }
- // // 所有条件都符合,才会出现在列表中
- // AddVariableTreeItem(pGroupItem, var);
- // }
- //}
- //// 将树形结构展开
- //ui.treeTool->expandAll();
- }
- /// <summary>
- /// 添加兼容的硬件工具
- /// </summary>
- void DialogPortValue::AddHdwToolsToTree()
- {
- AddPouToolsToTree(g_pPouManager->getHdwPou());
- }
- /// <summary>
- /// 添加兼容的硬件局部变量
- /// </summary>
- void DialogPortValue::AddHdwVariablesToTree()
- {
- // 获取全部的GVL变量
- m_pAllVariables = g_pGvlManager->getAllGvls();
- // 首先找到用户选择的分组
- QMapIterator<QString, GVL*> it(*m_pAllVariables);
- while (it.hasNext())
- {
- if (it.next().key() != GROUP_NAME_HARDWARE)
- {
- continue;
- }
- // 找到当前变量集
- const GVL* pGvl = it.value();
- // 将变量信息添加到树形结构中
- QTreeWidgetItem* pGroupItem = AddVariableGroupTreeItem(pGvl->Type);
- const VARIABLES& vars = it.value()->Variables;
- // 继续添加变量
- for (const VARIABLE* var : vars)
- {
- // 如果Port已经绑定了变量类型,那么变量类型也需要相同
- // 注:全局变量无需考虑方向,所有方向都可以设置
- if (portInfo->Interfaces[0]->value.type != VALUE_TYPE::Type_Unknown
- && var->value.type != portInfo->Interfaces[0]->value.type)
- {
- continue;
- }
- // 所有条件都符合,才会出现在列表中
- AddVariableTreeItem(pGroupItem, var);
- }
- // 将树形结构展开
- ui.treeTool->expandAll();
- break;
- }
- }
- /// <summary>
- /// 添加Tool子节点
- /// </summary>
- /// <param name="toolName"></param>
- QTreeWidgetItem* DialogPortValue::AddToolTreeItem(const QString& toolName)
- {
- QTreeWidgetItem* newItem = new QTreeWidgetItem(QStringList(toolName));
- newItem->setIcon(0, QIcon(":/image/tool_tree_item.png"));
- // 使父节点不可选中
- newItem->setFlags(Qt::ItemIsEnabled);
- ui.treeTool->addTopLevelItem(newItem);
- return newItem;
- }
- /// <summary>
- /// 添加接口子节点
- /// </summary>
- void DialogPortValue::AddInterfaceTreeItem(QTreeWidgetItem* pToolItem, const _INTERFACE* pInf)
- {
- QTreeWidgetItem* newItem = new QTreeWidgetItem(pToolItem, QStringList(pInf->strName));
- if (pInf->Direction == INF_DIRECTION::INF_DIR_OUT)
- {
- newItem->setIcon(0, QIcon(":/image/Output.png"));
- }
- else
- {
- newItem->setIcon(0, QIcon(":/image/Input.png"));
- }
-
- pToolItem->addChild(newItem);
- // 将新加入的item和对应的Interface绑定
- m_ItemInfs.insert(newItem, pInf);
- }
- /// <summary>
- /// 添加变量分组子节点
- /// </summary>
- /// <param name="groupName"></param>
- /// <returns></returns>
- QTreeWidgetItem* DialogPortValue::AddVariableGroupTreeItem(TOOL_TYPE varType)
- {
- QStringList strTitle;
-
- if (varType == TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE)
- {
- strTitle.push_back("Global Variables");
- }
- else
- {
- strTitle.push_back("Local Variables");
- }
- QTreeWidgetItem* newItem = new QTreeWidgetItem(strTitle);
-
- newItem->setIcon(0, QIcon(":/image/gvl_group_tree_item.png"));
- // 使父节点不可选中
- newItem->setFlags(Qt::ItemIsEnabled);
- ui.treeTool->addTopLevelItem(newItem);
- return newItem;
- }
- /// <summary>
- /// 添加变量子节点
- /// </summary>
- /// <param name="pToolItem"></param>
- /// <param name="pInf"></param>
- void DialogPortValue::AddVariableTreeItem(QTreeWidgetItem* pToolItem, const VARIABLE* var)
- {
- // 添加的节点命名规则为 变量类型:变量名字
- QString strNodeName = var->strNameWithType + "[" + Utility::getValueString(var->value.Ptr, var->value.type) + "]";
- // strNodeName =
- // Utility::getTypeString(var->value.type)
- // + ": " + var->strName +
- // " [" + Utility::getValueString(var->value.Ptr, var->value.type) + "]";
-
- // 根据名字建立新的节点
- QTreeWidgetItem* newItem = new QTreeWidgetItem(pToolItem, QStringList(strNodeName));
- // newItem->setIcon(0, QIcon(":/image/Output.png"));
- // 根据当前Port的输入输出选择方向
- if (portInfo->Interfaces[0]->Direction == INF_DIRECTION::INF_DIR_OUT)
- {
- newItem->setIcon(0, QIcon(":/image/Output.png"));
- }
- else
- {
- newItem->setIcon(0, QIcon(":/image/Input.png"));
- }
- pToolItem->addChild(newItem);
- // 将新加入的item和对应的Variable绑定
- m_ItemInfs.insert(newItem, var);
- }
- /// <summary>
- /// select按钮
- /// </summary>
- void DialogPortValue::onButtonSelectClicked()
- {
- // 获取用户选择的节点
- QList<QTreeWidgetItem*> selItems = ui.treeTool->selectedItems();
- if (selItems.size() <= 0)
- {
- // 如果选择的节点无效,则不允许关闭
- Utility::VPCriticalMessageBox(" The interface selected is invalid!");
- selInf = nullptr;
- return;
- }
- // 获取用户选择的接口或变量
- selInf = m_ItemInfs[selItems[0]];
- this->accept();
- }
- /// <summary>
- /// Combo框选择变更时,需要切换对应的变量列表
- /// </summary>
- /// <param name="nIndex"></param>
- void DialogPortValue::onComboGroupChanged(int nIndex)
- {
- Q_UNUSED(nIndex);
- // 先将当前的树形控件及对应数据结构全部清空
- ui.treeTool->clear();
- m_ItemInfs.clear();
- // 获取当前选中的分组名称
- QString strGroup = ui.comboValueGroup->currentText();
- // 首先判断是不是硬件组态分组
- if (strGroup == GROUP_NAME_HARDWARE)
- {
- // 添加硬件变量
- // AddHdwVariablesToTree();
- // 添加硬件工具
- AddHdwToolsToTree();
- return;
- }
- // 如果是Pou相关的,则按Pou的逻辑处理
- // 根据分组首先添加对应的Pou变量
- bool bIsGlobal = AddPouVariablesToTree(strGroup);
- // 然后如果选择的是Pou页面,则继续添加Tool的接口变量
- if (!bIsGlobal)
- {
- AddPouToolsToTree(m_pLocalPou);
- }
- }
- ///// <summary>
- ///// 事件过滤器,拦截发往treeTool的双击事件
- ///// </summary>
- ///// <param name="target"></param>
- ///// <param name="event"></param>
- ///// <returns></returns>
- //bool DialogPortValue::eventFilter(QObject* target, QEvent* event)
- //{
- // if (target == ui.treeTool)
- // {
- //
- // qDebug() << event->type();
- //
- // if (event->type() == QEvent::MouseButtonPress)
- // {
- // // 获取用户选择的节点
- // QList<QTreeWidgetItem*> selItems = ui.treeTool->selectedItems();
- //
- // if (selItems.size() <= 0)
- // {
- // return true;
- // }
- // else
- // {
- // QMessageBox::critical(this, "Vision Plus", " The interface selected is invalid!");
- // }
- //
- // this->accept();
- // }
- // }
- //
- //
- // return QDialog::eventFilter(target, event);
- //}
- ///// <summary>
- ///// 鼠标双击,直接选定接口
- ///// </summary>
- ///// <param name="event"></param>
- //void DialogPortValue::mouseDoubleClickEvent(QMouseEvent* event)
- //{
- // // 获取用户选择的节点
- // QList<QTreeWidgetItem*> selItems = ui.treeTool->selectedItems();
- //
- // if (selItems.size() <= 0)
- // {
- // return;
- // }
- // else
- // {
- // QMessageBox::critical(this, "Vision Plus", " The interface selected is invalid!");
- // }
- //
- // this->accept();
- //}
|