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

30/05/2013

Чтение размерного текста в ARX

Размерный текст нельзя прочитать непосредственно, т.к. информация хранится в примитиве AcDbMText, содержащемся в записи таблицы блоков. Из AcDbDimension (или производных классов) можно получить идентификатор записи таблицы блоков при помощи метода dimBlockId(). Затем можно в записи таблицы блоков AcDbBlockTableRecord найти примитив AcDbMText и вызвать его метод contents().

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Чтение и изменение настроек AutoCAD

Изменение настроек AutoCAD возможно при помощи прямого изменения реестра или с использованием ActiveX объекта Preferences. Заметим, что прямое изменение реестра не влияет на настройки текущей сессии AutoCAD. ActiveX объект Preferences экспортирует многие свои свойства через интерфейс, который можно использовать в VBA/VB.NET или в C++/MFC приложениях. Ниже пример кода (на VB и C++), который добавляет новый путь к существующим путям доступа к вспомогательным файлам AutoCAD.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Хранение 64-битного целого в ResultBuffer

Вопрос:

Я не смог найти DXF код для хранения 64-битного целого в Расширенных данных (Extended Data). Есть ли такой?

Ответ:

Нет. Такого кода для хранения 64-битного значения в Расширенных данных (XData) нет. Это сделано специально, так как в противном случае предыдущие версии AutoCAD не смогли бы прочитать такой файл.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Установка камеры/объектива, цели, ширины и высоты вида

Вопрос:

Я хочу установить камеру, цели и поле зрения в окне модели, чтобы точно сфокусироваться на определенных объектах в перспективе. Я пытался это сделать различными способами, но никогда не получалось в точности то, что хотелось.

Решение:

В прикрепленном чертеже (Загрузить Окружности) у нас три круга: красный (r = 10), зеленый (r = 20) и голубой (r = 30). Они все параллельны и их центры лежат на одной прямой.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Удаление фильтров слоёв при помощи ObjectARX

Вопрос:

У меня есть клиент, который использует множество dwg-файлов с множеством фильтров слоёв. Как можно удалить эти фильтры с помощью программы?

Ответ:

Фильтры слоёв – это объекты типа AcDbXRecord в двух словарях (с именами ACAD_LAYERFILTERS и ACLYDICTIONARY) содержащихся в расширенном словаре таблицы слоёв. Чтобы удалить фильтры слоёв, вам необходимо пройтись по словарям ACAD_LAYERFILTERS и ACLYDICTIONARY и удалить все AcDbXRecord.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Удаление вершины у 3D-полилинии (AcDbPolyline3d) средствами ObjectARX

Удаление вершины у 3D-полилинии несколько сложнее, чем вы можете себе представить. AcDbPolyline3d – это составной тип примитива, данные ее вершин содержатся в отдельных внешних примитивах AcDbVertex3d. Так что для того, чтобы удалить вершину её нужно найти, а затем удалить при помощи метода erase().

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Текстовые примитивы в собственных примитивах не скрываются после команды СКРЫТЬ (HIDE)

Возьмем такой пример: Вы создали собственный примитив (Custom Entity) и среди других примитивов в методе worldDraw, вы рисуете текст (mode->geometry().text). После создания собственного примитива, когда выполнилась команда СКРЫТЬ (HIDE) в режиме 2D-каркас, текст в собственном примитиве оказывается не скрытым. Кроме того, когда текст рисуется как часть собственного примитива, некоторые другие примитивы могут быть скрыты неправильно. Такого не случается в собственных примитивах, не содержащих текстовые примитивы.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Создание BMP-файла из выбранных примитивов

Если вы хотите создать/сохранить BMP-файл из выбранных примитивов вы можете воспользоваться методом Export() класса AcadDocument из состава ActiveX Automation API AutoCAD’а

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Свойства примитивов в JIG не появляются в OPM (Панель свойств)

Вопрос:

Мой код очень точно следует примеру "ObjectARX 2009 SDK\samples\editor\Palettes\BoltSolution", но свойства примитивов во время JIG не появляются в Панели свойств (OPM).

Ответ:

После просмотра кода стало ясно, что вы забыли добавить флаг ACRX_CMD_INTERRUPTIBLE к флагам команды, которая стартует JIG:

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Рисование горизонтального текста в собственном примитиве

Вопрос:

Как рисовать текст в собственном примитиве, который будет всегда горизонтальным вне зависимости от направления вида и поворота при печати?

Ответ:

