//Компиляция проекта, возвращает количество ошибок компиляции public string CompileProject() { //OnlyOn = true; CountsToZero(); if (State == State.Project || State == State.Empty)//Если не загружены, то загружаем сигналы { string s = LoadSignals(); if (s != "") { return(s); } } else { foreach (var sig in SignalsList) { sig.InUse = false; sig.InUseSource = false; sig.InUseReceiver = false; } } StartAtom(Atom.CompileProject); if (State == State.Closed) { AddError("Копилятор уже был закрыт"); } else { try { //Обнуления поля Expr и т.п. using (var daodb = new DaoDb(_projectFile)) { //daodb.Execute("UPDATE CalcParams SET CalcParams.Expr = Null, CalcParams.ErrMess = Null, CalcParams.UsedUnits = Null, CalcParams.CalcNumber = 0;"); foreach (string tab in new[] { "CalcParams", "CalcSubParams" }) { using (var rec = new RecDao(daodb, tab)) while (rec.Read()) { rec.Put("Expr", (string)null); try { rec.Put("UsedUnits", (string)null); } catch { } rec.Put("CalcNumber", 0); rec.Put("ErrMess", (string)null); rec.Update(); } } CalcParams.Clear(); CalcParamsId.Clear(); CalcParamsAll.Clear(); Grafics.Clear(); ArchiveParams.Clear(); Prevs.Clear(); HandSignals.Clear(); CalcParamNumber = 0; Procent = 10; AddEvent("Загрузка графиков"); using (var rec = new RecDao(daodb, "SELECT GraficsList.Code, GraficsList.Dimension FROM GraficsList")) while (rec.Read()) { var gr = new Grafic(rec.GetString("Code"), rec.GetInt("Dimension")); Grafics.Add(gr.Code, gr); } Procent = 15; AddEvent("Загрузка параметров"); string spar = OnlyOn ? "WHERE (CalcOn = True) And (TaskOn = True)" : ""; using (var rec = new RecDao(daodb, "SELECT CalcParams.* FROM CalcParams " + spar + " ORDER BY CalcParamId")) while (rec.Read()) { new CalcParam(rec, this); } Procent = 25; AddEvent("Загрузка подпараметров"); string ssub = OnlyOn ? "WHERE (CalcParams.CalcOn = True) And (CalcParams.TaskOn = True) And (CalcSubParams.CalcOn = True)" : ""; using (var rec = new RecDao(daodb, "SELECT CalcSubParams.* FROM CalcParams INNER JOIN CalcSubParams ON CalcParams.CalcParamId = CalcSubParams.OwnerId " + ssub)) while (rec.Read()) { new CalcParam(rec, this, true); } Procent = 35; AddEvent("Разбор выражений"); foreach (var cp in CalcParamsId.Values) { cp.Parse(); } IsPrevAbs = false; IsLastBase = false; IsLastHour = false; IsLastDay = false; IsManyBase = false; IsManyHour = false; IsManyDay = false; IsManyMoments = false; Procent = 45; AddEvent("Компиляция выражений"); foreach (var cp in CalcParamsId.Values) { if (cp.Stage == CompileStage.NotStarted) { cp.Compile(null); } /*foreach (var d in cp.MethodsId.Values) * if (d.Stage == CompileStage.NotStarted) * d.Compile(null);*/ } FindCycleLinks(); ErrorsCount = 0; UsedProviders = new SetS(); IsAbsolute = false; IsPeriodic = false; IsMoments = false; Procent = 60; AddEvent("Сохранение результатов компиляции параметров"); using (var rec = new RecDao(daodb, "SELECT CalcParams.* FROM CalcParams " + spar + " ORDER BY CalcParamId")) SaveCompile(rec, false); Procent = 70; AddEvent("Сохранение результатов компиляции подпараметров"); using (var rec = new RecDao(daodb, "SELECT CalcSubParams.* FROM CalcParams INNER JOIN CalcSubParams ON CalcParams.CalcParamId = CalcSubParams.OwnerId " + ssub + " ORDER BY CalcParams.CalcParamId;")) SaveCompile(rec, true); } Procent = 80; AddEvent("Сохранение списка используемых сигналов и графиков"); SaveInUse(); Procent = 90; AddEvent("Сохранение архивных параметров"); SaveArchive(); Procent = 96; AddEvent("Сохранение параметров функций Пред"); SavePrevs(); Procent = 99; SaveUsedProviders(); using (var sys = new SysTabl(_projectFile)) { sys.PutSubValue("CompileStatus", "LastTimeCompile", DateTime.Now.ToString()); sys.PutSubValue("CompileStatus", "ErrorsCount", ErrorsCount.ToString()); } } catch (Exception ex) { AddError("Ошибка компилятора", ex); } } return(FinishAtom(State.Compiled, State.Signals, "Проект: " + _code + "; Ошибок: " + ErrorsCount + ";" + Different.NewLine + "Параметров: " + CalcParamsId.Count + "; Архивных параметров:" + ArchiveParams.Count + "; Сигналов: " + SignalsInUseCount)); }