Создание и перенос в новый слой текста из текстовых объектов

Автор Тема: Создание и перенос в новый слой текста из текстовых объектов  (Прочитано 10081 раз)

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

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Доброго дня всем.
Пытаюсь решить следующую задачку.
Есть чертёж. На чертеже большое количество текстовых объектов.
1. Выполнил поиск по чертежу и нашёл все текстовые объекты (в том числе и в блоках);
2. В найденных объектах выполнил поиск цифр.

Цифры занёс в отдельный массив.
И эти же цифры пытаюсь разместить в отдельном слое, рядом с тем объектом где они были найдены.
Для этого нужно знать ширину текстового объекта.
Пытаюсь её определить, но ни  к чему не приводит.
В этой теме
https://adn-cis.org/forum/index.php?topic=7986.msg27722#msg27722

Как определить длину текстового поля, будь то MTExt или Text.
И как создать отдельный слой.
« Последнее редактирование: 08-12-2021, 15:25:12 от marsh_one »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как определить длину текстового поля, будь то MTExt или Text.
MText.ActualWidth для MText
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Отсюда брал.
https://adn-cis.org/forum/index.php?topic=10341.0
При поиске нужного объекта:
Код - C# [Выбрать]
  1.  
  2. .......
  3.         // Поиск всех текстов элементов чертежа
  4.         private bool FindTextsInDrawing(dynamic app, dynamic acDoc, dynamic modelSpace)
  5.         {
  6.             try
  7.             {
  8.                 dynamic count = CallFunc((object)app, () => modelSpace.Count);
  9.  
  10.                 for (int i = 0; i < (int)count; i++)
  11.                 {
  12.                     dynamic en = CallFunc((object)app, () => modelSpace.Item(i));
  13.                     dynamic className = CallFunc((object)app, () => en.ObjectName);
  14.                     if (className == "AcDbMText")
  15.                     {
  16.                         dynamic str = CallFunc((object)app, () => en.TextString);
  17.                         ListTextItems.Add(new CFragment(str, DataType.MText));
  18.                     }
  19.                     else if (className == "AcDbText")
  20.                     {
  21.                         dynamic str = CallFunc((object)app, () => en.TextString);
  22.                         ListTextItems.Add(new CFragment(str, DataType.DBText));
  23.                     }
  24.                     else if (className == "AcDbTable")
  25.                     {
  26.                         dynamic rowsCount = CallFunc((object)app, () => en.Rows);
  27.                         dynamic columnsCount = CallFunc((object)app, () => en.Columns);
  28.                         for (int row = 0; row < rowsCount; row++)
  29.                         for (int col = 0; col < columnsCount; col++)
  30.                         {
  31.                             dynamic str = CallFunc((object)app, () => en.GetCellValue(row, col));
  32.                             if (!String.IsNullOrEmpty(str))
  33.                             {
  34.                                ListTextItems.Add(new CFragment(str, DataType.Table));
  35.                             }
  36.                         }
  37.                     }
  38.                     else if (className == "AcDbMLeader")
  39.                     {
  40.                         dynamic str = CallFunc((object)app, () => en.TextString);
  41.                         ListTextItems.Add(new CFragment(str, DataType.MLeader));
  42.                     }
  43.                     else if (className == "AcDbBlockReference")
  44.                     {
  45.                         dynamic blockHasAttributes = CallFunc((object)app, () => en.HasAttributes);
  46.                         if (blockHasAttributes)
  47.                         {
  48.                             // Выборка текстов всех атрибутов текущего блока
  49.                             dynamic attributeCollection = CallFunc((object)app, () => en.GetAttributes());
  50.                             foreach (dynamic att in attributeCollection)
  51.                             {
  52.                                 dynamic bVisible = CallFunc((object)app, () => att.Visible);
  53.                                 if (bVisible)
  54.                                 {
  55.                                     dynamic str = CallFunc((object)app, () => att.TextString);
  56.                                     ListTextItems.Add(new CFragment(str, DataType.AttributeReference));
  57.                                 }
  58.                             }
  59.                         }
  60.                         dynamic blockReferenceName = CallFunc((object)app, () => en.Name);
  61.                         dynamic blocks = CallFunc((object)app, () => acDoc.Blocks);
  62.                         dynamic blocksCount = CallFunc((object)app, () => blocks.Count);
  63.                         for (int i1 = 0; i1 < (int)blocksCount; i1++)
  64.                         {
  65.                             dynamic block = CallFunc((object)app, () => blocks.Item(i1));
  66.                             dynamic blockName = CallFunc((object)app, () => block.Name);
  67.                             if (blockName == blockReferenceName)
  68.                             {
  69.                                 // Поиск текстов всех элементов, входящих в текущий блок
  70.                                 if (!FindTextsInDrawing(app, acDoc, block)) return false;
  71.                                 break;
  72.                             }
  73.                         }
  74.                     }
  75.                 }
  76.  
  77.                 return true;
  78.             }
  79.             catch (System.Exception)
  80.             {
  81.                 WriteErrorMsg(ex, ConsoleColor.Red);
  82.                 if (acDoc != null)
  83.                     DoAction((object)app, () => acDoc.Close(false));
  84.                 if (app != null)
  85.                     DoAction((object)app, () => app.Quit());
  86.                 return false;
  87.             };
  88.         }
  89.  
  90.  
Пытаюсь добавить:
Код - C# [Выбрать]
  1.      
  2.  else if (className == "AcDbText")
  3.                     {
  4.                         dynamic str = CallFunc((object)app, () => en.TextString);
  5.                         dynamic str_dlin=str.ActualWidth;
  6.                         Сonsole.WriteLine(str_dlin);
  7.                         ListTextItems.Add(new CFragment(str, DataType.DBText));
  8.                     }
Хочу вывести в консоль значение, но видимо я не верно применяю.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
marsh_one,
Ты через COM что-ли пытаешься работать? Зачем? И вообще тот пример мягко говоря не хорош.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
en.TextString - это текстовая строка, а не сам MText, так что у него нет метода ActualWidth. Да и у AcDbText нет метода ActualWidth. Что-то у тебя совсем всё запутано. Если использовать COM, то использовать метод GetBoundingBox и при этом получать из него ширину и высоту. Но если текст повернутый, то правильную ширину так не получить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Спасибо Александр. Да. Через СОМ. Понял. Сегодня буду пробовать)

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Добрый день, Александр. А что именно  в том примере не очень хорошо.
И вообще тот пример мягко говоря не хорош
.
И хотел уточнить такой момент, что иногда в самом Mtext, длина текста не совпадает с длиной объекта. Как быть в таком случае?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Добрый день, Александр. А что именно  в том примере не очень хорошо.
И вообще тот пример мягко говоря не хорош
.
И хотел уточнить такой момент, что иногда в самом Mtext, длина текста не совпадает с длиной объекта. Как быть в таком случае?

Увы никак. Средствами COM более точно размер MText вычислить нельзя. Это одна из причин, по которой я не рекомендую использовать COM.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Добрый день. Александр, вы выше написали, что тот пример "не очень хорош".
Подскажите как, на ваш взгляд, должна быть реализация способа поиска текстовых объектов в файле dwg при использовании COM.
Я не имею ввиду сам код,  а чтобы вы поменяли в том том коде, что я в качестве примера привел.
Принадлежность того или иного объекта к конкретному слою делаю так.
Код - C# [Выбрать]
  1.  string lay_object = en.Layer;
Вывожу в консоль, чтобы посмотреть.
Вроде все соответствует.
Код - C# [Выбрать]
  1. Console.WriteLine(lay_object);
.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я очень против использования COM. Это главная претензия к коду.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение