/// <summary> /// 执行if框 /// </summary> /// <param name="box"></param> /// <returns></returns> protected void DoIfFunction(ItemBox box, WriteStreamCallBack wrs, IScriptLayout ml) { ScriptInput si = new ScriptInput(); foreach (var item in box.InputDatas) { if (item.PIEnum != ParaItemEnum.INPUT) { si.SetValue(item.Name, GetValue(item as ParatItem)); } } //检测是否需要断点停止 checkScriptRunForStopPoint(box, si, null); if (Convert.ToBoolean(si.GetFirst())) { RunningFunction((box as ItemBox).Children[0], wrs, ml); } else { RunningFunction((box as ItemBox).Children[1], wrs, ml); } si.Dispose(); si = null; }
/// <summary> /// 运行脚本 /// </summary> /// <param name="m"></param> public override Task <bool> RunScript(IScriptLayout m) { if (scriptRunThread != null && scriptRunThread.IsCompleted == false) { return(null); } scriptRunThread = new Task <bool>((obj) => { IsRunning = true; IScriptLayout ml = obj as IScriptLayout; WriteStreamCallBack wrs = ml.ComipleMessageCall; try { isStop = false; //初始化flag isDebugMode = false; Init(ml); wrs?.Invoke("赋值属性完成,开始执行脚本"); foreach (var currentbox in ml.Itemboxs) { //RunningFunction(currentbox, wrs, ml); //ml.SetFunctionBoxRun(Colors.Red, currentbox); if (currentbox.BoxType == ItemBoxEnum.FUNCTION) { Dofunction(currentbox, wrs, ml); } else if (currentbox.BoxType == ItemBoxEnum.IF) { DoIfFunction(currentbox, wrs, ml); } else if (currentbox.BoxType == ItemBoxEnum.WHILE) { DoWhileFunction(currentbox, wrs, ml); } //ml.SetFunctionBoxStop(Colors.White, currentbox); } return(true); } catch (Exception ex) { wrs?.Invoke("脚本运行失败"); Log.ScriptLog.Log.Write(new LogMessage("脚本运行失败", ex)); return(false); } finally { manager.Clear(); wrs?.Invoke("程序运行结束"); IsRunning = false; } }, m); scriptRunThread.Start(); return(scriptRunThread); }
/// <summary> /// 执行准确的函数 /// </summary> /// <param name="box"></param> protected void Dofunction(ItemBox box, WriteStreamCallBack wrs, IScriptLayout ml) { if (isStop) { throw new Exception("主动停止了脚本!"); } ml.SetFunctionBoxRun(box); ScriptInput si = new ScriptInput(); foreach (var item in box.InputDatas) { if (item.PIEnum != ParaItemEnum.INPUT) { si.SetValue(item.Name, GetValue(item as ParatItem)); } } ScriptOutput so = RunScript(box, si); //ScriptOutput so = null; ////////////////////////////////////待修改 if (so != null) { if (so.LogMessage != null && so.LogMessage.Equals("") == false) { wrs?.Invoke(so.LogMessage); } foreach (var item in box.OutDatas) { if (item.PIEnum != ParaItemEnum.OUTPUT) { item.Value = so.GetValue(item.Name); SetValue(item as ParatItem); } } } //检测是否需要断点停止 checkScriptRunForStopPoint(box, si, null); if (so != null) { so.Dispose(); so = null; } si.Dispose(); si = null; ml.SetFunctionBoxStop(box); }
/// <summary> /// 选中执行的函数 /// </summary> /// <param name="box"></param> /// <param name="wrs"></param> /// <param name="ml"></param> protected void RunningFunction(IItemBox box, WriteStreamCallBack wrs, IScriptLayout ml) { foreach (var currentbox in (box as ItemBox).Children) { ml.SetFunctionBoxRun(currentbox); if (currentbox.BoxType == ItemBoxEnum.FUNCTION) { Dofunction(currentbox, wrs, ml); } else if (currentbox.BoxType == ItemBoxEnum.IF) { DoIfFunction(currentbox, wrs, ml); } else if (currentbox.BoxType == ItemBoxEnum.WHILE) { DoWhileFunction(currentbox, wrs, ml); } ml.SetFunctionBoxStop(currentbox); } }
/// <summary> /// 运行脚本 /// </summary> /// <param name="ml"></param> public static void RunScript(MainLayout ml, WriteStreamCallBack wrs, IList <IPropertyIt> propertys, WriteStreamCallBack runover = null) { ScriptObjectManager sm = new ScriptObjectManager(); if (propertys.Count > 0) { foreach (var item in propertys) { ScriptOutput so = new ScriptOutput(); so.SetValue(item.Name, item.Value); sm.SetValue(item.Id, so); } } try { IItemBox currentib = (ml.MainIb as LineItemBox).Next(0); IItemBox next = null; while (currentib != null) { ml.SetFunctionBoxRun(System.Windows.Media.Colors.Red, currentib); next = DoFunction(currentib as ItemBox, sm, wrs); ml.SetFunctionBoxStop(System.Windows.Media.Colors.White, currentib); currentib = next; } } catch (Exception ex) { wrs?.Invoke("脚本运行失败"); Log.Write(new LogMessage("脚本运行失败", ex)); } finally { sm.Dispose(); sm = null; runover?.Invoke("程序运行结束"); } }
/// <summary> /// 做循环 /// </summary> /// <param name="box"></param> /// <returns></returns> protected void DoWhileFunction(ItemBox box, WriteStreamCallBack wrs, IScriptLayout ml) { ItemBox sbox = box as ItemBox; if (box.InputDatas.Count == 1) { if (box.InputDatas[0].PIEnum == ParaItemEnum.BOOL) { ScriptInput si = GetFunctionInput(box); //检测是否需要断点停止 checkScriptRunForStopPoint(box, si, null); while (true) { if (Convert.ToBoolean(si.GetFirst())) { RunningFunction(box, wrs, ml); } else { return; } si.Dispose(); si = null; si = GetFunctionInput(box); } } else if (box.InputDatas[0].PIEnum == ParaItemEnum.DATETIME) { ScriptInput si = GetFunctionInput(box); //检测是否需要断点停止 checkScriptRunForStopPoint(box, si, null); while (true) { if (Convert.ToDateTime(si.GetFirst()) > DateTime.Now) { RunningFunction(box, wrs, ml); } else { return; } si.Dispose(); si = null; si = GetFunctionInput(box); } } } else { ScriptInput si = GetFunctionInput(box); while (true) { int idxs = Convert.ToInt32(si.GetFirst()); int idxe = Convert.ToInt32(si.GetSecond()); int boxidx = GetWhileBoxIdx(sbox, idxs); //if (box.IsHasBreakPoint) //{ // ScriptOutput so = new ScriptOutput(); // so.SetValue("Idx", boxidx); // ScriptBreakPoint?.Invoke(box, si, so); //} //检测是否需要断点停止 checkScriptRunForStopPoint(box, si, null); if (boxidx > idxe) { return; } else { RunningFunction(box, wrs, ml); } si.Dispose(); si = null; si = GetFunctionInput(box); } } }
/// <summary> /// 设置值 /// </summary> /// <param name="ib"></param> /// <param name="sm"></param> /// <returns></returns> protected static IItemBox DoFunction(ItemBox itembox, ScriptObjectManager sm, WriteStreamCallBack wrs) { LineItemBox ib = itembox as LineItemBox; if (ib.BoxType == ItemBoxEnum.IF) { ScriptInput si = new ScriptInput(); //si.WriteStream += wrs; foreach (var item in ib.InputDatas) { if (item.PIEnum != ParaItemEnum.OUTPUT && item.PIEnum != ParaItemEnum.INPUT && item.PIEnum != ParaItemEnum.NULL) { si.SetValue(item.Name, getValue(item as ParatItem, sm)); } } if (Convert.ToBoolean(si.GetFirst())) { return(ib.Next(0)); } else { return(ib.Next(1)); } } else if (ib.BoxType == ItemBoxEnum.SET) { ScriptOutput so = new ScriptOutput(); so.SetValue(ib.InputDatas[1].Name, getValue(ib.InputDatas[1] as ParatItem, sm)); //so.SetValue(ib.InputDatas[1].Name, ib.InputDatas[1].Value); sm.SetValue(ib.Id, so); return(ib.Next(0)); } else { ScriptInput si = new ScriptInput(); si.WriteStream += wrs; foreach (var item in ib.InputDatas) { if (item.PIEnum != ParaItemEnum.OUTPUT && item.PIEnum != ParaItemEnum.INPUT && item.PIEnum != ParaItemEnum.NULL) { si.SetValue(item.Name, getValue(item as ParatItem, sm)); } } ScriptOutput so = (ib as ItemBox).DoScriptFunction(si); if (so != null) { sm.SetValue(ib.Id, so); } return(ib.Next(0)); } }