Редактирование по месту файлов внешних ссылок
Код ниже показывает процедуру редактирования файла внешней ссылки. Для этой цели используется класс “XrefFileLock”, который обрабатывает управление блокировкой файлов внешних ссылок:
Управление видимостью Точки в AutoCAD
Системная переменная “PDMODE” управляет отображением примитива Точка в AutoCAD. Эта переменная может иметь значения между 0 и 5, между 32 и 36, между 64 и 68 и между 96 и 100. Это значение можно изменить меняя свойство “Pdmode” для Database.
Использование пользовательских данных чертежа в полях
.NET/ObjectARX API позволяет использовать пользовательские свойства в полях. Следующий код показывает, как это сделать на примере пользовательского свойства Адрес (“Address”).
Зеркальное отображение примитива однострочного текста (DBText)
Некоторое время назад, когда этого блога еще не было, был написан следующий .NET код для отзеркаливания однострочного текста (DBText), чтобы решить один из запросов от члена AND. Через какое-то время снова возникла необходимость в этом коде. Вы сами сможете увидеть, что он не так прост, как могло бы показаться:
Выравнивание примитива по трем точкам
Ниже приведен пример кода, который выравнивает выбранный примитив по трем базовым и трем целевым точкам. Порядок, в котором точки выбираются, показан на картинке. Приведен пример чертежа для проверки кода.
Добавление поля, содержащего данные другого примитива
Следующий код показывает как можно добавить поле, которое показывает данные другого примитива (в данном случае площадь полилинии). От пользователя требуется выбрать полилинию и местоположение, в котором создается примитив MText. Этот MText и будет показывать площадь выбранной полилинии.
Изменение цвета вложенных примитивов AutoCAD с помощью .NET
Меня спрашивали как изменить цвет всех примитивов внутри блоков.
Следующий код использует рекурсивную вспомогательную функцию для итерирования внутри блоков, изменяющую цвет множества примитивов (не вставок блока – для них простая рекурсия).
Получение кода поля (field) из объекта Field
Следующая программа показывает процедуру получения кода поля текстового примитива. Сначала она проверяет есть ли поля, ассоциированные с этим текстовым примитивом, при помощи метода “HasFields”. Затем используется метод “GetField” для получения объекта Field, а из него при помощи метода “GetFieldCode” получается код поля.
Получение всех полей (field) примитива AutoCAD
Такие примитивы AutoCAD как MText и Text могут содержать более одного поля. Чтобы получить доступ к этим полям нужно использовать метод “GetChildren”. Код ниже показывает каким образом следует использовать метод “GetChildren”. Чтобы получить объект Field используется метод “GetField” (без параметров).
Обратное преобразование растрового изображения
Вставка блока (BlockReference) предоставляет матрицу преобразования "BlockTransform", которая очень полезна, когда необходимо преобразовать примитив так, чтобы свести на нет последствия перемещения, вращения и масштабирования. А растровое изображение (RasterImage) не предоставляет такой матрицы. Но мы можем её создать сами, зная значения поворота, смещения и масштабирования по X и Y. Вот код примера, который устраняет масштабирование, смещение и поворот выбранного растрового изображения:Проецирование кривой на поверхность
Ниже пример кода проецирования отрезка на цилиндрическую поверхность. Создаётся цилиндрическая поверхность и отрезок, а затем отрезок проецируется на поверхность. Проекция добавляется в базу чертежа.
Расчленение MText, содержащего управляющие коды
Для того, чтобы расчленить примитив MText на фрагменты его текста можно использовать метод "ExplodeFragments".Получение фрагментов текста из примитива MText
Используем метод “ExplodeFragments”, как показано ниже в коде, для разбивки текстовой строки MText на фрагменты. Функция обратного вызова, которая передается методу “ExplodeFragments” вызывается для каждого фрагмента текста примитива MText.
Петля штриховки использующая коллекцию Curve2d
Чтобы создать штриховку информация для создания петли может быть указана как коллекция ObjectId содержащихся в базе примитивов. Тут лучше всего посмотреть эту статью: Создание объектов штриховки с использованием трассировки границ в .NET. Другой путь заключается в работе с одной лишь геометрией без добавления примитивов в базу.Изменение имени Растрового изображения
В поле «имя» в палитре свойств AutoCAD для Растрового изображения отображается имя из записи словаря, используемого для хранения RasterImageDef в словаре именованных объектов "ACAD_IMAGE_DICT". Чтобы изменить имя Растрового изображения мы создадим новый RasterImageDef и ассоциируем все существующие Растровые изображения с ним. Важно также отключить реакторы растрового изображения перед тем как RasterImageDef будет выгружен и удален.
Изменение путей к внешним ссылкам из абсолютных в относительные
Чтобы поменять пути к внешним ссылкам (XREF) из абсолютных в относительные нужно просто изменить строку BlockTableRecord.PathName так, чтобы она определяла относительный путь (или вообще без пути если мы полагаемся на то, что FindFile может найти наш Xref).Использование Window.Focus в AutoCAD 2014
Среди новых API в AutoCAD 2014 включен метод Window.Focus. Этот метод очень полезен в том случае если вы используете палитры для вызова команд, которые заставляют AutoCAD запрашивать у пользователя информацию. В предыдущих версиях AutoCAD его редактор не получал фокус пока на нём не был активизирован. Это требовало дополнительного нажатия кнопки мыши. Чтобы избежать этого требовалось или вызвать функцию SetFocus из Win32 API посредством P/Invoke или использовать недокументированный метод Internal.Utils.SetFocusToDwgView.
Использование события выбора ячейки в таблице
В момент выбора ячейки вы можете захотеть узнать её номер ряда и колонки в таблице.Подходящего события в публичном AutoCAD .NET API нет, но в пространстве имён "Autodesk.AutoCAD.Internal.Reactors" есть такое событие. Обратите внимание, что использование любых классов/методов из пространства имён "Internal" не поддерживается и они могут быть изменены в любое время. Так что если вы собираетесь их использовать, проверьте их полностью, чтобы убедиться что они работают корректно в вашем приложении.
Динамически блоки с операцией Растянуть (Stretch)
Средствами API невозможно создать динамический блок с операцией Растяни.
Одним из возможных путей обойти это ограничение – это создать набор чертежей с динамическими блоками. Эти чертежи должны быть созданы с использованием пользовательского интерфейса AutoCAD. Такие рисунки можно вставить при необходимости в любой другой чертеж с использованием AutoCAD API.
Две типичных ошибки работы с транзакциями
Возможно, это вырастет в целую серию о типичных ошибках.
Моя последняя статья была об обработке прерываний, и Adam написал замечание о неизвестных командах. Теперь две наиболее типичных ошибки людей работающих с транзакциями, когда они только начали использовать AutoCAD .NET API, которые могут потратить много часов для отладки и будут чувствовать себя крайне глупо, когда поймут в чем причина).