Подсветка сегмента полилинии
Этот код демонстрирует как использовать subentitypath для подсветки определенного сегмента полилинии. Вы можете использовать метод Unhighlight для снеятия подсветки сегмента полилинии (этот метод здесь не приводится). Не забудьте прочитать соответствующую тему по этому методу в ObjectARX Managed Reference Guide прежде чем использовать его в своём коде – там есть несколько деталей, которые следует учитывать.
Как сделать объекты AutoCAD аннотативными в .NET
В этой статье мы решим два вопроса:- Как создать и добавить к чертежу новый масштаб аннотации?
- Как сделать примитивы аннотативными и присвоить им допустимые масштабы аннотаций?
Ниже приведен код, в котором содержатся два метода – команды:
Команда ADS позволит нам создать новый масштаб аннотации с именем "МойМасштаб 1:28", а команда ATS позволит сделать выбранный примитив аннотативным и назначить ему масштабы аннотаций:
Как выбрать грани соседствующие с выбранным ребром 3DSOLID
Используя BREP API, довольно просто получить смежные грани для выбранного ребра 3DSOLID.Мы будем использовать Boundary Loop, чтобы получить все петли, в которые входит выбранное ребро для получения соседних граней.
Создание таблиц со строками различной высоты средствами .NET
Создание таблиц при помощи методов Table.InsertColumns и Table.InsertRows достаточно сложно и ниже мы опишем несколько сценариев, которые могут быть полезными.
Добавление MTEXT к ячейке таблицы
Это пример кода вставки MText’а в указанную пользователем ячейку Таблицы. Можно передавать RTF-контент в MText или создавать строку с использованием кодов форматирования.
В AutoCAD 2018.1 метод UpgradeOpen приводит к фатальной ошибке внутри транзакцииАвтор: Александр Ривилис
Вопрос: Я обнаружил, что если использовать метод UpgradeOpen внутри транзакции, в которой этот объект открыт для чтения, то это приводит к фатальной ошибке. Пример кода, приводящий к такой ошибке:
Как проверить средствами .NET имеется ли в типе линии текст или нет
Недавно партнер ADN поинтересовался методом, который позволил бы определить содержится ли текст в типе линии или нет перед тем, как получить этот текст.
Чтобы получить текст из типа линии можно воспользоваться методом LinetypeTableRecord.TextAt, но он генерирует исключение eNotApplicable если текста нет в переданном индексе типа линии. Чтобы исключить генерацию исключения можно проверить на ObjectId.Null значение, которое возвращает LinetypeTableRecord.ShapeStyleAt. Этот метод возвращает ObjectId.Null если нет текста в указанном индексе в LinetypeTableRecord.
Как установить ось Z ПСК вдоль линии в .NETАвтор: Александр Ривилис
Вопрос: Имеются различные линии в AutoCAD (отрезки, полилинии, сплайны). Как можно установить ось Z текущей ПСК вдоль линии в указанной пользователем точке?Ответ: Ниже приведён код, который позволяет установить ось Z ПСК вдоль выбранной пользователем линии. В качестве начала координат ПСК выбирается точка на линии, ближайшая к указанной пользователем точке:
Как получить список доступных плоттеров/форматов в AutoCAD?Автор: Александр Ривилис
Как получить список доступных плоттеров/форматов в AutoCAD?
Вопрос: Как получить список доступных плоттеров в AutoCAD и список канонических имён форматов для каждого из доступных плоттеров?
Ответ: Для получения списка доступных плоттеров нужно воспользоваться методом PlotSettingsValidator.GetPlotDeviceList, а для получения канонических имён форматов – PlotSettingsValidator.GetCanonicalMediaNameList
Ниже пример того, как можно выбрать только плоттеры, в имени которых есть строка «PDF», и получить список канонических имён их форматов:
Определение внешних ссылок, требующих обновленияАвтор: Александр Ривилис
Определение внешних ссылок, требующих обновления
Вопрос: Как определить, что в чертеже есть внешние ссылки, которые требуют обновления?
Ответ: Это возможно только в том случае, когда системная переменная XREFNOTIFY отлична от 0 (в противном случае AutoCAD не отслеживает изменение внешних ссылок и не уведомляет об изменениях).
Для получения информации об изменившихся внешних ссылках следует пробежаться по графу внешних ссылок и найти те, статус (XrefNotificationStatus) которых равен ResolvedUpdateAvailable
Код может выглядеть так:
Мониторинг изменения рабочего пространства
Если вам нужно отслеживать переключения рабочего пространства (например, в случае если вы используете Ribbon Runtime API для добавления элементов управления в Ленту), то вам достаточно отслеживать изменение системной переменной WSCURRENTКак запретить выполнение конкретной команды AutoCAD
Вы можете запретить выполнение команды внутри события “DocumentCollection.DocumentLockModeChanged”. Это событие вызывается сразу перед тем как AutoCAD начнёт выполнение этой команды. Посмотрите как можно запретить завершение работы AutoCAD.
Как реализовать PlotSettingsValidator.SetClosestMediaName в .NET
Комментарий в документации о методе "PlotSettingsValidator.SetClosestMediaName" гласит:"Эта функция не реализована."
Ниже предложение того, как можно реализовать этот метод в C# используя AutoCAD .NET API:
Как определить, что мы находимся в контексте печати
Недавно я получил ряд запросов от разработчиков как идентифицировать состояние печати в overrule. Чтобы идентифицировать это состояние используем “Context.IsPlotGeneration” как показано ниже в коде:
AecModeler и AutoCAD 2017 Service Pack 1
В hideDisplay API класса Body в AecModeler для AutoCAD 2017 есть проблемы. Ниже обновленный модуль.
AecModeler для AutoCAD 2017 SP1
Стили строк и ячеек таблицы
Каждая строка и ячейка в таблице может иметь свой стиль. Вы можете получить или задать стиль, используя свойство CellRange.Style. Смотрите код ниже:
Как можно создать фильтр, содержащий все типы кривых в чертежеАвтор: Александр Ривилис
Вопрос: Мне нужно дать возможность пользователю выбирать любые типы кривых - все типы полилиний, сплайны, дуги и т.д., и в том числе и пока неизвестные пользовательские кривые… Как это можно сделать?
Ответ: Для этой цели следует проанализировать SystemObjects.ClassDictionary, найти все классы-наследники класса Curve и получить их DXF-коды. Ниже приведен код, который реализует этот алгоритм:
Как удалить команду из списка доступных команд AutoCADАвтор: Александр Ривилис
Это экзотическая ситуация, но может возникнуть необходимость полностью запретить команду AutoCAD. Один из вариантов – выполнение метода veto() в событии DocumentLockModeChanged. Но при этом команда есть в списке доступных команд и её выполнение начинается, а затем прерывается.
Есть более радикальный метод – использование метода RemoveCommand недокументированного класса Utils из пространства имён Autodesk.AutoCAD.Internal. Этот метод – обертка для метода AcEdCommandStack::removeCmd из ObjectARX. Ему передаются два параметра – имя группы команд и имя команды. Обычно достаточно передать глобальное имя команды, но бывают и исключения. Поэтому мы удалим команду и по глобальному и по локальному имени. Так как мы не знаем в какой локализации AutoCAD будет выполняться код, то нам нужно получить имя локализованной команды по её глобальному имени. Для этой цели в ObjectARX есть функция acedGetCName которая в версиях AutoCAD до 2012 включительно содержится в acad.exe, а позднее в accore.dll Мы воспользуемся P/Invoke для вызова её из .NET
Как получить 3D-полилинию, по которой получается тело сдвигаАвтор: Александр Ривилис
Вопрос: Имеется труба - твердое тело, полученной сдвигом круга (Circle) по траектории, образованной 3D-полилинией (3DPoly). Как получить вершины 3D-полилинии?
Ответ: Вариантов решения этой задачи несколько:
1) Использование метода GetGripPoints. Для тела у которого не очищена история редактирования если пропустить первые четыре ручки, то мы получим вершины 3D-полилинии. Но если история очищена, то получить вершины таким образом не получится, так как расположение ручек совсем другое.
2) Использовать BREP .NET API для получения информации о вершинах.
Второй вариант мы и рассмотрим, так как он более универсальный. Нам следует получить все ребра (Edge) твердого тела, выделить из них круглые (CircularArc3d) и эллиптические (EllipticalArc3d) и найти их центры.
Как выполнить Overrule для замкнутого сплайна так, чтобы он был заполнен своим цветомАвтор: Александр Ривилис
Вопрос: Как выполнить Overrule для замкнутого сплайна (Spline) так, чтобы он был заполнен своим цветом?
Ответ: Простейший способ – это выполнить аппроксимацию сплайна и рисовать сплайн при помощи Geometry.Polygon указав в качестве параметра точки аппроксимации.
Ниже пример как это можно реализовать: