logplus/ModuleConsole/include/WorkflowPluginControl.h
2026-01-16 17:18:41 +08:00

533 lines
16 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file WorkflowPluginControl.h
* @brief 工作流界面的控制器,封装了新建,保存,提交,导入工作流的功能以及一些界面的控制流转激活关闭等功能
* @note 该文件是从WorkflowPlugin中提取出来的如果查看之前的历史请查看WorkflowPlugin.h
* @date 3014-08-05
*/
#ifndef PAI_FRAME_WORKFLOWVIEW_WORKFLOWPLUGINCONTROL_H
#define PAI_FRAME_WORKFLOWVIEW_WORKFLOWPLUGINCONTROL_H
#include <QObject>
#include <QUuid>
#include <QPair>
#include "ControlExtension.h"
#include "PaiMessageBox.h"
#include "RunTimeContext.h"
#include "WellLogWorkflowRunner.h"
#include "ModuleInformation.h"
// #include "VecWindow.h"
class QAction;
class QUndoGroup;
namespace pai
{
class CPaiWorkflowTemplateTree;
class PaiCheckJobOutputThread;
namespace objectmodel
{
class PaiObject;
class PaiSurvey;
class PaiWorkflowDataModel;
}
namespace graphics2d
{
class WorkflowWidget;
}
namespace gui
{
class PaiAction;
}
}
/**
* @enum HandleEnvironmentType
* @brief 处理环境时的类型
*/
enum HandleEnvironmentType
{
HandleEnvironment_BeforeUnselect = 0,
HandleEnvironment_AfterSelect = 1
};
/**
* @enum ImportType
* @brief 标记导入类型
*/
enum ImportType
{
WORKFLOW_TYPE = 0, // 导入工作流
TEMPLATE_TYPE = 1 // 导入模板
};
/**
* @enum ImportErrorType
* @brief 标记导入错误类型
*/
enum ImportErrorType
{
ImportErrorType_STYLE = 0, // style文件
ImportErrorType_DELETE = 1, // 同名删除错误
ImportErrorType_REMOVE = 2, // 同名树节点删除错误
ImportErrorType_PARSE = 3, // 解析错误
ImportErrorType_IMPORT = 4 // 导入错误
};
namespace pai
{
/**
* @class WorkflowPluginControl
* @brief 工作流界面的控制器,封装了新建,保存,提交,导入工作流的功能以及一些界面的控制流转激活关闭等功能
*/
class PAI_WORKFLOWVIEW_EXPORT WorkflowPluginControl : public QObject, public ControlExtension
{
Q_OBJECT
public:
/**
* @brief 构造函数
*/
WorkflowPluginControl(const QUuid& viewID, QObject* pParent = NULL);
/**
* @brief 析构函数
*/
virtual ~WorkflowPluginControl();
/**
* @brief 为树上选中的某对象添加菜单行为
* @param contextObjs 树上选中的对象
* @param[out] lstMenuActions 结果菜单数组
*/
bool BuildTreeMenuActionsForObject(QList< pai::objectmodel::PaiObject* > & contextObjs,
QList< pai::gui::PaiAction* >& lstMenuActions);
/**
* @brief 导入一系列的json格式的工作流定义文件到指定的对象下
* @param targetParentID 指定的对象ID
* @param lstJsonFilePaths 一系列的json格式的工作流定义文件
*/
void ImportWorkflows(const QUuid& targetParentID, const QStringList& lstJsonFilePaths, ImportType type = WORKFLOW_TYPE);
/**
* @brief 提交已经保存完的Workflow
*/
void SubmitWorkflow();
/**
* @brief 更新Workflow 名称为用户自定义名称
* @param[in] strName 用户定义名称
*/
void RenameWorkflow(QString /*strName*/);
/**
* @brief 处理当前工作环境
* @param type 处理环境时的类型在select之后还是unselect之前。
*/
void HandleCurrentWorkEnvironment(HandleEnvironmentType type);
/**
* @brief 得到当前激活的正在编辑的工作流页面视图
*/
// pai::graphics2d::WorkflowWidget* GetActiveWorkflowView();
/**
* 得到视图的ID
*/
QUuid GetViewID() const;
/**
* @brief 得到UndoAction
*/
QAction* GetUndoAction();
/**
* @brief 得到RedoAction
*/
QAction* GetRedoAction();
/**
* @brief 得到UndoGroup
*/
QUndoGroup* GetUndoGroup();
/**
*@brief 设置模板树
*/
void SetActiveTemplate(pai::CPaiWorkflowTemplateTree *pTemplateTree);
/**
* @brief get template tree.
*/
pai::CPaiWorkflowTemplateTree * GetTemplateTree();
/**
* @brief 根据输入参数即工作流对象更新save相关action的状态
* @param[in] updateOrClose 为true根据pObj更新savesaveall状态为false则由于有关闭操作更新saveall状态
* @param[in] pObj工作流对象指针
*/
void UpdateSaveActions(bool updateOrClose, pai::objectmodel::PaiObject* pObj);
/**
* @brief 打开选中或者拖拽的工作流
* @param[in] 工作流的dbid
*/
void OpenWorkflowView(long long dbid);
public slots:
/**
* @brief 在右键发起节点所在的工区新建工作流
*/
void slotNewWorkflow();
/**
* @brief 打开浏览对话框,在用户选择的节点所在工区新建工作流
*/
void NewWorkflowByBrowse();
/**
* @brief 得到提交作业失败后的信息
*/
void ShowMsg(QString strMsg);
/**
* @brief 执行测井算法模块
*/
void SlotRunWelllogModule();
void SlotRunWelllogModule(float sdep,float edep);
/**
* @brief 将步骤下的所有工作流以json文件格式批量导出到指定目录
*/
void slotExportWorkflows(ImportType type = WORKFLOW_TYPE);
/**
* @brief 当前编辑的工作流另存为模板
*/
void slotSaveAsTemplate();
private slots:
/**
* @brief 预提交Workflow启动作业输出路径同名检查线程
*/
void slotPreSubmitWorkflow();
/**
* @brief 让用户输入作业名称并提交已经保存完的Workflow
*/
void slotSubmitWorkflow(pai::objectmodel::PaiWorkflowDataModel* workflow, const QString& jobName);
/**
* @brief 保存当前编辑的工作流
*/
void slotSaveWorkflow();
/**
* @brief 当前编辑的工作流另存为
*/
void slotSaveAsWorkflow();
/**
* @brief 保存所有打开的工作流
*/
void slotSaveAllWorkflows();
/**
* @brief 从json文件导入工作流
*/
void slotImportWorkflows(ImportType type = WORKFLOW_TYPE);
/**
* @brief 关闭tabWidget的时候如果tabWidget的个数是0关闭工作流编辑界面
*/
void slotCloseWorkflowPlugin(QString strAreaName); //syr
/**
* 激活参数编辑面板
* @param[in] pInfo 参数对应的module.
* @param[in] IsModuleReadOnly 模块是否来自只读场景
*/
void slotActivateParameterEditor(pai::workflow::CModuleInformation* pInfo, bool IsModuleReadOnly);
/**
* 切换参数编辑面板内容
*/
void slotActiveParameter();
/**
* @brief 当当前模块为空时将B1区切换到模块树为当前激活页签
* @param[in] pCurrentModule 当前模块句柄
* @param[in] IsModuleReadOnly 模块是否来自只读场景
*/
void slotActivateModuleTree(pai::workflow::CModuleInformation* pCurrentModule, bool IsModuleReadOnly = false);
/**
* @brief 关闭插件的tab页时判断是否为本插件如果是则提示未保存的工作流页面保存。
* @param strPageID 插件页面的ID
*/
void slotOnClosePluginTabPage(const QString& strPageID);
/**
* @brief 响应用户点击下方工作流标签的关闭按钮,提示用户是否需要保存该页面的工作流
* @param strExtensionID 页面的ID
*
*/
void slotCloseWorkflowWidget(const QString& strExtensionID);
/**
* @brief 响应作业提交成功,在状态栏上给出提示
* @param strNewJobName[in] 作业提交成功后的作业名称
*/
void slotOnJobSubmitFinished(pai::objectmodel::PaiWorkflowDataModel* pWorkflowObject, const QString& strNewJobName);
/**
* @brief 响应作业数据上树事件,将作业新生成的数据展现出来并用提示气泡加以指示,当前该函数仅仅用来临时解决defect12215
* @param pJob 发生变化的对象
* @param strPropertyName 属性名字
* @param varNewPropertyValue 变化后的属性值这里是作业生成数据的DB ID。
*/
void slotOnJobDataGenerated(pai::objectmodel::PaiObject* pJob,
const QString& strPropertyName,
const QVariant& varJobOutputDataID);
/**
* @brief 响应对Untitile工作流的重命名修改相应页签的名字
* @param pObj 发生变化的对象
* @param strPropertyName 属性名字
* @param varNewPropertyValue 变化后的属性值
*/
void slotOnWorkflowPropertyChanged(pai::objectmodel::PaiObject* pObj,
const QString& strPropertyName,
const QVariant& strNewPropertyValue);
// /**
// * @brief 将步骤下的所有工作流以json文件格式批量导出到指定目录
// */
// void slotExportWorkflows(ImportType type = WORKFLOW_TYPE);
/**
* @brief 删除工作流文件
*/
void slotDeleteItem();
/**
* @brief 编辑工作流文件
*/
void slotEditItem();
/**
* @brief 响应用户当前workflow页签切换的消息通知数据树选中对应的Worflow对象
* @param strExtensionID 当前workflow页签所携带的视图扩展ID,也就是Worflow对象的ID
*/
void slotOnActiveCurrentWorkflow(const QString& strExtensionID);
/**
* @brief 刷新属性窗口
*/
void slotRefreshProperties(const QUuid & id);
/**
* @brief 把工作流保存成图片文件
*/
void slotSaveWorkflowAsImageFile();
/**
* @brief 粘贴
*/
void slotPasteItems();
/**
* @brief 剪切
*/
void slotCutItems();
/**
* @brief 复制
*/
void slotCopyItems();
/**
* @brief 响应数据对象刷新成功消息
* @param[in] pJob 被刷新的对象
*/
void slotOnWorkflowRefreshed(pai::objectmodel::PaiObject* pObj);
public :
/**
* @brief 显示工作流执行结果
*/
void DisplayCaculatedCurveOnWellSectionWindow(Qt::CheckState checkstate = Qt::Checked);
CWellLogWorkflowRunner * GetWorkflowRunner(){return m_pWellLogWorkflowRunner;};
/**
* @brief 对待显示的输入输出曲线应用模版
*/
// void ApplyTemplate(CVecWindow * pWindow);
private:
/**
* @brief 将输入输出曲线上树
* @param[in] 待上树的曲线
*/
void AddCurvesToDataTree(CObjWellLog * pWelllogCurve);
/**
* @brief 删除文件
* @param[in] filePath 被删除文件的绝对路径
* @return true删除成功反之失败
*/
bool DeleteFile(const QString& filePath);
/**
* @brief 导入一个工作流到数据树
* @param[in] JsonFilePath 被导入的工作流文件
* @param[in] pWorkflowMaster 数据对象指针
* @param[in] importErrorList 导入失败时的错误信息
* @param[in] resultButton 同名工作流对话框,用户点击的按钮
* @param[in] strNames 工作流或模板名称链表
* @param[in] type 导入类型,工作流或者模板
* @param[in] outPutFile 工作流所在工区的路径名称,为空表示模板
* */
bool ImportWorkflow(const QString& JsonFilePath,
pai::objectmodel::PaiObject *pWorkflowMaster,
QList < QPair< int, QString > > &importErrorList,
pai::gui::PaiMessageBox::StandardButton &resultButton,
QStringList &strNames,
ImportType type,
QString outPutFile = QString());
/**
* @brief 更新被打开的某工作流
* @param[in] workflowdbid 工作流数据库id
* @param[in] pWorkflow workflowdbid对应最新工作流
*/
void UpdateOpenedWorkflow(pai::objectmodel::PaiWorkflowDataModel* pWorkflow, long long workflowdbid);
/**
* @brief 检查工作流是否存在当前版本已经不存在的模块
* @param[in] pWorkflow 工作流
* @param[in] versionMsg 版本信息
* @return true,老版本;反之不是
*/
bool HasUnsupportedModule(pai::objectmodel::PaiWorkflowDataModel* pWorkflow, QString &versionMsg);
/**
* @brief 在某工区下的工作流节点下创建工作流
* @param[in] pSur 工区对象指针
*/
void NewWorkflow(pai::objectmodel::PaiObject *pSur);
/**
* @brief获得去除后缀以后的工作流名称目前工作流文件后缀为.wfl
* @param[in] workflowFileName 带后缀的工作流文件名称(可以是全路径的)
* @param[in] suffix 后缀名(例如.wfl)
* @return 去掉后缀的工作流名
*/
QString GetWorkflowBaseName(const QString &workflowFileName, const QString &suffix);
/**
* @brief 保存被导出工作流或者工作流模板
* @param[in] workflowList将被导出工作流或者工作流模板
*/
void SaveExportedWorkflows(QList<pai::objectmodel::PaiObject*> &workflowList);
/**
* @brief 打开导出工作流或者工作流模板对话框
* @param[out] targetPath 导出工作流的目标路径
* @param[in] type 工作流模板或者工作流
*/
void OpenExportWorkflowsDialog(QString &targetPath, ImportType type);
/**
* @brief 检查目标路径下是否已经存在当前被导出的工作流并作出相应的处理
* @param[in] workflowList将被导出工作流或者工作流模板
* @param[in] targetPath 导出工作流的目标路径
*/
void CheckExportedWorkflows(QList<pai::objectmodel::PaiObject*> &workflowList, const QString &targetPath);
/**
* @brief 创建临时文件夹
* @param[in] tempPath 临时文件夹绝对路径
*/
void CreateTempDir(const QString &tempPath);
/**
* @brief 删除临时文件夹
* @param[in] tempPath 临时文件夹绝对路径
*/
void DeleteTempDir(const QString &tempPath);
/**
*@brief 获取当前活动的工作流
*@return PaiWorkflowDataModel* 活动工作流对象指针
*/
pai::objectmodel::PaiWorkflowDataModel* GetActiveWorkflow();
/**
* @brief 导入工作流或者模板
*/
void Import(pai::gui::PaiAction *pSender, ImportType type);
/**
* @brief解析错误
*/
void ParseError(QList< QPair< int, QString > > &importErrorLst, ImportType type);
/**
* @brief处理导入个*.wfl文件
* @param[in] lstJsonFilePaths被导入的文件的链表
* @param[in] pWorkflowMaster数据对象指针
* @param[in] strNames工作流或模板名称链表
* @param[in] type导入类型工作流或者模板
* @param[in] outPutFile工作流所在工区的路径名称为空表示模板
*/
void HandleImportedFiles(const QStringList& lstJsonFilePaths,
pai::objectmodel::PaiObject *pWorkflowMaster,
QStringList &strNames,
ImportType type,
QString outPutFile = QString());
/**
* 基类IExtension的接口必须实现
*/
virtual std::string GetStringID() const;
/**
* 得到参数编辑面板的句柄
*/
QWidget* GetParameterEditor() const;
/**
* @brief 关闭指定工作流时的核心逻辑,本函数只能用在一个槽函数内部
* @param pWorkflowObject 指定的工作流对象
* @param pSender 槽函数的信号发送者的句柄该变量用于Cancel逻辑
* @param[out] 返回false表示取消了操作返回true对应yes和no。
*/
bool CloseWorkflow(pai::objectmodel::PaiWorkflowDataModel* pWorkflowObject, QObject* pSender);
/**
* @brief 打开作业命名对话框
* @param strJobName 对话框默认的作业名,和用户输入的返回给调用函数的作业名
* @param strLabelText 对话框显示的文本信息
*/
bool OpenNameJobDialog(QString& strJobName, QString strLabelText);
/**
* @brief 获取所有被打开的工作流
* @return 被打开工作流链表
*/
QList<pai::objectmodel::PaiWorkflowDataModel*> GetOpenedWorkflows();
//计算完成后,刷新图形区域
// void RefreshMapArea(CVecWindow * pWindow);
private:
QUuid m_ViewID; // 插件ID
QUndoGroup* m_pUndoGroup; // 命令栈组
QAction* m_pUndoAction; // 撤销action
QAction* m_pRedoAction; // 重做action
pai::CPaiWorkflowTemplateTree *m_pTemplateTree; // 模板树
pai::PaiCheckJobOutputThread *m_pCheckJobOutputThread;
CWellLogWorkflowRunner * m_pWellLogWorkflowRunner;
};
}
#endif