Помогите с первыми шагами в ObjectArx

Автор Тема: Помогите с первыми шагами в ObjectArx  (Прочитано 16533 раз)

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

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

Оффлайн РустемАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Здравствуйте Уважаемые программисты. Я действующий инженер-проектировщик линейных объектов. В своей практике работы я самостоятельно и при помощи хороших людей, научился немного программировать в среде LISP, для реализации инженерных задач и задач оформительского характера в AutoCAD. С некоторого момента мне стало не хватать дополнительных инструментов для реализации своих идей, потому что они стали заходит далеко за рамки AutoCAD и LISP. У меня также был небольшой опыт работы в среде VBA. Взвесив все за и против, я решил попробовать себя в связке C++ objectARX. Для этого я изучил вводные лекции по С++ и купил книгу уважаемого Полищука Николая Николаевича "Программирование для AutoCAD 2013-2015". Идея была простая, LISP я начал изучать с подобной книги, думал и тут можно будет найти ключи к знаниям.
Первое что меня удивило- это отсутствие функции main. Во всех лекциях по С++ это функция приводилась как основное тело программы в котором без которой ничего не работает. Поняв что я ее в примерах не найду, решил принять это так как есть. Я отлично понимаю что это Ваш хлеб и вы им дорожите, но если все таки найдете возможным помочь, прошу дать направление в следующих шагах.
Как правило, множество операция в Autocad носит следующий характер:
- Выделить объект;
- Получить информацию об объекте;
- Совершить какие то изменения над объектом;
или
- Создать объект;
- Разместить в базе данных Autocad;
- Задать параметры объекту.
Конечно существуют более сложные формы программ с подключением баз данных с подготовкой к информационной модели BIM, но это ведь уже совсем другой уровень для меня.
Вот пример простого кода в LISP

Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com) ;загрузили фунции AutoLISP для работы со свойствами ActiveX
  2.  (setq acad_aplication (vlax-get-acad-object));получили указатель на объект Aplication
  3. (setq active_document (vla-get-activedocument acad_aplication)) ;получили указатель на объект активный документ;
  4. (setq model_space (vla-get-modelspace active_document)) ;получили указатель на пространство модели;
  5. (setq paper_space (vla-get-paperspace active_document)) ;получили указатель на пространство листа;
  6. (if (= (vla-get-ActiveSpace active_document) 0); если условие выполнено значит находимся в пространстве листа
  7. (setq model_space paper_space); делаем такое хитрое присвоение, чтобы везде в коде использовать model_space без лишних заморочек
  8. ;***************************************************************  
  9. (setq lpol_koor_t nil) ; задали  lpol_koor_t  значение nil
  10. (setq nabpol_t (ssget '((0 . "LWPOLYLINE")))); создали набор из полилиний и присвоили его значению nabpol_t.
  11. (setq lpol_t (ssname nabpol_t 0));получили 0-й элемент набора, а то мало ли там еще чего лишнего выбрал пользователь))), и присвоили значение  lpol_t
  12. (setq lpol_vla_t (vlax-ename->vla-object lpol_t )); преобразовали в vla объект и присвоили значение lpol_vla_t
  13. (setq lpol_koor_t (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates lpol_vla_t)))); получили координаты в виде данных Varian, приобразовали в безоспастный массив и преобразовали в список с присвоением переменной lpol_koor_t.
  14. (setq n_t (length  lpol_koor_t)); получили длину списка;
  15.  
Наверное тем кто не знаком с LISP это покажется слишком сложным, а тем кто с ним знаком скажет что зачем было столько переменных плодить можно было все через скобки сделать,  я знаю. Но для понимания так проще. Я когда заканчивал университет и имел базовые понятия в turbo pascal именно в таком ключе все преподавалось.
Тут ключевым является момент (setq lpol_vla_t (vlax-ename->vla-object lpol_t ));
после этого в инспекторе объектов можно посмотреть все возможные данные для lpol_vla_t  и в дальнейшем обращаться уже непосредственно к доступным свойствам или применять какие то методы к объекту. Если каких то особых специфических задач нет кроме описанных выше, то этой информации вполне достаточно, чтобы дальше конструировать нужный для задачи код.
1. Первый вопрос
Как вышеизложенный код возможно было бы реализовать в objectARX придерживаясь логики изложенной в LISP или же это принципиально не правильный подход??

Далее
В objectARX оказалось все совсем даже не так, ну вот например код из книги Полищука Н.Н. проекта UserSimple  файл  acrxEntryPoint.cpp

IMPLEMENT_ARX_ENTRYPOINT(CUserSimpleApp) //Данный код создает связь с AutoCAD где весь код по сути является описанием класса CUserSimpleApp. Лично для меня уже на этой стадии уже есть определенные трудности понимания. Получается исполнение макроса IMPLEMENT_ARX_ENTRYPOINT с параметром  CUserSimpleApp возвращает компилятору указатель в пространство модели. При этом не совсем понятно если разница для листа или модели или там все предусмотрено уже. Тогда возникает вопрос как получить указатель конкретно для какого то листа.

Самый сложный момент для меня на данный момент это следующий:
В Visual Studio подключаемся к процессу acad
В AutoCAD загружаем UserSimple.arx
Рисуем круг и пересекающую его полилинию
В Visual Studio создаем точку остановки в середине модуля для отслеживания значений объектов
Пишем командной строке (entsinters)
Выделяем первый объект
Открывается Visual Studio и смотрим окно локальных переменных
В окне исследований значений локальных переменных появляется такая такая запись для переменной pEnt1
-  pEnt1 0x0000000032031810 <Информация недоступна, символы для acdb19.dll не загружены>   AcDbEntity *

Интуитивно конечно понятно что значения объекта, сохраненного в переменной pEnt1 не могут быть корректно отображены потому что чего то не хватает. Но вот чего не хватает, правильно ли я вообще в целом размышляю и что надо сделать, чтобы начать правильно размышлять, эти вопросы на данный момент, не имея ответа, стали гирей на моей ноге, причем такой, которую нет сил сдвинуть.

Ниже приведет участок кода из примера  UserSimple

ads_entsinters, код приведен ниже
Код - C++ [Выбрать]
  1. static int ads_entsinters(void)
  2. {
  3. int es1, es2;
  4. ads_name ent1, ent2;
  5. ads_point pt1, pt2;
  6. AcDbObjectId entId1, entId2;
  7. AcDbEntity* pEnt1 = NULL;
  8. AcDbEntity* pEnt2 = NULL;
  9. AcGePoint3dArray points;
  10.  
  11. // Выбор первого объекта по запросу
  12. es1 = acedEntSel(L"\nУкажите объект 1: ", ent1, pt1);
  13. if (es1 != RTNORM)
  14. {
  15.   acutPrintf(L"\nОбъект не выбран. ");
  16.   return (RTNORM);
  17. }
  18.  
  19. // Вычисление ID для перехода от ads_name к AcDbObjectId
  20. es1 = acdbGetObjectId(entId1, ent1);
  21. if (es1 != Acad::eOk)
  22. {
  23.   acutPrintf(L"\nНе получен Id 1 ");
  24.   return (RTNORM);
  25. }
  26. // Вычисление указателя на AcDbEntity
  27. es1 = acdbOpenAcDbEntity(pEnt1, entId1, AcDb::kForRead);
  28. if (es1 != Acad::eOk)
  29. {
  30.   acutPrintf(L"\nНе открыт объект 1 ");
  31.   return (RTNORM);
  32. }
  33. // Подсветка первого объекта
  34. pEnt1->highlight();
  35. //<<<<Тут ставим точку, чтобы в локальных переменных увидеть значение pEnt1
  36. // Выбор второго объекта по запросу
  37. label_select2:
  38. es2 = acedEntSel(L"\nУкажите объект 2: ", ent2, pt2);
  39. if (es2 != RTNORM)
  40. {
  41.   pEnt1->unhighlight(); // сброс подсветки
  42.   pEnt1->close(); // закроем объект 1
  43.   acutPrintf(L"\nОбъект не выбран. ");
  44.   return (RTNORM);
  45. }
  46. // Вычисление ID для перехода от ads_name к AcDbObjectId
  47. es2 = acdbGetObjectId(entId2, ent2);
  48. if (es2 != Acad::eOk)
  49. {
  50.   pEnt1->unhighlight();
  51.   pEnt1->close(); // закроем объект 1
  52.   acutPrintf(L"\nНе получен Id 2 ");
  53.   return (RTNORM);
  54. }
  55. // Проверка совпадения объектов
  56. if (entId2 == entId1)
  57. {
  58.   acutPrintf(L" Повторите выбор: ");
  59.   goto label_select2;
  60. }
  61.  
  62. // Вычисление указателя на AcDbEntity
  63. es2 = acdbOpenAcDbEntity(pEnt2, entId2, AcDb::kForRead);
  64. if (es2 != Acad::eOk)
  65. {
  66.   pEnt1->unhighlight();
  67.   pEnt1->close(); // закроем объект 1
  68.   acutPrintf(L"\nНе открыт объект 2 ");
  69.   return (RTNORM);
  70. }
  71.  
  72. // Подсветка второго объекта
  73. pEnt2->highlight();
  74.  
  75. // Распечатка выбранных объектов
  76. acutPrintf(L"\n"); // переход на новую строку
  77. pEnt1->list();
  78. acutPrintf(L"\n");
  79. pEnt2->list();
  80.  
  81. // Вычисление точек пересечения для объектов
  82. es1 = pEnt2->intersectWith(pEnt1, AcDb::kOnBothOperands, points);
  83. int len;
  84. if ( (es1 != Acad::eOk) || ((len = points.length() ) == 0) )
  85.   acutPrintf(L"\nОбъекты не пересекаются. ");
  86. else
  87. {
  88.   acutPrintf(L"\nТочки пересечения:");
  89.   for (int i=0; i<len; ++i)
  90.   {
  91.     acutPrintf(L"\n %d: %.6f %.6f %.6f",
  92.       i+1, points[i].x, points[i].y, points[i].z);
  93.   }
  94. }
  95.  
  96. // Сброс подсветки
  97. pEnt1->unhighlight();
  98. pEnt2->unhighlight();
  99.  
  100. // Закрытие объектов с освобождением памяти
  101. pEnt1->close();
  102. pEnt2->close();
  103.  
  104. // TODO: Replace the following line by your returned value if any
  105. acedRetVoid () ;
  106. return (RTNORM) ;
  107. }

Заранее извиняюсь за столько долгое изложение текста и свою невежественность в этих вопросах. Я самоучка, но все это мне ужасно интересно и есть огромное желание изучать и познавать.
Для работы были использованы Visual Studio 12, AutoCAD 2014, Windows 7 64 бит.
« Последнее редактирование: 15-04-2018, 23:09:31 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #1 : 15-04-2018, 23:13:15 »
Рустем,
Приветствую на форуме!
1. Прочитай у меня в подписи как следует форматировать код на нашем форуме и в дальнейшем соблюдай это правило.
2. Слишком много вопросов для одной темы. И они очень нечетко сформулированы. Постарайся разделять вопросы. Один вопрос - одна тема.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #2 : 15-04-2018, 23:21:50 »
1. Первый вопрос
Как вышеизложенный код возможно было бы реализовать в objectARX придерживаясь логики изложенной в LISP или же это принципиально не правильный подход??
Никак. Если собираешься использовать ObjectARX с C++ - забудь про стилистику AutoLisp/VisualLisp
Получается исполнение макроса IMPLEMENT_ARX_ENTRYPOINT с параметром  CUserSimpleApp возвращает компилятору указатель в пространство модели.
Бред. Ничего общего. Поищи в *.h-файлах из ObjectARX что этот макрос делает.
Открывается Visual Studio и смотрим окно локальных переменных
В окне исследований значений локальных переменных появляется такая такая запись для переменной pEnt1
-  pEnt1 0x0000000032031810 <Информация недоступна, символы для acdb19.dll не загружены>   AcDbEntity *

Интуитивно конечно понятно что значения объекта, сохраненного в переменной pEnt1 не могут быть корректно отображены потому что чего то не хватает. Но вот чего не хватает, правильно ли я вообще в целом размышляю и что надо сделать, чтобы начать правильно размышлять, эти вопросы на данный момент, не имея ответа, стали гирей на моей ноге, причем такой, которую нет сил сдвинуть.
Если это гиря, то пока не увяз, бросай ObjectARX и C++ и переключайся на C# и AutoCAD .NET API. С++ и ObjectARX это инструменты профессиональных программистов. На их изучения нужно потратить годы. C# и AutoCAD .NET API проще.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Рустем 20-04-2018, 07:42:04

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #3 : 15-04-2018, 23:29:42 »
Интуитивно конечно понятно что значения объекта, сохраненного в переменной pEnt1 не могут быть корректно отображены потому что чего то не хватает. Но вот чего не хватает, правильно ли я вообще в целом размышляю и что надо сделать, чтобы начать правильно размышлять, эти вопросы на данный момент, не имея ответа, стали гирей на моей ноге, причем такой, которую нет сил сдвинуть.
Но если очень хочешь, то читай:
http://through-the-interface.typepad.com/through_the_interface/2011/06/public-symbols-for-autocad-2012.html
http://adndevblog.typepad.com/autocad/2013/04/announcement-autocad-2014-debug-symbols-now-available-on-the-public-server.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн РустемАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Помогите с первыми шагами в ObjectArx
« Ответ #4 : 15-04-2018, 23:38:26 »
Спасибо за оперативный ответ Александр, я учту все Ваши замечания в дальнейших своих изысканиях. Если не смогу снять "Гирю" ну значит "не шмагла", а в целом я постараюсь.
Про пункт
Получается исполнение макроса IMPLEMENT_ARX_ENTRYPOINT с параметром  CUserSimpleApp возвращает компилятору указатель в пространство модели.
Это не мои слова. Это из книги 55 страница. Дословно IMPLEMENT_ARX_ENTRYPOINT - для создания связи приложения с AutoCAD. Может я конечно не совсем правильно написал, но понял я именно так.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #5 : 15-04-2018, 23:47:37 »
Это не мои слова. Это из книги 55 страница. Дословно IMPLEMENT_ARX_ENTRYPOINT - для создания связи приложения с AutoCAD. Может я конечно не совсем правильно написал, но понял я именно так.
Абсолютно неправильно понял. Макрос определён в файле dbxEntryPoint.h
Смотрим его (в ObjectARX SDK 2014):
Код - C++ [Выбрать]
  1. #define IMPLEMENT_ARX_ENTRYPOINT_STD(classname) \
  2.         HINSTANCE _hdllInstance =NULL ; \
  3.     class classname entryPointObject ; \
  4.     AcRxDbxApp *acrxGetApp () { return (&entryPointObject) ; } \
  5.     extern "C" AcRx::AppRetCode __declspec(dllexport) acrxEntryPoint (AcRx::AppMsgCode msg, void *pkt) { \
  6.         return (entryPointObject.acrxEntryPoint (msg, pkt)) ; \
  7.     }
  8. #define IMPLEMENT_ARX_ENTRYPOINT(classname) IMPLEMENT_ARX_ENTRYPOINT_STD(classname)
  9.  

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

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Помогите с первыми шагами в ObjectArx
« Ответ #6 : 16-04-2018, 13:52:13 »
как бы C# и NET API - гораздо проще для понимания, а функционал хороший... и перейти на C++ будет проще...

