Exemplo n.º 1
0
        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, "");
        }