Как определить что свойства примитива изменены при помощи Панели Свойств?
Вопрос:
Как я могу узнать, что свойства примитива изменены через Панель свойств (OPM)?
Ответ:
Панель свойств при изменении объекта запускает уведомления о событиях начала и конца модификации, используя строку "OPM_CHGPROP"
Как использовать метод AcDbRegion::getAreaProp()
Первые три параметра метода описываются как:
- origin — Возвращает начальную точку области
- xAxis — Возвращает ось X области
- yAxis — Возвращает ось Y области
Но учитывая объявления этих параметров как const :
Как использовать класс AcadAppInfo для чтения и записи информации из реестра
Вопрос:
Как можно использовать класс AcadAppInfo для чтения и записи информации из (в) реестр?
Ответ:
Следующий код подразумевает, что вы загрузили пример POLYSAMP в AutoCAD. (Вы можете найти этот пример в каталоге ObjectARX SDK\Samples\entity\). Измените имя приложения в аргументе функции setAppName() чтобы получить собственную информацию вашего приложения из реестра.
Как использовать длинные транзакции для эмуляции команды -ССЫЛРЕД
Команды -ССЫЛРЕД (-REFEDIT) и ССЫЛРЕД (REFEDIT) обеспечивают возможность контекстного редактирования блока (по месту). Они позволяют переключатся между вложенными ссылками блока. Тогда AutoCAD принимает подсвеченную вставку блока для редактирования по месту. Приложение посылает команду -ССЫЛРЕД для переключения в режим редактирования для удобства пользователя.
Как заставить команду УВЕЛИЧИТЬ работать с пользовательским примитивом
Команда УВЕЛИЧИТЬ (LENGTHEN) может работать только со следующими классами или пользовательскими объектами, унаследованными от этих классов:
Visual Studio 2008 для ObjectARX 2010/11/12
Правильная версия для работы с ObjectARX SDK 2010, 2011, 2012 – это VisualStudio 2008 с ServicePack 1.
API для ГРАФНАСТР (3DCONFIG)
Вопрос:
Мне известно, что я могу воспользоваться версией команды 3DCONFIG для командной строки, чтобы изменить установки графической подсистемы, т.е. SendStringToExecute(). Однако было бы хорошо сделать тоже самое непосредственно при помощи API.
Ответ:
Вы можете это сделать при помощи класса AcGsConfig.
AutoCAD 2014 API (ObjectARX)
Филипп Леефсма (Philippe Leefsma) создал презентацию (DevTV) о новшествах в AutoCAD 2014 API. Вы можете скачать её отсюда (на английском).
Как загрузить из неуправляемого arx-приложения управляемую .NET сборку в AutoCAD?Автор: Александр Ривилис
Вопрос: У меня есть arx-приложение и dll-сборка (.NET-сборка). Я бы хотел загружать dll-сборку в AutoCAD непосредственно из arx-приложения, а не использовать отложенную загрузку меняя ключи реестра или команду _NETLOAD. Я пробовал функцию acrxDynamicLinker->loadModule(), но она не работает с управляемыми сборками.
Ответ: acdbmgd.dll экспортирует недокументированную функцию LoadManagedDll, которая и позволяет загружать из неуправляемого arx-приложения управляемую dll-сборку. Пример её использования:
AutoCAD 2014 и Безопасность
Вы уже загрузили и установили AutoCAD 2014 ? Если да, то вы могли заметить новый набор функций безопасности
readDwgFile показывает ошибку DBX CAS 4 если вызывается из DBX - модуля
DBX модули или ‘Object Enablers’ созданы с единственной целью определения пользовательского объекта / примитива в ObjectARX. Модуль должен определить один или несколько пользовательских классов объекта, каждый из которых содержит пользовательские элементы и переопределяет необходимые методы, подходящие для конкретных целей. Взаимодействие с внешними базами данных или объектов в той же базе данных, которые не связаны напрямую (через ObjectID-ссылки), для пользовательских объектов не поддерживается.
AcDb::ePermanentlyErased при открытии клонированных методом wblock объектов внутри одного DWG
Вопрос:
Возможно ли открыть клонированные объекты в реакторах AcEditorReactor::beginDeepCloneXlation() или AcEditorReactor::endDeepClone() если выполняется ПБЛОК (WBLOCK) внутри одного dwg-файла?
Попытка открыть их в AcEditorReactor::beginDeepCloneXlation() или endDeepClone(), приводит к получению кода возврата "ePermanentlyErased". Нам требуется доступ к ним в режиме kForWrite для дополнительной обработки.
Ответ:
Проблема связана с тем, что в контексте операции wblock внутри одного чертежа, AutoCAD выполняет «быструю» операцию wblock, что означает, что AutoCAD в действительности не клонирует объекты, а симулирует эту операцию т.к. целью является сохранить клоны в файл. Чтобы предотвратить возможность модификации клонированных объектов (т.к. и клон и оригинальный объект – это один и тот же объект) AutoCAD возвращает код ошибки "ePermanentlyErased" когда приложение пытается открыть и модифицировать клон.
Временная графика в AutoCAD
Часто бывает необходимо визуально увидеть результаты наших геометрических вычислений. В составе ObjectARX и AutoCAD .NET API есть несколько методов, которые очень удобно использовать при таком сценарии.
Чтение размерного текста в ARX
Размерный текст нельзя прочитать непосредственно, т.к. информация хранится в примитиве AcDbMText, содержащемся в записи таблицы блоков. Из AcDbDimension (или производных классов) можно получить идентификатор записи таблицы блоков при помощи метода dimBlockId(). Затем можно в записи таблицы блоков AcDbBlockTableRecord найти примитив AcDbMText и вызвать его метод contents().
Чтение и изменение настроек AutoCAD
Изменение настроек AutoCAD возможно при помощи прямого изменения реестра или с использованием ActiveX объекта Preferences. Заметим, что прямое изменение реестра не влияет на настройки текущей сессии AutoCAD. ActiveX объект Preferences экспортирует многие свои свойства через интерфейс, который можно использовать в VBA/VB.NET или в C++/MFC приложениях. Ниже пример кода (на VB и C++), который добавляет новый путь к существующим путям доступа к вспомогательным файлам AutoCAD.
Хранение 64-битного целого в ResultBuffer
Вопрос:
Я не смог найти DXF код для хранения 64-битного целого в Расширенных данных (Extended Data). Есть ли такой?
Ответ:
Нет. Такого кода для хранения 64-битного значения в Расширенных данных (XData) нет. Это сделано специально, так как в противном случае предыдущие версии AutoCAD не смогли бы прочитать такой файл.
Установка камеры/объектива, цели, ширины и высоты вида
Вопрос:
Я хочу установить камеру, цели и поле зрения в окне модели, чтобы точно сфокусироваться на определенных объектах в перспективе. Я пытался это сделать различными способами, но никогда не получалось в точности то, что хотелось.
Решение:
В прикрепленном чертеже (Загрузить Окружности) у нас три круга: красный (r = 10), зеленый (r = 20) и голубой (r = 30). Они все параллельны и их центры лежат на одной прямой.
Удаление фильтров слоёв при помощи ObjectARX
Вопрос:
У меня есть клиент, который использует множество dwg-файлов с множеством фильтров слоёв. Как можно удалить эти фильтры с помощью программы?
Ответ:
Фильтры слоёв – это объекты типа AcDbXRecord в двух словарях (с именами ACAD_LAYERFILTERS и ACLYDICTIONARY) содержащихся в расширенном словаре таблицы слоёв. Чтобы удалить фильтры слоёв, вам необходимо пройтись по словарям ACAD_LAYERFILTERS и ACLYDICTIONARY и удалить все AcDbXRecord.
Удаление вершины у 3D-полилинии (AcDbPolyline3d) средствами ObjectARX
Удаление вершины у 3D-полилинии несколько сложнее, чем вы можете себе представить. AcDbPolyline3d – это составной тип примитива, данные ее вершин содержатся в отдельных внешних примитивах AcDbVertex3d. Так что для того, чтобы удалить вершину её нужно найти, а затем удалить при помощи метода erase().
Текстовые примитивы в собственных примитивах не скрываются после команды СКРЫТЬ (HIDE)
Возьмем такой пример: Вы создали собственный примитив (Custom Entity) и среди других примитивов в методе worldDraw, вы рисуете текст (mode->geometry().text). После создания собственного примитива, когда выполнилась команда СКРЫТЬ (HIDE) в режиме 2D-каркас, текст в собственном примитиве оказывается не скрытым. Кроме того, когда текст рисуется как часть собственного примитива, некоторые другие примитивы могут быть скрыты неправильно. Такого не случается в собственных примитивах, не содержащих текстовые примитивы.