Создание плагинов для AutoCAD с помощью .NET API (часть 1 – первые шаги)

Hello, Habr!

Решил рассказать о своем опыте работы с AutoCAD. Может быть, кому-то это поможет – ну или хотя бы интересным покажется.

public static string disclaimer = "Автор не является профессиональным разработчиком и не обладает глубокими знаниями AutoCAD. Этот пост – просто небольшой рассказ о начальном этапе создания плагина.";


Предыстория


Началось все достаточно просто: в очередной раз почувствовав острую нехватку денег, я решил, что пора бы уже начать их где-нибудь разыскивать. И вот после пары недель поиска на «Фрилансим» обнаружилась вакансия разработчика для создания программы, взаимодействующей с AutoCAD.

Скажу сразу: до того дня общаться с AutoCAD мне не доводилось. Однако объявление содержало в себе фразу «Опыт работы не требуется», которая наполнила мою душу надеждой. Я связался с разместившим вакансию человеком и получил тестовое задание.

Для пробы предлагалось создать на чертеже пару объектов, а также вывести текст. Несколько дней я искал информацию об API и пытался подружиться с непривычной программой. В конце концов фигуры были нарисованы, текст выведен, а тестовое задание отправлено на проверку. И через несколько дней я неожиданно узнал, что принят! Чудеса, да и только.

В следующих абзацах – мои впечатления, синяки и шишки, мысли и советы (возможно, вредные). Разработка велась под AutoCAD 2010, в качестве IDE использовалась верная Visual Studio 2013 Express. Язык разработки – C#.

1. Подготовка необходимых инструментов


1.1. Собственно AutoCAD

Тут все понятно. Качайте с официального сайта Autodesk, ставьте, 30 дней наслаждайтесь прекрасным инструментом. Потом узнайте цену покупки и повесьтесь. Для разработчиков действует специальная программа ADN, по которой можно получать девелоперские лицензии на продукты Autodesk. Стоимость базовой версии подписки, как указано на сайте, составляет от 700 долларов в год.

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

Последние три-четыре версии библиотек можно бесплатно скачать тут после регистрации. Более ранние придется поискать – скажем, тут. На всякий случай продублирую список прямо здесь – не такой уж он и длинный:

ссылки для загрузки ObjectARX SDK для версий AutoCAD 2000 – 2011
Версия SDK и ссылка для загрузки Совместимость с версиями AutoCAD
2011 2011, 2012
2010 2010, 2011, 2012
2009 2009
2008 x86 2008, 2009 x86
2008 x64 2008, 2009 x64
2007 2007, 2008, 2009 x86
2006 2006
2005 2005, 2006
2004 2004, 2005, 2006
2002 2002
2000i 2000i, 2002
2000 2000, 2000i, 2002
R14 R14

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

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

1.3. MS Visual Studio 2013 Express

Великолепная IDE! Больше про нее и говорить-то нечего. Ссылок для скачивания масса – например, вот.

Можно, конечно, использовать и более ранние версии. Я начинал работу над проектом в MS Visual Studio 2010, но потом решил перейти на более современный выпуск.

1.4. Поисковик, усидчивость, здравый смысл

У меня был не такой большой опыт программирования – я привык решать простые задачи, для которых за глаза хватало средств самой платформы .NET. И первое мое знакомство с программированием под AutoCAD вышло не очень простым. Неприятной неожиданностью оказалось то, что у классов для работы с AutoCAD:
  • нет привычных всплывающих подсказок о назначении класса, свойства или метода;
  • нет подробной справки.

В итоге информацию я черпал из файлов помощи Object ARX (у меня они установлены в папку с именем C:\ObjectARX 2010\docs), а также из многочисленных форумов, блогов и сообществ разработчиков AutoCAD. Признаться, больше помогало последнее, чем первое. :)

В конце этой статьи приведен список ресурсов, на которых можно позадавать вопросы и, если повезет, получить на них ответы.

2. Создание проекта библиотеки


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

Вкратце продублирую основные этапы:

2.1. Создать проект «Библиотека классов» («Class Library»)

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

При понижении версии .NET Framework, используемой в проекте, могут появляться сообщения об ошибках. В моем случае Visual Studio ругается на отсутствие сборки «Microsoft.CSharp» – ее просто нужно исключить из ссылок (References).

2.2. Добавить ссылки на необходимые библиотеки AutoCAD .NET API

На этом пункте стоит остановиться чуть подробнее. AutoCAD .NET API включает в себя достаточно большое количество классов, которые разнесены по разным пространствам имен (namespaces). В свою очередь, эти пространства имен разнесены по нескольким контейнерам (проще говоря, DLL-файлам).

Эти DLL-файлы находятся в папке с именем inc-<наименование_архитектуры>. Так, в моем случае я добавляю ссылки на библиотеки из папки C:\ObjectARX 2010\inc-win32.

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

