Как стать автором
Обновить

Комментарии 14

1. SDK можно не качать, т.к. все нужные сборки лежат в папке с самим установленным ACad-ом. Раньше в SDK еще были годные мануалы, но, по-моему, версии с 2013 их выпилили в онлайн. Печалька.

2. Обратная совместимость работает фигово, поэтому лучше компилить несколько версий под разные ACad-ы. Иногда, и переписывая часть кода. Вывод — без работы не останетесь.

3. Грузить плагины через NETLOAD чрез меры утомительно. Лучше прописывать в реестр. Раз и навсегда. Хотя, да, причин отвала в таком случае в консоли не увидите.

4. Судя по скрину выбора файла, все афтокадовские сборки в рефах у вас помечены как Copy to Local. НИКОГДА так не делайте. Глюкать при отладке будет — мама, не горюй!

Ну а вообще, конечно, соболезную. Столько костылей, сколько мне пришлось сгородить за время моей недолгой работы с этим чудом инженерной мысли, я никогда в жизни не писал. 1С нервно курит в сторонке.
3. Про реестр все так — не стал здесь это упоминать, чтобы не загромождать статью. В проекте я AutoCAD запускаю из внешнего приложения — соответственно, NETLOAD выполняю программно, поэтому пользователю ничего загружать не приходится.
4. Мой недосмотр. В рабочем проекте, конечно, опция CopyLocal отключена. Добавлю этот момент в пост. Сейчас только картинку в Пэйнте отфотошоплю.)
5. Самая больная часть работы, надеюсь, уже осталась позади.) То, что я от AutoCAD хотел, он вроде делает. Больше вроде пока не надо.)
Спасибо за комментарий!
5. Хорошо, раз так. Но есть подозрение, что пока хотите мало и не всё. :)
Потом узнайте цену покупки и повесьтесь.

Ну как не среагировать на такую подачу? Приведённый пример будет прекрасно работать и под бесплатным nanoCAD.

Попробуйте пересобрать пример, заменив пространство имён Autodesk.AutoCAD на HostMgd, как описано в статье "САПёР на полях САПР". Поскольку используется VS2013, не забудьте выставить TargetFramework=v3.5.

А там, глядишь, и до упомянутой программы для заказчика дело дойдёт.
Может, в будущем попробую, если время будет. Но пока и над текущей задачей еще работать и работать.)
Были случаи когда мы с помощью нанокада лечили файлы автокада.

СапЁр напомнил мое баловство, пользуясь случаем похвастаюсь )


Как-то раз заказчик спросил: «А с какими версиями AutoCAD сможет работать программа?», и мне пришлось изрядно времени потратить на поиски ответа. В целом, ответ звучит так: «Autodesk поддерживает обратную совместимость в течение трех лет».


Обозначенный ответ не имеет никакого отношения к обозначенному вопросу. Обозначенный ответ относится к расширениям, написанным на C++. Для .NET расширений действуют иные «правила игры».

ObjectARX SDK – набор библиотек, необходимых для работы с AutoCAD.


Неверно. Это набор библиотек, необходимых для написания расширений под AutoCAD (почувствуй разницу). Работать с AutoCAD можно и через COM, используя позднее связывание — в этом случае ObjectARX SDK не используется вовсе.

>Пока задачи перекомпилировать программу с другими библиотеками у меня не возникало. Думаю, что это хорошо: перспектива создавать отдельную версию продукта для других выпусков AutoCAD не радует совершенно.

Здесь, в комментарии от 11 сентября 2014 г. 12:19 рассказано, как это решается «малой кровью».

«AutoCAD .NET Wizard» – шаблон проекта для создания плагинов под AutoCAD. Люди знающие говорят, что этот шаблон сильно упрощает жизнь;


Это утверждение справедливо скорее к Wizard для C++, чем для .NET. Лично я при создании .NET расширений под AutoCAD предпочитаю не юзать «визард»…

Если плагин предназначен для старой версии AutoCAD, то целесообразно сразу же задать в свойствах проекта версию .NET, которую будем использовать.


Версию .NET целесообразно задавать в любом случае. Информация о совместимости приведена здесь

>Эти DLL-файлы находятся в папке с именем inc-<наименование_архитектуры>.

В более свежих версиях AutoCAD часть управляемых DLL находится в подкаталоге inc.

у меня дома установлена 32-разрядная ОС, у заказчика – 64-разрядная. Пока серьезных проблем с совместимостью не возникало. Но однажды я все же напоролся на то, что у меня функция возвращала Int32, а у заказчика – Int64. Линковщик ОЧЕНЬ расстраивался. Нужно иметь эту особенность в виду.


Рекомендую почитать это

Исчерпывающего перечня сопоставлений я найти не смог, поэтому все проверялось методом научного тыка. Если есть более правильный способ, было бы интересно его узнать…


Плохой «способ\метод». «Исчерпывающий перечень» тебе и не нужен — подключать следует только то, что тебе действительно необходимо. Как правило, это acdbmgd.dll, acmgd.dll, (acoremgd.dll — для AutoCAD 2013 или новее). Почитай это

обязательно запретите копирование библиотек AutoCAD .NET API в каталог сборки при построении проекта! Для этого найдите в свойствах каждой добавленной ссылки параметр CopyLocal и установите его в False.


Это смотря какие библиотеки подключаются… Почитай на тему TLB файлов здесь

Например, можно создать обычную форму Windows с полями ввода, отобразить ее на экране с помощью ShowModal()


Плохой способ, т.к. в этом случае существует вероятность в AutoCAD поймать Fatal Error. Вместо этого следует пользоваться статическими методами класса Autodesk.AutoCAD.ApplicationServices.Application: для WPF это методы ShowModalWindow и ShowModelessWindow, а для WinForms — методы ShowModalDialog и ShowModelessDialog.

Чтобы «превратить» созданный метод в команду AutoCAD, применяется атрибут CommandMethod. В скобках после него указывается имя создаваемой команды, которое можно будет использовать непосредственно в среде AutoCAD.


По хорошему, «в скобках» должно указываться гораздо больше информации, которая определяет контекст работы команды (приложение или документ), локализованное имя команды, а так же связь с соответствующим разделом справочной системы. Альтернативный, более гибкий вариант управления локализациями команд AutoCAD обозначен здесь

Затем в открывшемся окне указать путь к файлу плагина:


отсутствует изображение.

После этого плагин будет загружен в AutoCAD. Мы должны увидеть первое сообщение:


отсутствует изображение.

… и увидеть результат:


отсутствует изображение.
Спасибо за комментарий!
Хотелось бы прояснить несколько моментов.
1.
В целом, ответ звучит так: «Autodesk поддерживает обратную совместимость в течение трех лет».
Для .NET расширений действуют иные «правила игры».
Подскажите, а где можно почитать про обратную совместимость версий именно для .NET-плагинов?

2.
ObjectARX SDK – набор библиотек, необходимых для работы с AutoCAD.
Неверно. Это набор библиотек, необходимых для написания расширений под AutoCAD (почувствуй разницу).
Разница прочувствована.) Но в статье рассматривалось именно создание плагина, поэтому я и употребил такую формулировку.

3.
у меня дома установлена 32-разрядная ОС, у заказчика – 64-разрядная. Пока серьезных проблем с совместимостью не возникало.
Рекомендую почитать это
Про «заглушки» я не вполне осмыслил. Получается, что для AutoCAD до 2011 версии рекомендуется создавать две отдельные сборки проекта — под x86 и x64, иначе возможны проблемы?

4.
Исчерпывающего перечня сопоставлений я найти не смог, поэтому все проверялось методом научного тыка.
«Исчерпывающий перечень» тебе и не нужен — подключать следует только то, что тебе действительно необходимо.
Конечно, я подключаю не все библиотеки, а только необходимый минимум. Но проблема в том, что у меня не сразу получается понять, какой из DLL-файлов содержит нужное мне пространство имен. Вот, к примеру, возьмем тот же самый атрибут CommandMethod. Где можно посмотреть, в каком из DLL-файлов он находится?

5.
следует пользоваться статическими методами класса Autodesk.AutoCAD.ApplicationServices.Application
С ShowModal() я, похоже, действительно дал маху. Попробую исправить в проекте на ShowModalDialog(), если все получится — исправлю и в статье.

6. Все картинки у меня открываются — думаю, это был временный глюк habrastorage.org.

P. S. Хочу вас поблагодарить за пример с созданием плавающей панельки — на его базе получилось очень удобное меню.
Вот, к примеру, возьмем тот же самый атрибут CommandMethod. Где можно посмотреть, в каком из DLL-файлов он находится?
Сперва найти строку «CommandMethod» в тексте одной из .dll библиотек, потом открыть найденную библиотеку в ILSpy или .NET Reflector.
Вы не могли бы уточнить, что значит «найти строку «CommandMethod» в тексте одной из .dll библиотек»? Я так понимаю, что нужно просто текстовым редактором (к примеру) найти в DLL-файле строку CommandMethod?
Но я же заранее не знаю, в каком файле она находится. С тем же успехом можно добавить в проект все библиотеки (атрибут CommandMethod гарантированно будет определен в одной из них), а потом уже в IDE найти нужный файл через пункт меню Перейти к определению (Go to Definition).
Такое чувство, что я чего-то недопонимаю.
просто текстовым редактором (к примеру) найти в DLL-файле строку CommandMethod?
Именно так. Но этот способ, скорее, не для того, чтобы выбросить лишние ссылки, а чтобы найти где смотреть как оно устроено.
Подскажите, а где можно почитать про обратную совместимость версий именно для .NET-плагинов?

Здесь я перечислил четыре пункта, выполнение которых существенно повышает вероятность совместимости. Официальной информации по этому вопросу нет, насколько мне известно. То, что я пишу — основано на собственном опыте.
Про «заглушки» я не вполне осмыслил. Получается, что для AutoCAD до 2011 версии рекомендуется создавать две отдельные сборки проекта — под x86 и x64, иначе возможны проблемы?

Вы невнимательно читали указанную мною ссылку — я ведь там пояснил, в каких случаях сборку можно компилировать как AnyCPU, а в каких собирать отдельно под x86 и x64. Пояснение: управляемые DLL файлы, подключаемые из Object ARX SDK я называю «заглушками» по той причине, что в процессе работы Ваше расширение будет использовать не их (Copy Local = False), но реальные одноимённые DLL файлы из каталога AutoCAD. Заглушки, как правило, не совпадают с «боевыми» DLL по размеру, что наводит на мысль, что они не идентичны по составу.
Спасибо за разъяснение.
Например, можно создать обычную форму Windows с полями ввода, отобразить ее на экране с помощью ShowModal()
Плохой способ, т.к. в этом случае существует вероятность в AutoCAD поймать Fatal Error. Вместо этого следует пользоваться статическими методами класса Autodesk.AutoCAD.ApplicationServices.Application: для WPF это методы ShowModalWindow и ShowModelessWindow, а для WinForms — методы ShowModalDialog и ShowModelessDialog.

Тут дело даже не в Fatal Error, а в том, что упомянутые статические методы собирают список окон, которые автоматически закрываются при вызове Editor.GetPoint() и подобных функций.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории