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

23/12/2015

Получение доступа к каталогам поддержки и проекта

Я получил недавно запрос о том, как програмно получить доступ к каталогам поддержки и файлам проекта, которые доступны на вкладке Свойства/Файлы.

Мы можем воспользоваться ActiveX API AcadPreferences.Files для получения доступа к каталогам поддержки и файлам проекта.

Чтобы получить информацию о каталогах поддержки можно также прочитать системную переменную «ACADPREFIX» или выполнить следующий код:

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

Преобразование даты из Юлианского календаря

Простейший способ для преобразования Юлианской даты (формат системной переменной DATE) в формат день, месяц, год, часы минуты, секунды, миллисекунды – это использование класса AcDbDate. Вот пример его использования:

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

Чтение свойств чертежа (SummaryInfo) из внешнего приложения.Автор: Александр Ривилис

Вопрос:

Средствами ObjectARX и AutoCAD .NET API можно получить информацию о dwg-файле, которую записывает команда DWGPROPS. А можно ли прочитать эту информацию из внешнего C++ приложения без запуска AutoCAD?

Ответ:

Это возможно. Пример кода, который позволяет это сделать ниже:

Опубликовано 19.12.2015     Читать далее >>>
17/11/2015

Встраивание изображения в чертеж - 2

В этом статье мы рассмотрим создание пользовательского объекта, унаследованного от класса AcDbRasterImageDef, который сохраняет/загружает растровые данные в/из рисунка при помощи ATIL. Это гарантирует независимость чертежа от внешнего файла изображения и данные будут доступны если будет загружен ваш arx-файл в AutoCAD.

Другие способы встраивания растра в чертеж без зависимости от внешнего растрового файла описаны в этой статье:

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

Как получить доступ и изменить свойства динамического блока в ARX и .NET

Вопрос:

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

Ответ:

Запустите следующий код с присоединённым в конце статьи чертежом. Выберите вставку динамического блока, код получит доступ к свойству Visibility и изменит его состояние. Вы сможете сразу увидеть результат после завершения работы кода.

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

Создание таблицы с содержимым только для чтения

Содержимое таблицы можно сделать с признаком «только для чтения» если установить соответствующее состояние ячейкам таблицы.

Следующий код создаёт таблицу с ячейками, которым установлено состояние "AcDb::kCellStateContentReadOnly"

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

Как объединить отрезки и дуги в полилинию?Автор: Александр Ривилис

Эта статья навеяна темой на форуме Полилинии и дуги в одну полилинию

Начиная с AutoCAD 2011 для этой цели можно воспользоваться методами Entity.JoinEntity и Entity.JoinEntities из AutoCAD .NET API, а также AcDbJoinEntityPE::joinEntity и AcDbJoinEntityPE::joinEntities из ObjectARX. Интереснее показать как можно это реализовать самостоятельно в .NET и в ObjectARX:

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

Модифицируем Ассоциативный массив по траектории при помощи API

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

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

Создание прямоугольного облака (RevCloud) при помощи acedCommandS

Когда выполняется команда Облако (_RevCloud) из скрипта или при помощи функции acedCommandS (command или command-s в Lisp), опции в командной строке не соответствуют опциям в командной строке при запуске команды Облако из пользовательского интерфейса AutoCAD. Например, не появляется опция установки типа облака, когда запускается при помощи acedCommandS.

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

Как удалить профиль вращения после создания тела вращения

Иногда я получаю запросы от партнеров ADN о том что:

“После использования AcDb3dSolid::createRevolvedSolid() образующая кривая вращения видна в твердом теле.”

Профиль используемый для вращения виден в твёрдом теле как показано на картинке.

Он может быть удалён при помощи метода cleanBody класса AcDb3dSolid, который удаляет все грани и ребра, которые не нужны для поддержки топологии твердого тела.

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

Регистрация команды для функции обратного вызова UnknownCommand

Этот пример отвечает на множество вопросов по поводу функции обратного вызова unknownCommand и использования UnknownCommand.

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

В этом примере пользователь пытается ввести некоторую неизвестную команду, например, в функции обратного вызова, запущенной из реактора события unknownCommand, мы будем загружать наш "TestUknCom".

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

Как сохранить идентификатор объекта в словаре расширения другого объекта?

Следующий код показывает как это сделать. Обратите внимание, что необходимо преобразовать ObjectId в ads_name для сохранения результата в Xrecord, и наоборот для получения ObjectId из буфера результата Xrecord. Также отметьте, что необходимо передать ссылку на первый элемент цепочки буферов методу setFromRbChain() вместо указателя на resbuf.

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

О методе AcDbObject::releaseExtensionDictionary

В чем разница между вызовом метода erase() непосредственно для словаря расширения (extension dictionary) и вызовом releaseExtensionDictionary() для объекта-владельца?

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

Фундаментальное различие между вызовом releaseExtensionDictionary() для родительского объекта и вызовом erase() для словаря расширения становится совершенно очевидным если посмотреть на результаты вызова двух других методов работы со словарём расширения: extensionDictionary и createExtensionDictionary. Рассмотрим следующие две последовательности:

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

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

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

Ответ:
В статье О методе AcDbObject::releaseExtensionDictionary описано как и для чего использовать этот метод. Однако для того, чтобы воспользоваться эти методом следует сначала очистить (т.е. удалить все элементы) словаря расширения. Следующий код показывает, как это сделать и результаты его работы:

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

Удаление меню из строки меню и из памяти

Вопрос:

Моё приложение создаёт меню и добавляет его используя IAcadPopupMenus.Add. Удаление его позднее при помощи RemoveMenuFromMenuBar или IAcadPopupMenu.RemoveFromMenuBar работает, но повторная попытка добавить тоже самое меню терпит неудачу. Почему и как это исправить?

Ответ:

Хотя пользовательское меню может быть удалено из строки меню после добавления, меню остаётся в памяти AutoCAD. Это можно проверить если сравнить значения IAcadPopupMenus.GetCount() до и после удаления меню – значение останется тем же, так как меню остаётся внутри коллекции меню. Пожалуйста проверьте демонстрационный код ниже: он добавляет 3 меню в первую группу меню. Запустите снова и код удалит одно меню, и сравните счетчик меню до и после удаления.

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

Преобразование из .NET в COM с использованием управляемого (Managed) C++

После выбора объекта при помощи .NET (управляемый C++), как его преобразовать в COM-объект? Сначала нужно получить IUnknow-указатель из свойства AcadObject объекта, а затем преобразовать его в COM-объект. Эта процедура позволяет вам сохранить счетчик ссылок COM объекта.

Следующий код показывает как это сделать и как получить его имя типа. Напоминаю, что нужно установить для проекта свойство Mixed mode. Это легко сделать создав проект при помощи ObjectARX Wizard и указав ему использовать .NET.

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

Получение свойств примитива в AccoreConsole

"dumpallproperties" – это простейший способ для получения все свойств примитива при помощи Lisp. Но это не работает в scr-файле в AccoreConsole. Простейший способ для получения свойств AccoreConsole - создать CRX-плагин, который использует НЕ-COM систему свойств.

Если вы еще не знакомы с НЕ-COM системой свойств, тогда почитайте статью: Перезентация (DevTV): Не-COM система свойств

Пример в этой статье использует порцию кода из предыдущей статьи для создания CRX-приложения. Вот соответствующий код, а полный пример проекта можно скачать здесь:

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

Позиционирование AcPane в статусбаре

Я получил недавно вопрос от партнера ADN о позиционировании AcPane и сейчас я покажу пример кода, который выполняет именно эту функцию.

Прежде чем перейти к коду я должен сообщить, что в отличие от предыдущих версий AutoCAD 2015 не позволяет показывать текстовые метки в статусбаре – только иконки. Ранние версии позволяли переключаться между текстовыми метками и иконками. Теперь только иконки.

Я выполнил миграцию очень старого примера по работе с статусбаром, который был в составе ObjectARX SDK 2007 до текущих AutoCAD 2014/15.

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

Выбор точки на 3DSolid при выборе примитива

Функция acedEntSel даёт возможность пользователю выбрать примитив и также позволяет получить точку, которая была указана при выборе примитива. Когда эту функцию используют с 2D-примитивом, тока возвращаемая acedEntSel очень удобна в случае если нужна информация для таких задач как РАЗОРВАТЬ (Break), ОБРЕЗАТЬ (Trim) и т.д.

Однако если acedEntSel используется с 3DSolid, точка возвращается в плоскости XY текущей ПСК вне зависимости от того где указали точку на 3DSolid. Если включена объектная привязка (OSNAP) при выборе примитива, тогда точка будет на поверхности 3DSolid. Если важно получить точку на 3DSolid, которая использовалась при выборе объекта именно при помощи кода, то можно использовать следующий алгоритм:

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

Как получить формат файла для сохранения по-умолчанию

Я недавно получил вопрос от партнера ADN о возможности получить формат файла по-умолчанию для сохранения файла при помощи API или команды. Я не уверен можно ли это сделать командными методами, но вот небольшой пример как это сделать при помощи API.
Опубликовано 02.07.2015     Читать далее >>>