コード例 #1
0
ファイル: Model.cs プロジェクト: holgworknote/e3TxtSubst
        /// <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;
        }