Вы можете использовать метод AcGiViewport::getCameraUpVector() чтобы получить вектор, направленный вверх для текущего вида. Имея этот вектор вы легко можете получить направление для отрисовки горизонтального текста в этом виде.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Рекомендуемый способ для получения доступа к AutoCAD COM интерфейсу с помощью C++

Общий способ доступа к объекту интерфейсу AutoCAD – вызов функции GetActiveObject, но он может вернуть NULL в ряде случаев (и в частности в событии On_kInitAppMsg), а также не гарантируется доступ к текущему AutoCAD...

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Расчленение текстовых примитивов

Вопрос:

Как расчленить основанные на SHX-шрифтах примитивы AcDbText на входящие в их состав линии?

Ответ:

Вы можете “расчленить” или тессиллировать текстовый примитив, используя метод AcGiTextEngine::tessellate(). Но этот метод возвращает необработанную информацию о точках, которая может быть использована для создания отдельных линий. Метод этот не учитывает свойства текстового стиля и высоту текста, а ширина подразумевается единичной.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Программное сохранение активного документа в C++/ARX приложении

Используем ActiveX интерфейс внутри ARX-приложения. Следующий пример кода показывает два подхода. Обратите внимание, что проект ARX-приложения должен поддерживать клиентские интерфейсы AutoCAD ActiveX. При помощи помощника (wizard) ARX это сделать очень просто.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Проверка состояния готовности AutoCAD с использованием OLE

Вопрос:
Как можно проверить статус готовности AutoCAD средствами OLE автоматизации? Как можно предотвратить диалог "Ошибка. Сервер занят" ("Server Busy Error")?

Ответ:
Для надежной проверки того доступен ли AutoCAD для вызова или нет вы можете использовать проверку IAcadState. Вам нужно создать глобальный инициализированный объект IAcadState в момент когда AutoCAD не занят. Для любых последующих запросов автоматизации вы можете проверять состояние занятости AutoCAD используя объект IAcadState, а затем или дождаться когда AutoCAD освободится или отменить запрос.

Опубликовано 30.05.2013     Читать далее >>>
30/05/2013

Преобразование AcGePoint3d в ads_point и наоборот

Функция asDblArray() позволяет преобразовать при необходимости AcGePoint3d в ads_point.

Опубликовано 30.05.2013     Читать далее >>>
29/05/2013

Получение информации о гранях из AcDbPolyFaceMesh и AcDbPolygonMesh

Вопрос:

Я бы хотел получить информацию о гранях для примитивов полигональных и многогранных сетей. Есть ли пример как это можно сделать?

Ответ:

Следующие примеры кода рисуют отрезки поперёк всех граней выбранных примитивов полигональной и многогранной сетей.

Опубликовано 29.05.2013     Читать далее >>>
29/05/2013

Получение граней SubD Сети

Если вы хотите получить все грани геометрии поверхности AcDbSubDMesh (называемой просто "Сеть" в Палитре свойств), то вы можете использовать либо getFaceArray (возвращает базовый (уровня 0) список граней сети) или getSubDividedFaceArray (возврат список граней сглаженной сети).

Опубликовано 29.05.2013     Читать далее >>>
29/05/2013

Получение имени блока в ARX

Вопрос:
Могу ли я используя ObjectARX получить имя блока из вставки блока внутри ObjectARX приложения? Я знаю, что это можно сделать используя ads_entget (acdbEntGet), а затем найти соответствующий код группы.

Ответ:
Нет метода у класса вставки блока, который бы возвращал имя определения блока. Вставка блока (класс AcDbBlockReference) хранит ID объекта определения блока (класс AcDbBlockTableRecord). Имя блока хранится в определении блока. Чтобы получить имя блока нужно получить ID определения блока и открыть его. Тогда можно будет получить имя блока из определения блока. Следующий код позволяет выбрать вставку блока и получить его имя:

Опубликовано 29.05.2013     Читать далее >>>
29/05/2013

Показ локализованных имён свойств с использованием Не-COM системы свойств

Если вы уже начали использовать Не-COM систему свойств в AutoCAD, пожалуйста, посмотрите эту презентацию (DevTV) моего коллеги, Adam Nagy. В этой статье мы рассмотрим изменения, которые потребуются для показа локализованных имён с использованием Не-COM системы свойств.

Опубликовано 29.05.2013     Читать далее >>>
29/05/2013

Площадь пересечения двух AcDbRegion

Следующий пример показывает использование метода AcDbRegion::booleanOper() для пересечения двух примитивов область (AcDbRegion)...

Опубликовано 29.05.2013     Читать далее >>>