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

28/10/2014

Получение угла поворота и оси из матрицы AcGeMatrix3d

Метод AcGeMatrix3d::rotation возвращает новую матрицу с определенным углом поворота. А как из существующей матрицы получить угол поворота? Следующий код это делает.

Опубликовано 28.10.2014     Читать далее >>>
09/10/2014

Получение габаритного контейнера сплайна с помощью ObjectARX

Вопрос:

Я хочу получить габаритный контейнер сплайна, но метод getGeomExtents() дает неточные результаты. Как можно получить точный габаритный контейнер для сплайна?

Ответ:

Для AcDbSpline метод getGeomExtents() возвращает неточный габаритный контейнер, т.к. вычисление точного контейнера сопряжено с временными тратами.

Чтобы получить точный габаритный контейнер вам придется вычислить его самостоятельно. Вы можете воспользоваться методом getPointAtParam() для прохода по сплайну и вычисления максимальных/минимальных координат X и Y. Точность вычисления габаритного контейнера зависит от того насколько частей кривая поделена. Коэффициент 1e6 даёт приемлемую точность и допустимое время для подсчета. Функции показанные ниже показывают как это можно сделать. Запустите команду SplineBB и выберите сплайн. Команда нарисует два габаритных контейнера. Красный возвращает метод getGeomExtents(), а желтый – это тот, который мы вычислили.

Опубликовано 09.10.2014     Читать далее >>>
07/10/2014

Настройка CAdUiListCtrl

Если мы пользуемся классом CAdUiListCtrl и хотим его настроить получше, мы можем использовать пользовательское рисование. Это делается точно так же, как и с любым другим элементом управления MFC. Хорошую статью о том, как это делать (на английском) для элемента управления CListCtrl вы найдете здесь.
Опубликовано 07.10.2014     Читать далее >>>
25/09/2014

Как используя Visual C++ запустить AutoCAD и заставить его выполнять некоторые действия.Автор: Александр Ривилис

AutoCAD представляет собой COM-сервер и для работы с ним имеется AutoCAD ActiveX/COM API. По этому API есть и документация, которая ориентирована на VBA и немного на VisualLisp (на английском языке), но которая позволяет понять структуру и возможности этого API.

AutoCAD 2015 – Developer's Guide и AutoCAD 2015 – Reference Guide

Кроме того документацию можно скачать полностью: http://images.autodesk.com/adsk/files/autocad_2013_activex_help.zip

Я сделал готовый пример с комментариями, который используя некоторые средства AutoCAD ActiveX/COM API, позволяет понять как можно сделать диалоговое окно с кнопкой, по которой будет запущен AutoCAD, будет создан новый документ, отрисованы некоторые примитивы, а затем этот документ будет сохранен в указанном месте. После этого работа AutoCAD будет завершена. Основная проблема при работе с AutoCAD через ActiveX API заключается в том, что в это время с AutoCAD может работать пользователь, или AutoCAD занимается своими делами и занят. В ряде случае он возвращает коды ошибки при работе с ним:

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

Ассоциативный Массив и его API

В AutoCAD 2012 появился так называемый ассоциативный массив. Одновременно с этим появилось и API для его создания, редактирования и получения информации о существующем ассоциативном массиве. Например, вот так можно получить характеристики массива:

Опубликовано 13.09.2014     Читать далее >>>
26/08/2014

Синхронизация видов Пространства Модели

Это пример кода синхронизирующий параметры двух ВЭкранов пространства Модели. Для простоты код подразумевает, что Пространство Модели уже разделено вертикально на два ВЭкрана одинаковой ширины. Если ширина ВЭкранов не одинакова код сделает её одинаковой перед синхронизацией параметров ВЭкранов.

Опубликовано 26.08.2014     Читать далее >>>
25/08/2014

Добавление пространственного фильтра к вставке блока

В этой статье сделаны небольшие исправления для существующей статьи написанной моим коллегой Xiaodongв 2013, связанные с внутренними изменениями, которые приводят к аварийному завершению AutoCAD 2015 на 32-разрядных машинах. Чтобы предотвратить это я написал универсальный код.
Опубликовано 25.08.2014     Читать далее >>>
21/08/2014

Подрезка внешних ссылок при помощи ObjectARX

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

Ниже небольшой пример. Примечание: команда должна быть определена с флагом ACRX_CMD_NOINTERNALLOCK

Опубликовано 21.08.2014     Читать далее >>>
20/08/2014

Метод AcDbRegion::transformBy

Вопрос: У меня есть ситуации, в которых использование метода AcDbRegion::transformBy дает различные результаты в AutoCAD 2015 и в AutoCAD 2014 Можете ли Вы объяснить, что изменилось в этом методе, что приводит к различным результатам?

Ответ: Этот сценарий работал в AutoCAD 2014, потому что мы использовали больший допуск (equalPoint равный 1.0E-8 и equalVector равный 1.0E-6). В AutoCAD 2015 установка допуска не делается, так что это повлияло на некоторые сценарии выполнения ряда методов. Ниже указано как можно обойти эту ситуацию. Спасибо партнеру ADN, который показал нам такой вариант поведения.

Опубликовано 20.08.2014     Читать далее >>>
11/08/2014

Преобразование цветов между RGB и AutoCAD ACI в ObjectARX

Преобразование цвета в RGB к ближайшему эквивалентному индексу в палитре индексов AutoCAD (ACI) может быть сделано при помощи методов loopUpACI и lookUpRGB, реализованных в классе AcCmEntityColor.

Следующий пример использует метод lookUpRGB() для конвертации индекса цвета 47 в соотвествующий цвет в RGB, а затем используя полученный RGB найдем ближайший индексный цвет при помощи метода lookUpACI()

Опубликовано 11.08.2014     Читать далее >>>
16/06/2014

Что значит getallobjects() в контексте вложенных транзакций?

Вопрос:

Можете ли вы объяснить мне как работает метод getAllObjects() в контексте сценария использования вложенных транзакций? Я не нашел объяснения в ObjectARX Developer's Reference/Guide.

Ответ:

Давайте рассмотрим такой сценарий (это псевдокод, все транзакции типа AcDbTransaction)

Опубликовано 16.06.2014     Читать далее >>>
13/06/2014

Сброс текущего цвета при установке текущим другого слоя

Установка текущего цвета при помощи системной переменной CECOLOR помогает создавать примитивы с определенным цветом вне зависимости от цвета слоя. Но когда мы устанавливаем другой слой текущим нам может захотеться, чтобы цвет совпал с цветом нового текущего слоя.

Итак. Как автоматически менять текущий цвет на цвет Послою (BYLAYER) при изменении текущего слоя?

Текущий цвет может быть установлен при помощи метода AcDbDatabase::setCecolor(). Вы можете получить уведомление об изменении системной переменной, если создадите реактор, унаследованный от AcEditorReactor и переопределите его метод sysVarChanged(). Системная переменная текущего слоя: CLAYER.

Опубликовано 13.06.2014     Читать далее >>>
07/06/2014

Удаление анонимных групп средствами ObjectARX

Когда пользователь создает группу в AutoCAD, он может создать группу анонимной. При этом любая группа (анонимная или нет) хранится в Словаре именованных объектов (NOD) в группе 'ACAD_GROUP'. Если группа анонимная, AutoCAD присваивает ей имена вида '*A1', '*A2' и так далее. Хотя группа и анонимная, но у каждой анонимной группы есть уникальное имя в базе чертежа.

Пользователь может удалить примитивы из группы, так что группа может оказаться пустой. Следующий код демонстрирует как удалить анонимную группу.

Опубликовано 07.06.2014     Читать далее >>>
26/05/2014

Создание твердых тел выдавливанием полилинии

Примитив твердого тела может быть получен выдавливанием объекта область. Таким образом мы можем создать временную область, ограниченную существующей полилинией. Здесь мы расчленяем полилинию на отдельные кривые, составляющие границу, а затем создаем область из этих кривых.

Посмотрите на следующий пример кода:

Опубликовано 26.05.2014     Читать далее >>>
21/05/2014

Определение прерывания команды при выполнении acedCommandC

Выполнение команд в AutoCAD сейчас возможна двумя способами вместо одного варианта функции acedCommand. Функция acedCommandS проще для использования, но требует задания сразу всех параметров, которые необходимы AutoCAD для завершения команды и без ввода данных пользователем. При выполнении команды при помощи функции acedCommandS её нельзя прервать.

Функция acedCommandC используется в том случае когда может возникнуть необходимость паузы для ввода данных пользователем. Тут возможно прерывание пользователем выполнения команды вместо ввода данных. Чтобы идентифицировать это событие в коде используются функции "acedCmdCWasCancelled" и "acedCallBackOnCancel". Так же в силу асинхронности функции acedCommandC, завершение команды может быть идентифицировано только в функции обратного вызова, как в следующем коде.

Опубликовано 21.05.2014     Читать далее >>>
06/05/2014

Не-DWG окна в AutoCAD 2015

AutoCAD 2015 позволяет создавать Не-DWG окна и попросту окна содержащие не dwg-файлы. Не-DWG окна появляются как вкладки точно так же, как и обычные окна с чертежами.

В конце этой статьи вы найдете ссылку на скачивание готового C++ проекта для создания Не-DWG окна и показа как его использовать.

Опубликовано 06.05.2014     Читать далее >>>
21/04/2014

Периметр штриховки с помощью ObjectARX и .NET API

Примитив штриховки в AutoCAD хранит свою геометрию в своих "циклах". Перебирая циклы штриховки можно вычислить периметр штриховки, получая доступ к геометрии. Также, учитывая, какие циклы являются «внутренними», какие «внешние», нужно вычислить отдельно периметр внешний, и периметр внутренний. Здесь пример кода, который вычисляет периметр с использованием ObjectARX и AutoCAD .Net API. Проверка ошибок минимальна для того, чтобы код был более читабелен.
Опубликовано 21.04.2014     Читать далее >>>
09/04/2014

AutoCAD 2015: вызов команд

Как указывается в предыдущем сообщении, фиберы в AutoCAD 2015 неактивны (соответствующий код остался, в первую очередь для средств тестирования, но его не следует включать для обычного использования продукта).

Опубликовано 09.04.2014     Читать далее >>>
07/04/2014

Доступность Visual Studio 2012

Как объясняется в другой теме в этом блоге и в прекрасном блоге Киана Уомсли(и конечно в документации ObjectARX 2015), AutoCAD 2015 не является совместимым на уровне двоичных кодов с предыдущими версиями AutoCAD. Это означает, что версия Visual Studio, которая требуется для создания ваших приложений, также изменилась. А вот какая именно версия вам нужна зависит от того, какой API вы используете.
Опубликовано 07.04.2014     Читать далее >>>
29/03/2014

Находим примитив под курсором при помощи Win32 и ObjectARX

Вопрос:
Как найти примитив под курсором с использованием чистого Win32?

Ответ:
Лучший способ для нахождения примитива под курсором/перекрестьем – использование класса AcEdInputPointMonitor. Но если вам нужно использовать только Win32, это можно сделать так …

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