Объединение блоков AutoCAD с использованием .NET API
Вопрос: У меня есть два блока с разными атрибутами, которые я хочу объединить в единый блок. При этом я не хочу создавать вложенные блоки. Как это можно осуществить при помощи AutoCAD .NET API?
Ответ: Вот C#-код, который использует метод Database.DeepCloneObjects() для создания нового блока на основе двух других:
Как получить границы области (Region)Автор: Александр Ривилис
Вопрос: Как средствами AutoCAD .NET API можно получить границы (контура) области (Region)?
Ответ: Для этой цели следует воспользоваться возможностями Brep .NET API. Пример получения граничных контуров ниже. Внешние контура красного цвета, внутренние - желтого.
Как показать диалоговое окно редактирования поля (Field) средствами .NETАвтор: Александр Ривилис
Вы можете показать диалоговое окно AutoCAD редактирования поля, используя функцию “AcFdUiInvokeFieldDialog” из ObjectARX при помощи P/Invoke. При помощи этой функции можно показать диалог и вернуть объект поля, выбранный пользователем, переданный как первый параметр. Код ниже показывает как это сделать:
Полное подавление пользовательского интерфейса AutoCAD из .NET
В первой статье из этой серии, мы видели, как отключить AutoCAD ленту. Во второй статье мы увидели как скрыть панели AutoCAD (с некоторыми оговорками). В этом посте мы собираемся показать как сделать всё намного лучше и проще при помощи одной строки кода.
Но прежде всего, хотелось бы сказать большое спасибо что большой "спасибо" James Meading и Alexander Rivilis, которые помогли нам.
James заметил существенную проблему во вчерашней статье, связанную с многострочными панелями, для которых требуется поместить на то же самое место, когда делаем их видимыми.
Но к полуночи, Alexander показал MFC код, который полностью подавляет пользовательский интерфейс AutoCAD но более низком уровне: подавляет полностью окно AutoCAD со всеми элементами интерфейса без необходимости скрывать что-либо.
Я посмотрел на код Alexander’а и обнаружил, что его несложно сделать работающим и в C# при помощи P/Invoke. И вот так этот код выглядит сейчас:
Как отключить Ленту средствами .NET
Мне попался интересный вопрос на форуме AutoCAD .NET, заданный Pete Elliott:
Когда AutoCAD загружается, я вижу что мои панели выключены (серые) до того момента, когда он не закончит загружаться. Наша программа выполняет дополнительную загрузку данных после того, как AutoCADпопадает в состояние «простоя». Но если пользователь нажмёт одну из кнопок на панели до того, как все данные будут загружены, AutoCADаварийно завершит свою работу. Есть ли способ отключить панели (как это делает AutoCAD) пока загрузка не выполнена, а затем включить их? Я не смог найти API, которое бы позволило это сделать. Приму любые предложения с благодарностью!
Мне кажется, что это будет полезно знать всем. Для сегодняшней статьи я буду считать, что под "Панелями " Pete имеет в виду Ленту. (Это мне подходит, так как я нашел способ как это сделать для Ленты, но я сделаю все возможное, чтобы опубликовать последующую статью для Панелей если в этом возникнет потребность.
Основной подход достаточно прост: вы получаете доступ к текущему "Набору палитр Ленты " при помощи класса RibbonServices (мы вызываем метод для создания новой Ленты, но обычно он возвращает существующую Ленту если вызывается из команды). Затем мы используем его, чтобы отключить "Элемент управления Ленты ", а также его фоновое отображение вкладок. Мы также отключим отображение всплывающих подсказок на то время, пока Лента отключена.
Изменение установок Профиля 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, чтобы увидеть, какое свойство в реестре модифицируется при изменении настройки с помощью пользовательского интерфейса. В случае печати это свойство было найдено здесь:
Так что мы можем его изменить при помощи следующего кода:
Захват изображения текущего документа AutoCAD с использованием .NET
Эта тема уже несколько раз поднималась в этом блоге, когда мы обсуждали систему 3D графики для захвата изображения и в серии сообщений про плагин месяца "Снимок Изображения" несколько лет назад. Я подумал, что следует её пересмотреть с учетом того, что я не использовал это API раньше.
Вставка определённой страницы PDF-файла в качестве подложки в чертеж.Автор: Александр Ривилис
На форме возник вопрос как можно вставить в dwg-файл конкретную страницу из pdf-файла. По умолчанию вставляется первая (или единственная) страница. Оказалось, что это сделать не сложно. Достаточно задать PdfDefinition.ItemName, указав строковое представление номера страницы. Немного переработанный код из http://adn-cis.org/kak-sozdat-pdf-podlozhku-sredstvami-autocad-net.html будет выглядеть так:
Как создать pdf-подложку средствами AutoCAD .NET?
PDF подложки представлены классами PdfDefinition и PdfReference classes в AutoCAD .NET API. Вставка подложка (в данном случае PDF) должна ссылаться на совместимое определение подложки. Вставка подложка определяет положение контента в чертеже, определение подложки определяет контент подложки.
Как найти группы, которым принадлежит примитив
Группы хранятся как постоянные реакторы в примитиве AutoCAD, так что можно воспользоваться методом DbObject.GetPersistentReactorIds для получения списка групп, с которыми ассоциирован примитив. Следующий код показывает как это можно сделать:
Перебор всех групп в чертеже
Следующий код показывает, как можно перебрать все группы в чертеже при помощи итерации по словарю групп. Этот код так же показывает, как получить все идентификаторы объектов внутри каждой из групп.
Доступ к группам AutoCAD при помощи .NET
Так же, как и у других объектов, у групп есть идентификатор (ObjectId), к которым можно получить доступ при помощи словаря. Этот пример показывает как прочитать этот словарь, и что внутри него есть.
Определение координат в статусбаре AutoCAD при помощи .NET
Мы столкнулись с этой задачей во время внутреннего обсуждения, и я думаю, что этим стоит здесь поделиться. Достаточно просто использовать класс PointMonotor в AutoCAD, чтобы определить текущее местоположение курсора, но, как мы убедиться, что точка в текущей пользовательской системе координат (ПСК), и что мы учитываем объектные привязки (OSNAP)?Для простоты кода я добавил обработчик события как лямбда, не беспокоясь о его удаления. Кроме того, чтобы избежать аварии, когда вы переключаетесь на страницу новой вкладки или нового документа и обратно, код проглатывает исключение eNotApplicable, которое производит Editor.WriteMessage () - что вероятно не понадобится, так как вы, скорее всего, в такой ситуации предпочли бы вывести координаты куда-то в другое место, а не в командную строку.
Вот код C# реализации команды (CC), которая печатает в командной строке координаты, соответствующие тем, которые появляются в статусбаре:
Текст мультивыноски соответствующий установкам стиля мультивыноски
Это небольшой пример кода, который создаёт мультивыноску, основанную на существующем стиле мультивыноски. Для того, чтобы текст мультивыноски отражал изменения стиля мультивыноски, необходимо клонировать MLeaderStyle.DefaultText и использовать его в качестве текста мультивыноски. Создание нового MText без клонирования DefaultText приводит к тому, что он в дальнейшем перестаёт отражать изменения, которые происходят с его стилем мультивыноски.Спасибо Xin Xu из команды инженеров AutoCAD за предоставленный совет.
Как запустить редактор мультитекста?Автор: Александр Ривилис
Вопрос:
Как в ObjectARX и AutoCAD .NET API запустить встроенный редактор мультитекста?
Ответ:
Начиная с версии AutoCAD 2011 для редактирования мультитекста в ObjectARX имеется класс AcEdInplaceTextEditor и класс InplaceTextEditor в AutoCAD .NET API. Ниже примеры использования:
Публикация листов в PDF с помощью COM API
У нас нет специального API, которое бы позволило публиковать несколько листов в один PDF-документ, так что придётся это сделать другим способом.
В этой статье я покажу как создать простой DSD-файл и использовать его для выполнения команды _PUBLISH (ПУБЛ).
Установка стандартных параметров сохранения в AutoCAD
Вы можете воспользоваться ActiveX API “IAcadPreferencesOpenSave.SaveAsType” для установки стандартных параметров сохранения. Перечисление “AcSaveAsType” даёт множество вариантов для сохранения, которые могут быть установлены при помощи IAcadPreferencesOpenSave.SaveAsType. Следующий код показывает как использовать “SaveAsType” API в VB.NETКлонированный видовой экран есть, но невидим в только что созданном листе
Вопрос:
Имеется лист "Лист1" с видовым экраном "vp" в нём. Я хочу скопировать этот видовой экран при помощи ObjectARX (метод deepCloneObjects) в существующий, но пока не открытый лист "Лист2" этого же dwg-файла. Но скопированный в "Лист2" видовой экран невидим и не может быть выбран и найден ни при помощи команды СПИСОК (_LIST), ни каким другим способом.
Если же "Лист2" уже был хоть раз открыт перед копированием vp (даже без заполнения информации в диалоговом окне "Параметры листа"), всё работает прекрасно и vp прекрасно виден после перехода в "Лист2".
Что не так?
Копирование размерных стилей между чертежами при помощи C#
Этот пример показывает, как использовать метод WblockCloneObjects для копирования объектов между чертежами – в данном случае это набор размерных стилей. Он так же демонстрирует малоизвестный метод для получения последних (до 6 штук) использованных размерных стилей – GetDimRecentStyleList (по крайней мере, я раньше не натыкался на него).
Небольшое замечание. Распространенная ошибка многих людей для клонирования DBObjects использовать метод Clone. Его следует использовать осторожно, так как он производит лишь «поверхностное» копирование. В зависимости от того, зачем вам нужны клоны как правило лучше использовать WblockClone или DeepClone вместо обычного Clone.
Преобразование геометрических объектов в примитивы AutoCAD
Очень часто вы работаете с геометрическими объектами (экземплярами классов AcGeXXXX) для выполнения некоторых геометрических операций в 2D или в 3D. Для преобразования их в примитивы, которые могут быть добавлены в базу AutoCAD существует очень полезный метод в ObjectARX / AutoCAD .NET API.
Метод "acdbConvertGelibCurveToAcDbCurve", который выполняет эту функцию, был представлен в AutoCAD 2012. Эквивалентный метод в AutoCAD .NET API появился в AutoCAD 2013.