/// <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="filename"></param> /// <returns></returns> public static IScriptLayout LoadOne(string filename) { string exname = filename.Split('.').Last(); IScriptLayout script = null; foreach (var item in exName) { if (item.Value == exname) { //if(item.Key == typeof(MainLayout).Name) //{ // script = new MainLayout(); //} if (item.Key == typeof(StackingMainLayout).Name) { //script = new StackingMainLayout(); } } } if (script == null) { return(null); } script.LoadFromJson(filename); return(script); }
/// <summary> /// 加载 /// </summary> /// <param name="slnpath">项目文件路径</param> public static IList <IScriptLayout> Load(string slnpath) { string json = ""; using (FileStream fs = File.Open(slnpath, FileMode.Open)) { byte[] datas = new byte[fs.Length]; fs.Read(datas, 0, datas.Length); json = System.Text.Encoding.UTF8.GetString(datas); datas = null; } JObject jobj = (JObject)JsonConvert.DeserializeObject(json); JToken scriptpaths = jobj[Scripts]; string directory = Path.GetDirectoryName(slnpath); IList <IScriptLayout> scripts = new List <IScriptLayout>(); foreach (var item in scriptpaths) { IScriptLayout script = ScriptHelp.LoadOne(Path.Combine(directory, item.ToString())); if (script != null) { scripts.Add(script); } } return(scripts); }
/// <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="scriptLayout"></param> /// <param name="itembox"></param> public void IItemBoxSelected(IScriptLayout scriptLayout, IItemBox itembox) { ItemboxParamterCom itemboxParamterCom = new ItemboxParamterCom() { ScriptLayout = scriptLayout, ItemBox = itembox }; FunctionParaItemList.DataContext = itemboxParamterCom; //FunctionParaItemList.DataContext = itembox; }
/// <summary> /// 添加一个脚本 /// </summary> /// <param name="script"></param> public StackingMainLayout AddScript() { IScriptLayout script = new IScriptLayout(); script.ScriptName = GetScriptName(); StackingMainLayout stackingMainLayout = StackingMainLayout.InstanceStackingMainLayout(script); Scripts.Add(stackingMainLayout); ItemAddEvent?.Invoke(stackingMainLayout); return(stackingMainLayout); }
/// <summary> /// 初始化 /// </summary> protected override void Init(IScriptLayout ml) { if (ml.IPropertys.Count > 0) { foreach (var item in ml.IPropertys) { ScriptOutput so = new ScriptOutput(); so.SetValue(item.Name, item.Value); manager.SetValue(item.Id, so); } } }
/// <summary> /// 拖拽事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TaskItem_Drop(object sender, DragEventArgs e) { if (tasks.SelectedItem == null) { return; } IScriptLayout scriptLayout = e.Data.GetData(typeof(IScriptLayout)) as IScriptLayout; (tasks.SelectedItem as ScriptTask).TaskItems.Add(new TaskItem() { ScriptLayout = scriptLayout , Times = 0, }); }
/// <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="sender"></param> /// <param name="e"></param> private void Load_Click(object sender, RoutedEventArgs e) { System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog(); openFileDialog.Filter = "脚本项目文件 (*.sProject)|*.sProject"; if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { ScriptConfig = JsonConvert.DeserializeObject <ScriptConfig>(openFileDialog.FileName.GetStringFromFile()); string path = System.IO.Path.GetDirectoryName(openFileDialog.FileName); foreach (var item in ScriptConfig.ScriptFiles) { IScriptLayout scriptLayout = new IScriptLayout(); scriptLayout.LoadFromJson(System.IO.Path.Combine(path, item + ".script")); scriptContent.ScriptControl.AddScript(StackingMainLayout.InstanceStackingMainLayout(scriptLayout)); } } }
/// <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="sender"></param> /// <param name="e"></param> private void Load_Script(object sender, RoutedEventArgs e) { System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog(); openFileDialog.Filter = "脚本项目文件 (*.sProject)|*.sProject"; if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { ScriptConfig = JsonConvert.DeserializeObject <ScriptConfig>(openFileDialog.FileName.GetStringFromFile()); string path = System.IO.Path.GetDirectoryName(openFileDialog.FileName); projectPath = System.IO.Path.GetDirectoryName(openFileDialog.FileName); foreach (var item in ScriptConfig.ScriptFiles) { IScriptLayout scriptLayout = new IScriptLayout(); scriptLayout.LoadFromJson(System.IO.Path.Combine(path, item + ".script")); scriptLayout.ComipleMessageCall += logBox.WritLog; ScriptLayouts.Add(scriptLayout); } //加载任务 if (System.IO.File.Exists(System.IO.Path.Combine(projectPath, "projectTask.task"))) { ObservableCollection <ScriptTask> scriptTasks = Newtonsoft.Json.JsonConvert. DeserializeObject <ObservableCollection <ScriptTask> >(System.IO.Path.Combine(projectPath, "projectTask.task") .GetStringFromFile()); foreach (var listitem in scriptTasks) { foreach (var item in listitem.TaskItems) { IScriptLayout script = ScriptLayouts.FindOne(p => p.ScriptName == item.ScriptName); if (script != null) { item.ScriptLayout = script; } } TaskItems.Add(listitem); } scriptTasks.Clear(); scriptTasks = null; } } }
/// <summary> /// 构造函数 /// </summary> public ScriptIntegrationForOne() { InitializeComponent(); this.Loaded += ScriptIntegrationForOne_Loaded; TreeView = FunctionDataList.FunctionView; PropertyItControl.ControlKey = "全局变量"; FunctionParaItemList.ControlKey = "函数的参数列表"; ScriptControl.ControlKey = "脚本列表"; LogBox.ControlKey = "输出"; TreeView.ControlKey = "代码工具箱"; ScriptDebugWindow.ControlKey = "监视窗口"; Controls.Add("全局变量"); Controls.Add("函数的参数列表"); Controls.Add("脚本列表"); Controls.Add("输出"); Controls.Add("代码工具箱"); Controls.Add("监视窗口"); mainContent.AddUserControl("全局变量", PropertyItControl, Layout.LeftUp, "全局变量"); mainContent.AddUserControl("函数的参数列表", FunctionParaItemList, Layout.LeftDown, "函数的参数列表"); mainContent.AddUserControl("脚本列表", ScriptControl, Layout.Right, "脚本列表"); mainContent.AddUserControl("代码工具箱", TreeView, Layout.Buttom, "代码工具箱"); mainContent.AddUserControl("输出", LogBox, Layout.Buttom, "输出"); mainContent.AddUserControl("监视窗口", ScriptDebugWindow, Layout.Right, "监视窗口"); AllFunctionData.Add(IScriptLayout.AddSystemBox()); TreeView.MyData = AllFunctionData; TreeView.CreateCallback += TreeView_CreateCallback; //AllFunctionData.Add(IScriptLayout.AddSystemBox()); //AllFunctionData.Add(IScriptLayout.AddToolsFunction()); ScriptControl.ItemMouseDoubleClickEvent += ScriptControl_ItemMouseDoubleClickEvent; ScriptControl.ItemAddEvent += ScriptControl_ItemAddEvent; ScriptControl.ItemRemoveEvent += ScriptControl_ItemRemoveEvent; ScriptControl.ItemScriptNameChanged += ScriptControl_ItemScriptNameChanged; //ScriptControl.AddScript(new StackingMainLayout() { ScriptName = "测试脚本" }); }
/// <summary> /// 停止运行当前激活的脚本 /// </summary> public void StopActiveScript() { IScriptLayout script = (mainContent.GetActiveDocument() as StackingMainLayout).ScriptLayout; script.StopRun(); }
/// <summary> /// 保存到文件 /// </summary> /// <param name="script"></param> /// <param name="directory"></param> public static void SaveOne(IScriptLayout script, string directory) { string path = directory + "//" + script.ScriptName + "." + exName[script.GetType().Name]; script.SaveToJson(path); }
/// <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> public void RestFunctionData() { AllFunctionData.Clear(); AllFunctionData.Add(IScriptLayout.AddSystemBox()); }
/// <summary> /// 运行当前激活的脚本 /// </summary> public void RunActiveScript() { IScriptLayout script = (mainContent.GetActiveDocument() as StackingMainLayout).ScriptLayout; script.RunCompile(); }
/// <summary> /// 获取当前激活中的脚本 /// </summary> /// <returns></returns> public IScriptLayout GetActiveScript() { IScriptLayout script = mainContent.GetActiveDocument() as IScriptLayout; return(script); }