Как сделать bind autocad

Обновлено: 05.07.2024

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

Предыстория

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

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

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

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. Поисковик, усидчивость, здравый смысл
  • нет привычных всплывающих подсказок о назначении класса, свойства или метода;
  • нет подробной справки.

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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



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

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

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

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

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

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

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

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




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




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


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

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




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


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

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

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


Одно из часто требуемых при черчении действий - поиск и создание замкнутых контуров из имеющихся линий. Это действие производит в AutoCAD каждый, кто создает штриховки, кому нужны контуры площадных объектов для подсчета площадей, для формирования площадных объектов, для передачи данных в другое ПО и т.п.

Для решения этой задачи в AutoCAD предназначена команда _BOUNDARY (КОНТУР) или _BPOLY (КПОЛИ). Появилась команда BOUNDARY примерно в 1999 году (плз, знатоки, поправьте), т.е. примерно 17 лет назад.

Команда _BOUNDARY решает свою задачу в двух основных вариантах:

1. Pick Points (Указание точек) - по указанным точкам ищет ближайшие замкнутые контуры из окружающих графических элементов,

2. Boundary set (Набор объектов контура) - ищет замкнутые контуры, образуемые указанными графическими элементами, и создает из них нужные контуры после указания внутри них точек.

Но с _BOUNDARY в варианте запуска Pick Points (Указание точек) есть проблемы с момента ее появления и до сих пор, все эти 17 лет. В варианте запуска Pick Points (Указание точек) - создаются неточные или неполные контуры, часто очень медленно - минуты и десятки минут, и не всегда вообще создаются даже при нормальной возможности:

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

Причина этого заложена, вероятно, в алгоритме команды - поиске с использованием экранных координат графических элементов, т.е. зависящих от степени увеличения и детализации элементов. Кроме того, возможно, используется метод Flood ("затопление"), что тоже приводит к неточностям и/или затруднениям.

Проблема эта, очевидно, проявлялась с самого начала, но в корректном, быстром и надежном варианте команда BOUNDARY до сих пор в AutoCAD не появилась.

Судя по мнениям некоторых программистов и общим соображениям, данная задача только кажется несложной, а в действительности требует непростых и нетривиальных решений. И даже может казаться для общего случая нерешаемой. Например, для общего случая можно предположить, что решение задачи для построения уже одного контура требует анализа всех элементов модели. Которая может содержать десятки и сотни тысяч графических элементов. Тем не менее есть пример ряда "клонов" AutoCAD, в которых задача BOUNDARY в варианте указания точек решена корректно и полно. И существуют качественные решения сторонних программистов под AutoCAD.

Я начал искать решения этой задачи под AutoCAD примерно в 2007-2008 годах, т.е. уже 9-10 лет назад.

В тот период я нашел три готовых альтернативных решения задачи BOUNDARY, причем одно из них от самого Autodesk и для AutoCAD!

Первое решение от индийской компании DeliCAD - FlashPolygon, платное. Это не решение для варианта указания точек, но быстрое, полное и точное построение всех возможных замкнутых контуров из всех указанных графических элементов. Не зависит от видимости всех элементов, увеличения и т.п.

Второе решение от знакомого программиста - BNDR, но оно, увы, практически недоступно. Работает в варианте указания точек, и тоже быстрое, полное и точное. Не зависит от видимости всех элементов, увеличения и т.п.

Третье решение от Autodesk и для AutoCAD Map 3D - создание площадных топологических моделей с возможностью выгрузки контуров всех площадей. Это тоже не решение для варианта указания точек, но тоже быстрое, полное и точное. Хотя и требующее специфической тщательной подготовки исходных графических элементов - запрет на дублирование, на непримыкания, разбивание на пересечениях и т.п. Не зависит от видимости всех элементов, увеличения и т.п.

Решения от DeliCAD и в Map 3D не позволяют указывать нужную площадь точкой, но они могут быть основой алгоритма для варианта с указанием точек.

Решение от DeliCAD, вероятно, самое давнее, приблизительно с 2002-2004 г. или ровесник AutoCAD Map 3D.

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

Но мне уже в 2009 г. стало понятно, что задача BOUNDARY для AutoCAD вполне практически решаема.

В конце 2014 г., увидев программу TotalBoundary, я связался с ее автором и в т.ч. мы обсуждали и вопрос о создании альтернативы BOUNDARY, но в основном в гипотетическом плане.

  • работает и в варианте указания точек, и в варианте создания всех возможных контуров из указанных графических элементов,
  • позволяет создавать вместо контуров штриховки,
  • работает очень быстро, полно и точно,
  • бесплатное,
  • автор доступен для отзывов и предложений.

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

Считаю, что появление SuperBoundary - событие. Решена, хоть и не впервые, задача, которой уже 17 лет, задача по мнению программистов сложная или очень сложная, ее решение позволяет выстраивать работу с применением надежного и точного решения. Я, безусловно, пристрастен, т.к. вижу большую пользу от такого инструмента для процесса формирования, описания площадных объектов, штрихования и заполнения контуров, которые необходимы для нашей продукции. Но на мой взгляд это событие сравнимо с решением гипотезы Пуанкаре или теоремы Ферма. В автокадовском, конечно, масштабе.

Предположу, что и "мощный движок" тоже есть достижение, и он применим для многих других задач, требующих обработки больших моделей. Что автор уже делает, выпуская соответствующие другие программы. Возможно, что и этот "движок" не совершенен, но с ним обработку данных можно производить быстрее, и, вероятно, и его можно улучшать.

Кому-то может не нравиться автор SuperBoundary, кому-то способ установки этой программы, окно программы, отсутствие командного режима и т.п., но сейчас автор программы открыт для доработок и улучшений, и многое можно изменить. И, повторюсь, я точно предвзят, т.к. заинтересован, но появление SuperBoundary, по-моему, и событие, и достижение.

И мне совсем непонятно, почему Autodesk за столько лет не предпринял для исправления пороков BOUNDARY соответствующих усилий. Вплоть до приобретения готовых решений у сторонних программистов - у DeliCAD, сейчас SuperBoundary и т.п. Или перенести решения из вертикального приложения в базовый AutoCAD. По-моему, лучшее и всех устроившее бы решение - качественное решение от самого Autodesk.

Особая роль в диалоговом окне Xref Manager (Диспетчер внешних ссылок) отводится кнопке Bind (Внедрить), которая внедряет внешнюю ссылку, т. е. преобразует ссылку в блок текущего рисунка. До внедрения внешней ссылки имена таких элементов, как слои, типы линий, описания блоков, текстовые стили и размерные стили, содержали в текущем рисунке в качестве префикса имя файла, на который сделана ссылка. Например, после вставки внешней ссылки SPCA Site Plan в текущем рисунке образовались слой SPCA Site Plan|A-PILLARS и тип линии SPCA Site Plan|BDY2, поскольку в файле-источнике был слой A-PILLARS и тип линии BDY2. Преобразование ссылки в блок может быть выполнено двумя способами: внедрением (со сложными именами внедряемых элементов, содержащими имя файла-источника в качестве префикса) и слиянием (имена не сохраняют обозначения файла-источника).

Кнопка Bind (Внедрить) вызывает диалоговое окно Bind Xrefs (Внедрение ссылок) (рис. 7.27), в котором с помощью переключателя нужно выбрать способ преобразования внешней ссылки.


Рис. 7.27. Диалоговое окно Bind Xrefs

В случае выбора положения Insert (Слияние) имена элементов (слоев, типов линий, описаний блоков, текстовых стилей и размерных стилей) переносятся в таком же виде, в каком они были в файле-источнике. Этот вариант дает результат, аналогичный результату действия команды INSERT (ВСТАВИТЬ) при вставке файла в текущий рисунок.

В случае выбора положения Bind (Внедрение) имена внедряемых символов преобразуются по схеме: из blockname(symbolname в blockname$n$symbolname, причем обычно $n$ заменяется на $0$ (если возникают повторения имен, то AutoCAD последовательно пытается заменить n на 1, 2 и т. д.). Если вернуться к примеру с внешней ссылкой SPCA Site Plan, то слой SPCA Site Plan|A-PILLARS после внедрения преобразуется в SPCA Site Plan$0$A-PILLARS, а тип линии SPCA Site Plan|BDY2 – в SPCA Site Plan$0$BDY2.

Команда XBIND (ВНЕДРИТЬ) выполняет аналогичную операцию переноса символов (текстовых и размерных стилей, блоков и т. п.), вызывая диалоговое окно Xbind (Внедрение символов) (рис. 7.28). Команда XBIND (ВНЕДРИТЬ) может быть вызвана с помощью кнопки панели Reference (Ссылки) или пункта падающего меню Modify › Object › External Reference › Bind (Редакт › Объекты › Внешние ссылки › Внедрить).

Рассмотрим действие команды на примере с внешней ссылкой SPCA Site Plan. В расположенном слева списке области Xrefs (Внешние ссылки) диалогового окна Xbind (Внедрение символов) щелкните левой кнопкой мыши по знаку слева от ссылки SPCA Site Plan. После этого раскроется перечень символов, которые можно перенести из внешней ссылки в текущий рисунок.


Рис. 7.28. Диалоговое окно Xbind

Если, например, щелкнуть по знаку плюс слева от наименования Textstyle (Текстовый стиль), то раскроется ветвь дерева, содержащая имена текстовых стилей. Если пометить нужное нам имя стиля и нажать на кнопку Add (Добавить), то помеченный символ появится в расположенном справа списке области Definitions to Bind (Внедряемые описания) диалогового окна. Таким образом, можно выбрать все внедряемые символы (лишние можно убрать с помощью кнопки Remove (Удалить)), которые будут перенесены в текущий рисунок. Теперь если стереть внешнюю ссылку и сохранить текущий рисунок, то в нем удаленной внешней ссылки не будет, но останутся внедренные символы.

Внешние ссылки могут копироваться из одного рисунка в другой с помощью Центра управления (о Центре управления см. разд. 5.4).

Новая кнопка Open (Открыть), появившаяся в системе AutoCAD 2004 в диалоговом окне Xref Manager (Диспетчер внешних ссылок), вызывает команду XOPEN (русское наименование команды в момент написания книги не известно), которая позволяет открыть файл-ссылку.

Одним из способов ускорения работы в Автокад является применение горячий клавиш.

В этом уроке мы рассмотрим стандартные Горячие клавиши Автокад, их применение и создание своих горячих клавиш.

Например, чтобы открыть окно Печати, Нужно щелкнуть мышкой по кнопке приложения . Перевести указатель мыши ниже на строку «Печать». И в появившемся списке выбираем «Печать» . См. Рис. 1.

Горячие клавиши Автокад

Рис. 1. Открыть окно Печати.

Или просто нажать на клавиатуре Ctrl+P . Согласитесь, что с клавиатуры это сделать намного проще.

AutoCAD 2013 включает в себя следующие стандартные горячие клавиши:

Клавиши общего назначения.

Esc – используется для снятия выделения или отмены команды

Пробел (или Enter ) – используется для запуска последней выполненной программы. Также для подтверждения параметров команды.

Del – удаляет выделенные объекты

Горячие клавиши F1-F12.

F2 – Включить / отключить текстовое окно (информация о процессе работы, порядке построение объектов).

Клавиши для работы с буфером обмена:

Клавиши для работы с файлами:

Клавиши CTRL+0… CTRL+9

Создание горячих клавиш в Автокад.

Мы видим, что по умолчанию, количество горячих клавиш не так велико. Многие команды Автокад, которые используются часто, не имеют таковых. К счастью производители Автокад предоставляют нам возможность создания своих горячих клавиш. И эта процедура совсем не сложная.

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

Горячие клавиши Автокад

Рис. 2. Пользовательский интерфейс.

(или наберите в командной строке CUI и нажмите на клавиатуре Enter ).

Откроется окно «Адаптация пользовательского интерфейса». Щелкните по квадратику с плюсиком напротив строки «Горячие клавиши». Откроется подсписок. Выделите надпись «Клавиши быстрого доступа» . Справа в окне «Ярлыки» появятся существующие горячи клавиши . См. Рис. 3.

Горячие клавиши Автокад

Рис. 3. «Адаптация пользовательского интерфейса».

В окне «Список команд» найдите команду « Свойства слоя » Поставьте на нее указатель мыши, нажмите левую кнопку и не отпуская ее, ведите указатель к надписи « Клавиши быстрого доступа » И только там отпускаем кнопку. См. Рис. 4.

Горячие клавиши Автокад

Рис. 4. Добавление команды в Горячие клавиши.

В подсписке «Клавиши быстрого доступа» появится новая строка « Свойства слоя ». Щелкнув по ней, выделите ее. Далее в окне «Свойства» щелкните в поле напротив надписи « Клавиши ». Затем по квадратику с точками . См. Рис. 5.

Горячие клавиши Автокад

Откроется окно «Клавиши быстрого вызова». Удерживая на клавиатуре SHITF нажмите S . В строке появиться надпись SHITF+S . Нажимаем ОК . См. рис. 6.

Горячие клавиши Автокад

Рис. 6. Клавиши быстрого вызова.

В поле «Клавиши» появиться надпись SHITF+S . Нажимаем ОК . См. Рис. 7.

Горячие клавиши Автокад

Все горячая клавиша готова. Давайте ее проверим.

Нажмите сочетание клавиш SHITF+S. Откроется окно « Диспетчера свойств слоев ». См. Рис. 8.

Горячие клавиши Автокад

Рис. 8. Диспетчера свойств слоев.

Нажмите SHITF+S еще раз и окно закроется.

Создайте горячие клавиши для команд, которые Вы используете часто или для тех, до которых вам трудно добраться при помощи мыши и ваша работа в AutoCAD станет быстрее. А ваши коллеги будут удивляться тому, как быстро Вам удается вызывать команды.

Надеюсь, что эта статья оказалось кому-то полезной, и Ваша работа в AutoCAD стала более комфортной.

Читайте также: