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

23/12/2013

Добавление и удаление примитивов из набора предварительного выбора в ObjectARX

Вы можете воспользоваться функцией “acedSSSetFirst” для создания набора (с «ручками») предварительного выбора. Ниже пример команды, которая запрашивает выбор примитивов и помещает их в набор предварительного выбора. Код также показывает окно сообщений, и как только нажимаете «Да», набор удаляется из набора предварительного выбора. Заметим, что команда позволяющая выбирать и устанавливать набор предварительного выбора должна иметь флаги ACRX_CMD_USEPICKSET и ACRX_CMD_REDRAW

Опубликовано 23.12.2013     Читать далее >>>
20/12/2013

Получение информации из прокси-примитивов

Вы можете воспользоваться классом “AcDbProxyEntity” для получения оригинального имени класса, оригинального dxf-имени и числа ссылок на этот примитив в файле чертежа.

Ниже код, который получает “originalClassName” и “originalDxfName” прокси-примитива.

Опубликовано 20.12.2013     Читать далее >>>
18/12/2013

Удаление всех прокси-примитивов из чертежа средствами ObjectARX

Вопрос:

Я хочу работать с чертежом, содержащем пользовательские объекты, для которых у меня нет соответствующего приложения. Я бы хотел использовать данные из чертежа для построения новой «геометрии». Какие-то примитивы можно расчленить, а какие-то нет. И они отмечены как неудаляемые. Я создаю эквивалент для этих примитивов, а вот удалить их не могу. Возможно ли их удалить?

Ответ
Средствами ObjectARX можно заменить прокси-примитивы на какие-то другие. Следующий код делает именно это: проходит по всем примитивам чертежа, переключая все прокси-примитивы на анонимные блоки. Блоки содержат эквивалентную геометрию прокси-примитивов. Заметим, что нельзя создать примитив содержащий ту же информацию, что и исходный примитив.

Опубликовано 18.12.2013     Читать далее >>>
16/12/2013

Расчленение всех примитивов из набора

Ниже код для расчленения всех примитивов из набора. Мы используем метод explode() класса AcDbEntity class и результат расчленения сохраняется в массиве AcDbVoidPtrArray. Все примитивы из AcDbVo

Опубликовано 16.12.2013     Читать далее >>>
13/12/2013

Использование набора предварительного выбора в команде копирования

Вопрос :

У меня есть набор предварительного выбора и я хотел бы получить его копию сразу и целиком, а не копировать последовательно каждый примитив из набора при помощи вызова функции acedCommand (RTSTR, "_copy",..). Есть ли возможность вызвать однократно acedCommand (RTSTR, "_copy",..) для всего набора, как это делает AutoCAD?

Ответ :
Вы можете использовать набор, передав RTPICKS и набор в функцию acedCommand:

Опубликовано 13.12.2013     Читать далее >>>
11/12/2013

Выбор определенных примитивов из набора предварительного выбора

Системная переменная 'PICKFIRST' будучи установленной в '1' позволяет пользователю выбрать примитивы до запуска команды AutoCAD. Это применимо и к командам, созданным при помощи ObjectARX.

Есть две ARX-функции, которые позволяют получить набор предварительного выбора. Это функция acedSSGet() с опцией "_I", и чаще используемая функция acedSSGetFirst(). Это демонстрирует следующий код. Имя команды 'pfss'.

Если пользователь предварительно выберет примитивы и запустит команду 'pfss', эти примитивы попадут в набор 'pfSet'. Проверим , что число элементов в наборе больше нуля и если это так, то выполним цикл 'for'. В цикле 'for' получаем ObjectId каждого примитива и открываем примитив «для чтения». Проверяем примитив при помощи функции 'isA()'. Вы можете аналогично проверить и пользовательские примитивы если замените имя на имя пользовательского класса.

Опубликовано 11.12.2013     Читать далее >>>
09/12/2013

Как определить направление вращения замкнутой полилинии?

Чтобы определить направление вращения полилинии по часовой или против часовой стрелки можно пройтись по всем сегментам полилинии и проверить лежит ли он справа или слева. Следующий код делает именно это. Он подсчитывает сумму числа поворотов для всех сегментов. Повороты возможны внутри сегментов (если они дуговые) или между последовательными сегментами. Результат работы функции – число поворотов. Если поворот налево – число положительное, если поворот направо – отрицательное. Заметим, что алгоритм не определяет, является ли полилиния самопересекающейся и может даже давать ошибочные результаты если полилиния действительно самопересекающаяся.

Опубликовано 09.12.2013     Читать далее >>>
04/12/2013

Передача списка значений в ObjectARX из Lisp приводит к ошибке

Вопрос:

Передача списка значений в ObjectARX-функцию из Lisp приводит к ошибкам в том случае, когда некоторые значения чисел (Пример: 5011, 25111) являются частью списка. Как этого избежать?

