ADN Open CIS
Сообщество программистов Autodesk в СНГ

12/10/2015

Закрепление панелей инструментов в рядах с использованием CUI API

Создание и закрепление панелей в AutoCAD API представлено в COM API. Хотя панели можно закреплять при помощи COM API, в нём нет возможности организовывать панели в несколько рядов. Сам AutoCAD использует внутри себя метод закрепления панелей в рядах, который не представлен в COM API.

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

Опубликовано 12.10.2015     Читать далее >>>
02/10/2015

Не могу удалить обработчик события в .NET

Когда моё .NET-приложение загружается, оно подписывается на событие DocumentToBeDestroyed и нормально работает.

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

Опубликовано 02.10.2015     Читать далее >>>
22/09/2015

Нахождение конечных точек оси цилиндрического твердого тела

В недавнем запросе от разработчика потребовалось найти конечные точки оси цилиндрического твердого тела. Для этого требуется найти круглые ребра тела и найти их центры. Я вспомнил про элегантный образец кода Gilles Chanteauна форуме, который использует Linq запрос к BRep API здесь. Мы немного изменим его код чтобы получить концы осей цилиндра. Вот немного модифицированный код и благодарности Gilles.
Опубликовано 22.09.2015     Читать далее >>>
18/09/2015

Устанавливаем ортографический вид без изменения ПСК

Вот предыдущая статья с подобной темой об установке ортографического вида. В приведённом коде есть ограничение, связанное с тем что модифицируется активная запись таблицы ВЭкранов (ViewportTableRecord) и после изменения вида имя текущей ПСК не отображается в Видовом Кубе. Когда же мы меняем вид при помощи Видового Куба и переключаемся на Вид Сверху – это меняет только вид, но не меняет текущую ПСК. Также оси X и Y соответственно выравниваются горизонтально и вертикально. Вот код, который позволяет добиться подобного поведения при помощи API. Он устанавливает направление вида вдоль оси +Z и выравнивает оси X и Y так же, как это делает Видовой Куб:

Опубликовано 18.09.2015     Читать далее >>>
12/09/2015

Устанавливаем текущий вид в ортографический вид

Ниже пример кода, устанавливающий текущий вид в вид "Справа". При помощи подобного кода вид может быть установлен в любой ортографический вид.
Опубликовано 12.09.2015     Читать далее >>>
11/09/2015

Как отобразить статус внешнего процесса в командной строке AutoCAD

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

Замечание: Следующая процедура доступна начиная с .NET 4.5, так как использует методы await и async.

Опубликовано 11.09.2015     Читать далее >>>
08/09/2015

Устанавливаем переопределение цвета слоя для ВЭкрана используя AccoreConsole

Этот пример кода устанавливает переопределение для цвета слоя для всех ВЭкранов во всех листах чертежа. Можно использовать AccoreConsole для автоматизации этого переопределения в случае если эту операцию нужно повторить для множества чертежей в каталоге. Вот скрипт AutoCAD и пользовательская команда для переопределения слоя "Слой1" :
Опубликовано 08.09.2015     Читать далее >>>
06/09/2015

Запуск команды ССЫЛРЕД (REFEDIT) с выбранным примитивом средствами .NET

Действительно интересная проблема возникла в ходе внутренней дискуссии на этой неделе: кому-то понадобилось запустить команду REFEDIT для выбранной внешней ссылки с предварительно выбранным примитивом. И этот примитив должен быть частью выбранной внешней ссылки.

Это оказалось весьма непростым делом, но мы нашли способ, решающий её в несколько строк кода. Хитростью было найти правильный примитив в наборе и соответствующий ему примитив во внешней ссылке.

Вот подход, который я в конечном итоге использовал:

Опубликовано 06.09.2015     Читать далее >>>
25/08/2015

Получение списка видимых примитивов в динамическом блоке

Членом ADN был задан следующий вопрос:

Как можно получить список видимых примитивов для конкретного состояния видимости динамического блока, содержащего параметр видимости?

Решение основывается на предложении Тони Танзилло из этого сообщения на форуме.

Решение:

К сожалению API динамических блоков ограничено и нет прямого пути для получения этой информации. Эта информация в словаре расширения динамического блока и требуется смотреть на свойства экземпляра класса "AcDbBlockVisibilityParameter" (это родной класс ObjectARX, но он недоступен через публичные API ни в C++, ни в .NET).

Так что требуется несколько больше работы для получения этой информации. Вот несколько шагов:

Опубликовано 25.08.2015     Читать далее >>>
19/08/2015

Добавление словаря расширения

Для каждого объекта AutoCAD можно сохранить его пользовательские данные. Обычно это делается для графических примитивов, когда для них сохраняется неграфическая информация. Например, для отрезка AutoCAD можно сохранить строку и/или число (в его словаре расширения). Следующий код показывает как можно добавить в словарь расширения плавающее число и строку.
Опубликовано 19.08.2015     Читать далее >>>
14/08/2015

Добавление нового положения файла при помощи Sheetset API

Вот кусок кода, добавляющий новое положение файла и устанавливает новое положение листа при помощи Sheetset API :
Опубликовано 14.08.2015     Читать далее >>>
10/08/2015

Как удалить полностью словарь расширения (ExtDict) примитива средствами .NET?Автор: Александр Ривилис

Как удалить полностью словарь расширения (ExtDict) примитива средствами .NET?

В статье Как удалить полностью словарь расширения (ExtDict) примитива? описано как это сделать средствами ObjectARX. Ниже приводится код как тоже самое можно сделать при помощи AutoCAD .NET API:

Опубликовано 10.08.2015     Читать далее >>>
10/08/2015

Установка положения MText для каждого из масштабов аннотаций

Для аннотативного MText его положение можно менять при помощи ручек. Это положение специфическое для каждого из масштабов аннотаций чертежа. В данный момент не существует публичного API для установки положения аннотативного примитива для каждого масштаба программным путём. В качестве альтернативного метода можно использовать установку масштаба перед установкой положения. Этот пример кода проходит по коллекции масштабов и устанавливает позицию MText для каждого из масштабов.

Опубликовано 10.08.2015     Читать далее >>>
06/08/2015

Как показать иерархическое меню в Ленте

Если вам нужно показать простой (одноранговый) список – подойдёт RibbonSplitButton. О нём есть соответствующая статья. Но если вам нужно организовать иерархическое меню - подойдёт RibbonMenuButton. Ниже пример кода, создающий меню как на следующей картинке:
Опубликовано 06.08.2015     Читать далее >>>
04/08/2015

НПИ (CUI) и прозрачные картинки

До AutoCAD 2014 включительно, AutoCAD использует только формат BMP в CUI. Так как формат BMP не поддерживает прозрачность, AutoCAD использует RGB-цвет 192,192,192 как прозрачный. Пользователи AutoCAD могут использовать эту особенность в CUI.

Но это ограничивает возможность использования прозрачности только фоновым цветом 192,192,192. Любые другие фоновые цвета становятся видимыми в CUI.

Начиная с AutoCAD 2015 (и в более новых версиях), вы можете использовать формат PNG для картинок. Так как PNG формат поддерживает прозрачность, вы можете установить прозрачность для картинки и не ограничены только фоновым цветом 192,192,192.

Если у вас есть картинка в формате BMP с фоновым цветом (типа 192,192,192) тогда вызов “Bitmap.MakeTransparent” API поможет конвертировать этот цвет в прозрачный. Следующий код конвертирует BMPс фоновым цветом 192,192,192 в прозрачный PNG

Опубликовано 04.08.2015     Читать далее >>>
24/07/2015

Связывание атрибутов блоков с использованием DataExtraction API

Команда ДАННЫЕИЗВЛ (_EATTEXT) в AutoCAD позволяет извлекать данные, такие как тексты и атрибуты блока и показывать их в таблице. Вот пример кода, который использует DataExtraction API и создаёт таблицу, связывая её с данными.
Опубликовано 24.07.2015     Читать далее >>>
09/06/2015

Создание ВЭкрана автоматически отображающего план ПСК (UCSFollow)

Следующий пример показывает как создать вид с включенным UCSFollow. Это должно означать, что ВЭкран будет всегда отображать план текущей ПСК при любом её изменении.
Опубликовано 09.06.2015     Читать далее >>>
05/06/2015

Как заставить две команды работать как одну

Когда одна команда запускает другую команду из приложения вы можете захотеть, чтобы AutoCAD воспринимал их как единую команду когда пользователь использует команду Отмени (Undo) или хочет повторить последнюю команду.

Например, команда "Test1" запускает другую команду "Test2". Вы можете пожелать чтобы оба действия отменились AutoCAD’ом вместе при нажатии Ctrl+Z. Аналогично, когда вы повторяете команду нажатием клавиши Enter, вы хотите чтобы запускалась команда "Test1", а не "Test2".

Чтобы это сделать нужно «скрыть» команду "Test2" с помощью флагов "CommandFlags.NoHistory" и "CommandFlags.NoUndoMarker".

Опубликовано 05.06.2015     Читать далее >>>
04/06/2015

Программная имитация команды Burst

Команда "Burst" из Express Tools очень полезна при расчленении блока с атрибутами. В отличие от обычной команды Расчленить (Explode) она оставляет атрибуты неизменными при расчленении вставки блока.

Вот пример кода имитирующий команду Burst при помощи AutoCAD .Net API. Он сначала расчленяет блок и заменяет все определения атрибутов текстами (DBText).

Опубликовано 04.06.2015     Читать далее >>>
26/05/2015

Копирование словаря расширения (ExtDictionary)

Следующий код показывает как скопировать словарь расширения одного примитива в другой примитив. Специальная логика устанавливает в конце имена словаря как у исходного примитива, так как “DeepCloneObjects” копирует их с другими именами в целевой примитив.
Опубликовано 26.05.2015     Читать далее >>>