using Serein.Library; using Serein.Library.Api; using Serein.Library.FlowNode; using Serein.Library.Utils; using Serein.NodeFlow.Services; using Serein.NodeFlow.Tool; using System.Reflection; namespace Serein.NodeFlow.Env { /// /// 流程运行环境 /// public class FlowEnvironment : IFlowEnvironment { public FlowEnvironment() { ISereinIOC sereinIOC = new SereinIOC(); sereinIOC.Reset(); sereinIOC.Register(()=> sereinIOC); // 注册IOC sereinIOC.Register(() => this); sereinIOC.Register(); sereinIOC.Register(); sereinIOC.Register(); sereinIOC.Register(); sereinIOC.Register(); sereinIOC.Register(); sereinIOC.Build(); this.IOC = sereinIOC; // 默认使用本地环境 currentFlowEnvironment = sereinIOC.Get(); currentFlowEnvironmentEvent = sereinIOC.Get(); SereinEnv.SetEnv(currentFlowEnvironment); } /* /// /// 本地环境 /// private readonly LocalFlowEnvironment flowEnvironment; /// /// 远程环境 /// private RemoteFlowEnvironment remoteFlowEnvironment;*/ /// /// 本地环境事件 /// private readonly IFlowEnvironmentEvent flowEnvironmentEvent; /// /// 远程环境事件 /// private IFlowEnvironmentEvent remoteFlowEnvironmentEvent; /// /// 管理当前环境 /// private IFlowEnvironment currentFlowEnvironment; /// /// 管理当前环境事件 /// private IFlowEnvironmentEvent currentFlowEnvironmentEvent; private int _loadingProjectFlag = 0; // 使用原子自增代替锁 /// /// 传入false时,将停止数据通知。传入true时, /// /// public void SetProjectLoadingFlag(bool value) { Interlocked.Exchange(ref _loadingProjectFlag, value ? 1 : 0); } /// /// 判断是否正在加载项目 /// /// public bool IsLoadingProject() { return Interlocked.CompareExchange(ref _loadingProjectFlag, 1, 1) == 1; } /// public IFlowEnvironment CurrentEnv { get => currentFlowEnvironment; } /// public UIContextOperation UIContextOperation => currentFlowEnvironment.UIContextOperation; /// public NodeMVVMService NodeMVVMManagement => currentFlowEnvironment.NodeMVVMManagement; /// public ISereinIOC IOC { get; set; } /// public IFlowEnvironmentEvent Event => currentFlowEnvironment.Event; /// public string EnvName => currentFlowEnvironment.EnvName; /// public string ProjectFileLocation => currentFlowEnvironment.EnvName; /// public bool IsGlobalInterrupt => currentFlowEnvironment.IsGlobalInterrupt; /// public bool IsControlRemoteEnv => currentFlowEnvironment.IsControlRemoteEnv; /// public InfoClass InfoClass { get => currentFlowEnvironment.InfoClass; set => currentFlowEnvironment.InfoClass = value; } /// public RunState FlowState { get => currentFlowEnvironment.FlowState; set => currentFlowEnvironment.FlowState = value; } /// public event LoadDllHandler DllLoad { add { currentFlowEnvironmentEvent.DllLoad += value; } remove { currentFlowEnvironmentEvent.DllLoad -= value; } } /// public event ProjectLoadedHandler ProjectLoaded { add { currentFlowEnvironmentEvent.ProjectLoaded += value; } remove { currentFlowEnvironmentEvent.ProjectLoaded -= value; } } /// public event ProjectSavingHandler? ProjectSaving { add { currentFlowEnvironmentEvent.ProjectSaving += value; } remove { currentFlowEnvironmentEvent.ProjectSaving -= value; } } /// public event NodeConnectChangeHandler NodeConnectChanged { add { currentFlowEnvironmentEvent.NodeConnectChanged += value; } remove { currentFlowEnvironmentEvent.NodeConnectChanged -= value; } } /// public event CanvasCreateHandler CanvasCreated { add { currentFlowEnvironmentEvent.CanvasCreated += value; } remove { currentFlowEnvironmentEvent.CanvasCreated -= value; } } /// public event CanvasRemoveHandler CanvasRemoved { add { currentFlowEnvironmentEvent.CanvasRemoved += value; } remove { currentFlowEnvironmentEvent.CanvasRemoved -= value; } } /// public event NodeCreateHandler NodeCreated { add { currentFlowEnvironmentEvent.NodeCreated += value; } remove { currentFlowEnvironmentEvent.NodeCreated -= value; } } /// public event NodeRemoveHandler NodeRemoved { add { currentFlowEnvironmentEvent.NodeRemoved += value; } remove { currentFlowEnvironmentEvent.NodeRemoved -= value; } } /// public event NodePlaceHandler NodePlace { add { currentFlowEnvironmentEvent.NodePlace += value; } remove { currentFlowEnvironmentEvent.NodePlace -= value; } } /// public event NodeTakeOutHandler NodeTakeOut { add { currentFlowEnvironmentEvent.NodeTakeOut += value; } remove { currentFlowEnvironmentEvent.NodeTakeOut -= value; } } /// public event StartNodeChangeHandler StartNodeChanged { add { currentFlowEnvironmentEvent.StartNodeChanged += value; } remove { currentFlowEnvironmentEvent.StartNodeChanged -= value; } } /// public event FlowRunCompleteHandler FlowRunComplete { add { currentFlowEnvironmentEvent.FlowRunComplete += value; } remove { currentFlowEnvironmentEvent.FlowRunComplete -= value; } } /// public event MonitorObjectChangeHandler MonitorObjectChanged { add { currentFlowEnvironmentEvent.MonitorObjectChanged += value; } remove { currentFlowEnvironmentEvent.MonitorObjectChanged -= value; } } /// public event NodeInterruptStateChangeHandler NodeInterruptStateChanged { add { currentFlowEnvironmentEvent.NodeInterruptStateChanged += value; } remove { currentFlowEnvironmentEvent.NodeInterruptStateChanged -= value; } } /// public event ExpInterruptTriggerHandler InterruptTriggered { add { currentFlowEnvironmentEvent.InterruptTriggered += value; } remove { currentFlowEnvironmentEvent.InterruptTriggered -= value; } } /// public event IOCMembersChangedHandler IOCMembersChanged { add { currentFlowEnvironmentEvent.IOCMembersChanged += value; } remove { currentFlowEnvironmentEvent.IOCMembersChanged -= value; } } /// public event NodeLocatedHandler NodeLocated { add { currentFlowEnvironmentEvent.NodeLocated += value; } remove { currentFlowEnvironmentEvent.NodeLocated -= value; } } /// public event EnvOutHandler EnvOutput { add { currentFlowEnvironmentEvent.EnvOutput += value; } remove { currentFlowEnvironmentEvent.EnvOutput -= value; } } /// public void ActivateFlipflopNode(string nodeGuid) { currentFlowEnvironment.ActivateFlipflopNode(nodeGuid); } /// public void CreateCanvas(string canvasName, int width, int height) { currentFlowEnvironment.CreateCanvas(canvasName, width, height); } /// public void RemoveCanvas(string canvasGuid) { currentFlowEnvironment.RemoveCanvas(canvasGuid); } /// public void ConnectInvokeNode(string canvasGuid, string fromNodeGuid, string toNodeGuid, JunctionType fromNodeJunctionType, JunctionType toNodeJunctionType, ConnectionInvokeType invokeType) { currentFlowEnvironment.ConnectInvokeNode(canvasGuid, fromNodeGuid, toNodeGuid, fromNodeJunctionType, toNodeJunctionType, invokeType); } /// public void ConnectArgSourceNode(string canvasGuid, string fromNodeGuid, string toNodeGuid, JunctionType fromNodeJunctionType, JunctionType toNodeJunctionType, ConnectionArgSourceType argSourceType, int argIndex) { currentFlowEnvironment.ConnectArgSourceNode(canvasGuid, fromNodeGuid, toNodeGuid, fromNodeJunctionType, toNodeJunctionType, argSourceType, argIndex); } /// public async Task<(bool, RemoteMsgUtil)> ConnectRemoteEnv(string addres, int port, string token) { // 连接成功,切换远程环境 (var isConnect, var remoteMsgUtil) = await currentFlowEnvironment.ConnectRemoteEnv(addres, port, token); if (isConnect) { /* remoteFlowEnvironment ??= new RemoteFlowEnvironment(remoteMsgUtil, this.Event, this.UIContextOperation); currentFlowEnvironment = remoteFlowEnvironment;*/ } return (isConnect, remoteMsgUtil); } /// public async Task LoadNodeInfosAsync(List nodeInfos) { SetProjectLoadingFlag(false); await currentFlowEnvironment.LoadNodeInfosAsync(nodeInfos); // 装饰器调用 SetProjectLoadingFlag(true); } /// public void CreateNode(string canvasGuid, NodeControlType nodeBase, PositionOfUI position, MethodDetailsInfo methodDetailsInfo = null) { SetProjectLoadingFlag(false); currentFlowEnvironment.CreateNode(canvasGuid, nodeBase, position, methodDetailsInfo); // 装饰器调用 SetProjectLoadingFlag(true); } /// public void PlaceNodeToContainer(string canvasGuid, string nodeGuid, string containerNodeGuid) { SetProjectLoadingFlag(false); currentFlowEnvironment.PlaceNodeToContainer(canvasGuid, nodeGuid, containerNodeGuid); // 装饰器调用 SetProjectLoadingFlag(true); } /// public void TakeOutNodeToContainer(string canvasGuid, string nodeGuid) { SetProjectLoadingFlag(false); currentFlowEnvironment.TakeOutNodeToContainer(canvasGuid,nodeGuid); // 装饰器调用 SetProjectLoadingFlag(true); } /// public async Task ExitFlowAsync() { return await currentFlowEnvironment.ExitFlowAsync(); } /// public void ExitRemoteEnv() { currentFlowEnvironment.ExitRemoteEnv(); } /// public async Task GetEnvInfoAsync() { return await currentFlowEnvironment.GetEnvInfoAsync(); } /// public async Task GetProjectInfoAsync() { return await currentFlowEnvironment.GetProjectInfoAsync(); } /// public void LoadLibrary(string dllPath) { currentFlowEnvironment.LoadLibrary(dllPath); } /// public void SaveProject() { currentFlowEnvironment.SaveProject(); } /// public void LoadProject(FlowEnvInfo flowEnvInfo, string filePath) { if (flowEnvInfo is null) return; SetProjectLoadingFlag(false); currentFlowEnvironment.LoadProject(flowEnvInfo, filePath); SetProjectLoadingFlag(true); } /// public void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType) { currentFlowEnvironment.MonitorObjectNotification(nodeGuid, monitorData, sourceType); } /*/// public void MoveNode(string canvasGuid, string nodeGuid, double x, double y) { currentFlowEnvironment.MoveNode(canvasGuid, nodeGuid, x, y); } */ /// public void NodeLocate(string nodeGuid) { currentFlowEnvironment.NodeLocate(nodeGuid); } /// public bool TryUnloadLibrary(string assemblyName) { return currentFlowEnvironment.TryUnloadLibrary(assemblyName); } /// public void SetConnectPriorityInvoke(string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType) { currentFlowEnvironment.SetConnectPriorityInvoke(fromNodeGuid, toNodeGuid, connectionType); } /// public void RemoveInvokeConnect(string canvasGuid, string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType) { currentFlowEnvironment.RemoveInvokeConnect(canvasGuid, fromNodeGuid, toNodeGuid, connectionType); } /// public void RemoveArgSourceConnect(string canvasGuid, string fromNodeGuid, string toNodeGuid, int argIndex) { currentFlowEnvironment.RemoveArgSourceConnect(canvasGuid, fromNodeGuid, toNodeGuid, argIndex); } /// public void RemoveNode(string canvasGuid, string nodeGuid) { currentFlowEnvironment.RemoveNode(canvasGuid, nodeGuid); } /// /// 输出信息 /// /// 日志内容 /// 日志类别 /// 日志级别 public void WriteLine(InfoType type, string message, InfoClass @class = InfoClass.Trivial) { currentFlowEnvironment.WriteLine(type, message, @class); } #region MyRegion #if false public async Task AddInterruptExpressionAsync(string key, string expression) { return await currentFlowEnvironment.AddInterruptExpressionAsync(key, expression); } public async Task<(bool, string[])> CheckObjMonitorStateAsync(string key) { return await currentFlowEnvironment.CheckObjMonitorStateAsync(key); } public async Task GetOrCreateGlobalInterruptAsync() { return await currentFlowEnvironment.InterruptNode(); } public void SetMonitorObjState(string key, bool isMonitor) { currentFlowEnvironment.SetMonitorObjState(key, isMonitor); } public async Task SetNodeInterruptAsync(string nodeGuid, bool isInterrupt) { return await currentFlowEnvironment.SetNodeInterruptAsync(nodeGuid, isInterrupt); } #endif #endregion /// public void SetStartNode(string canvasGuid, string nodeGuid) { currentFlowEnvironment.SetStartNode(canvasGuid, nodeGuid); } /// public async Task StartFlowAsync(string[] canvasGuids) { return await currentFlowEnvironment.StartFlowAsync(canvasGuids); } /// public async Task StartFlowFromSelectNodeAsync(string startNodeGuid) { return await currentFlowEnvironment.StartFlowFromSelectNodeAsync(startNodeGuid); } /// public async Task StartRemoteServerAsync(int port = 7525) { await currentFlowEnvironment.StartRemoteServerAsync(port); } /// public void StopRemoteServer() { currentFlowEnvironment.StopRemoteServer(); } /// public void TerminateFlipflopNode(string nodeGuid) { currentFlowEnvironment.TerminateFlipflopNode(nodeGuid); } /// public void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type) { currentFlowEnvironment.TriggerInterrupt(nodeGuid, expression, type); } /// public void SetUIContextOperation(UIContextOperation uiContextOperation) { if(uiContextOperation is null) { return; } IOC.Register(() => uiContextOperation).Build(); currentFlowEnvironment.SetUIContextOperation(uiContextOperation); } /// public void UseExternalIOC(ISereinIOC ioc) { currentFlowEnvironment.UseExternalIOC(ioc); } /// public bool TryGetNodeModel(string nodeGuid, out IFlowNode nodeModel) { return currentFlowEnvironment.TryGetNodeModel(nodeGuid, out nodeModel); } /// public bool TryGetDelegateDetails(string libraryName, string methodName, out DelegateDetails del) { return currentFlowEnvironment.TryGetDelegateDetails(libraryName, methodName, out del); } /// public bool TryGetMethodDetailsInfo(string libraryName, string methodName, out MethodDetailsInfo mdInfo) { return currentFlowEnvironment.TryGetMethodDetailsInfo(libraryName, methodName, out mdInfo); } /// public async Task NotificationNodeValueChangeAsync(string nodeGuid, string path, object value) { if (!IsLoadingProject()) { return; } if (currentFlowEnvironment.IsControlRemoteEnv) { await currentFlowEnvironment.NotificationNodeValueChangeAsync(nodeGuid, path, value); } } /// public void ChangeParameter(string nodeGuid, bool isAdd, int paramIndex) { currentFlowEnvironment.ChangeParameter(nodeGuid, isAdd, paramIndex); } #region 流程依赖类库的接口 /// public bool LoadNativeLibraryOfRuning(string file) { return currentFlowEnvironment.LoadNativeLibraryOfRuning(file); } /// public void LoadAllNativeLibraryOfRuning(string path, bool isRecurrence = true) { currentFlowEnvironment.LoadAllNativeLibraryOfRuning(path,isRecurrence); } #endregion } }