Как вытащить тексты из блока

Автор Тема: Как вытащить тексты из блока  (Прочитано 13180 раз)

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

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Добрый день!
Написал такой код:
Код - C# [Выбрать]
  1.         public void FindTextsInDrawing()
  2.         {
  3.             try
  4.             {
  5.                 ListNotes.Clear();
  6.  
  7.                 // Get the current document and database, and start a transaction
  8.                 Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.
  9.                     MdiActiveDocument;
  10.                 Database acCurDb = acDoc.Database;
  11.  
  12.                 // Get the current document editor
  13.                 Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.
  14.                     MdiActiveDocument.Editor;
  15.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  16.                 {
  17.                     // Open the Block table record for read
  18.                     BlockTable acBlkTbl;
  19.                     acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  20.                                                  OpenMode.ForRead) as BlockTable;
  21.  
  22.                     // Open the Block table record Model space for read
  23.                     BlockTableRecord acBlkTblRec;
  24.                     acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  25.                                                     OpenMode.ForRead) as BlockTableRecord;
  26.  
  27.                     // Step through each object in Model space
  28.                     foreach (ObjectId acObjId in acBlkTblRec)
  29.                     {
  30.                         Entity en = acTrans.GetObject(acObjId, OpenMode.ForRead) as Entity;
  31.                         if (en != null)
  32.                         {
  33.                             if (en.GetType() == typeof(DBText))
  34.                             {
  35.                                 string str = ((DBText)en).TextString;
  36.                                 ListNotes.Add(new CNote(str, acObjId, DataType.DBText));
  37.                             }
  38.                             else if (en.GetType() == typeof(MText))
  39.                             {
  40.                                 string str = ((MText)en).Contents;
  41.                                 ListNotes.Add(new CNote(str, acObjId, DataType.MText));
  42.                             }
  43.                             else if (en.GetType() == typeof(Table))
  44.                             {
  45.                                 Autodesk.AutoCAD.DatabaseServices.Table tbl = (Table)en;
  46.                                 for (int row = 0; row < tbl.Rows.Count; row++)
  47.                                 for (int col = 0; col < tbl.Columns.Count; col++)
  48.                                 {
  49.                                    string str = tbl.Cells[row, col].TextString;
  50.                                    if (!String.IsNullOrEmpty(str))
  51.                                         ListNotes.Add(new CNote(str, acObjId, DataType.Table, row, col));
  52.                                 }
  53.                             }
  54.                             else if (en.GetType() == typeof(BlockReference))
  55.                             {
  56.                                 //int i = 1;
  57.                             }
  58.                         }
  59.                     }
  60.                 }
  61.             }
  62.             catch (System.Exception e)
  63.             {
  64.                 Editor acDocEd = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  65.                 acDocEd.WriteMessage(String.Format("Ошибка. {0}{1}" + Environment.NewLine, e.Message, e.StackTrace));
  66.             }
  67.         }
  68.  
Для однострочного текста, многострочного текста, таблицы я легко вытаскиваю все тексты.
Теперь дошел до блока. Как я понимаю, это ветка en.GetType() == typeof(BlockReference)
Как вытащить элементы из блока?
Спасибо.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Как вытащить тексты из блока
« Ответ #1 : 10-12-2020, 18:22:49 »
Цитировать
Как вытащить элементы из блока?
какие элементы?

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как вытащить тексты из блока
« Ответ #2 : 10-12-2020, 18:24:48 »
Меня интересуют все элементы блока, в которых может быть текст.

Отмечено как Решение Борис_С 10-12-2020, 18:59:19

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как вытащить тексты из блока
« Ответ #3 : 10-12-2020, 18:25:21 »
Теперь дошел до блока. Как я понимаю, это ветка en.GetType() == typeof(BlockReference)
А дальше начинается рекурсия. Для BlocкReference в его свойстве BlockTableRecord  содержится ObjectId его BlockTableRecord. И дальше ты идёшь вглубь этой BlockTableRecord и ищешь там тексты, таблицы и (!!!) снова могут быть BlockReference...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как вытащить тексты из блока
« Ответ #4 : 10-12-2020, 18:27:45 »
Меня интересуют все элементы блока, в которых может быть текст.
Кстати, тексты могут быть еще и в AttributeReference, в Leader и MLeader...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как вытащить тексты из блока
« Ответ #5 : 10-12-2020, 18:42:35 »
Как я понимаю, мне нужно вытащить что-то похожее на acBlkTblRec
// Open the Block table record Model space for read
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                               OpenMode.ForRead) as BlockTableRecord;
Но я не очень понимаю, что вставить вместо BlockTableRecord.ModelSpace?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как вытащить тексты из блока
« Ответ #6 : 10-12-2020, 18:48:08 »
Но я не очень понимаю, что вставить вместо BlockTableRecord.ModelSpace?
Если у тебя en типа BlockReference,
Код - C# [Выбрать]
  1. BlockReference bref = en as BlockReference;
и вместо acBlkTbl[BlockTableRecord.ModelSpace] у тебя будет bref.BlockTableRecord

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как вытащить тексты из блока
« Ответ #7 : 10-12-2020, 18:58:47 »
Теперь все ясно. Спасибо.

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как вытащить тексты из блока
« Ответ #8 : 11-12-2020, 13:18:22 »
Что возвращает Entity.GetType() для AttributeReference, Leader и MLeader?

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как вытащить тексты из блока
« Ответ #9 : 11-12-2020, 15:30:38 »
C MLeader разобрался. А как создать объекты Leader и AttributeReference?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как вытащить тексты из блока
« Ответ #10 : 11-12-2020, 17:11:50 »
А как создать объекты Leader и AttributeReference?
Leader создаётся командой _LEADER.
AttributeReference создаются AutoCAD при вставке блока с атрибутами командой _INSERT (или программно). Они привязаны к BlockReference и их можно получить используя свойство BlockReference.AttributeCollection (если у блока есть атрибуты).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как вытащить тексты из блока
« Ответ #11 : 14-12-2020, 16:27:22 »
Я не понял. Объекты выноска и мультивыноска - это разные объекты? Объект мультивыноска я создал в панели Мультивыноска в пункте меню Аннотация.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как вытащить тексты из блока
« Ответ #12 : 14-12-2020, 16:30:10 »
Объекты выноска и мультивыноска - это разные объекты?
Разные. И команды для их создания разные.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как вытащить тексты из блока
« Ответ #13 : 14-12-2020, 17:09:13 »
Я создал объект Выноска в виде линии. Теперь никак не могу понять, как вписать в него текст.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как вытащить тексты из блока
« Ответ #14 : 14-12-2020, 17:14:10 »
Я создал объект Выноска в виде линии. Теперь никак не могу понять, как вписать в него текст.
Зачем в него вписывать текст? Вы воспользовались командой _LEADER? Она сама "вписывает текст".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение