Особенности работы с макросами
Андрей Фазлеев часто использует макросы для своих задач. Во время работы с ними, у него сложилось собственное восприятие работы с макросами, и он любезно решил поделиться с нами этими особенностями.
Далее, привожу текст с его слов:
Как показать диалоговое окно редактирования поля (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, чтобы увидеть, какое свойство в реестре модифицируется при изменении настройки с помощью пользовательского интерфейса. В случае печати это свойство было найдено здесь:
Так что мы можем его изменить при помощи следующего кода:
Визуализация при помощи RenderToImage API
Как вы возможно уже знаете API графической системы было изменено в AutoCAD 2015, как описано в статье Изменения в графике в AutoCAD 2015. В AutoCAD 2016 рендер RapidRT заменил рендер MentalRay, который использовался в предыдущих версиях. В свете этого в ObjectARX 2016 появился новый класс AcDbRapidRTRenderSettings. Все эти изменения требуют изменений в вашем коде в случае, если вы использовали метод AcGsView::RenderToImage для генерации изображения модели AutoCAD.
Следующий код должен генерировать визуализацию изображения как в AutoCAD 2016, так и в предыдущих версиях. Чтобы учесть различные изменения графической системы и средства визуализации, приведенный ниже код широко использует возможности условной компиляции.
Чтобы попробовать это, откройте чертеж и задайте направление взгляда в AutoCAD, такой как вы хотите для того чтобы генерировать визуализированное изображение. Настройте параметры визуализации и выполните визуализацию в AutoCAD. После того как вас устроят результаты, сделать настройки визуализации текущими. Это должно сохранить предустановки визуализации в качестве активных. Приведенный ниже код, получает параметры на основе активной предустановки, и используют их для создания изображении.
Программное создание диалога "Сохрани как..."
Эта статья появилась как результат запроса от пользователя. Здесь я покажу простую реализацию диалога для сохранения файла.
Хотя у нас есть функция acedGetNavDialog, но у неё нет возможности управлять списком форматов чертежей.
Интерфейс OData
Особенности работы с интерфейсом ODataПошаговая инструкция по AutoCAD I/O API
Введение в создание приложений при помощи AutoCAD I/O APIЗахват изображения текущего документа 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), к которым можно получить доступ при помощи словаря. Этот пример показывает как прочитать этот словарь, и что внутри него есть.