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

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     Читать далее >>>
20/09/2014

Как удалить описание общего параметра

Еще один небольшой пример, демонстрирующий достоинства утилиты RevitLookup.

В данной статье покажем это на примере удаления описания общего параметра, который предоставил нам Trevor Taylor из компании ZGF.

Задача

Когда я удаляю описание общего параметра, то оно исчезает в пользовательском интерфейсе. Однако, фактически оно не удаляется из самой модели.

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

Получение указателя на объект по ObjectID

Иногда необходимо по ObjectID получить указатель на объект. Казалось бы, ничего особо сложного нет - в ActiveX есть метод vla-ObjectIdToObject с соответствующим параметрами. Но не все так просто, как хотелось бы.
Опубликовано 19.09.2014     Читать далее >>>
14/09/2014

Определение типа электрооборудования

Вопрос: Как правильно определить различия между распределительным щитом и щитом осветительных и бытовых приборов с помощью API? Например, из базового примера проекта Revit MEP, как мне определить тип оборудования SWB и MDP-1?

 

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

Ассоциативный Массив и его API

В AutoCAD 2012 появился так называемый ассоциативный массив. Одновременно с этим появилось и API для его создания, редактирования и получения информации о существующем ассоциативном массиве. Например, вот так можно получить характеристики массива:

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

Уникальность наименования и класс NamingUtils

В Revit API полно сюрпризов. Вот один из них, которых правел нас к новому вспомогательному классу, который раньше был не замеченным.

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

Как удалить неиспользуемые и необработанные ссылки на данные (DataLink)?Автор: Александр Ривилис

Для необработанных ссылок на данные свойство IsValid всегда равно false. А вот с неиспользуемыми ссылками на данные несколько сложнее. Метод DataLink.GetTargets() возвращает коллекцию ObjectId объектов/примитивов, которые используют эту связь. Если таблица (Table) использовала связь, то её ObjectId содержится в коллекции DataLink.GetTargets(). Если эту таблицу стереть, то DataLink.GetTargets() не будет содержать ObjectId таблицы, а будет содержать ObjectId для объекта TableContent (это не примитив, т.е. не является наследником Entity). Таким образом, если DataLink.GetTargets() не содержит ObjectId ни одного примитива, то соответственно он не используется и его можно удалить. Следующий код это и показывает:

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

Как получить неиспользуемые внешние ссылки, растры и подложки?Автор: Александр Ривилис

Вопрос: Мне нужно средствами AutoCAD .NET API получить неиспользуемые внешние ссылки (XREF), растры (IMAGE), pdf-подложки (PDFUNDERLAY) и dwf-подложки (DWFUNDERLAY). Как это можно сделать?

Ответ: Для внешних ссылок достаточно найти все записи таблицы блоков (BlockTableRecord), свойство XrefStatus которых отлично от NotAnXref и для них справедливо выражение GetBlockReferenceIds(false, true).Count == 0

Для растров и подложек процедура несколько иная. Необходимо найти соответствующую таблицу (ACAD_IMAGE_DICT – для IMAGE, ACAD_PDFDEFINITIONS – для PDFUNDERLAY, ACAD_DWFDEFINITIONS – для DWFUNDERLAY) и получить из неё все ObjectId элементов. После этого достаточно воспользоваться методом Database.Purge(), чтобы получить только те ObjectId элементов, которые не используются.

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

Лёгкое программирование под Autodesk Vault Часть 38Автор: Дмитрий Емельянов

Свойства. Введение
Опубликовано 04.09.2014     Читать далее >>>