LISP для CAD-менеджера
Доклад Autodesk University Russia 2014 о применении LISP для CAD-менеджера.Лёгкое программирование под Autodesk Vault Часть 41
О развертывании AutoCAD 2015
По материалам Autodesk University Russia 2014. Текстовый вариант доклада о развертывании AutoCAD 2015.Мультивыноска может привести к исключению eInvalidContext
Примитив MLeader (и эквивалентный ему AcDbMLeader in C++) поддерживает возможность использования блока в качестве текстового компонента, как описано в предыдущей статье. Один из необходимых шагов – это установка свойства BlockPosition (или setBlockPosition в C++), но это может привести к исключению eInvalidContext.Как создать мультивыноску в .NET?
Ниже два примера, которые иллюстрируют создание мультивыноски (MLeader) в C#.Получение габаритного контейнера сплайна с помощью ObjectARX
Вопрос:
Я хочу получить габаритный контейнер сплайна, но метод getGeomExtents() дает неточные результаты. Как можно получить точный габаритный контейнер для сплайна?
Ответ:
Для AcDbSpline метод getGeomExtents() возвращает неточный габаритный контейнер, т.к. вычисление точного контейнера сопряжено с временными тратами.
Чтобы получить точный габаритный контейнер вам придется вычислить его самостоятельно. Вы можете воспользоваться методом getPointAtParam() для прохода по сплайну и вычисления максимальных/минимальных координат X и Y. Точность вычисления габаритного контейнера зависит от того насколько частей кривая поделена. Коэффициент 1e6 даёт приемлемую точность и допустимое время для подсчета. Функции показанные ниже показывают как это можно сделать. Запустите команду SplineBB и выберите сплайн. Команда нарисует два габаритных контейнера. Красный возвращает метод getGeomExtents(), а желтый – это тот, который мы вычислили.
Как преобразовать Toolbar в элемент ленты
Известно, что старые файлы меню (mnu, mns, cui) прекрасно открываются в более поздних версиях AutoCAD. Одновременно с открытием (то есть загрузкой) меню преобразовывается в актуальный формат (для AutoCAD с версии 2010 используется формат cuix). Но совсем древние разработки базируются на панелях инструментов (Toolbar) и выпадающем меню. Собственно вопрос - как быстро сделать эти меню доступными в новых версиях AutoCAD?Настройка CAdUiListCtrl
Если мы пользуемся классом CAdUiListCtrl и хотим его настроить получше, мы можем использовать пользовательское рисование. Это делается точно так же, как и с любым другим элементом управления MFC. Хорошую статью о том, как это делать (на английском) для элемента управления CListCtrl вы найдете здесь.Удаление кнопок с панели быстрого доступа убивает AutoCAD
Если вы добавляете кнопки ленты на панель быстрого доступа AutoCAD (ПБД) убедитесь, что вы обеспечили уникальный ID для кнопки. Если у кнопки нет уникального ID, тогда AutoCAD может аварийно завершиться при скрытии/удалении любой другой стандартной кнопки ПБД.
Расчленение вложенных блоков с помощью .NET
Некоторое время назад я написал статью о том, как использовать метод Entity.Explode() чтобы получить те же результаты, что и в команде РАСЧЛЕНИ (_EXPLODE). В комментариях я получил замечание, что с этим лучше справляется метод BlockReference.ExplodeToOwnerSpace.Мне захотелось использовать этот же метод для расчленения вложенных блоков, но так как BlockReference.ExplodeToOwnerSpace() не возвращает список созданных объектов, мне пришлось приспособить событие Database.ObjectAppended для этого и для рекурсивного вызова моей функции ExplodeBlock() со всеми вновь созданными блоками. Мы можем так же удалить оригинальный примитив (или примитивы если функция вызвана рекурсивно).
Как используя Visual C++ запустить AutoCAD и заставить его выполнять некоторые действия.Автор: Александр Ривилис
AutoCAD представляет собой COM-сервер и для работы с ним имеется AutoCAD ActiveX/COM API. По этому API есть и документация, которая ориентирована на VBA и немного на VisualLisp (на английском языке), но которая позволяет понять структуру и возможности этого API.
AutoCAD 2015 – Developer's Guide и AutoCAD 2015 – Reference Guide
Кроме того документацию можно скачать полностью: http://images.autodesk.com/adsk/files/autocad_2013_activex_help.zip
Я сделал готовый пример с комментариями, который используя некоторые средства AutoCAD ActiveX/COM API, позволяет понять как можно сделать диалоговое окно с кнопкой, по которой будет запущен AutoCAD, будет создан новый документ, отрисованы некоторые примитивы, а затем этот документ будет сохранен в указанном месте. После этого работа AutoCAD будет завершена. Основная проблема при работе с AutoCAD через ActiveX API заключается в том, что в это время с AutoCAD может работать пользователь, или AutoCAD занимается своими делами и занят. В ряде случае он возвращает коды ошибки при работе с ним:
Как средствами AutoCAD определить расположение точки относительно контура.Автор: Александр Ривилис
Вопрос:
Есть ли встроенные средства для определения как расположена точка относительно контура в AutoCAD .NET API?
Ответ:
Специальных средств для этого нет. Но есть по меньшей мере два способа, которыми можно воспользоваться для этого:
- С использованием BREP .NET API (Autodesk.AutoCAD.BoundaryRepresentation) – Если превратить контур в Region, то можно будет воспользоваться возможностью Brep для определения положения точки внутри Region. Для этого можно воспользоваться методом BrepEntity.GetPointContainment, который возвращает объект-перечисление PointContainment, которое может принимать одно из трёх значений: Inside (внутри), Outside (снаружи), OnBoundary (на самом контуре).
- C использованием класса примитива MPolygon. Обычно этот класс используется в Civil 3D, но так как он есть и в базовом AutoCAD, то мы можем им воспользоваться.
В данной статье мы рассмотрим второй способ. Будем считать, что в качестве контура у нас имеется замкнутая полилиния. В общем случае она может иметь и дуговые сегменты, но не должна быть самопересекающейся – иначе теряется смысл понятия «внутри контура». Ниже пример команды, которая просит пользователя указать точку и полилинию. Обратите внимание на следующие моменты:
Лёгкое программирование под Autodesk Vault Часть 40
Свойства. Получение значенийИзменение геометрии экземпляра семейства
Вопрос: Мне нужно изменить геометрию конкретного элемента в проекте. Похоже на то, что Revit API просто не позволяет это делать. Я разобрался с тем, как использовать метод Duplicate для создания нового типоразмера в проекте и затем задать новый типоразмер нужному мне экземпляру семейства. Но таким способом я могу лишь менять значение параметров в новом типоразмере. Мне же действительно нужно изменить именно геометрию. Я бы предпочел не использовать редактор семейств, для реализации моей задумки. Все дело в том, что я хочу сделать эти изменения в методе IUpdater.Execute. Есть ли способ сделать то, что мне требуется?