Поиск текстового значения Mtext в случае с многострочным текстом

Автор Тема: Поиск текстового значения Mtext в случае с многострочным текстом  (Прочитано 6877 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн qstАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Всем доброго времени суток!

Перевожу чертеж с помощью dictionary. Однострочный MText находит, двухстрочный -нет.
Открыл свойства Mtext, в поле Contents: First line/PSecond line.
Понимаю, что, скорее всего, неправильно использую спец. символы.
Как прописать правильно?

Код - C# [Выбрать]
  1.  static Dictionary<string, string> tabTrans = new Dictionary<string, string>()
  2.         {
  3.             { @"First line/PSecond line",         "АБВ"},

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
не понятно в чем собственно проблема. Символ /P - это Автокадовский символ перевода строки. Если надо сравнивать строки с переносом можете подменить /P на "\r\n" или наоборот

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Для начала нужно изучить управляющие коды для многострочного текста в автокаде. Вот хорошее описание

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Набери в командной строке AutoCAD:
Код - Auto/Visual Lisp [Выбрать]
  1. (entget (car (entsel)))
и нажми ENTER.
В группе 1 ты увидишь текст.
Хотя в общем случае форматирование может быть значительно сложнее и ты ничего не найдёшь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн qstАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Александр Ривилис,

В результате команды в консоли появился текст:

Код - C# [Выбрать]
  1. "First line\\PSecond line"

Не понимаю зачем нужен второй слэш.
Поменял соотвественно текстовое значение в коде, но это не принесло результатов.
Прошу помочь разобраться, файл в приложении.

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using System.Collections.Generic;
  6.  
  7. namespace ClassLibrary1
  8. {
  9.     public class CommandClass
  10.     {
  11.         static Dictionary<string, string> tabTrans = new Dictionary<string, string>()
  12.         {
  13.             { @"First line\\PSecond line",         "00000"},
  14.             { "zzzaaa",                             "АБВ"},
  15.             { "Ред.",               "Rev"},
  16.             { "История редакций",   "REVISION HISTORY"},
  17.             { "Дата",               "DATE"},
  18.             { "Черт.",              "DRN"},
  19.             { "Пров.",              "CHK"},
  20.             { "Конт.",              "APP"},
  21.             { "Заказчик:",          "Customer:"},
  22.             { "Проект:",            "Project name:"},
  23.             { "№Контр.:",           "Contract#:"},
  24.             { "№Проекта:",          "Project#:"},        
  25.             { "Название:",          "Title:"},
  26.             { "Шкаф:",              "Cabinet:"},
  27.             { "Файл:",              "File:"},
  28.             { "Стр.",               "Page"},
  29.             { "из",                 "of"},
  30.             { "Рев.",               "Rev"}
  31.         };
  32.         [CommandMethod("VJUH")]
  33.         public void RunCommand()
  34.         {
  35.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  36.  
  37.             if (adoc == null)
  38.                 return;
  39.  
  40.             Editor ed = adoc.Editor;
  41.             Database db = adoc.Database;
  42.  
  43.             using (Transaction tr = db.TransactionManager.StartTransaction())              
  44.             {
  45.                 // Получаем BT
  46.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  47.  
  48.                 if (!bt.Has("A3FRAME_1"))
  49.                 {
  50.                     tr.Commit();
  51.                     return;
  52.                 }
  53.  
  54.                 // Получаем все BTR для "A3FRAME_1"
  55.                 BlockTableRecord btr = tr.GetObject(bt["A3FRAME_1"], OpenMode.ForRead) as BlockTableRecord;
  56.  
  57.                 // Исследуем полученные BTR          
  58.                 foreach (ObjectId btrId in btr)
  59.                 {
  60.                     // Ищем все объекты типа DBText
  61.                     if (btrId.ObjectClass == RXObject.GetClass(typeof(DBText)))
  62.                     {
  63.                         // Получаем значение всех объектов DBText
  64.                         DBText text = tr.GetObject(btrId, OpenMode.ForRead) as DBText;
  65.  
  66.                         //Ищем соответствие полученных текстовых значений и словаря
  67.                         string engText = null;
  68.                         if (tabTrans.TryGetValue(text.TextString, out engText))
  69.                         {
  70.                             //Если нашли соответствие - заменяем
  71.                             text = tr.GetObject(btrId, OpenMode.ForWrite) as DBText;
  72.                             text.TextString = engText;
  73.                         }                        
  74.                     }
  75.                     else if (btrId.ObjectClass == RXObject.GetClass(typeof(MText)))
  76.                     {
  77.                         // Получаем значение всех объектов MText
  78.                         MText mtxt = tr.GetObject(btrId, OpenMode.ForRead) as MText;
  79.  
  80.                         string engText = null;
  81.                         if (tabTrans.TryGetValue(mtxt.Contents, out engText))
  82.                         {
  83.                          
  84.                             mtxt = tr.GetObject(btrId, OpenMode.ForWrite) as MText;
  85.                             mtxt.Contents = engText;
  86.  
  87.                         }
  88.                     }
  89.                 }
  90.                 tr.Commit();
  91.             }
  92.             ed.Regen();
  93.         }
  94.     }
  95. }



Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Не понимаю зачем нужен второй слэш.
\\P   
Первый \ - экранирующий, для того, что бы в автокад пришло \P , что в MText означает перевод строки (\n\r в коде)

Оффлайн qstАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Владимир Шу,


Попробовал разные варианты:

Код - C# [Выбрать]
  1. @"First line\n\rSecond line"
  2. @"First line\r\nSecond line"
  3. @"First line\nSecond line"
  4. @"First line\rSecond line"

Ни один из них не принес желаемого результата(

Отмечено как Решение qst 15-08-2018, 17:44:46

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Как будто на разных языках разговариваем. Вы спрашивали, зачем второй слеш... я ответил, наверное не достаточно понятно ответил. Тут: https://habr.com/post/165597/  подробнее

Оффлайн qstАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Владимир Шу,


Извините меня за безграмотность и спасибо за отличную статью.
Вот вариант, который принес желаемый результат:

Код - C# [Выбрать]
  1.  static Dictionary<string, string> tabTrans = new Dictionary<string, string>()
  2.         {
  3.             { "First line\\PSecond line",         "Первая строка\\PВторая строка"},
  4.