Поиск текстовых объектов в пространстве модели

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

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

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Доброго всем дня.
Пытаюсь написать небольшую приложуху по поиску текстовых полей в модельном пространстве выбранного чертежа и их изменению.
Совсем недавно начал изучение шарпа, тем более прмиенительно к АКАДУ, поэтому оч и оч многое не знаю.
Буду признателен за любую помощь.
В ниже прведенном коде ругается на переменную - е
Код - C# [Выбрать]
  1.         private void erToolStripMenuItem_Click(object sender, EventArgs e)
  2.         {
  3.             //поиск файла word
  4.             using (OpenFileDialog ofd = new OpenFileDialog())
  5.             {
  6.                 ofd.Multiselect = true;
  7.                 ofd.Filter = "Autocad(*.dwg*) | *.dwg*";
  8.                 ofd.Title = "Выберите документ AutoCAD";
  9.                 if (ofd.ShowDialog() != DialogResult.OK)
  10.                 {
  11.                     MessageBox.Show("Вы не выбрали файл для открытия", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
  12.                     return;
  13.                 }
  14.                 // paht file
  15.                 string str_fileNeame = ofd.FileName;
  16.                 try
  17.                 {
  18.                         // Get the current document and database, and start a transaction
  19.                         Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.
  20.                             MdiActiveDocument;
  21.                         Database acCurDb = acDoc.Database;
  22.  
  23.                         // Get the current document editor
  24.                         Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.
  25.                             MdiActiveDocument.Editor;
  26.                         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  27.                         {
  28.                             // Open the Block table record for read
  29.                             BlockTable acBlkTbl;
  30.                             acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  31.                                                          OpenMode.ForRead) as BlockTable;
  32.  
  33.                             // Open the Block table record Model space for read
  34.                             BlockTableRecord acBlkTblRec;
  35.                             acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  36.                                                             OpenMode.ForRead) as BlockTableRecord;
  37.  
  38.                             // Step through each object in Model space
  39.                             foreach (ObjectId acObjId in acBlkTblRec)
  40.                             {
  41.                                 Entity en = acTrans.GetObject(acObjId, OpenMode.ForRead) as Entity;
  42.                                 if (en != null)
  43.                                 {
  44.                                     if (en.GetType() == typeof(DBText))
  45.                                     {
  46.                                         string str = ((DBText)en).TextString;
  47.  
  48.                                        
  49.                                     }
  50.                                     else if (en.GetType() == typeof(MText))
  51.                                     {
  52.                                         string str = ((MText)en).Contents;
  53.                                        
  54.                                     }
  55.                                     else if (en.GetType() == typeof(Table))
  56.                                     {
  57.                                         Autodesk.AutoCAD.DatabaseServices.Table tbl = (Table)en;
  58.                                         for (int row = 0; row < tbl.Rows.Count; row++)
  59.                                             for (int col = 0; col < tbl.Columns.Count; col++)
  60.                                             {
  61.                                                 string str = tbl.Cells[row, col].TextString;
  62.                                             if (!String.IsNullOrEmpty(str));
  63.                                              
  64.                                                
  65.                                                 //ListNotes.Add(new CNote(str, acObjId, DataType.Table, row, col));
  66.                                             }
  67.                                     }
  68.                                     else if (en.GetType() == typeof(BlockReference))
  69.                                     {
  70.                                         //int i = 1;
  71.                                     }
  72.                                 }
  73.                             }
  74.                         }
  75.                 }
  76.  
  77.                 catch (System.Exception e)
  78.                 {
  79.                     Editor acDocEd = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  80.                     acDocEd.WriteMessage(String.Format("Ошибка. {0}{1}" + Environment.NewLine, e.Message, e.StackTrace));
  81.                 }
  82.  
  83.  
  84.  
  85.  
  86.             }
  87.         }
  88.  
