123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- #include "WindowAppBlockStandard.h"
- #include "WindowAppPouFrame.h"
- #include "WindowAppItemInterface.h"
- #include "Pou.h"
- #include "DialogBlockProperty.h"
- #include "TaskManager.h"
- #include "WindowAppTaskView.h"
- // bShowOnly 是否仅供展示使用,展示使用的话不提供右键菜单以及其他互动功能
- WindowAppBlockStandard::WindowAppBlockStandard(TOOL* pTool, POU* Pou, bool bShowOnly, QGraphicsObject* parent):
- WindowAppBlockStandardBase(pTool, Pou, bShowOnly, parent)
- {
-
- }
- /// <summary>
- /// 添加接口(Standard工具需要额外添加ToolInterface)
- /// </summary>
- void WindowAppBlockStandard::addItemInterfaces()
- {
- // 添加标准接口
- WindowAppBlockStandardBase::addItemInterfaces();
- // 添加ToolStart接口
- WindowAppBlockStandardBase::addItemToolInterfaces();
- }
- /// <summary>
- /// 双击弹出设置对话框
- /// </summary>
- /// <param name="event"></param>
- void WindowAppBlockStandard::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
- {
- // 只有鼠标左键才响应
- if (event->button() == Qt::LeftButton && !m_bShowOnly)
- {
- // qDebug() << this->scenePos();
- m_pPou->ShowToolDialog(this);
- }
- }
- /// <summary>
- /// 2022-3-10 根据Dll中的信息动态添加接口
- /// </summary>
- /// <param name="infList"></param>
- bool WindowAppBlockStandard::addDynamicInterfacesFromDll(const QList<DLL_INF>& infList, QString& strReason)
- {
- //// 此处需要去掉const属性了,因为需要动态给Tool增加端口
- //TOOL* pTool = const_cast<TOOL*>(this->toolInfo);
- for (const DLL_INF& inf : infList)
- {
- // 首先检查Tool中是否已经有此名字的接口了
- if (m_toolInfo->contains(inf.strName))
- {
- strReason = "[Error] Interface [" + inf.strName + " is already exist.";
- return false;
- }
- // 建立对应的Interface数据结构
- _INTERFACE* newInf = new _INTERFACE(m_toolInfo);
- newInf->basedFrom(inf);
- // 设置全名
- newInf->strFullName = m_toolInfo->strInstanceName + "." + newInf->strName;
- // 添加到Tool数据结构中
- m_toolInfo->addInterface(newInf);
- // 生成对应的InterfaceItem
- WindowAppItemInterface* pNewItemInf = new WindowAppItemInterface(
- newInf,
- m_pPou,
- this->m_toolInfo,
- m_bShowOnly,
- this
- );
- if (!m_bShowOnly)
- {
- // Pou中保存此接口的对应关系
- m_pPou->registerInterface(pNewItemInf, newInf);
- }
- // 保存接口Item信息用于绘制
- m_itemInterfaces.append(pNewItemInf);
- }
- // 重新计算矩形区域
- this->updateRect();
- // 接口全部动态添加完毕之后,更新Interface的位置
- WindowAppBlockBase::updateInterfacesPostion();
- return true;
- }
- /// <summary>
- /// 2022-3-11 根据Dll中的信息动态删除接口
- /// </summary>
- /// <param name="infList"></param>
- bool WindowAppBlockStandard::deleteDynamicInterfacesFromDll(const QList<DLL_INF>& infList, QString& strReason)
- {
- // 取得Tool指针
- // TOOL* pTool = const_cast<TOOL*>(this->toolInfo);
- // 遍历需要删除的接口
- for (const DLL_INF& inf : infList)
- {
- // 取得接口指针
- _INTERFACE* pDelInf = m_toolInfo->getInterfaceByName(inf.strName);
- if (pDelInf == nullptr)
- {
- strReason = "[Error] WindowAppBlockStandard::delDynamicInterfacesFromDll - but "
- + inf.strName + " is not exist.";
- return false;
- }
- // 取得接口指针的图形单元
- WindowAppItemInterface* pInfItem = m_pPou->GetInterfaceItemByName(pDelInf->strFullName);
- if (pInfItem == nullptr)
- {
- strReason = "[Error] WindowAppBlockStandard::delDynamicInterfacesFromDll - but item "
- + pDelInf->strFullName + " is not exist.";
- return false;
- }
- // 只允许删除动态接口
- if (!pDelInf->bDynamic)
- {
- strReason = "[Error] " + inf.strName + " is not dynamic intrface, can't be delete!";
- return false;
- }
- // 被引用的接口不允许删除
- if (pDelInf->nRefCount > 0)
- {
- strReason = "[Error] Can't delete interface[" + pDelInf->strFullName + "] : ref count > 0";
- return false;
- }
- // 层层检查完毕之后,开始执行删除动作
- // Pou相关接口中删除此接口相关数据结构
- m_pPou->DelInterface(pDelInf->strFullName, pInfItem, pDelInf);
- // m_itemInterfaces 中删除
- QVector<WindowAppItemInterface*>::iterator itr = m_itemInterfaces.begin();
- for (; itr != m_itemInterfaces.end();)
- {
- if (*itr == pInfItem)
- {
- // 要从scene()中移除这个Item,要不界面上不会消失
- scene()->removeItem(*itr);
- itr = m_itemInterfaces.erase(itr);
- break;
- }
- else
- {
- itr++;
- }
- }
- // 最后从Tool中删除此接口数据结构
- m_toolInfo->delInterfaceByName(inf.strName);
- }
- // 本功能块重绘
- this->updatePosition();
- return true;
- }
|