Ответ:

Некоторые числовые значения интерпретируются как DXF-коды, что и приводит к исключениям.

Опубликовано 04.12.2013     Читать далее >>>
02/12/2013

Получение копий сложных объектов без помещения их в базу

Используя ObjectARX вы можете создать копию одиночного простого объекта без помещения в базу при помощи методов clone() или copyFrom(). Но эти два метода не работают со сложными объектами, такими как AcDbBlockReference (вставка блока) с AcDbAttribute (атрибут). Как описано в документации, метод clone() вызывает метод copyFrom(), который делает поверхностную копию объекта. Другими словами, эти методы не копируют объекты атрибутов (AcDbAttribute). И не существует прямого метода в ObjectARX чтобы получить полную копию сложного объекта.

Опубликовано 02.12.2013     Читать далее >>>
22/10/2013

Как показать диалоговое окно редактирования поля (Field) средствами ObjectARX

Вы можете показать диалоговое окно AutoCAD редактирования поля, используя функцию “AcFdUiInvokeFieldDialog”. При помощи этой функции можно показать диалог и вернуть объект поля, выбранный пользователем, переданный как первый параметр. Код ниже показывает как это сделать:

Опубликовано 22.10.2013     Читать далее >>>
19/10/2013

Изменение цвета вершины у сети (SubDMesh)

Чтобы назначить цвета вершинам сети (SubDMesh), примитив сети (SubDMesh) должен быть предварительно добавлен в базу данных чертежа, прежде чем вызвать метод "AcDbSubDMesh::setVertexColorArray". Вот пример:

Опубликовано 19.10.2013     Читать далее >>>
27/09/2013

Получение положения мыши (курсора) без события

AutoCAD API реализует интерфейс AcEdInputPointManager.InputPointMonitor который отслеживает любой ввод пользователя, в том числе и перемещение мыши. При помощи API можно отслеживать и сообщения в очереди Windows. Иногда нужно получить текущее положение мыши без наступления какого-либо события. Следующий код демонстрирует как это можно сделать. В действительности достаточно получить текущее положение курсора Windows и преобразовать его в координаты AutoCAD. Следует учитывать также ПСК.
Опубликовано 27.09.2013     Читать далее >>>
26/09/2013

Как реагировать на клавиши курсора (без передачи их в AutoCAD) используя ObjectARX?

В ObjectARX вы можете добавить фильтр в функцию обработки окна AutoCAD можно использовать PInvoke для использования этой функциональности в .NET).

Опубликовано 26.09.2013     Читать далее >>>
21/09/2013

Описание метода Database.ResolveXrefs

Если вам интересно, что за параметры используются в методе…

public void Database.ResolveXrefs(bool useThreadEngine, bool doNewOnly)

…тогда взгляните описание эквивалентной функции в ObjectARX Reference Guide

Опубликовано 21.09.2013     Читать далее >>>
18/09/2013

Зумирование, панорамирование и орбита текущего вида AutoCAD с помощью ObjectARX

Наш коллега Киан написал статью о зумировании, панорамировании и орбите текущего вида при помощи .NET. Я переписал этот код с помощью ObjectARX.
Опубликовано 18.09.2013     Читать далее >>>
16/09/2013

Длина имен ключей в словаре

К именам ключей в словаре применимы те же правила, что и к именам в символьных таблицах: не больше 255 символов, должны быть буквенно-цифровые и могут содержать символы доллара ($), подчеркивания (_) и переноса (-). Можно использовать функцию acdbSNValid() для проверки допустимости имени.

Опубликовано 16.09.2013     Читать далее >>>
13/09/2013

Закрытие документов из унаследованного от CAdUiDialog диалога

Вопрос:
Я не могу закрыть документы с использованием closeDocument API из диалога, унаследованного от CAdUiDialog, так как AutoCAD сообщает, что документ занят. Почему это происходит?

Опубликовано 13.09.2013     Читать далее >>>
09/09/2013

Использование ActiveX интерфейса AutoCAD при его завершении

Мы можем попробовать использовать в ObjectARX-приложении ActiveX интерфейс AutoCAD для установки пользовательского профиля при старте и завершении AutoCAD при помощи интерфейсов IAcadApplication и IAcadPreferences

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

Выбор примитивов пространства Модели из пространства Листа без предварительного выбора видового экрана средствами ObjectARX

Вопрос:
Как можно выбрать примитивы Модели находясь в Листе без предварительного выбора видового экрана?

Ответ:
В ObjectARX есть недокументированная функция acedNEntSelPEx(), которая позволяет сделать именно это. Она даже позволяет передать точку указания при помощи параметра ‘pickflag’, так что вы сами можете обеспечить точку в пространстве листа.

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