Первое знакомство с API у меня заключалось в лихорадочных попытках скомпилировать хоть какой-нибудь из примеров, щедро разбросанных по Сети. И что сλка характерно, компилироваться они упорно не хотели, ругаясь на неизвестные пространства имен и классы. В попытках собрать свой первый проект я с горя включил в него чуть ли не все DLL-файлы, которые шли с ObjectARX. Плохой способ – так делать не надо.

А как надо?
Ну, это вопрос не ко мне. Я только могу сказать, что в начале примеров обычно идет перечисление используемых пространств имен – скажем, так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Autodesk.AutoCAD.Runtime;
using Autodesk.Windows;

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

А пока – вот список DLL-файлов, которые я использую в проекте, и содержащихся в них пространств имен:

Контейнер «AcMgd» (файл «AcMgd.dll»):
  • Autodesk.AutoCAD.ApplicationServices
  • Autodesk.AutoCAD.EditorInput
  • Autodesk.AutoCAD.GraphicsSystem
  • Autodesk.AutoCAD.Internal
  • Autodesk.AutoCAD.Internal.Calculator
  • Autodesk.AutoCAD.Internal.DatabaseServices
  • Autodesk.AutoCAD.Internal.Forms
  • Autodesk.AutoCAD.Internal.PreviousInput
  • Autodesk.AutoCAD.Internal.PropertyInspector
  • Autodesk.AutoCAD.Internal.Reactors
  • Autodesk.AutoCAD.Internal.Windows
  • Autodesk.AutoCAD.PlottingServices
  • Autodesk.AutoCAD.Publishing
  • Autodesk.AutoCAD.Runtime
  • Autodesk.AutoCAD.Windows
  • Autodesk.AutoCAD.Windows.Data
  • Autodesk.AutoCAD.Windows.ToolPalette

Контейнер «AcDbMgd» (файл «AcDbMgd.dll»):
  • Autodesk.AutoCAD.Colors
  • Autodesk.AutoCAD.ComponentModel
  • Autodesk.AutoCAD.DatabaseServices
  • Autodesk.AutoCAD.DatabaseServices.Filters
  • Autodesk.AutoCAD.Geometry
  • Autodesk.AutoCAD.GraphicsInterface
  • Autodesk.AutoCAD.GraphicsSystem
  • Autodesk.AutoCAD.LayerManager
  • Autodesk.AutoCAD.Runtime

Контейнер «AdWindows» (файл «AdWindows.dll»):
  • Autodesk.Internal.InfoCenter
  • Autodesk.Internal.Windows
  • Autodesk.Internal.Windows.ToolBars
  • Autodesk.Private.InfoCenter
  • Autodesk.Private.SubAwareService
  • Autodesk.Private.WebSearchService
  • Autodesk.Private.Windows
  • Autodesk.Private.Windows.ToolBars
  • Autodesk.Private.WsCommCntrLib
  • Autodesk.Windows
  • Autodesk.Windows.Common.Utilities
  • Autodesk.Windows.ToolBars

Контейнер «AcCui» (файл AcCui.dll»):
  • Autodesk.AutoCAD.Customization

NB:
имена многих классов AutoCAD .NET API совпадают с именами стандартных классов .NET, что не очень удобно. Например, если обратиться в коде к классу Application, то Visual Studio выругается на неоднозначность этого определения: класс с таким именем есть как в пространстве имен System.Windows, так и в пространстве имен Autodesk.AutoCAD.ApplicationServices. Чтобы не писать каждый раз полное имя, можно добавить в начало файла строку

using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;

Теперь в любом месте этого файла можно вместо Autodesk.AutoCAD.ApplicationServices.Application писать acadApp.

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


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

2.3. Написать код плагина

using System.Windows.Forms;
using Autodesk.AutoCAD.Runtime;

namespace MyAutoCADDll
{
    public class Commands : IExtensionApplication
    {
        // функция инициализации (выполняется при загрузке плагина)
        public void Initialize()
        {
            MessageBox.Show("Hello!");
        }

        // функция, выполняемая при выгрузке плагина
        public void Terminate()
        {
            MessageBox.Show("Goodbye!");
        }

        // эта функция будет вызываться при выполнении в AutoCAD команды «TestCommand»
        [CommandMethod("TestCommand")]
        public void MyCommand()
        {
            MessageBox.Show("Habr!");
        }
    }
}

Все очень просто. Вначале мы указываем необходимые пространства имен. Нам потребуются два.

В первом пространстве имен (System.Windows.Forms) хранится описание класса MessageBox, с помощью которого мы будем выводить сообщения. Чтобы сделать его доступным, необходимо добавить ссылку на одноименную сборку .NET.

Во втором пространстве имен (Autodesk.AutoCAD.Runtime) определены интерфейс IExtensionApplication и атрибут CommandMethod. Причем описание IExtensionApplication находится в файле AcDBMgd.dll, а описание CommandMethod – в файле AcMgd.dll, поэтому придется добавить ссылки на обе эти библиотеки.

Таким образом, всего необходимо добавить три ссылки:





