Программная имитация команды Burst
Команда "Burst" из Express Tools очень полезна при расчленении блока с атрибутами. В отличие от обычной команды Расчленить (Explode) она оставляет атрибуты неизменными при расчленении вставки блока.
Вот пример кода имитирующий команду Burst при помощи AutoCAD .Net API. Он сначала расчленяет блок и заменяет все определения атрибутов текстами (DBText).
Копирование словаря расширения (ExtDictionary)
Следующий код показывает как скопировать словарь расширения одного примитива в другой примитив. Специальная логика устанавливает в конце имена словаря как у исходного примитива, так как “DeepCloneObjects” копирует их с другими именами в целевой примитив.Как найти все поля (Field) в чертеже?
Словарь именованных объектов (NOD) в базе данных содержит запись “ACAD_FIELDLIST” если чертеж содержит хотя бы одно поле. Эта запись содержит записи класса “AcDbFieldList”, который к сожалению не доступен ни в ObjectARX, ни в .NET API.
Каждый объект AcDbField обычно доступен из словаря расширения (Extension Dictionary). Например, если мы создаём MText содержащий поле, мы можем получить доступ к MTextyou и посмотреть AcDbField в его ExtensionDictionary.
Чтобы получить все поля непосредственно – единственный путь получить все TypedValue (DxfCode – пары значений) из нашего AcDbFieldList, пройдя по ним по всем и отобрав все, у которых код = 330 и тип AcDbField.
Использование ресурсной dll для CUIx с прозрачными растрами
Эту статью и пример кода любезно предоставил один из членов ADN: Michael Csikos. Спасибо Михаил!
Здесь показывается, как можно использовать ico-файлы в ресурсных dll для ваших cuix-файлов. По умолчанию, cuix-файлы принимают из dll bmp-файлы растров. Но bmp-файлы не поддерживают прозрачность, которая могла бы помочь сделать кнопки иконок намного симпатичнее в интерфейсе AutoCAD.
К сожалению этот подход нигде не документирован в документации, так что Michael раскопал следующее решение: редактирование вручную файла ресурсов (.rc) для вашей ресурсной dll позволяет добавить поддержку ico-файлов. Достаточно просто добавить новый ico-ресурс при помощи редактора Visual Studio и отредактировать свойства “ICO” ресурса в “RCDATA” как показано ниже:
Как определить, что PaletteSet только что создан в первый раз
В ряде случаев вам может понадобиться узнать создан ли ваш PaletteSet в первый раз или нет, для того чтобы задать его пристыковку (Docking) или еще для каких-то целей. Чтобы сделать это, можно сохранить собственное значение одновременно с сохранением PaletteSet, и которого нет и быть не может при первом создании этого PaletteSet.
Ниже пример кода, который устанавливает пристыковку по умолчанию к левой границе (DockSides.Left) при первом создании PaletteSet. В следующей сессии вариант пристыковки уже не меняется и PaletteSet должен вернуть позицию, в которую его установил пользователь.
Пользовательский выбор файла, подчиняющийся системной переменной FILEDIA
Когда мы создаем пользовательскую команду, мы хотим чтобы она подчинялась общим правилам AutoCAD. Одним из правил является подчинение переменной FILDEIA, которая управляет появлением диалога при выборе файлов.
Многие разработчики используют напрямую класс Autodesk.AutoCAD.Windows.OpenFileDialog, который напрямую вызывает диалог. Альтернативой ему является класс PromptSaveFileOptions, который подчиняется системной переменной FILEDIA.
Получение всех доступных имен плоттеров
Для того чтобы получить все доступные для AutoCAD плоттеры можно воспользоваться менеджером конфигурация плоттеров (класс PlotConfigManager). У этого класса есть свойство Devices, которое дает доступ ко всем плоттерам. Ниже процедура получения имён плоттеров:
Как найти сплайн в AutoCAD между двумя другими сплайнами в .NET
Я получил вопрос в комментариях к блогу:
Как найти «центральную» линию NurbCurve3dмежду двумя другими линиями NurbCurve3d?
Я интерпретирую это следующим образом: с учетом двух объектов NurbCurve3d, создать NurbCurve3d, который находится точно между ними. NurbCurve3d являются AcGe-классом - это означает, что это объект неграфический - так что я решил работать со сплайнами (Spline), поскольку они тесно связаны с классом NurbCurve3d (есть удобные методы для преобразования между этими двумя классами). Вот еще для интересующихся некоторая информация о NURBS.
Изменение путей к растрам в чертеже с абсолютных на относительные
Ниже показан пример кода, который позволяет изменить абсолютные пути к файлам растров на относительные пути (по отношению к пути к файлу чертежа). Те же пути к растрам, которые уже были относительными, остаются неизменными.Запрет всплывания диалоговых окон в AutoCAD
Большинство появляющихся диалоговых окон AutoCAD могут быть подавлены при необходимости при помощи ряда системных переменных или вызова команды с предшествующим знаком "-" для вызова команды в режиме командной строки. Вы можете прочитать об этом в этой статье:Переключение между диалоговыми окнами и командной строкой (англ)
Сохранение чертежа в DXF-формате
Вы можете использовать метод Database.DxfOut для экспорта/сохранения чертежа в DXF-файле. Ниже простой код показывает процедуру сохранения текущего чертежа в различные версии DXFDwgVersion.AC1027 – для AutoCAD 2013 версии
DwgVersion.AC1024 – для AutoCAD 2010 версии
DwgVersion.AC1021 – для AutoCAD 2007 версии
DwgVersion.AC1800 – для AutoCAD 2004 версии
DwgVersion.AC1015 – для AutoCAD 2000 версии
DwgVersion.AC1009 – для AutoCAD R12 версии
Установка направления пристыковки палитры по-умолчанию
Я получил запрос от партнера ADN о возможности установить направление пристыковки палитры по-умолчанию при первом запуске и при этом чтобы пользователь мог в дальнейшем пристыковывать палитру в любом направлении: Вниз, Влево, Вверх, Вправо.
Следующий код показывает, как это можно сделать:
Разрешаем использование глобальных имён команд в AutoCAD с помощью .NET
Идея заключается в том, чтобы позволить использование вводить английские имена команд без необходимости использовать подчеркивание. В коде определяется что команда неизвестна (“unknown”) и выполняется попытка выполнить её повторно с префиксом подчеркивания для запуска глобальной команды. Это конечно может сработать или не сработать и чтобы предотвратить бесконечный цикл необходимо установить флаг установки подчеркивания.
Кроме того нам придётся отключить автокоррекцию и автозавершение команд для того чтобы наш код работал корректно. Так как нет специальных системных переменных то это придётся сделать при помощи команды.
Получение информации обо всех системных переменных .NETАвтор: Александр Ривилис
Установка данных геолокации в чертеже AutoCAD с использованием .NET
API геолокации AutoCAD - это очень актуальная и перспективная тема, которую пришло время обсудить. Итак начнем. :-)Ниже пример кода на основе показанной на ADN DevDays в конце 2013 года - для AutoCAD версии 2014, - но тогда API оказалась не полностью реализованным (по крайней мере, насколько я помню – если я не прав, то поправьте меня) до версии 2015.
Я воспользовался возможностью для того, чтобы использовать Editor.Command (), чтобы вызвать пару команд синхронно - для включения информации Geomap и для зумирования до окружности, которую мы создаем вокруг нашего места – теперь этот API доступен.
Модификация Ленты
Вопрос:Я хочу изменить содержимое Ленты (Ribbon) – добавлять/удалять панели, и т.д.. Как это можно сделать?
Ответ:
Это доступно только при помощи AutoCAD .NET API.
Есть два набора функций:
1) RibbonRuntimeAPI – содержащееся в AdWindows.dll в пространстве имён Autodesk.Windows
Позволяет модифицировать Ленту, но изменения не будут сохраняться в CUIx файл, так что при перезапуске AutoCAD, или даже при переключении рабочего пространства (системной переменной WSCURRENT) или при перезагрузке меню все сделанные вами изменения пропадут и вам понадобится всё повторять.
Как найти все внешние ссылки в текущей базе с помощью C#
Метод Database.GetHostDwgXrefGraph() возвращает иерархию внешних ссылок для текущего чертеж в виде объекта XrefGraph. Ниже простой пример, демонстрирующий его использование – печать структуры этой иерархии для текущего чертежа в командной строке.При использовании WblockCloneObjects скопированные в Пространство Модели примитивы исчезают в текущем чертеже
Это известное поведение метода Database.WblockCloneObjects() когда он используется с чертежом, открытым в AutoCAD. Проделайте следующие шаги для того, чтобы обойти это ограничение:- Сделайте целевой чертеж текущим документом
- Вызовите метод TransactionManager.QueueForGraphicsFlush() для запроса обновления графики
Пожалуйста не забудьте сделать целевой чертеж текущим до использования TransactionManager.QueueForGraphicsFlush() в противном случае это не даст никакого эффекта. Также не забудьте блокировать/разблокировать документ.
Получение глобального имени DIMLDRBLK в локализованной версии AutoCAD
Когда мы используем английскую версию AutoCAD, вы можете непосредственно получить имя системной переменной стрелки выноски, используя системную переменную DIMLDRBLK. Но когда используется локализованная версия AutoCAD, эта системная переменная хранит локализованную системную переменную, например, "Punkt" в немецкой и "Точка" в русской версии для стрелки выноски DOT.
Использование WeakEventManager с событиями AutoCAD
Недавно мы получили вопрос от разработчика об использовании Менеджера Слабых Событий (WeakEventManager) при работе с событиями AutoCAD. В этой статье мы увидим три разных версии подписки на событие завершение команды (CommandEnded) класса Document. Преимущество использования WeakEventManager в предотвращение утечки памяти, когда на событие подписаны, но они уже не нужны. Но при этом использование WeakEventManager имеет свою цену, так как события теперь доставляются через менеждер событий. Дополнительная цена использования шаблона слабых событий отлично расписана в этой статье Reed Copsey.
Рекомендуется отписываться от событий AutoCAD вручную, но следующие образцы кода должны продемонстрировать использование WeakEventManager в том случае если он вам нужен.