Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015

Автор Тема: Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015  (Прочитано 138894 раз)

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

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Надуюсь поможет
Главное - не сильно надуваться, а то так и лопнуть можно. :)

Оффлайн Agens

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Можно, но не нужно :)
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн Agens

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Сказали бы сразу, что все статьи по С# - бумажный вариант сайтов Андрея :)
(получил книгу, пробежал глазом)
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Цитата: Agens
Приедет книга ко мне в Минск в понедельник.
Сказали бы сразу, что все статьи по С# - бумажный вариант сайтов Андрея
(получил книгу, пробежал глазом)
Я так понял, что книга доехала... :) В главе по .NET не весь материал мой - кое-что и от Николая Николаевича присутствует. Кроме того, насколько я помню, он местами вносил авторские правки в мой материал, дабы изложение было более последовательным и плавным (в блоге ведь это в виде отдельных, почти не связанных друг с другом заметок).

Оффлайн Agens

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Тема VBA в книге вообще слабенькая. Я понимаю, что для "серьезных парней" она интереса не вызывает, но книгу, я так думаю, покупают новички, а VBA для старта - самая оптимальная среда.
Что по VBA очень много примеров, информации, что модель достаточно подробно описана - это я знаю.
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
VBA для старта - самая оптимальная среда
Субъективное мнение. Если тебе чего-то нехватает в главе по VBA, то выдавай конкретные пожелания того, чего бы тебе хотелось там найти. Это позволит автору в будущем, если будет переиздание книги, улучшить её исходный вариант за счёт добавления материала с подробным рассмотрением тем, запрошенных читателями. Книга, в конце-концов не резиновая, да и издательство накладывает чёткое ограничение на количество страниц и на сроки. Так что автору приходилось чем-то жертвовать, чтобы уложиться в очерченные рамки. На мой взгляд, оптимальным решением было бы отделение мух от котлет: каждому языку отдельная книга. По лиспу Николай Николаевич написал отличный справочник. Возможно следующей книгой по этому языку была бы кстати книга в стиле "Практика программирования на AutoLisp\Visual Lisp в AutoCAD". Аналогично в отдельные книжки лучше было бы заворачивать ARX, .NET и VBA. Но это в идеале и требует значительных усилий, а поскольку эти усилия не стоят текущего спроса, то вряд ли сие будет реализовано (ну разве что Autodesk возьмётся профинансировать работу автора).
« Последнее редактирование: 20-01-2015, 13:14:23 от Андрей Бушман »

Оффлайн Николай Полещук

  • ADN
  • *
  • Сообщений: 33
  • Карма: 9
Объем книги строго определен договором заказа. Состав тоже во многом зависит от издательства. Именно оно настояло на включении главы по VBA. Я с VBA отчасти согласен, поскольку с появлением VBA 7 возникла поддержка 64-разрядности. На это и обращено внимание в главе.
Но Autodesk, похоже, не уверен, что поддержка VBA будет продолжаться долго и все-таки рекомендует переходить на .NET.
Книги по программированию в специальной среде имеют небольшой спрос у покупателей, поэтому появление книги по одному языку в среде AutoCAD маловероятно (разве что Autodesk профинансирует).

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
разве что Autodesk профинансирует
На сцене ожидается выход Ярослава Решетникова, дабы разрешить обозначенную паузу... :)

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Вряд ли ответ на вопрос лежит в сфере ответственности Ярослава.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Agens

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Именно оно(издательство) настояло на включении главы по VBA
Чтобы увеличить число потенциальных покупателей, все правильно...
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Выделил время на 2-ю главу. Первая партия замечаний по ней:
 
Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 25
Рекомендуемой и почти обязательной средой разработки является Microsoft Visual Studio (VS) Professional.

На мой взгляд, здесь в тексте присутствует некоторая двусмысленность, согласно которой у читателя может сложиться впечатление о том, что то ли можно попытаться использовать IDE от других производителей (т.е. не Microsoft), то ли даже имея на руках версию VS Premium или VS Ultimate он всё же по каким-то причинам должен стараться использовать именно VS Professional. Наверное стоило бы уточнить, что IDE должна быть именно MS VS, а в составе конкретной линейки продуктов рекомендуется использовать не ниже чем Professional, тем самым давая понять, что более функциональные варианты (например Premium или Ultimate) так же годятся. Так же неплохо было бы пояснить читателю, чем обусловлены эти требования.

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 29
Основное окно Solution01-Microsoft Visual Studio(Администратор)...

У меня "(Администратор)" отсутствует, поскольку я никогда не работаю с правами администратора, но пользуюсь ими лишь для установки\удаления софта или в др. важных случаях, когда такие права действительно необходимы. Вы работаете из под учётной записи администратора - это конечно же Ваше личное дело однако, пусть даже и невольно, но прививать такую привычку читателю не стоит и на скринах книги "(Администратор)" присутствовать не должен (ИМХО).

Небольшая цитата из официального учебного курса Microsoft:

Цитата: Microsoft, "Разработка защищённых приложений на Visual Basic .NET и Visual C# .NET (экзамены 70-330, 70-430)" стр. 56
В наши дни нет оправдания тем, кто не использует принцип наименьших привилегий, так как все должны входить в системы под учётной записью стандартных пользователей. Чтобы использовать принцип наименьших привилегий, следуйте двум правилам:
  1. Не запрашивайте большего уровня доступа к ресурсам, чем необходимо.
  2. Создавайте файлы и разделы реестра там, где стандартные пользователи могут их изменить.

Я неоднократно сталкивался с приложениями (не системными), которые работают только из под админской учётной записи в виду того, что разрабатывавший их программист имел привычку работать с правами администратора и с этими же правами, видимо, тестировал свой код. А вот протестировать его из под обычной учётки либо не додумался, либо поленился, видимо решив, что и там всё будет успешно работать. Разработка ПО из под учётной записи обычного пользователя - общепризнанная, широко используемая мировая практика (и не только потому, что так советует Майкрософт).

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 31
Разработчикам, создающим коммерческие версии своих продуктов, необходимо компилировать и собирать проекты под обе платформы (они несовместимы друг с другом).

Т.е. если софт не является коммерческим, то такой необходимости нет? Вопрос риторический. :) Такая формулировка может сбить с толку читателя. Коммерческий это продукт или некоммерческий - роли не играет: правила "игры" одни и те же в обоих случаях. Я думаю, что корректней было бы написать так: "Разработчикам, желающим чтобы их приложение работало как в 32-х битной, так и в 64-х битной версии AutoCAD, необходимо...".

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 32
Параметр Конечное расширение (Target Extension) необходимо заменить на .arx (по умолчанию - .dll), так как это обязательно для ARX-приложений...

Данное заявление не совсем корректно... Пользователю действительно не удастся загрузить ARX приложение, имеющее произвольное расширение, при помощи диалогового окна Load\Unload Applications. Это обусловлено тем, что в настройках этого окна установлены фильтры на расширения отображаемых файлов. Однако ничто не мешает выполнить загрузку такого приложения программно: в настройках проекта я заменил .arx на .abcd, после чего смог успешно через COM API загрузить приложение в AutoCAD и использовать определённые в нём команды и lisp-функции. Код загрузки прост:

Код - C# [Выбрать]
  1. // C# code:
  2. public void Initialize() {
  3.   IAcadApplication comApp = (IAcadApplication) cad.AcadApplication;
  4.   comApp.LoadArx(@"C:\public\Debug\App01\App01_x64.abcd");
  5. }

Т.о. слово "обязательно" следовало бы заменить на "стандартно" и при этом добавить информацию о возможности программной загрузки ARX приложений с произвольными расширениями файлов (это может быть полезно, когда программист по каким-либо причинам не хочет предоставлять пользователю возможность загрузки тех или иных ARX приложений через обозначенное выше диалоговое окно).

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 33
... создаваемые файлы приложения будут накрывать друг друга.
Накрывать чем, медным тазом? :) Мне кажется слово "перезапись" было бы более к месту.

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 33
Представляет интерес параметр Набор инструментов платформы (Platform Toolset). Это номер версии используемого компилятора. Обычное значение - v100 (соответствует версии 10 компилятора, необходимого для ObjectARX2013-2014).

Неплохо было бы пояснить, что если на компьютере установлены, к примеру, VS 2008-2013, то для разработки ARX приложений, которые требуют одну из этих версий VS, при желании можно использовать даже самую новую версию (VS 2013 на сегодняшний день) при условии, что свойству Platform Toolset назначена корректная версия компилятора. Т.е. разработчик сможет использовать более современную IDE, а уж msbuild.exe для компиляции воспользуется именно той версией компилятора, которая указана в обозначенном выше свойстве. Т.е. в данном месте была бы полезна ссылка на стр. 52.

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 36
Если вы посмотрите параметр Свойства конфигурации => С/С++ => ...

В VS 2013 обозначенная группа свойств по умолчанию присутствует, но в VS 2010, используемом согласно тексту книги, она отсутствует. Группа настроек С/С++ появляется в VS 2010 сразу после добавления в проект первого CPP файла. Возможно, что такое поведение будет наблюдаться и у др. читателей и об этом следует предупредить заранее, дабы не оставлять их в замешательстве.

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 37
Примечание. Предлагаемые в примере настройки не работают в VS 2012 и ObjectARX 2015.

Это здорово... :) Но если уж сказано "А", то тут же хотелось бы услышать и "Б": почему они не работают и что нужно сделать, чтобы заработали? Или же нужна ссылка на стр. где это будет объяснено позднее. Оставлять читателя в недоумении - не самый лучший ход.

Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 41
Теперь к проекту необходимо добавить файл определений имён функций, экспортируемых из DLL (такой файл должен быть с расширением .def).

Строго говоря, это не является "необходимостью", но является лишь одним из возможных способов сообщения линковщику списка экспортируемых функций. Я полагаю, что имеет смысл показать читателю ещё один вариант, дабы он для себя сам решил, каким способом ему пользоваться. Далее, собственно, показан альтернативный вариант...

В конце заголовочного файла dbxEntryPoint.h определена следующая директива условной компиляции:

Код - C++ [Выбрать]
  1. //- This line allows us to get rid of the .def file in ARX projects
  2. #if !defined(_WIN64) && !defined (_AC64)
  3. #pragma comment(linker, "/export:_acrxGetApiVersion,PRIVATE")
  4. #else
  5. #pragma comment(linker, "/export:acrxGetApiVersion,PRIVATE")
  6. #endif

Неплохо было бы обратить внимание читателя на то, что в данном коде для Win32 имя экспортируемой функции начинается с символа подчёркивания. Включив обозначенный заголовок в наш код, мы тем самым выполняем тот самый экспорт обозначенной в коде функции acrxGetApiVersion (или _acrxGetApiVersion). Остаётся выполнить экспорт функции acrxEntryPoint (её имя одинаково для Win32 и x64). В обозначенном выше файле заголовка присутствует макрос IMPLEMENT_ARX_ENTRYPOINT_STD, посредством которого, видимо Wizard выполняет регистрацию acrxEntryPoint, предварительно сгенерировав некий вспомогательный класс, имя которого и передаёт параметром макросу. Можно попробовать самому написать такой класс, после чего воспользоваться обозначенным макросом, либо, как наиболее простой вариант - создать и подключить такой заголовочный файл:

Код - C++ [Выбрать]
  1. /* exports.h */
  2. #pragma once
  3. //- This line allows us to get rid of the .def file in ARX projects
  4. #pragma comment(linker, "/export:acrxEntryPoint,PRIVATE")

Т.о. после подключения заголовочных файлов dbxEntryPoint.h и exports.h необходимость в DEF файле исчезает. Если позднее потребуется экспортировать какие-то дополнительные функции, то всегда можно добавить соответствующие записи в файл exports.h.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Начну с конца. Вместо использования
Код - C++ [Выбрать]
  1. #pragma comment(linker, "/export:acrxEntryPoint,PRIVATE")
Можно использовать __declspec(dllexport):
Код - C++ [Выбрать]
  1. extern "C" AcRx::AppRetCode __declspec(dllexport) acrxEntryPoint (AcRx::AppMsgCode msg, void *pkt)
  2. {
  3.   //...
  4. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Цитата: MSDN, Exporting from a DLL Using __declspec(dllexport)
Because there is no standard specification for name decoration, the name of an exported function might change between compiler versions.
Насколько мне известно, такой стандарт существует. Там же указаны и те, кто участвовал в его разработке:
Цитировать
This document was developed jointly by an informal industry coalition consisting of (in alphabetical order) CodeSourcery, Compaq, EDG, HP, IBM, Intel, Red Hat, and SGI. Additional contributions were provided by a variety of individuals.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Пользователю действительно не удастся загрузить ARX приложение, имеющее произвольное расширение, при помощи диалогового окна Load\Unload Applications. Это обусловлено тем, что в настройках этого окна установлены фильтры на расширения отображаемых файлов.
Вообще-то и в этом окне можно выбрать файлы с другим расширением. Достаточно в строке "Имя файла" указать что-нибудь типа *.* и нажать Загрузка (Load). Только AutoCAD не поймёт как его грузить. Кстати, кроме расширения arx может быть еще и crx и dbx. И грузить вне зависимости от расширения можно еще при помощи (arxload ...) в lisp, или DynamicLinker.LoadApp, или DynamicLinker.LoadModule, или HostApplicationServices.LoadApplication в AutoCAD .NET API
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение