ADN Open CIS
Сообщество программистов Autodesk в СНГ

21/10/2014

LISP для CAD-менеджера

Доклад Autodesk University Russia 2014 о применении LISP для CAD-менеджера.
Опубликовано 21.10.2014     Читать далее >>>
14/10/2014

О развертывании AutoCAD 2015

По материалам Autodesk University Russia 2014. Текстовый вариант доклада о развертывании AutoCAD 2015.
Опубликовано 14.10.2014     Читать далее >>>
14/10/2014

Мультивыноска может привести к исключению eInvalidContext

Примитив MLeader (и эквивалентный ему AcDbMLeader in C++) поддерживает возможность использования блока в качестве текстового компонента, как описано в предыдущей статье. Один из необходимых шагов – это установка свойства BlockPosition (или setBlockPosition в C++), но это может привести к исключению eInvalidContext.
Опубликовано 14.10.2014     Читать далее >>>
10/10/2014

Как создать мультивыноску в .NET?

Ниже два примера, которые иллюстрируют создание мультивыноски (MLeader) в C#.
Опубликовано 10.10.2014     Читать далее >>>
09/10/2014

Получение габаритного контейнера сплайна с помощью ObjectARX

Вопрос:

Я хочу получить габаритный контейнер сплайна, но метод getGeomExtents() дает неточные результаты. Как можно получить точный габаритный контейнер для сплайна?

Ответ:

Для AcDbSpline метод getGeomExtents() возвращает неточный габаритный контейнер, т.к. вычисление точного контейнера сопряжено с временными тратами.

Чтобы получить точный габаритный контейнер вам придется вычислить его самостоятельно. Вы можете воспользоваться методом getPointAtParam() для прохода по сплайну и вычисления максимальных/минимальных координат X и Y. Точность вычисления габаритного контейнера зависит от того насколько частей кривая поделена. Коэффициент 1e6 даёт приемлемую точность и допустимое время для подсчета. Функции показанные ниже показывают как это можно сделать. Запустите команду SplineBB и выберите сплайн. Команда нарисует два габаритных контейнера. Красный возвращает метод getGeomExtents(), а желтый – это тот, который мы вычислили.

Опубликовано 09.10.2014     Читать далее >>>
07/10/2014

Как преобразовать Toolbar в элемент ленты

Известно, что старые файлы меню (mnu, mns, cui) прекрасно открываются в более поздних версиях AutoCAD. Одновременно с открытием (то есть загрузкой) меню преобразовывается в актуальный формат (для AutoCAD с версии 2010 используется формат cuix). Но совсем древние разработки базируются на панелях инструментов (Toolbar) и выпадающем меню. Собственно вопрос - как быстро сделать эти меню доступными в новых версиях AutoCAD?
Опубликовано 07.10.2014     Читать далее >>>
07/10/2014

Настройка CAdUiListCtrl

Если мы пользуемся классом CAdUiListCtrl и хотим его настроить получше, мы можем использовать пользовательское рисование. Это делается точно так же, как и с любым другим элементом управления MFC. Хорошую статью о том, как это делать (на английском) для элемента управления CListCtrl вы найдете здесь.
Опубликовано 07.10.2014     Читать далее >>>
05/10/2014

Удаление кнопок с панели быстрого доступа убивает AutoCAD

Если вы добавляете кнопки ленты на панель быстрого доступа AutoCAD (ПБД) убедитесь, что вы обеспечили уникальный ID для кнопки. Если у кнопки нет уникального ID, тогда AutoCAD может аварийно завершиться при скрытии/удалении любой другой стандартной кнопки ПБД.

Опубликовано 05.10.2014     Читать далее >>>
26/09/2014

Расчленение вложенных блоков с помощью .NET

Некоторое время назад я написал статью о том, как использовать метод Entity.Explode() чтобы получить те же результаты, что и в команде РАСЧЛЕНИ (_EXPLODE). В комментариях я получил замечание, что с этим лучше справляется метод BlockReference.ExplodeToOwnerSpace.

Мне захотелось использовать этот же метод для расчленения вложенных блоков, но так как BlockReference.ExplodeToOwnerSpace() не возвращает список созданных объектов, мне пришлось приспособить событие Database.ObjectAppended для этого и для рекурсивного вызова моей функции ExplodeBlock() со всеми вновь созданными блоками. Мы можем так же удалить оригинальный примитив (или примитивы если функция вызвана рекурсивно).

Опубликовано 26.09.2014     Читать далее >>>
25/09/2014

Как используя 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 занимается своими делами и занят. В ряде случае он возвращает коды ошибки при работе с ним:

Опубликовано 25.09.2014     Читать далее >>>
24/09/2014

Как средствами AutoCAD определить расположение точки относительно контура.Автор: Александр Ривилис

Вопрос:

Есть ли встроенные средства для определения как расположена точка относительно контура в AutoCAD .NET API?

Ответ:

Специальных средств для этого нет. Но есть по меньшей мере два способа, которыми можно воспользоваться для этого:

  1. С использованием BREP .NET API (Autodesk.AutoCAD.BoundaryRepresentation) – Если превратить контур в Region, то можно будет воспользоваться возможностью Brep для определения положения точки внутри Region. Для этого можно воспользоваться методом BrepEntity.GetPointContainment, который возвращает объект-перечисление PointContainment, которое может принимать одно из трёх значений: Inside (внутри), Outside (снаружи), OnBoundary (на самом контуре).
  2. C использованием класса примитива MPolygon. Обычно этот класс используется в Civil 3D, но так как он есть и в базовом AutoCAD, то мы можем им воспользоваться.

В данной статье мы рассмотрим второй способ. Будем считать, что в качестве контура у нас имеется замкнутая полилиния. В общем случае она может иметь и дуговые сегменты, но не должна быть самопересекающейся – иначе теряется смысл понятия «внутри контура». Ниже пример команды, которая просит пользователя указать точку и полилинию. Обратите внимание на следующие моменты:

Опубликовано 24.09.2014     Читать далее >>>
24/09/2014

Лёгкое программирование под Autodesk Vault Часть 40

Свойства. Получение значений
Опубликовано 24.09.2014     Читать далее >>>
24/09/2014

Изменение геометрии экземпляра семейства

Вопрос: Мне нужно изменить геометрию конкретного элемента в проекте. Похоже на то, что Revit API просто не позволяет это делать. Я разобрался с тем, как использовать метод Duplicate для создания нового типоразмера в проекте и затем задать новый типоразмер нужному мне экземпляру семейства. Но таким способом я могу лишь менять значение параметров в новом типоразмере. Мне же действительно нужно изменить именно геометрию. Я бы предпочел не использовать редактор семейств, для реализации моей задумки. Все дело в том, что я хочу сделать эти изменения в методе IUpdater.Execute. Есть ли способ сделать то, что мне требуется?

Опубликовано 24.09.2014     Читать далее >>>
23/09/2014

Получение поверхности (Face) из ReferenceIntersector

Вопрос: С помощью API мне нужно получить поверхность, которая находится на пересечении заданной точки и заданного направления. Для этого я использую класс ReferenceIntersector. Вот пример моего кода:

Код - C#: [Выделить]
  ReferenceIntersector refIntersector

    = new ReferenceIntersector( id,

      FindReferenceTarget.Face, selectedView );

 

  XYZ origin = new XYZ( x, y, z );

 

  ReferenceWithContext refContext

    = refIntersector.FindNearest(

      origin, new XYZ( 0, 0, -1 ) );

 

  Reference refObject = refContext.GetReference();

А что мне делать дальше с refObject? Как мне в итоге получить ссылку на поверхность?

Опубликовано 23.09.2014     Читать далее >>>
23/09/2014

Использование потоков (Thread) для фоновой обработки

Вопрос:

Внутри моей команды я хочу запустить фоновую задачу для синхронизации с базой данных. Как только эта задача заканчивается я хотел бы при помощи AutoCAD .NET API сделать некоторые изменения в базе данных. Однако, когда я вызываю функции AutoCAD API из этой задачи, они не работают. Например, the MdiActiveDocument равен null.

Ответ:

AutoCAD .NET API не позволяют использовать мультизадачность. Необходимо вызывать функции API из главной задачи.

Если вы находитесь в другой задаче, вам необходимо настроить вызов из главной задачи. Самый простой способ достичь этого – это создать объект System.Windows.Forms.Control в главной задаче и использовать его метод Invoke() для запуска функции которая и выполнит окончательную обработку.

Опубликовано 23.09.2014     Читать далее >>>
22/09/2014

Как определить присоединен ли экземпляр семейства к другому элементу

Вопрос: Есть ли какой-нибудь метод, с помощью которого можно определить, присоединен ли экземпляр семейства к чему-либо?

Я попытался с помощью RevitLookup найти что-то похожее, но так и не увидел ничего, что позволило бы это определить.

Опубликовано 22.09.2014     Читать далее >>>
21/09/2014

Доступ к настройкам из ленты и закрепление всплывающей панели

Вопрос: Как можно с помощью Revit API получить доступ к кнопке закрепления всплывающей панели и стрелочке, по которой открываются настройки?

 

 

Опубликовано 21.09.2014     Читать далее >>>