public (ActionProgram.ActionProgram actionProgram, ProgramBuildingState finalState, IReadOnlyDictionary <IAction, (int procedure, int line)> actionLines, string errorMessage) BuildProgram(CNCState.CNCState initialMachineState, ProgramBuildingState builderState) { var program = new ActionProgram.ActionProgram(rtSender, modbusSender, config, machine, toolManager); var actionLines = new Dictionary <IAction, (int, int)>(); var state = builder.BeginProgram(program, initialMachineState); actionLines[program.Actions[0].action] = (-1, -1); Sequence sequence = builderState.Source.Procedures[builderState.CurrentProcedure]; state = builder.ProcessDrillingMove(null, null, -1, 10, 10, program, state); bool finish = false; builderState.Completed = false; while (!finish) { bool stop; if (builderState.CurrentLine >= sequence.Lines.Count) { break; } Logger.Instance.Debug(this, "build", string.Format("processing line {0}", builderState.CurrentLine)); Arguments frame = sequence.Lines[builderState.CurrentLine]; try { var len0 = program.Actions.Count; (state, stop) = Process(frame, program, state); var len1 = program.Actions.Count; if (len1 > len0) { Logger.Instance.Debug(this, "build", "has actions"); var first = program.Actions[len0].action; actionLines[first] = (builderState.CurrentProcedure, builderState.CurrentLine); } else { Logger.Instance.Debug(this, "build", "Doesn't have actions"); } } catch (Exception e) { var msg = String.Format("{0} : {1}", frame, e.ToString()); Logger.Instance.Error(this, "compile error", msg); return(null, null, new Dictionary <IAction, (int, int)>(), e.Message); } var currentPos = state.AxisState.Params.CurrentCoordinateSystem.ToLocal(state.AxisState.TargetPosition); state.VarsState.Vars["x"] = currentPos.x; state.VarsState.Vars["y"] = currentPos.y; state.VarsState.Vars["z"] = currentPos.z; builderState.CurrentLine += 1; if (stop) { break; } } if (builderState.CurrentLine >= sequence.Lines.Count) { builderState.Completed = true; } state = builder.FinishProgram(program, state); return(program, builderState, actionLines, ""); }