Создание простой полигональной сети
Это пример создания простой полигональной сети при помощи ObjectARX. Если используется конструктор AcDbPolygonMesh() без каких-либо параметров, необъодимо явно задать количество вершин в направлениях M и N, а также открыта или закрыта полигональная сеть в направлениях M и N:
Как получить имя локализации с помощью ObjectARX
В ObjectARX SDK есть класс AcLocale, при помощи которого можно получить информацию о языке локализации AutoCAD. Класс AcLocale появился только в версии 2017.
Как определить был ли сохранён dwg-файл в ПО Autodesk или нет
Класс AcDbDatabase содержит метод dwgFileWasSavedByAutodeskSoftware для определения того был ли сохранён dwg-файл в ПО Autodesk или нет. Аналогично в AutoCAD .NET API в классе Database есть свойство DwgFileWasSavedByAutodeskSoftware.Как получить цвет солнца
Цвет солнца вычисляется по географическому положению, дате и времени дня.Начиная с ObjectARX 2017 у нас есть API для получения цвета солнца как из палитры свойств солнца:
Добавление пользовательского меню к фрейму приложения AutoCAD
В AutoCAD 2016 представлен новый класс AdApplicationFrame, который содержит множество API для доступа к фрейму приложения.В этой статье мы покажем как создать и добавить свое меню вместо существующей строки меню AutoCAD (‘MENUBAR’).
При помощи экземпляра AdApplicationFrame мы можем добавлять MFC-элементы пользовательского интерфейса в наш AutoCAD.
Как средствами ObjectARX получить точки пересечения кривой и плоскостиАвтор: Александр Ривилис
Вопрос: Имеется кривая (наследник AcDbCurve) и задана плоскость AcGePlane. Каким образом можно получить все точки пересечения кривой и плоскости?
Ответ: Для этой цели мы воспользуемся геометрической библиотекой. Во-первых, при помощи функции acdbConvertAcDbCurveToGelibCurve мы преобразуем AcDbCurve (и любого его наследника) в AcGeCurve3d. Во-вторых, воспользуемся классом AcGeCurveSurfInt для получения точек пересечения кривой и плоскости.
Ниже вы видите исходный код функции, которая запрашивает у пользователя кривую, начальный и конечный уровень для горизонтальных плоскостей и шаг между горизонтальными плоскостями. Результат её работы – желтые точки, отмечающие пересечение плоскостей и кривой.
Добавление иконки к имени команды без использования CUIXАвтор: Александр Ривилис
Вопрос: как программно добавить иконку для своей команды в контекстное меню, возникающее при наборе команды вручную? Один из способов мне известен – это регистрация команды в cuix-файле, как описано здесь: Adding Icon Next To Custom Command. Хотелось бы добиться такого же результата, но без создания cuix-файла.
Ответ: средствами ObjectARX это возможно. Думаю, что можно и при помощи AutoCAD .NET API, но понадобится активно использовать P/Invoke для большого числа функций из Win32 и ObjectARX. Я покажу здесь как это можно сделать при помощи ObjectARX:
Форматирование плавающего числа в строку
В ObjectARX для конвертации плавающего числа в строку используется функция acdbRToS. Эта функция также заботится о преобразовании строки в нужный формат ("Архитектурные", "Десятичные", "Инженерные", "Дробные" и "Научные"), как показано в коде ниже.Конвертация AcDb3DSolid в AcDbPolyFaceMesh средствами ObjectARXАвтор: Александр Ривилис
Вопрос: Стоит задача получить на основе AcDb3DSolid сеть AcDbPolyFaceMesh. Как это можно сделать?
Ответ: Ниже код, который позволяет это сделать. Возможны вариации в настройке AcBrMesh2dControl, определяющей насколько сеть будет повторять контуры твердого тела и какие элементы будут в основе этой сети.
Установка цвета всем граням твёрдого тела
Ниже вы видите код, который показывает как пройти по всем граням твердого тела и покрасить каждую из граней в свой цвет:Управление форматом вывода данных чисел в Панели свойств AutoCADАвтор: Александр Ривилис
Управление форматом вывода данных чисел в Панели свойств AutoCAD
В статье Как показать правильно числовое значение в Панели Свойств (OPM)? в общих чертах описывается возможность управлять форматом вывода числовых значений в Панели свойств. Всё более-менее просто если свойство статическое. В этом случае имеется возможность указать формат числа в idl-файле. А вот в случае динамического свойства требуется выполнить специальную подготовку. Форматом вывода управляют методы GetCurrentValueName и GetCurrentValueType. Вот пример, обеспечивающий независящее от единиц представление действительного числа:
Визуализация при помощи RenderToImage API
Как вы возможно уже знаете API графической системы было изменено в AutoCAD 2015, как описано в статье Изменения в графике в AutoCAD 2015. В AutoCAD 2016 рендер RapidRT заменил рендер MentalRay, который использовался в предыдущих версиях. В свете этого в ObjectARX 2016 появился новый класс AcDbRapidRTRenderSettings. Все эти изменения требуют изменений в вашем коде в случае, если вы использовали метод AcGsView::RenderToImage для генерации изображения модели AutoCAD.
Следующий код должен генерировать визуализацию изображения как в AutoCAD 2016, так и в предыдущих версиях. Чтобы учесть различные изменения графической системы и средства визуализации, приведенный ниже код широко использует возможности условной компиляции.
Чтобы попробовать это, откройте чертеж и задайте направление взгляда в AutoCAD, такой как вы хотите для того чтобы генерировать визуализированное изображение. Настройте параметры визуализации и выполните визуализацию в AutoCAD. После того как вас устроят результаты, сделать настройки визуализации текущими. Это должно сохранить предустановки визуализации в качестве активных. Приведенный ниже код, получает параметры на основе активной предустановки, и используют их для создания изображении.
Программное создание диалога "Сохрани как..."
Эта статья появилась как результат запроса от пользователя. Здесь я покажу простую реализацию диалога для сохранения файла.
Хотя у нас есть функция acedGetNavDialog, но у неё нет возможности управлять списком форматов чертежей.
Как получать уведомление об использовании полос прокрутки или зумирования в реальном времени
Есть несколько способов, чтобы получить уведомление в случае, когда экран обновляется при помощи колеса мыши или полос прокрутки.
Самый простым способом может быть субклассирование окна AutoCAD, и отлов всех сообщений WM_VSCROLL, WM_HSCROLL и WM_MOUSEWHEEL. Вы знаете, что экран будет обновляться, когда AutoCAD получит эти сообщения, и вы можете контролировать или фильтровать сообщения AutoCAD путем реализации монитора или фильтра сообщений AutoCAD. Но есть одна загвоздка. В монитор контролируемое сообщение попадёт до того, как AutoCAD отработает его. И на самом деле нет чистого способа для отслеживания сообщений AutoCAD сразу после их обработки AutoCAD. Таким образом, простейшим решением было бы установить таймер с минимальной временной задержкой, который будет использоваться для уведомления о завершении обновления экрана AutoCAD. Это подразумевает, что экран AutoCAD будет обновлен в течение этого времени, так что возможно это значение придётся изменить.
Создание многолистового PDF файла при помощи DSD
У нас уже была статья как это сделать при помощи .NET, но может потребоваться некоторое время для конвертации этого кода в ARX, так что вот он.Он не совсем такой, как в .NET, но очень похож :)
Получение доступа к каталогам поддержки и проекта
Я получил недавно запрос о том, как програмно получить доступ к каталогам поддержки и файлам проекта, которые доступны на вкладке Свойства/Файлы.
Мы можем воспользоваться ActiveX API AcadPreferences.Files для получения доступа к каталогам поддержки и файлам проекта.
Чтобы получить информацию о каталогах поддержки можно также прочитать системную переменную «ACADPREFIX» или выполнить следующий код:
Преобразование даты из Юлианского календаря
Простейший способ для преобразования Юлианской даты (формат системной переменной DATE) в формат день, месяц, год, часы минуты, секунды, миллисекунды – это использование класса AcDbDate. Вот пример его использования:
Чтение свойств чертежа (SummaryInfo) из внешнего приложения.Автор: Александр Ривилис
Вопрос:
Средствами ObjectARX и AutoCAD .NET API можно получить информацию о dwg-файле, которую записывает команда DWGPROPS. А можно ли прочитать эту информацию из внешнего C++ приложения без запуска AutoCAD?
Ответ:
Это возможно. Пример кода, который позволяет это сделать ниже:
Встраивание изображения в чертеж - 2
В этом статье мы рассмотрим создание пользовательского объекта, унаследованного от класса AcDbRasterImageDef, который сохраняет/загружает растровые данные в/из рисунка при помощи ATIL. Это гарантирует независимость чертежа от внешнего файла изображения и данные будут доступны если будет загружен ваш arx-файл в AutoCAD.Другие способы встраивания растра в чертеж без зависимости от внешнего растрового файла описаны в этой статье:
Как получить доступ и изменить свойства динамического блока в ARX и .NET
Вопрос:
У моего динамического блока есть свойство "Visibility", которое может быть в двух состояниях. Как мне получить доступ к этому свойству и изменить его?
Ответ:
Запустите следующий код с присоединённым в конце статьи чертежом. Выберите вставку динамического блока, код получит доступ к свойству Visibility и изменит его состояние. Вы сможете сразу увидеть результат после завершения работы кода.