Внедрение изображения в чертеж
В этой статье мы рассмотрим создание пользовательского объекта, унаследованного от AcDbRasterImageDef, который сохраняет / загружает данные изображения в / из чертежа с помощью ATIL. Это гарантирует, что ваш чертеж не зависит от внешнего файла изображения, и данные изображения будут загружены в AcDbRasterImageDef, если ARX загружен в AutoCAD. Для других способов встроить изображение на рисунке, не имея зависимости от внешнего файла изображения, пожалуйста, обратитесь к этой статье: https://adn-cis.org/vstraivanie-izobrazheniya-v-chertezh.html
Установка стиля печати
Вы можете обнаружить, что при попытке назначить стиль печати слою с помощью 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 чертежа настроен на использование стилей печати на основе цвета.
Вставка растрового файла в AutoCAD при помощи ObjectARX
Внутри ObjectARX есть два класса, которые мы используем для представления изображений: один — AcDbRasterImage, а другой — AcDbRasterImageDef.
Объект AcDbRasterImage (объект изображения) работает с объектом AcDbRasterImageDef (объект определения изображения) для реализации растровых изображений внутри AutoCAD. Связь между этими двумя классами очень похожа на связь между объектом определения блока AutoCAD и объектом вставки блока.
Объект изображения — это объект AutoCAD с возможностью рисования и выбора, который помещает растровое изображение в пространство модели или листа в определенном месте и с определенной ориентацией. Объект изображения связан ровно с одним объектом определения изображения, которому он отправляет запросы на операции обработки изображения, необходимые для отображения и печати изображений. Поскольку объект определения изображения управляет всей информацией об изображении, его объект изображения относительно мал. Помимо местоположения и ориентации изображения, он содержит границу подрезки, параметры затухания изображения, контрастности и яркости, а также другие типичные свойства AcDbEntity, такие как слой и цвет.
Как создать несколько видовых экранов модели с помощью API?
Вопрос:Я хотел бы создать несколько видовых экранов в пространстве модели, например, четыре видовых экрана, которые делили бы экран на четыре равных части, как четыре разных вида одной и той же модели. Кроме того, я хотел бы делать это автоматически для каждого чертежа, который я создаю из пользовательского интерфейса. Как этого можно добиться при помощи ObjectARX?
Ответ:
В приведенном ниже примере кода показано, как создать четыре видовых экрана в пространстве модели с возможными разными представлениями модели. Для простоты задаются только параметры просмотра первого видового экрана.
Что касается выполнения этой обработки на каждом новом чертеже, то нам поможет выполнение нашего кода в реакторе AcApDocManagerReactor::documentCreated
Установка текущего визуального стиля при помощи ObjectARX
Вы можете использовать функцию acdbSetViewportVisualStyle для установки необходимого визуального стиля. Пример того, как установить визуальный стиль Реалистичный (Realistic).Ошибка 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. Если этого не сделать, то это может привести именно к этой ошибке.
Как создать конус средствами ObjectARX , который можно было бы редактироватьАвтор: Александр Ривилис
Вопрос: Если создавать конус при помощи команды КОНУС (_CONE), то конус создаётся параметрическим – у него есть ручки и в свойствах этого 3DSOLID видно, что это конус и у него есть параметры (радиусы и высота). Если же я использую для создания конуса метод AcDb3dSolid:: createFrustum, то конус создаётся не параметрическим и его можно только переносить, но не изменять параметрически. Как средствами ObjectARX можно воспроизвести поведение команды Конус.
Ответ: Для этой цели достаточно включить запись истории редактирования 3DSOLID. Ниже приведён полный пример кода, который это проделывает:
Как обеспечить синхронизацию AcDbMLeader с его стилем AcDbMLeaderStyleАвтор: Александр Ривилис
Вопрос: Если создавать мультивыноску (класс AcDbMLeader) при помощи команды _MLEADER, то эта мультивыноска будет следовать изменениям в её стиле мультивыноски (класс AcDbMLeaderStyle). А если создавать при помощи кода, то мультивыноска не следует за изменениями в стиле мултивыноски. Почему? И как сделать, чтобы поведение созданной программно мультивыноски было такой же, что и у созданной в команде _MLEADER?
Ответ: Для того, чтобы сделать такое поведение необходимо выполнить два условия:
1) Необходимо вызвать метод AcDbMLeader::setOverride с параметром isOverride == false (это значит, что параметр не переопределён в мултивыноске и используется тот, который в стиле мультивыноски) и параметром propertyType соответствующим тому свойству, которое должно браться из стиля мультивыноски. Вызывать этот метод можно несколько раз с разными значениями propertyType.
2) Необходимо вызвать метод AcDbMLeaderStyle::addPersistentReactor для того, чтобы добавить AcDbMLeader::objectId() к стилю мультивыноски, чтобы стиль был в курсе какие мультивыноски следует обновлять.
Удаление выбранных примитивов из групп, в которых они содержатсяАвтор: Александр Ривилис
Вопрос: Как средствами ObjectARX можно удалить выбранные примитивы из групп, в которых они содержатся?
Ответ: Для этого в первую очередь необходимо отключить групповой выбор (PICKSTYLE должно быть равно 0 или 2), чтобы можно было выбирать отдельные примитивы из групп. Ниже приведен код, позволяющий удалять выбранные примитивы из групп:
Как выполнить расчленение группы примитивов при помощи ObjectARXАвтор: Александр Ривилис
Следующий код показывает как можно расчленить группу, заданную её именем:Как подсветить примитив внутри блока или внешней ссылкиАвтор: Александр Ривилис
Вопрос: Для того чтобы подсветить примитив в текущем пространстве (Модели или Листа) достаточно воспользоваться методом AcDbEntity::highlight(). А как подсветить примитив, который находится в составе блока (возможно вложенного блока) или во внешней ссылке?
Ответ: Для этой цели следует воспользоваться методом AcDbEntity::highlight(AcDbFullSubentPath& subId), предварительно создав правильный AcDbFullSubentPath.
Команда для конвертации 3D-модели AutoCAD в DWFX
Было внутреннее обсуждение возможности использования 3DDWF в скриптах. В настоящий момент команда 3DDWF вызывает диалог выбора имени файла для сохранения экспортируемой модели. Этот диалог препятствует выполнению скриптов, содержащих команду 3DDWF. Хотелось бы иметь команду, которая бы выполняла функцию экспорта без диалога в скрипте. Ниже код который использует технику получения адреса экспортируемой функции (getSymbolAddress ) из динамически линкуемой библиотеки (DLL) и вызывает её с параметром – именем файла для экспорта. Это выгляди так:
Как определить включен ли режим крупных кнопок панелей инструментов?Автор: Александр Ривилис
Как определить включен ли режим крупных кнопок панелей инструментов?
Вопрос: Как определить включен ли режим крупных кнопок панелей инструментов?
Ответ: Для этой цели следует воспользоваться COM/ActiveX моделью AutoCAD. С помощью ObjectARX/C++ это будет выглядеть так:
Как обновить информацию в командной строке AutoCAD?Автор: Александр Ривилис
Вопрос: В процессе длительного выполнения кода необходимо обновлять информацию в командной строке AutoCAD (например, процент выполнения). В старых версиях AutoCAD достаточно было вызвать acedPrompt(L""). Начиная с AutoCAD 2015 это не помогает.
Ответ: По-прежнему в последних версиях AutoCAD lisp-выражение (princ) позволяет обновить содержимое командной строки. В ObjectARX для этой цели приходится использовать недокументированную функцию adsi_flushcommandline(). При этом следует учитывать, что для обновления интерфейса AutoCAD ему необходимо дать возможность обработать свои сообщения. Для этой цели можно воспользоваться такой функцией:
Установка «Показать область печати» с помощью API
Когда вы создаёте новый лист новые Параметры Листа называются *ЛистN*
На листе вы видите область печати, которая отмечена штриховым прямоугольником:
Как задать в всплывающих подсказках жирный шрифт?Автор: Александр Ривилис
Вопрос: Недавно на форуме мне задали вопрос о том как можно управлять шрифтом в окне всплывающих подсказок при наведении курсора на примитив?
Ответ: Я начал исследование с этой статьи: https://adndevblog.typepad.com/autocad/2013/03/formatting-in-rollover-tip.html
При анализе её вскрылись некоторые интересные моменты. AutoCAD использует WPF (а точнее XAML) для показа таких всплывающих подсказок. В тексте подсказок можно использовать встроенные теги: <Bold> (для жирного шрифта), <Italic> (для наклонного шрифта), <Underline> (подчеркнутый шрифт) и <Hyperlink> (гиперссылка). Но не всё так просто. AutoCAD использует конструкцию вида:
Что нового в AutoCAD 2021 и в различных AutoCAD API?Автор: Александр Ривилис
Что нового в AutoCAD 2021 и в различных AutoCAD API?ObjectARX 2021: Ошибки линковки с VS 2019
Вопрос: При линковке приложения, которое нормально компилировалось и линковалось с ObjectARX SDK 2020, мы получаем ошибки линковки.
Ответ: Код примитивов AutoCAD для 3D-моделирования (AcDbSubDMesh, AcDb3dSolid, AcDbRegion, AcDbAsmBody, AcDbShape и т.д.) сейчас перенесён в новую библиотеку AcGeomEnt.lib и соответственно требуется линковка с этой библиотекой, находящейся в каталоге <SDK>\lib-x64\