UPD. 09.04.2018. Важное дополнение от lasteran: В новых версиях (предположительно начиная с AutoCAD 2013) класс CommandMethod содержится не в AcDBMgd.dll, а в AcCoreMgd.dll, так что придётся добавить ссылку ещё и на эту библиотеку. Учтите это, если работаете с новой версией!

Затем мы объявляем класс Commands. Именно он и будет «отправной точкой» плагина. Наш класс унаследован от интерфейса IExtensionApplication, поэтому в нем могут быть реализованы методы Initialize и Terminate. Первый из них автоматически выполняется при загрузке плагина, второй – при выгрузке.

NB:
AutoCAD не предоставляет разработчику возможность выгрузить плагин после того, как он будет загружен. Поэтому реально метод Terminate будет вызываться только в одном случае – при закрытии самого AutoCAD.

Почитать поподробнее про методы Initialize и Terminate можно тут (rus) и там (англ.).

Наконец, мы объявляем функцию MyCommand, которая будет реализовывать команду AutoCAD. Она обязательно должна ничего не принимать на вход и ничего не возвращать на выходе (не знаю, откуда у меня взялось это убеждение, но оно есть). Внутри этой функции можно делать все, что заблагорассудится (в пределах разумного, конечно), причем есть возможность работать как с AutoCAD .NET API, так и со стандартными классами .NET. Например, можно создать обычную форму Windows с полями ввода, отобразить ее на экране с помощью ShowModal(), а затем на основе введенных пользователем данных внести изменения в открытый в AutoCAD чертеж.

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

После сборки этого проекта у нас получится готовый к употреблению плагин.

2.4. Загрузить созданный плагин

Нужно запустить AutoCAD и выполнить команду «NETLOAD»:




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




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




Если при загрузке плагина произошла критическая ошибка, она будет выведена в консоль AutoCAD:



Сообщения обычно понятные – помогут разобраться, если случай не сильно клинический. :)

NB:
если плагин не смог загрузиться из-за ошибки, то перед тестированием очередного (исправленного) варианта нужно закрыть и заново запустить AutoCAD. В противном случае он может отказаться загружать плагин, даже если ошибок в коде уже не будет.

Теперь, когда плагин загружен, можно выполнить нашу тестовую команду:




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



Работает. Теперь можно закрывать AutoCAD.

А как же…
Да – внимательный читатель, конечно, заметит, что при закрытии AutoCAD мы почему-то не увидим сообщения «Goodbye». Как уже говорилось выше, внутри функции «Terminate» можно сделать далеко не все. Но с ее помощью вполне получится, например, создать файл при закрытии AutoCAD.

2.5. Отладить плагин (при необходимости)

Процедура запуска плагина для отладки очень хорошо расписана в этом посте Tepliuk.

Финал


Ну что же – для первого раза достаточно. Осталось привести обещанные ссылки. В посте Namolem и посте n00buK уже приведен большой объем источников; часть из них я продублирую здесь.

  1. http://adn-cis.org/forum/ (rus) – форум Сообщества программистов Autodesk в СНГ. Один из лучших русскоязычных ресурсов среди всех мною встреченных в 2013-2014 годах. Сам я туда прихожу за советом, когда совсем припекает, – и не было пока случая, чтобы мне не помогли. Хотя я, конечно, стараюсь особо не злоупотреблять.
  2. http://forums.autodesk.com/t5/russkoe-soobshchestvo/bd-p/392 (rus) – официальные форумы Autodesk – раздел русского сообщества. Можно позадавать вопросы.
  3. http://forums.autodesk.com/t5/net/bd-p/152 (англ.) – официальные форумы Autodesk – раздел, посвященный .NET API. Тоже можно задать вопрос – правда, его могут и проигнорировать.
  4. http://through-the-interface.typepad.com (англ.) – блог, который ведет Kean Walmsley, один из ведущих экспертов в разработке под AutoCAD. Ценнейший ресурс. Можно попробовать что-нибудь спросить у самого хозяина блога – и даже получить ответ, если тот будет в настроении. Впрочем, неинтересные (и простые) вопросы Kean часто игнорирует – или же предлагает вопрошающему поискать решение на официальном форуме (см. рис. 1).
  5. http://adndevblog.typepad.com (англ.) – коллективный блог разработчиков из ADN. Порой бывает полезен.
  6. http://www.theswamp.org/index.php (англ.) – еще один форум со множеством примеров и решений.

На этом моя статья закончена. Если ее признают годной – напишу еще несколько простых заметок о том, с чем сталкивался, как-то:
  • работа с лентой (Ribbon);
  • работа со слоями;
  • работа с динамическими блоками;
  • реализация пользовательского ввода;
  • взаимодействие плагина с внешним приложением.

Спасибо за внимание!
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

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

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

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

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

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

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

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

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

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

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


          0
          Как-то раз заказчик спросил: «А с какими версиями 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. Мы должны увидеть первое сообщение:


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

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


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

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

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

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

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое