Внедрение изображения в чертеж
В этой статье мы рассмотрим создание пользовательского объекта, унаследованного от 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. Ниже приведён полный пример кода, который это проделывает:
Как создать конус, направленный вдоль заданной осиАвтор: Александр Ривилис
Вопрос: Как при помощи AutoCAD .NET API можно создать конус, который бы был направлен вдоль заданной пользователем оси?
Ответ: Для того, чтобы создать конус достаточно воспользоваться методом Solid3d.CreateFrustum. Созданный таким образом конус направлен вдоль оси Z, и начало координат находится в середине оси конуса. Дальше следует выполнить трансформацию конуса. Ниже исходный текст программы:
Доступны записи вебинаров с онлайн-тренинга по платформе Autodesk Forge для программистов на русском языкеАвтор: Юлия Еремеева
Доступны записи вебинаров с онлайн-тренинга по платформе Autodesk Forge для программистов на русском языкеКонец поддержки Internet Explorer 11 в Forge Viewer
Microsoft завершает поддержку Internet Explorer 11 (IE11) настольного приложения в июне 2022 года. Соответственно поддержка IE11 в Forge Viewer будет прекращена в конце января 2022 года.
Внимание: Некоторые продукты Autodesk, которые используют Forge Viewer, уже прекратили поддержку IE 11.
Если у вас есть вопросы или замечания по этому поводу – пишите на e-mail: forge.help@autodesk.com
По поводу анонса Microsoft читайте эту статью.
Источник: https://forge.autodesk.com/blog/end-internet-explorer-11-support-forge-viewer
Как обеспечить синхронизацию AcDbMLeader с его стилем AcDbMLeaderStyleАвтор: Александр Ривилис
Вопрос: Если создавать мультивыноску (класс AcDbMLeader) при помощи команды _MLEADER, то эта мультивыноска будет следовать изменениям в её стиле мультивыноски (класс AcDbMLeaderStyle). А если создавать при помощи кода, то мультивыноска не следует за изменениями в стиле мултивыноски. Почему? И как сделать, чтобы поведение созданной программно мультивыноски было такой же, что и у созданной в команде _MLEADER?
Ответ: Для того, чтобы сделать такое поведение необходимо выполнить два условия:
1) Необходимо вызвать метод AcDbMLeader::setOverride с параметром isOverride == false (это значит, что параметр не переопределён в мултивыноске и используется тот, который в стиле мультивыноски) и параметром propertyType соответствующим тому свойству, которое должно браться из стиля мультивыноски. Вызывать этот метод можно несколько раз с разными значениями propertyType.
2) Необходимо вызвать метод AcDbMLeaderStyle::addPersistentReactor для того, чтобы добавить AcDbMLeader::objectId() к стилю мультивыноски, чтобы стиль был в курсе какие мультивыноски следует обновлять.
Поддержка DWF и PDF в Forge Viewer
Forge Viewer (7.36) позволяет легко загружать и просматривать PDF и DWF файлы естественным путём. В прошлом эти файлы необходимо было обрабатывать дополнительно при помощи Model Derivative service но сейчас мы можем использовать расширения Autodesk.DWF и Autodesk.PDFдля загрузки этих файлов, аналогично тому, как это делает расширение Autodesk.glTF (https://forge.autodesk.com/blog/gltf-20-support-forge-viewer). Всё что от вас требуется – это вызвать методы loadExtension и loadModel в соответствии с выбранным типом расширения файла.
Использование клавиши табуляции для циклического выбора
В Revit можно использовать клавишу TAB для выбора различных вложенных элементов. Анимация в Revit показывает выбранные элементы, в статусбаре (слева внизу) показывая имена.Создаём четыре видовых экрана модели и назначаем ортогональные виды
Недавно пользователю понадобилось модифицировать код для создания раздельных видовых экранов в модели и установить каждому из них различные ортогональные виды. Код ниже создаёт четыре раздельных видовых экрана в модели. Для этого мы создаём новые ViewportTableRecord, которые представляют новые видовые экраны, а их параметры устанавливаем на основе текущей ViewportTableRecord. Это гарантирует, что ViewportTableRecord будет правильно настроен для установки орфографического представления. И в конечном итоге мы выполняем показ до границ. Вот скриншот результирующего расположения видовых экранов.
Имитация штриховки при помощи DrawableOverrule
Если вам нужно временно заштриховать примитив – для этой цели можно воспользоваться DrawableOverrule. Рисование шаблона штриховки в WorldDraw / ViewportDraw может быть как простым, так и сложным в зависимости от того, какой шаблон штриховки используется. Чтобы корректно заштриховать границу штриховки при помощи шаблона штриховки можно воспользоваться подрезкой по контуру, создаваемой в Overrule. Это упрощает реализацию Overrule, так как отсечка шаблона штриховки за пределами объекта обеспечивается подрезкой по заданным границам объекта.
Доступ к файлам стандартов оформления AutoCAD (.dws)
У меня появился шанс исследовать эту проблему, когда я наткнулся на запрос на форуме.
Когда пользователь вызывает команду _LAYTRANS, появляется диалоговое окно транслятора слоёв, и пользователю разрешено сопоставление из загруженного рисунка на текущий рисунок.
Слои из загруженного чертежа сопоставляются со слоями в текущем чертеже или могут быть сопоставлены пользователем.
Эта настройка может быть сохранена в качестве файла стандартов (.dws), для будущего использования, когда пользователь получает рисунок от клиента, пользователь может проверить, соответствует ли чертеж указанным файлам стандартов.
Файл стандартов оформления содержит таблицу трансляции слоёв в виде расширенных данных для каждого из слоёв, которые могут быть сопоставлены или транслированы.
Например, в этом файле есть соответствие между слоями A,B,C и 1,2,3. Тогда слои A,B,C файла стандартов (исходного) транслируются в слои 1,2,3 текущего чертежа (назначения)
Чтение dws-файлов точно такое же как и чтение dwg-файлов, только с другим расширением (спасибо Lee за подсказку).
Установка исходной точки штриховки при её создании в .NET
У нас был вопрос, поднятый клиентом по поводу установки исходной точки штриховки в процессе её создания.
Было обнаружено, что исходную точку штриховки следует задавать не в той транзакции, в которой эта штриховка создаётся, для того чтобы исходная точка была установлена корректно.
Ниже код, который можно использовать для проверки :
Метод Editor.Snap для изменения режима привязки точки
При использовании метода Editor.GetEntity часто требуется получить в точности все координаты точки указания, используемые для выбора объекта.
Например, рассмотрим следующую ситуацию. Построим окружность с центром в точке point (0,0,5) и радиусом 5 в плоскости XY МСК при виде сверху.
При выборе точке на окружности с использованием Editor.GetEntity, PromptEntityResult.PickedPoint вернул : (3.50064192661003 , 3.35618169844321 , 0)
Удаление выбранных примитивов из групп, в которых они содержатсяАвтор: Александр Ривилис
Вопрос: Как средствами ObjectARX можно удалить выбранные примитивы из групп, в которых они содержатся?
Ответ: Для этого в первую очередь необходимо отключить групповой выбор (PICKSTYLE должно быть равно 0 или 2), чтобы можно было выбирать отдельные примитивы из групп. Ниже приведен код, позволяющий удалять выбранные примитивы из групп: