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

23/05/2016

Отладка AutoCAD 2017 с использованием Visual Studio 2015

В настоящее время разработчики не могут полноценно отлаживать .NET модули в AutoCAD 2017 с использованием VS 2015. Как объясняется в статье Киана Уомсли для VS 2013 http://through-the-interface.typepad.com/through_the_interface/2013/11/debugging-autocad-using-visual-studio-2013.html, обходной путь для этой проблемы – это или включить отладку для машинного кода, или использовать режим совместимости в VS 2015.
Опубликовано 23.05.2016     Читать далее >>>
23/05/2016

Завершение сеанса AutoCAD

В AutoCAD.NET API есть метод “Application.Quit()” для завершения сеанса AutoCAD. Однако в настоящее время “Application.Quit()” не позволяет сохранить все пользовательские установки профиля (например, активную вкладку Ленты). Одним из альтернативных методов для завершения сеанса AutoCAD может быть запуск команды _QUIT (ВЫХОД) при помощи метода “SendStringToExecute”

Опубликовано 23.05.2016     Читать далее >>>
18/05/2016

Как обновить выбранные поля не выполняя регенерацию всего чертежаАвтор: Александр Ривилис

Вопрос: Мне необходимо выполнить обновление некоторых полей в чертеже, но мне не хотелось бы выполнять полную регенерацию. Как это можно осуществить?

Ответ: В ObjectARX есть семейство функций acdbEvaluateFields, которые и позволяют обновить поля в чертеже. Пример использования функции acdbEvaluateFields смотрите ниже:

Опубликовано 18.05.2016     Читать далее >>>
10/05/2016

Как определить изменение вида в AutoCAD

Недавно один из партнеров ADN задал мне вопрос о том, как можно идентифицировать изменение вида в AutoCAD при выполнении зуммирования и панорамирования при помощи мыши. Чтобы отловить такое событие в ObjectARX следует использовать реактор редактора viewChanged() (AcEditorReactor::viewChanged()). А вот в AutoCAD.NET API эквивалентом этом реактору будет событие класса документа Document::ViewChanged
Опубликовано 10.05.2016     Читать далее >>>
18/04/2016

Объединение блоков AutoCAD с использованием .NET API

Вопрос: У меня есть два блока с разными атрибутами, которые я хочу объединить в единый блок. При этом я не хочу создавать вложенные блоки. Как это можно осуществить при помощи AutoCAD .NET API?

Ответ: Вот C#-код, который использует метод Database.DeepCloneObjects() для создания нового блока на основе двух других:

Опубликовано 18.04.2016     Читать далее >>>
08/04/2016

Как получить границы области (Region)Автор: Александр Ривилис

Вопрос: Как средствами AutoCAD .NET API можно получить границы (контура) области (Region)?

Ответ: Для этой цели следует воспользоваться возможностями Brep .NET API. Пример получения граничных контуров ниже. Внешние контура красного цвета, внутренние - желтого.

Опубликовано 08.04.2016     Читать далее >>>
24/02/2016

Как показать диалоговое окно редактирования поля (Field) средствами .NETАвтор: Александр Ривилис

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

Опубликовано 24.02.2016     Читать далее >>>
22/02/2016

Полное подавление пользовательского интерфейса AutoCAD из .NET

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

Но прежде всего, хотелось бы сказать большое спасибо что большой "спасибо" James Meading и Alexander Rivilis, которые помогли нам.

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

Но к полуночи, Alexander показал MFC код, который полностью подавляет пользовательский интерфейс AutoCAD но более низком уровне: подавляет полностью окно AutoCAD со всеми элементами интерфейса без необходимости скрывать что-либо.

Я посмотрел на код Alexander’а и обнаружил, что его несложно сделать работающим и в C# при помощи P/Invoke. И вот так этот код выглядит сейчас:

Опубликовано 22.02.2016     Читать далее >>>
20/02/2016

Как отключить Ленту средствами .NET

Мне попался интересный вопрос на форуме AutoCAD .NET, заданный Pete Elliott:

Когда AutoCAD загружается, я вижу что мои панели выключены (серые) до того момента, когда он не закончит загружаться. Наша программа выполняет дополнительную загрузку данных после того, как AutoCADпопадает в состояние «простоя». Но если пользователь нажмёт одну из кнопок на панели до того, как все данные будут загружены, AutoCADаварийно завершит свою работу. Есть ли способ отключить панели (как это делает AutoCAD) пока загрузка не выполнена, а затем включить их? Я не смог найти API, которое бы позволило это сделать. Приму любые предложения с благодарностью!

Мне кажется, что это будет полезно знать всем. Для сегодняшней статьи я буду считать, что под "Панелями " Pete имеет в виду Ленту. (Это мне подходит, так как я нашел способ как это сделать для Ленты, но я сделаю все возможное, чтобы опубликовать последующую статью для Панелей если в этом возникнет потребность.

Основной подход достаточно прост: вы получаете доступ к текущему "Набору палитр Ленты " при помощи класса RibbonServices (мы вызываем метод для создания новой Ленты, но обычно он возвращает существующую Ленту если вызывается из команды). Затем мы используем его, чтобы отключить "Элемент управления Ленты ", а также его фоновое отображение вкладок. Мы также отключим отображение всплывающих подсказок на то время, пока Лента отключена.

Опубликовано 20.02.2016     Читать далее >>>
17/02/2016

Изменение установок Профиля AutoCAD при помощи .NET

Есть много параметров, используемых AutoCAD, которые хранятся в различных частях реестра. Многие из них также можно читать и писать через getenv / setenv в LISP или acedGetEnv / acedSetEnv в ObjectARX и вот так в .NET:

Простая альтернатива использованию COM-объекта Preferences в AutoCAD

Если это не переменная окружения и к ней нет доступа через getenv/setenv к ней можно получить доступ при помощи API Реестра для чтения/модификации значений.
Замечание: если интересующее значение является строчным, тогда к нему можно получить доступ при помощи объекта UserConfigurationManager для чтения/записи:
http://through-the-interface.typepad.com/through_the_interface/2008/05/storing-custom.html

В качестве примера попробуем изменить переключатель "Разрешить уведомления" для печати из .NET.

Если вы хотите выяснить где данная настройка сохраняется в реестре (если она действительно хранится там), то вы можете использовать такой инструмент, как Process Monitor, чтобы увидеть, какое свойство в реестре модифицируется при изменении настройки с помощью пользовательского интерфейса. В случае печати это свойство было найдено здесь:

Так что мы можем его изменить при помощи следующего кода:

Опубликовано 17.02.2016     Читать далее >>>
09/02/2016

Захват изображения текущего документа AutoCAD с использованием .NET

Эта тема уже несколько раз поднималась в этом блоге, когда мы обсуждали систему 3D графики для захвата изображения и в серии сообщений про плагин месяца "Снимок Изображения" несколько лет назад. Я подумал, что следует её пересмотреть с учетом того, что я не использовал это API раньше.

Опубликовано 09.02.2016     Читать далее >>>
28/01/2016

Вставка определённой страницы PDF-файла в качестве подложки в чертеж.Автор: Александр Ривилис

На форме возник вопрос как можно вставить в dwg-файл конкретную страницу из pdf-файла. По умолчанию вставляется первая (или единственная) страница. Оказалось, что это сделать не сложно. Достаточно задать PdfDefinition.ItemName, указав строковое представление номера страницы. Немного переработанный код из http://adn-cis.org/kak-sozdat-pdf-podlozhku-sredstvami-autocad-net.html будет выглядеть так:

Опубликовано 28.01.2016     Читать далее >>>
27/01/2016

Как создать pdf-подложку средствами AutoCAD .NET?

PDF подложки представлены классами PdfDefinition и PdfReference classes в AutoCAD .NET API. Вставка подложка (в данном случае PDF) должна ссылаться на совместимое определение подложки. Вставка подложка определяет положение контента в чертеже, определение подложки определяет контент подложки.

Опубликовано 27.01.2016     Читать далее >>>
25/01/2016

Как найти группы, которым принадлежит примитив

Группы хранятся как постоянные реакторы в примитиве AutoCAD, так что можно воспользоваться методом DbObject.GetPersistentReactorIds для получения списка групп, с которыми ассоциирован примитив. Следующий код показывает как это можно сделать:

Опубликовано 25.01.2016     Читать далее >>>
22/01/2016

Перебор всех групп в чертеже

Следующий код показывает, как можно перебрать все группы в чертеже при помощи итерации по словарю групп. Этот код так же показывает, как получить все идентификаторы объектов внутри каждой из групп.

Опубликовано 22.01.2016     Читать далее >>>
22/01/2016

Доступ к группам AutoCAD при помощи .NET

Так же, как и у других объектов, у групп есть идентификатор (ObjectId), к которым можно получить доступ при помощи словаря. Этот пример показывает как прочитать этот словарь, и что внутри него есть.

Опубликовано 22.01.2016     Читать далее >>>
25/12/2015

Определение координат в статусбаре AutoCAD при помощи .NET

Мы столкнулись с этой задачей во время внутреннего обсуждения, и я думаю, что этим стоит здесь поделиться. Достаточно просто использовать класс PointMonotor в AutoCAD, чтобы определить текущее местоположение курсора, но, как мы убедиться, что точка в текущей пользовательской системе координат (ПСК), и что мы учитываем объектные привязки (OSNAP)?

Для простоты кода я добавил обработчик события как лямбда, не беспокоясь о его удаления. Кроме того, чтобы избежать аварии, когда вы переключаетесь на страницу новой вкладки или нового документа и обратно, код проглатывает исключение eNotApplicable, которое производит Editor.WriteMessage () - что вероятно не понадобится, так как вы, скорее всего, в такой ситуации предпочли бы вывести координаты куда-то в другое место, а не в командную строку.

Вот код C# реализации команды (CC), которая печатает в командной строке координаты, соответствующие тем, которые появляются в статусбаре:

Опубликовано 25.12.2015     Читать далее >>>
22/12/2015

Текст мультивыноски соответствующий установкам стиля мультивыноски

Это небольшой пример кода, который создаёт мультивыноску, основанную на существующем стиле мультивыноски. Для того, чтобы текст мультивыноски отражал изменения стиля мультивыноски, необходимо клонировать MLeaderStyle.DefaultText и использовать его в качестве текста мультивыноски. Создание нового MText без клонирования DefaultText приводит к тому, что он в дальнейшем перестаёт отражать изменения, которые происходят с его стилем мультивыноски.

Спасибо Xin Xu из команды инженеров AutoCAD за предоставленный совет.

Опубликовано 22.12.2015     Читать далее >>>
10/12/2015

Как запустить редактор мультитекста?Автор: Александр Ривилис

Вопрос:

Как в ObjectARX и AutoCAD .NET API запустить встроенный редактор мультитекста?

Ответ:

Начиная с версии AutoCAD 2011 для редактирования мультитекста в ObjectARX имеется класс AcEdInplaceTextEditor и класс InplaceTextEditor в AutoCAD .NET API. Ниже примеры использования:

Опубликовано 10.12.2015     Читать далее >>>
21/11/2015

Публикация листов в PDF с помощью COM API

У нас нет специального API, которое бы позволило публиковать несколько листов в один PDF-документ, так что придётся это сделать другим способом.

В этой статье я покажу как создать простой DSD-файл и использовать его для выполнения команды _PUBLISH (ПУБЛ).

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