Цитировать
Никак. Если собираешься использовать ObjectARX с C++ - забудь про стилистику AutoLisp/VisualLisp
а если использовать VB.NET - можно помучатся... сам так делал

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #7 : 16-04-2018, 20:48:36 »
Если не смогу снять "Гирю" ну значит "не шмагла", а в целом я постараюсь.
Дерзай. Надеюсь, что появятся конкретные вопросы, на которые я смогу ответить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн РустемАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Помогите с первыми шагами в ObjectArx
« Ответ #8 : 17-04-2018, 08:19:01 »
Уважаемый Александр спасибо большое за Ваши ответы. С символами я разобрался и у меня все получилось. За это Вам большое спасибо. Теперь я могу видеть получаемые данные для arx объектов, если честно в структуре данных, я надеялся увидеть точку вставки круга, координаты полилинии, слой, радиус ну и прочие технические характеристики объекта, чтобы их считывать и дальше что то делать с этими данными, а там arx объекты с описанием типов данных, которые потребуется мне еще изучать. Я понял главное для себя, а абсолютно не представляю как работает objectarx. Поэтому, если есть возможность, можно ли какой то простенький пример с описаниями каждой более менее сложной строки, который наглядно показывает саму суть работы objectarx. Конечно это не должно затрагивать ваши интересы связанные с Autodesk. Скажем так показали бы в какую сторону рыть. Изучая структуру данных  ObjectARX  2014 C++ Class Hierarchy и ObjectARX  2014 Managed Class Hierarchy в виде таблиц, я вижу какие там широкие возможности заложены, но к сожалению пока как в лесу)))). Я сам в таких случаях молодым студентам говорю учи матчасть, но при этом говорю где и какой документ изучить или книгу, потому что все подряд читать как правило смысла особого нет.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #9 : 17-04-2018, 12:14:46 »
Поэтому, если есть возможность, можно ли какой то простенький пример с описаниями каждой более менее сложной строки, который наглядно показывает саму суть работы objectarx.
Нет. Во-первых, в сети (и в том числе на этом сайте и этом форуме) есть огромное количество примеров. Во-вторых, не я должен изобретать для вас пример, а вы должны определится что у вас есть и что вы хотите получить, а я могу попытаться написать как это сделать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Помогите с первыми шагами в ObjectArx
« Ответ #10 : 17-04-2018, 12:33:06 »
Как вышеизложенный код возможно было бы реализовать в objectARX придерживаясь логики изложенной в LISP или же это принципиально не правильный подход??
Если хочется функциональщины, то в .NET можно писать на F# ...

Оффлайн РустемАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Помогите с первыми шагами в ObjectArx
« Ответ #11 : 17-04-2018, 20:25:55 »
Уважаемый Александр последний вопрос, прежде чем начать терзать гранит ObjectARX
Структура кода вида:

   Описание класса
      Описание функций выполняющих действия при загрузке ARX-приложения
      Описание функций выполняющих действия при выгрузке ARX-приложения
      Описание функций регистрирующих компоненты сервера
      Функции пользователя
  Макрос создающий связь с AutoCAD
  Макросы пользовательских функций
 
Является обязательной для программ при использовании  ObjectARX, или же существуют другие формы, более привычные для восприятия??



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #12 : 17-04-2018, 20:47:35 »
Является обязательной для программ при использовании  ObjectARX, или же существуют другие формы, более привычные для восприятия??
Для чьего восприятия? Для меня это естественная форма. Какие формы вы считаете естественными? Если сможете дать им определение, то я смогу ответить возможно их реализация или нет. Без упомянутых вами макросов и класса можно обойтись, хотя это будет неудобно. Пример в ObjectARX SDK: samples\misc\fact_dg
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн РустемАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Помогите с первыми шагами в ObjectArx
« Ответ #13 : 17-04-2018, 21:54:29 »
Спасибо за пример Александр. Он очень познавательный для меня.
Я могу быть не точным, но в целом типичное представление кода выглядит где то так

1 форма

Описание классов
Объявление функций
Описание процедур и функций вспомогательного характера
Описание функций и процедур пользователя для ввода
Главная функция

конец 1 формы

2 форма

Объявление процедур и функций вспомогательного характера
Описание функций и процедур пользователя для ввода

конец 2 формы

Отличие в том что функции или процедуры не описываются как часть класса (не всегда);
Для регистрации функций или процедур не используются макросы;

Это опять таки из моего личного опыта самоучки, Вам как профессиональному программисту, наверное кажется смешным)))).

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите с первыми шагами в ObjectArx
« Ответ #14 : 17-04-2018, 22:52:23 »
Это опять таки из моего личного опыта самоучки, Вам как профессиональному программисту, наверное кажется смешным)))).
Именно так. Я не буду это больше комментировать. Тем более, что это к ObjectARX не имеет никакого отношения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение