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

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     Читать далее >>>
14/11/2015

Установка стандартных параметров сохранения в AutoCAD

Вы можете воспользоваться ActiveX API “IAcadPreferencesOpenSave.SaveAsType” для установки стандартных параметров сохранения. Перечисление “AcSaveAsType” даёт множество вариантов для сохранения, которые могут быть установлены при помощи IAcadPreferencesOpenSave.SaveAsType. Следующий код показывает как использовать “SaveAsType” API в VB.NET
Опубликовано 14.11.2015     Читать далее >>>
07/11/2015

Клонированный видовой экран есть, но невидим в только что созданном листе

Вопрос:

Имеется лист "Лист1" с видовым экраном "vp" в нём. Я хочу скопировать этот видовой экран при помощи ObjectARX (метод deepCloneObjects) в существующий, но пока не открытый лист "Лист2" этого же dwg-файла. Но скопированный в "Лист2" видовой экран невидим и не может быть выбран и найден ни при помощи команды СПИСОК (_LIST), ни каким другим способом.

Если же "Лист2" уже был хоть раз открыт перед копированием vp (даже без заполнения информации в диалоговом окне "Параметры листа"), всё работает прекрасно и vp прекрасно виден после перехода в "Лист2".

Что не так?

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

Копирование размерных стилей между чертежами при помощи C#

Этот пример показывает, как использовать метод WblockCloneObjects для копирования объектов между чертежами – в данном случае это набор размерных стилей. Он так же демонстрирует малоизвестный метод для получения последних (до 6 штук) использованных размерных стилей – GetDimRecentStyleList (по крайней мере, я раньше не натыкался на него).

Небольшое замечание. Распространенная ошибка многих людей для клонирования DBObjects использовать метод Clone. Его следует использовать осторожно, так как он производит лишь «поверхностное» копирование. В зависимости от того, зачем вам нужны клоны как правило лучше использовать WblockClone или DeepClone вместо обычного Clone.

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

Преобразование геометрических объектов в примитивы AutoCAD

Очень часто вы работаете с геометрическими объектами (экземплярами классов AcGeXXXX) для выполнения некоторых геометрических операций в 2D или в 3D. Для преобразования их в примитивы, которые могут быть добавлены в базу AutoCAD существует очень полезный метод в ObjectARX / AutoCAD .NET API.

Метод "acdbConvertGelibCurveToAcDbCurve", который выполняет эту функцию, был представлен в AutoCAD 2012. Эквивалентный метод в AutoCAD .NET API появился в AutoCAD 2013.

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