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

20/02/2022

Внедрение изображения в чертеж

В этой статье мы рассмотрим создание пользовательского объекта, унаследованного от AcDbRasterImageDef, который сохраняет / загружает данные изображения в / из чертежа с помощью ATIL. Это гарантирует, что ваш чертеж не зависит от внешнего файла изображения, и данные изображения будут загружены в AcDbRasterImageDef, если ARX загружен в AutoCAD. Для других способов встроить изображение на рисунке, не имея зависимости от внешнего файла изображения, пожалуйста, обратитесь к этой статье: https://adn-cis.org/vstraivanie-izobrazheniya-v-chertezh.html

Опубликовано 20.02.2022     Читать далее >>>
24/01/2022

Установка стиля печати

Вы можете обнаружить, что при попытке назначить стиль печати слою с помощью AcDbLayerTableRecord::setPlotStyleName() иногда возвращается «eKeyNotFound»? Это связано с тем, что PlotStyles и plotStyleNames не совпадают. PlotStyleNames — это просто записи в словаре plotStyleName (ACAD_PLOTSTYLENAME). Они не полагаются на plotStyles в файлах STB и автоматически не генерируются plotStyles. Намерение противоположно тому, что вы могли бы подумать; наоборот plotStyleName используется в качестве имени поиска, когда AutoCAD ищет plotStyle.

Когда setPlotStyleName возвращает "Acad::eKeyNotFound", это указывает на отсутствие такой записи в словаре plotStyleName. Чтобы создать нужную запись в этом словаре, вы можете использовать метод AcDbDatabase::getPlotStyleNameDictionary() для получения указателя на словарь plotStyleName (это объект типа класса AcDbDictionaryWithDefault, производный от AcDbDictionary). Затем вам нужно создать новый объект AcDbPlaceHolder и добавить его в словарь plotStyleName, используя нужное вам plotStyleName в качестве ключа записи.

Обратите внимание, что в словаре plotStyleName есть запись по умолчанию "Нормальный" класса AcDbPlaceHolder. А функция setPlotStyleName возвращает статус ошибки, если стиль печати не может быть найден в текущей таблице стилей печати (как в этом случае) или если PlotStyleMode чертежа настроен на использование стилей печати на основе цвета.

Опубликовано 24.01.2022     Читать далее >>>
24/01/2022

Вставка растрового файла в AutoCAD при помощи ObjectARX

Внутри ObjectARX есть два класса, которые мы используем для представления изображений: один — AcDbRasterImage, а другой — AcDbRasterImageDef.

Объект AcDbRasterImage (объект изображения) работает с объектом AcDbRasterImageDef (объект определения изображения) для реализации растровых изображений внутри AutoCAD. Связь между этими двумя классами очень похожа на связь между объектом определения блока AutoCAD и объектом вставки блока.

Объект изображения — это объект AutoCAD с возможностью рисования и выбора, который помещает растровое изображение в пространство модели или листа в определенном месте и с определенной ориентацией. Объект изображения связан ровно с одним объектом определения изображения, которому он отправляет запросы на операции обработки изображения, необходимые для отображения и печати изображений. Поскольку объект определения изображения управляет всей информацией об изображении, его объект изображения относительно мал. Помимо местоположения и ориентации изображения, он содержит границу подрезки, параметры затухания изображения, контрастности и яркости, а также другие типичные свойства AcDbEntity, такие как слой и цвет.

Опубликовано 24.01.2022     Читать далее >>>
24/01/2022

Как создать несколько видовых экранов модели с помощью API?

Вопрос:

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

Ответ:

В приведенном ниже примере кода показано, как создать четыре видовых экрана в пространстве модели с возможными разными представлениями модели. Для простоты задаются только параметры просмотра первого видового экрана.

Что касается выполнения этой обработки на каждом новом чертеже, то нам поможет выполнение нашего кода в реакторе AcApDocManagerReactor::documentCreated

Опубликовано 24.01.2022     Читать далее >>>
24/01/2022

Установка текущего визуального стиля при помощи ObjectARX

Вы можете использовать функцию acdbSetViewportVisualStyle для установки необходимого визуального стиля. Пример того, как установить визуальный стиль Реалистичный (Realistic).
Опубликовано 24.01.2022     Читать далее >>>
24/01/2022

Ошибка Acad::eWrongObjectType при вызове AcDbDictionary::setAt()

Ошибка Acad::eWrongObjectType при вызове AcDbDictionary::setAt()

Acad::eWrongObjectType error with AcDbDictionary::setAt()

Что же может заставить при вызове AcDbDictionary::setAt() вернуть ошибку Acad::eWrongObjectType ?

К сожалению эта ошибка не документирована в ObjectARX SDK для метода AcDbDictionary::setAt, но может быть несколько причин, по которым вы можете столкнуться с этой ошибкой.

Если вы добавляете пользовательский объект (Custom object) в словарь, вы должны зарегистрировать его класс в AutoCAD. Если этого не сделать, то это может привести именно к этой ошибке.

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

Как создать конус средствами ObjectARX , который можно было бы редактироватьАвтор: Александр Ривилис

Вопрос: Если создавать конус при помощи команды КОНУС (_CONE), то конус создаётся параметрическим – у него есть ручки и в свойствах этого 3DSOLID видно, что это конус и у него есть параметры (радиусы и высота). Если же я использую для создания конуса метод AcDb3dSolid:: createFrustum, то конус создаётся не параметрическим и его можно только переносить, но не изменять параметрически. Как средствами ObjectARX можно воспроизвести поведение команды Конус.

Ответ: Для этой цели достаточно включить запись истории редактирования 3DSOLID. Ниже приведён полный пример кода, который это проделывает:

Опубликовано 09.12.2021     Читать далее >>>
31/10/2021

Как обеспечить синхронизацию AcDbMLeader с его стилем AcDbMLeaderStyleАвтор: Александр Ривилис

Вопрос: Если создавать мультивыноску (класс AcDbMLeader) при помощи команды _MLEADER, то эта мультивыноска будет следовать изменениям в её стиле мультивыноски (класс AcDbMLeaderStyle). А если создавать при помощи кода, то мультивыноска не следует за изменениями в стиле мултивыноски. Почему? И как сделать, чтобы поведение созданной программно мультивыноски было такой же, что и у созданной в команде _MLEADER?

Ответ: Для того, чтобы сделать такое поведение необходимо выполнить два условия:

1) Необходимо вызвать метод AcDbMLeader::setOverride с параметром isOverride == false (это значит, что параметр не переопределён в мултивыноске и используется тот, который в стиле мультивыноски) и параметром propertyType соответствующим тому свойству, которое должно браться из стиля мультивыноски. Вызывать этот метод можно несколько раз с разными значениями propertyType.

2) Необходимо вызвать метод AcDbMLeaderStyle::addPersistentReactor для того, чтобы добавить AcDbMLeader::objectId() к стилю мультивыноски, чтобы стиль был в курсе какие мультивыноски следует обновлять.

Опубликовано 31.10.2021     Читать далее >>>
11/07/2021

Удаление выбранных примитивов из групп, в которых они содержатсяАвтор: Александр Ривилис

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

Ответ: Для этого в первую очередь необходимо отключить групповой выбор (PICKSTYLE должно быть равно 0 или 2), чтобы можно было выбирать отдельные примитивы из групп. Ниже приведен код, позволяющий удалять выбранные примитивы из групп:

Опубликовано 11.07.2021     Читать далее >>>
06/07/2021

Как выполнить расчленение группы примитивов при помощи ObjectARXАвтор: Александр Ривилис

Следующий код показывает как можно расчленить группу, заданную её именем:
Опубликовано 06.07.2021     Читать далее >>>
11/04/2021

Как подсветить примитив внутри блока или внешней ссылкиАвтор: Александр Ривилис

Вопрос: Для того чтобы подсветить примитив в текущем пространстве (Модели или Листа) достаточно воспользоваться методом AcDbEntity::highlight(). А как подсветить примитив, который находится в составе блока (возможно вложенного блока) или во внешней ссылке?

Ответ: Для этой цели следует воспользоваться методом AcDbEntity::highlight(AcDbFullSubentPath& subId), предварительно создав правильный AcDbFullSubentPath.

Опубликовано 11.04.2021     Читать далее >>>
28/01/2021

Команда для конвертации 3D-модели AutoCAD в DWFX

Было внутреннее обсуждение возможности использования 3DDWF в скриптах. В настоящий момент команда 3DDWF вызывает диалог выбора имени файла для сохранения экспортируемой модели. Этот диалог препятствует выполнению скриптов, содержащих команду 3DDWF. Хотелось бы иметь команду, которая бы выполняла функцию экспорта без диалога в скрипте. Ниже код который использует технику получения адреса экспортируемой функции (getSymbolAddress ) из динамически линкуемой библиотеки (DLL) и вызывает её с параметром – именем файла для экспорта. Это выгляди так:

Опубликовано 28.01.2021     Читать далее >>>
28/01/2021

Как определить включен ли режим крупных кнопок панелей инструментов?Автор: Александр Ривилис

Как определить включен ли режим крупных кнопок панелей инструментов?

Вопрос: Как определить включен ли режим крупных кнопок панелей инструментов?

Ответ: Для этой цели следует воспользоваться COM/ActiveX моделью AutoCAD. С помощью ObjectARX/C++ это будет выглядеть так:

Опубликовано 28.01.2021     Читать далее >>>
26/10/2020

Как обновить информацию в командной строке AutoCAD?Автор: Александр Ривилис

Вопрос: В процессе длительного выполнения кода необходимо обновлять информацию в командной строке AutoCAD (например, процент выполнения). В старых версиях AutoCAD достаточно было вызвать acedPrompt(L""). Начиная с AutoCAD 2015 это не помогает.

Ответ: По-прежнему в последних версиях AutoCAD lisp-выражение (princ) позволяет обновить содержимое командной строки. В ObjectARX для этой цели приходится использовать недокументированную функцию adsi_flushcommandline(). При этом следует учитывать, что для обновления интерфейса AutoCAD ему необходимо дать возможность обработать свои сообщения. Для этой цели можно воспользоваться такой функцией:

Опубликовано 26.10.2020     Читать далее >>>
14/09/2020

Установка «Показать область печати» с помощью API

Когда вы создаёте новый лист новые Параметры Листа называются *ЛистN*

На листе вы видите область печати, которая отмечена штриховым прямоугольником:

Опубликовано 14.09.2020     Читать далее >>>
20/05/2020

Как задать в всплывающих подсказках жирный шрифт?Автор: Александр Ривилис

Вопрос: Недавно на форуме мне задали вопрос о том как можно управлять шрифтом в окне всплывающих подсказок при наведении курсора на примитив?

Ответ: Я начал исследование с этой статьи: https://adndevblog.typepad.com/autocad/2013/03/formatting-in-rollover-tip.html

При анализе её вскрылись некоторые интересные моменты. AutoCAD использует WPF (а точнее XAML) для показа таких всплывающих подсказок. В тексте подсказок можно использовать встроенные теги: <Bold> (для жирного шрифта), <Italic> (для наклонного шрифта), <Underline> (подчеркнутый шрифт) и <Hyperlink> (гиперссылка). Но не всё так просто. AutoCAD использует конструкцию вида:

Опубликовано 20.05.2020     Читать далее >>>
16/04/2020

Что нового в AutoCAD 2021 и в различных AutoCAD API?Автор: Александр Ривилис

Что нового в AutoCAD 2021 и в различных AutoCAD API?
Опубликовано 16.04.2020     Читать далее >>>
03/04/2020

ObjectARX 2021: Ошибки линковки с VS 2019

Вопрос: При линковке приложения, которое нормально компилировалось и линковалось с ObjectARX SDK 2020, мы получаем ошибки линковки.

Ответ: Код примитивов AutoCAD для 3D-моделирования (AcDbSubDMesh, AcDb3dSolid, AcDbRegion, AcDbAsmBody, AcDbShape и т.д.) сейчас перенесён в новую библиотеку AcGeomEnt.lib и соответственно требуется линковка с этой библиотекой, находящейся в каталоге <SDK>\lib-x64\

Опубликовано 03.04.2020     Читать далее >>>
31/03/2020

Где можно найти файл AsdkHlrApi24.dbx

Начиная с AutoCAD 2021 этот модуль удалён из ObjectARX SDK-овской директории Redist и включен как часть в AutoCAD 2021.
Опубликовано 31.03.2020     Читать далее >>>
15/03/2019

Как управлять статусом показа диалогового окна размера текста OLEАвтор: Александр Ривилис

При вставке OLE объекта в чертеж AutoCAD может появляться или не появляться диалоговое окно установки размера текста OLE. Управляется статус показа этого окна в команде НАСТРОЙКА (_OPTIONS). А как можно управлять этим статусом из программы на ObjectARX? Это можно делать двумя способами – используя COM/ActiveX модель AutoCAD используя свойство Application.Preferences.System.DisplayOLEScale Но это несколько громоздко в случае если arx-приложение вообще не использует COM. Есть и второй способ использующий функцию acedSetEnv
Опубликовано 15.03.2019     Читать далее >>>