Рисование горизонтального текста в собственном примитиве
Вопрос:
Как рисовать текст в собственном примитиве, который будет всегда горизонтальным вне зависимости от направления вида и поворота при печати?
Ответ:
Вы можете использовать метод AcGiViewport::getCameraUpVector() чтобы получить вектор, направленный вверх для текущего вида. Имея этот вектор вы легко можете получить направление для отрисовки горизонтального текста в этом виде.
Рекомендуемый способ для получения доступа к AutoCAD COM интерфейсу с помощью C++
Общий способ доступа к объекту интерфейсу AutoCAD – вызов функции GetActiveObject, но он может вернуть NULL в ряде случаев (и в частности в событии On_kInitAppMsg), а также не гарантируется доступ к текущему AutoCAD...
Расчленение текстовых примитивов
Вопрос:
Как расчленить основанные на SHX-шрифтах примитивы AcDbText на входящие в их состав линии?
Ответ:
Вы можете “расчленить” или тессиллировать текстовый примитив, используя метод AcGiTextEngine::tessellate(). Но этот метод возвращает необработанную информацию о точках, которая может быть использована для создания отдельных линий. Метод этот не учитывает свойства текстового стиля и высоту текста, а ширина подразумевается единичной.
Разрешить отладку JavaScript в AutoCAD 2014
В AutoCAD 2014 появился новый API - JavaScript API. Не вдаваясь сейчас в излишние подробности (более детально это будет рассмотрено в другом месте) он позволяет разработчикам размещать свои приложения в интернете (через URL), а не посредством модели загрузка / инсталляция – это очень здорово.
Программное сохранение активного документа в C++/ARX приложении
Используем ActiveX интерфейс внутри ARX-приложения. Следующий пример кода показывает два подхода. Обратите внимание, что проект ARX-приложения должен поддерживать клиентские интерфейсы AutoCAD ActiveX. При помощи помощника (wizard) ARX это сделать очень просто.
Проверка состояния готовности AutoCAD с использованием OLE
Вопрос:
Как можно проверить статус готовности AutoCAD средствами OLE автоматизации? Как можно предотвратить диалог "Ошибка. Сервер занят" ("Server Busy Error")?
Ответ:
Для надежной проверки того доступен ли AutoCAD для вызова или нет вы можете использовать проверку IAcadState. Вам нужно создать глобальный инициализированный объект IAcadState в момент когда AutoCAD не занят. Для любых последующих запросов автоматизации вы можете проверять состояние занятости AutoCAD используя объект IAcadState, а затем или дождаться когда AutoCAD освободится или отменить запрос.
Преобразование координат точки из пространства Листа в пространство Модели средствами AutoCAD .NET API
Недавно я попытался найти какую-нибудь информацию о том, как преобразовать координаты точки из пространства Листа в пространство Модели и был шокирован тем, что нет простого кода для этого!!! Возможно, я упустил что-то очевидное, тем не менее, я решил создать свой собственный код и поделиться им с вами.
Преобразование AcGePoint3d в ads_point и наоборот
Функция asDblArray() позволяет преобразовать при необходимости AcGePoint3d в ads_point.
Получение размерных ограничений и их ассоциативных свойств в .NET
Вот полезный код для тех из вас, кто работает с .NET Associative API. Ниже пример на C# показывает как выполнить дамп всех размерных ограничений в текущем пространстве (Модели или Листа). Он так же показывает как по объектам, накладывающим ограничения найти зависимые примитивы и управляющие ими ассоциативные параметры.
Получение нормали к грани 3D-тела с помощью BREP .NET API
Следующая C#-статья иллюстрирует как получить нормаль к грани 3D-тела с помощью функционала BRep .NET API:
Получение координат контура подрезки
Вопрос:
Я могу установить контур подрезки при помощи метода AcadRasterImage.ClipBoundary, но как я могу получить координаты уже существующего контура подрезки? Я знаю, что если контур прямоугольный, то я могу получить граничный прямоугольник, ширину и высоту. А если контур подрезки имеет неправильную (непрямоугольную) форму, то я не могу найти ни одного метода, чтобы получить его координаты.
Решение:
Эквивалент метода из ObjectARX AcDbRasterImage::clipBoundary() не представлен в текущей модели ActiveX Automation.
Мы можем самостоятельно предоставить такой метод. Полный проект прилагается: ImgClipBoundary
Получение информации о гранях из AcDbPolyFaceMesh и AcDbPolygonMesh
Вопрос:
Я бы хотел получить информацию о гранях для примитивов полигональных и многогранных сетей. Есть ли пример как это можно сделать?
Ответ:
Следующие примеры кода рисуют отрезки поперёк всех граней выбранных примитивов полигональной и многогранной сетей.
Получение информации о гранях PolyFaceMesh в .NET
Это .NET версия этой статьи
Обычно достаточно просто мигрировать из кода ObjectARX в код AutoCAD .NET API, так как это просто обертки над ARX API. Вам нужно убрать префикс AcDb из имён классов базы данных, использовать foreach вместо функции создающей итератор, использовать транзакции, и большая часть следующего кода будет готова :)
Получение граней SubD Сети
Если вы хотите получить все грани геометрии поверхности AcDbSubDMesh (называемой просто "Сеть" в Палитре свойств), то вы можете использовать либо getFaceArray (возвращает базовый (уровня 0) список граней сети) или getSubDividedFaceArray (возврат список граней сглаженной сети).
Получение имени блока в ARX
Вопрос:
Могу ли я используя ObjectARX получить имя блока из вставки блока внутри ObjectARX приложения? Я знаю, что это можно сделать используя ads_entget (acdbEntGet), а затем найти соответствующий код группы.
Ответ:
Нет метода у класса вставки блока, который бы возвращал имя определения блока. Вставка блока (класс AcDbBlockReference) хранит ID объекта определения блока (класс AcDbBlockTableRecord). Имя блока хранится в определении блока. Чтобы получить имя блока нужно получить ID определения блока и открыть его. Тогда можно будет получить имя блока из определения блока. Следующий код позволяет выбрать вставку блока и получить его имя:
Показ локализованных имён свойств с использованием Не-COM системы свойств
Если вы уже начали использовать Не-COM систему свойств в AutoCAD, пожалуйста, посмотрите эту презентацию (DevTV) моего коллеги, Adam Nagy. В этой статье мы рассмотрим изменения, которые потребуются для показа локализованных имён с использованием Не-COM системы свойств.
Площадь пересечения двух AcDbRegion
Следующий пример показывает использование метода AcDbRegion::booleanOper() для пересечения двух примитивов область (AcDbRegion)...
Печать листов с использованием объекта Plot ActiveX в ObjectARX
Следующий код показывает как напечатать все листы в пакетном режиме с использованием ActiveX API в C++
Ключевые моменты для пакетной печати:
1) Установим число листов, которые будут напечатаны при помощи метода StartBatchMode() объекта IAcadPlot ...
Перехват вывода в текстовый экран и командную строку AutoCAD
Вопрос:
Как получить текстовый вывод команд, таких как СПИСОК (_LIST), а также скрыть вывод некоторых команд в командную строку?
Ответ:
Вы можете временно подменить объект HostApplicationServices своим собственным...
Пересечение Поверхности и Отрезка с использованием ARX
В другой статье, мой коллега Philippe рассказал о получении точки пересечения между плоскостью и отрезком. В этой статье мы увидим, как получить пересечение любой поверхности и отрезка.