« Последнее редактирование: 04-08-2021, 11:23:00 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В коде две переменных 'e'. На какую и в каком месте ругается?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В челом сам подход по перебору объектов модели верен?
В целом - да. Хотя есть еще и блоки и атрибуты и т.д. и т.п...
А вот ошибка у тебя выскочила принципиальная. Судя по всему ты пытаешься создать exe-приложение, которое будет использовать библиотеки AutoCAD acmgd.dll, acdbmgd.dll, accoremgd.dll. Должен сразу разочаровать - так не получится. Эти библиотеки можно использовать только в плагине (dll-файле), который грузится внутрь AutoCAD (при помощи команды _NETLOAD или аналогичными способами).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
В челом сам подход по перебору объектов модели верен?
В целом - да. Хотя есть еще и блоки и атрибуты и т.д. и т.п...
А вот ошибка у тебя выскочила принципиальная. Судя по всему ты пытаешься создать exe-приложение, которое будет использовать библиотеки AutoCAD acmgd.dll, acdbmgd.dll, accoremgd.dll. Должен сразу разочаровать - так не получится. Эти библиотеки можно использовать только в плагине (dll-файле), который грузится внутрь AutoCAD (при помощи команды _NETLOAD или аналогичными способами).
По блокам и атрибутам - понял. Спасибо.
Этот код подчерпнул тут у вас на форуме.
https://adn-cis.org/forum/index.php?topic=10205.0
Александр, а как осуществить мой подход.
Небольшая прога.
Выскакивает окошко - выбрать файлы dwg.
Выбрал файл.
Нажал ок.
Перебираются все объекты и текстовые именять по определенному принципу.
куда копать подскажите.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр, а как осуществить мой подход.
Лучше никак, ибо из внешнего приложения (exe-файла) можно работать с AutoCAD только через COM/ActiveX, что сопряжено с большим рядом сложностей и ограничений.
Поэтому рекомендую именно плагин, который грузится в AutoCAD, а затем пользователь запускает команду и дальше по тому сценарию, который вы описали (т.е. выбор dwg-файлов и их обработка).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Александр, спасибо за пояснение.
А если относительно  COM/ActiveX, помогите разобраться конкретно под мою задачу с текстовыми полями.
Немного пошелестил форум, кое что нашел
https://adn-cis.org/forum/index.php?topic=606.15. Это одна из проблем?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Немного пошелестил форум, кое что нашел
https://adn-cis.org/forum/index.php?topic=606.15. Это одна из проблем?
Да. И далеко не единственная.

А если относительно  COM/ActiveX, помогите разобраться конкретно под мою задачу с текстовыми полями.
Ага. Хочешь сам потоптаться по граблям. Ну-ну...

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Из AutoCAD'овских библиотек ты можешь использовать только Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll
Из документации:
http://help.autodesk.com/view/OARX/2019/PLK/?guid=GUID-36BF58F3-537D-4B59-BEFE-2D0FEF5A4443
http://help.autodesk.com/view/OARX/2019/PLK/?guid=GUID-5D302758-ED3F-4062-A254-FB57BAB01C44
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
В ссылках я подключил
acdbmgb
acmgd
accoremgd
AutoCAD.
Т.е. подключаемых библиотеках указывать то, что вы привели?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В ссылках я подключил
acdbmgb
acmgd
accoremgd
AutoCAD.
Т.е. подключаемых библиотеках указывать то, что вы привели?
Их использовать во внешнем exe-приложении нельзя. Только те две, которые я привел выше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Понял. Буду пробовать. Спасибо.

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Александр, добрыйдень.
Подскажите по поводу подключения (в ссылках добавил)?
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. //using Autodesk.AutoCAD.Application;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Application=Autodesk.AutoCAD.Interop;
  8. using Autodesk.AutoCAD.Interop.Common;
  9. using System.IO;
И как вызвать автокад? У меня ругается.
Код - C# [Выбрать]
  1.                     Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
susl,
Такое впечатление, что ты не читаешь всё что я пишу.
1. Из всех Autodesk'овских using, которые в твоём коде можно использовать только два:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Interop;
  2. using Autodesk.AutoCAD.Interop.Common;
2. Никаких Autodesk.AutoCAD.ApplicationServices использовать нельзя.
3. Пример как запустить или обратится к уже запущенному AutoCAD из своего exe-приложения было в ссылке, которую ты же сам выше и привёл.
« Последнее редактирование: 06-08-2021, 00:54:59 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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