Как получить доступ и изменить свойства динамического блока в ARX и .NET
Вопрос:
У моего динамического блока есть свойство "Visibility", которое может быть в двух состояниях. Как мне получить доступ к этому свойству и изменить его?
Ответ:
Запустите следующий код с присоединённым в конце статьи чертежом. Выберите вставку динамического блока, код получит доступ к свойству Visibility и изменит его состояние. Вы сможете сразу увидеть результат после завершения работы кода.
Создание таблицы с содержимым только для чтения
Содержимое таблицы можно сделать с признаком «только для чтения» если установить соответствующее состояние ячейкам таблицы.
Следующий код создаёт таблицу с ячейками, которым установлено состояние "AcDb::kCellStateContentReadOnly"
Как объединить отрезки и дуги в полилинию?Автор: Александр Ривилис
Эта статья навеяна темой на форуме Полилинии и дуги в одну полилинию
Начиная с AutoCAD 2011 для этой цели можно воспользоваться методами Entity.JoinEntity и Entity.JoinEntities из AutoCAD .NET API, а также AcDbJoinEntityPE::joinEntity и AcDbJoinEntityPE::joinEntities из ObjectARX. Интереснее показать как можно это реализовать самостоятельно в .NET и в ObjectARX:
Модифицируем Ассоциативный массив по траектории при помощи API
В этой статье мы рассмотрим как можно модифицировать ассоциативный массив по траектории при помощи API. Массив по траектории может зависеть или от расстояния между элементами или между количеством элементов в зависимости от свойств массива. Следующий образец кода уменьшает количество элементов или увеличивает расстояние между элементами для уменьшения количества элементов вдоль пути.
Создание прямоугольного облака (RevCloud) при помощи acedCommandS
Когда выполняется команда Облако (_RevCloud) из скрипта или при помощи функции acedCommandS (command или command-s в Lisp), опции в командной строке не соответствуют опциям в командной строке при запуске команды Облако из пользовательского интерфейса AutoCAD. Например, не появляется опция установки типа облака, когда запускается при помощи acedCommandS.
Как удалить профиль вращения после создания тела вращения
Иногда я получаю запросы от партнеров ADN о том что:“После использования AcDb3dSolid::createRevolvedSolid() образующая кривая вращения видна в твердом теле.”
Профиль используемый для вращения виден в твёрдом теле как показано на картинке.
Он может быть удалён при помощи метода cleanBody класса AcDb3dSolid, который удаляет все грани и ребра, которые не нужны для поддержки топологии твердого тела.
Регистрация команды для функции обратного вызова UnknownCommand
Этот пример отвечает на множество вопросов по поводу функции обратного вызова unknownCommand и использования UnknownCommand.Когда когда-либо пользователь вводит неправильное или незарегистрированное имя команды или опечатывается, мы можем использовать механизм, чтобы перехватить команду с опечаткой и отправить нашу команду или зарегистрировать новую команду и отправить её.
В этом примере пользователь пытается ввести некоторую неизвестную команду, например, в функции обратного вызова, запущенной из реактора события unknownCommand, мы будем загружать наш "TestUknCom".
Как сохранить идентификатор объекта в словаре расширения другого объекта?
Следующий код показывает как это сделать. Обратите внимание, что необходимо преобразовать ObjectId в ads_name для сохранения результата в Xrecord, и наоборот для получения ObjectId из буфера результата Xrecord. Также отметьте, что необходимо передать ссылку на первый элемент цепочки буферов методу setFromRbChain() вместо указателя на resbuf.
О методе AcDbObject::releaseExtensionDictionary
В чем разница между вызовом метода erase() непосредственно для словаря расширения (extension dictionary) и вызовом releaseExtensionDictionary() для объекта-владельца?Это API предоставлено для возможности полного удаления словаря расширения объекта. Этот метод позволяет создавать полностью новый словарь расширения вместо того, чтобы очищать существующий в текущей сессии редактирования чертежа.
Фундаментальное различие между вызовом releaseExtensionDictionary() для родительского объекта и вызовом erase() для словаря расширения становится совершенно очевидным если посмотреть на результаты вызова двух других методов работы со словарём расширения: extensionDictionary и createExtensionDictionary. Рассмотрим следующие две последовательности:
Как удалить полностью словарь расширения (ExtDict) примитива?Автор: Александр Ривилис
Вопрос:
Как удалить полностью словарь расширения (ExtDict) примитива?
Ответ:
В статье О методе AcDbObject::releaseExtensionDictionary описано как и для чего использовать этот метод. Однако для того, чтобы воспользоваться эти методом следует сначала очистить (т.е. удалить все элементы) словаря расширения. Следующий код показывает, как это сделать и результаты его работы:
Удаление меню из строки меню и из памяти
Вопрос:Моё приложение создаёт меню и добавляет его используя IAcadPopupMenus.Add. Удаление его позднее при помощи RemoveMenuFromMenuBar или IAcadPopupMenu.RemoveFromMenuBar работает, но повторная попытка добавить тоже самое меню терпит неудачу. Почему и как это исправить?
Ответ:
Хотя пользовательское меню может быть удалено из строки меню после добавления, меню остаётся в памяти AutoCAD. Это можно проверить если сравнить значения IAcadPopupMenus.GetCount() до и после удаления меню – значение останется тем же, так как меню остаётся внутри коллекции меню. Пожалуйста проверьте демонстрационный код ниже: он добавляет 3 меню в первую группу меню. Запустите снова и код удалит одно меню, и сравните счетчик меню до и после удаления.
Преобразование из .NET в COM с использованием управляемого (Managed) C++
После выбора объекта при помощи .NET (управляемый C++), как его преобразовать в COM-объект? Сначала нужно получить IUnknow-указатель из свойства AcadObject объекта, а затем преобразовать его в COM-объект. Эта процедура позволяет вам сохранить счетчик ссылок COM объекта.Следующий код показывает как это сделать и как получить его имя типа. Напоминаю, что нужно установить для проекта свойство Mixed mode. Это легко сделать создав проект при помощи ObjectARX Wizard и указав ему использовать .NET.
Получение свойств примитива в AccoreConsole
"dumpallproperties" – это простейший способ для получения все свойств примитива при помощи Lisp. Но это не работает в scr-файле в AccoreConsole. Простейший способ для получения свойств AccoreConsole - создать CRX-плагин, который использует НЕ-COM систему свойств.Если вы еще не знакомы с НЕ-COM системой свойств, тогда почитайте статью: Перезентация (DevTV): Не-COM система свойств
Пример в этой статье использует порцию кода из предыдущей статьи для создания CRX-приложения. Вот соответствующий код, а полный пример проекта можно скачать здесь:
Позиционирование AcPane в статусбаре
Я получил недавно вопрос от партнера ADN о позиционировании AcPane и сейчас я покажу пример кода, который выполняет именно эту функцию.Прежде чем перейти к коду я должен сообщить, что в отличие от предыдущих версий AutoCAD 2015 не позволяет показывать текстовые метки в статусбаре – только иконки. Ранние версии позволяли переключаться между текстовыми метками и иконками. Теперь только иконки.
Я выполнил миграцию очень старого примера по работе с статусбаром, который был в составе ObjectARX SDK 2007 до текущих AutoCAD 2014/15.
Выбор точки на 3DSolid при выборе примитива
Функция acedEntSel даёт возможность пользователю выбрать примитив и также позволяет получить точку, которая была указана при выборе примитива. Когда эту функцию используют с 2D-примитивом, тока возвращаемая acedEntSel очень удобна в случае если нужна информация для таких задач как РАЗОРВАТЬ (Break), ОБРЕЗАТЬ (Trim) и т.д.Однако если acedEntSel используется с 3DSolid, точка возвращается в плоскости XY текущей ПСК вне зависимости от того где указали точку на 3DSolid. Если включена объектная привязка (OSNAP) при выборе примитива, тогда точка будет на поверхности 3DSolid. Если важно получить точку на 3DSolid, которая использовалась при выборе объекта именно при помощи кода, то можно использовать следующий алгоритм:
Как получить формат файла для сохранения по-умолчанию
Я недавно получил вопрос от партнера ADN о возможности получить формат файла по-умолчанию для сохранения файла при помощи API или команды. Я не уверен можно ли это сделать командными методами, но вот небольшой пример как это сделать при помощи API.Загрузка DVB и запуск макроса VBA при помощи AutoCAD COM API в ObjectARX
Вопрос:
Как я могу загрузить dvb-файл и выполнить макро при помощи AutoCAD COM интерфейса?
Ответ:
Следующий код показывает как это можно сделать:
Получение образцов, текстов и форм, используемых в типах линий
Как вам возможно уже известно, тип линии в AutoCAD состоит из серий значений, представляющих образцы, которые могут содержать тексты и формы. Ниже пример кода, который проходится по типам линий, загруженным в базу и показывающий их определения. В случае вложенных форм создаются формы в Пространстве Модели.Как определить какие свойства слоя переопределены в ВЭкране?
Ниже пример кода, который позволяет определить какие слои имеют переопределения и какие свойства слоя переопределены в ВЭкране. Метод AcDbLayerTableRecord::hasAnyOverrides позволяет нам быстро узнать есть ли какие-то переопределения у слоя для ВЭкранов. Если есть, то мы можем узнать подробности при помощи метода AcDbLayerTableRecord::hasOverrides с указанием ObjectId ВЭкрана, для которого мы хотим узнать переопределения.
Почему не загружается в AutoCAD мой ARX-файл и как с этим бороться?Автор: Александр Ривилис
Причин по которым arx-файл не загружается в AutoCAD может быть много. В этом случае обычно выдаётся сообщение типа:C:\Program Files\Autodesk\AutoCAD 2015\acad.exe
can't load the myArxFile.arx file。
Или:
“....\myArxFile.arx” не является корректным ARX-файлом.
Сбой AcRxDynamicLinker при загрузке .”...\myArxFile.arx”
C:\Program Files\Autodesk\AutoCAD 2015\acad.exe
Module ”...\myArxFile.arx” failed to load.