/// <summary> /// Загрузка из файла схемы всех необходимых объектов - текстовых и символьных объектов /// </summary> public void ReplaceText(e3Application app, Dictionary <string, string> substDict) { // 0. Инициализируем все необходимые объекты для работы с проектом e3Job job = (e3Job)app.CreateJobObject(); e3Sheet sht = (e3Sheet)job.CreateSheetObject(); e3Text txt = (e3Text)job.CreateTextObject(); e3Symbol sym = (e3Symbol)job.CreateSymbolObject(); // 1. Откроем проект Global.Log.Write("################################################"); Global.Log.Write("Приступаем к обработке файла: " + this.FullFileName); int openRes = job.Open(this.FullFileName); Global.Log.Write("Файл открыт: " + (openRes != 0).ToString()); // 1.1 Выкинем исключение, если файл не удалось открыть if (openRes == 0) { throw new Exception("Не удалось открыть файл: " + this.FullFileName); } // 2. Пройдемся перебором по всем листам проекта dynamic ShtIds = null; int nshts = job.GetSheetIds(ref ShtIds); Global.Log.Write("Кол-во листов: " + nshts); foreach (var sid in ShtIds) { // 2.1 Дропнем пустые id листа if (sid == null) { continue; } // 2.2 Подключимся к листу sht.SetId(sid); // 2.3 Получим все текстовые объекты на текущем листе и пройдемся по ним перебором dynamic TxtIds = null; int ntxt = sht.GetGraphIds(ref TxtIds); foreach (var tid in TxtIds) { /* 2.3.1 Подключимся к текстовому объекту, получим его текстовое значение и пробуем * произвести замену подстрок по словарю (если таковые там будут присутствовать) */ txt.SetId(tid); string oldVal = txt.GetText(); // Зафиксируем старое значение // 2.3.2 ПРоверим, содержит ли данная надпись символы для замены bool exec = false; // Флаг необходимости обработки данной надписи foreach (string key in substDict.Keys) { if (oldVal.Contains(key)) { exec = true; } } if (exec) { string newVal = oldVal.ParallelReplace(substDict); // Сформируем новое значение txt.SetText(newVal); // Передадим новое значение в проект Global.Log.Write("Было: " + oldVal); Global.Log.Write("Стало: " + newVal); } } // 2.4 Аналогичным образом пройдемся по символам с текстом dynamic SymIds = null; int nsym = sht.GetSymbolIds(ref SymIds); foreach (var syid in SymIds) { sym.SetId(syid); dynamic SymTxtIds = null; sym.GetTextIds(ref SymTxtIds); foreach (var sytid in SymTxtIds) { txt.SetId(sytid); string oldVal = txt.GetText(); // Зафиксируем старое значение // 2.3.2 ПРоверим, содержит ли данная надпись символы для замены bool exec = false; // Флаг необходимости обработки данной надписи foreach (string key in substDict.Keys) { if (oldVal.Contains(key)) { exec = true; } } if (exec) { string newVal = oldVal.ParallelReplace(substDict); // Сформируем новое значение txt.SetText(newVal); // Передадим новое значение в проект Global.Log.Write("Было: " + oldVal); Global.Log.Write("Стало: " + newVal); } } } } // 3. Пометим схему как обработанную this.IsProcessed = true; Global.Log.Write("################################################" + Environment.NewLine); // 4. Заключительные операции: сохранить, закрыть затереть объекты job.Save(); job.Close(); txt = null; sht = null; job = null; app = null; }
static void Main() { // Подключаем E3 App = e3App.ToE3(); App?.PutInfo(0, "Starting The Snake!"); Prj = App?.CreateJobObject(); Sheet = Prj.CreateSheetObject(); Graph = Prj.CreateGraphObject(); Sym = Prj.CreateSymbolObject(); // Выберем лист while (sheetid == 0) { sheetid = Prj.GetActiveSheetId(); Sheet.SetId(sheetid); if (sheetid == 0) { MessageBox.Show("Выберите лист для игры!"); } } //находим середину листа object xmin = 0; object ymin = 0; object xmax = 0; object ymax = 0; Sheet.GetDrawingArea(ref xmin, ref ymin, ref xmax, ref ymax); double centerX = Math.Round(((double)xmin + (double)xmax) / 2); double centerY = Math.Round(((double)ymin + (double)ymax) / 2); // Переменные мира int score = 5; Pixel head = new Pixel(centerX, centerY, 13); List <Pixel> body = new List <Pixel>(); for (int i = 0; i < score; i++) { if (i == 0) { body.Add(new Pixel(head.XPos - 2, head.YPos, 35)); } else { body.Add(new Pixel(body[i - 1].XPos - 2, body[i - 1].YPos, 35)); } } body.Reverse(); Direction currentMovement = Direction.Right; //Собираем коллекцию символов object symIds = 0; object xSmin = 0; object ySmin = 0; object xSmax = 0; object ySmax = 0; object xS = 0; object yS = 0; object gridS = 0; List <Symbol> symbols = new List <Symbol>(); int symCnt = Sheet.GetSymbolIds(ref symIds); var symIdsArray = (Array)symIds; foreach (var symId in symIdsArray) { if (symId != null) { Sym.SetId((int)symId); Sym.GetArea(ref xSmin, ref ySmin, ref xSmax, ref ySmax); Sym.GetSchemaLocation(ref xS, ref yS, gridS); string rotS = Sym.GetRotation(); if (rotS.Contains("x")) { symbols.Add(new Symbol((double)xS + (double)xSmin, (double)yS - (double)ySmax, (double)xS + (double)xSmax, (double)yS - (double)ySmin, (int)symId)); } else if (rotS.Contains("y")) { symbols.Add(new Symbol((double)xS - (double)xSmax, (double)yS + (double)ySmin, (double)xS - (double)xSmin, (double)yS + (double)ySmax, (int)symId)); } else { symbols.Add(new Symbol((double)xS + (double)xSmin, (double)yS + (double)ySmin, (double)xS + (double)xSmax, (double)yS + (double)ySmax, (int)symId)); } } } //////////////////////////////////////////////////////////////////////////////////////// while (true) { // Выход за границы листа gameover |= (head.XPos >= (double)xmax - 1 || head.XPos <= 1 || head.YPos >= (double)ymax - 1 || head.YPos <= 1); // Съесть символ foreach (var symbol in symbols) { if (symbol.Collide(head.XPos, head.YPos)) { score++; frameTime *= 0.9; Sym.SetId(symbol.Id); Sym.Delete(); symbols.Remove(symbol); break; } } Console.Clear(); Console.WriteLine($"Счет: {score - 5}"); //Рисуем тело for (int i = 0; i < body.Count; i++) { Pixel tmpbody = body[i]; DrawPixel(ref tmpbody); body[i] = tmpbody; gameover |= (body[i].XPos == head.XPos && body[i].YPos == head.YPos); } if (gameover) { break; } //Рисуем голову DrawPixel(ref head); //Ждем кадр var sw = Stopwatch.StartNew(); while (sw.ElapsedMilliseconds <= frameTime) { currentMovement = ReadMovement(currentMovement); } //Добавляем пиксель тела чтобы подвинуться body.Add(new Pixel(head.XPos, head.YPos, 35)); // Изменяем положение головы switch (currentMovement) { case Direction.Up: head.YPos += 2; break; case Direction.Down: head.YPos -= 2; break; case Direction.Left: head.XPos -= 2; break; case Direction.Right: head.XPos += 2; break; } //Удаляем змейку, чтобы перерисовать в новом кадре Clear(head, body); // Удаляем последнее звено из коллекции тела чтобы змея двигалась if (body.Count > score) { body.RemoveAt(0); } } // Сообщение с результатом MessageBox.Show($"Game over, Score: {score - 5}"); Clear(head, body); App = null; }