Использование объекта DataStorage для хранения настроекАвтор: Виктор Чекалин
У разработчиков часто возникает вопрос, где хранить настройки приложения либо другую информацию, которая привязана к конкретной модели.
Традиционно для этих целей использовались общие параметры, затем, расширяемая область хранения Extensible Storage. Но у обоих вариантов возникала проблема, какой элемент нужно использовать для хранения параметра или к какому применить расширяемую область. Одним из вариантов – использовать элемент ProjectInfo, содержащий в себе информацию о проекте.
Однако, при совместной работе над проектом часто возникает ситуация, когда один из пользователей заблокировал этот элемент для изменения, например, когда элементарно поменял настройки проекта.
В Revit 2013 API для этих целей появился специальный объект – DataStorage. Объект наследуется от класса Element, а, следовательно, его можно и нужно использовать для хранения расширяемой области хранения.
Отслеживание изменения семейства
Уже много лет проектировщики и разработчики спрашивают, как можно защитить семейства от изменения их пользователями, или хотя бы отследить было ли семейство изменено или нет.
Вот один из подобных вопросов:
Вопрос: Меня все время спрашивают, как можно защитить мои семейства от изменения их пользователями.
Было бы очень неплохо, если я хотя бы смог определить, что в семейство были внесены некие изменения.
Доступ к значению параметра "Экспортировать виды на листах и ссылки на внешние связи" в диалоге экспорта в формат САПР через API
Вопрос: При экспорте модели в файл DWG (или другие форматы САПР) в диалоге «Экспорт в форматы САПР» есть галочка «Экспортировать виды на листах и ссылки на внешние связи». Как можно управлять этим же параметром програмно через API?
Как получить выбранный элемент из связанного файла
В Revit 2014 появилась еще одна реализация перегруженного метода PickObject, позволяющая выбрать элемент из связанного файла – PickObject(ObjectType.LinkedElement). Многие разработчики оценили это нововведение. Тем не менее, у многих возникает проблема – как в итоге получить сам выбранный элемент. Свойство Reference.ElementId не возвращало идентификатор выбранного элемента.
Как определить тип выступающего профиля стены (Wall Sweep Type) для использования в методе WallSweep.Create()
Вопрос: В Revit SDK есть метод для создания выступающего профиля стены. Он объявлен как:
WallSweep.Create( Wall wall,ElementId wallSweepType,
WallSweepInfo wallSweepInfo)
Вторым параметром необходимо передать тип профиля, но я не знаю, как мне его получить и поэтому у меня не получается воспользоваться этим методом. Скажите, как правильно получить значение этого параметра для передачи его в метод?
Открытие пользовательского файла справки при нажатии F1 в кнопке на ленте
Для открытия вашего собственного файла справки (файл .chm), при нажатии на кнопку F1 в момент выделения кнопки на ленте, нужно воспользоваться классом ContextualHelp. ContextualHelp позволяет открыть файл справки, находящемся на локальной машине пользователя, или перейти по внешней ссылке для отображения справки по работе с вашей надстройкой.
Как определить является ли текущий пользователь владельцем элемента при совместной работеАвтор: Виктор Чекалин
Вопрос: Как определить, что владельцем элемента, который мы хотим редактировать, является текущий пользователь, пред тем как сделать коммит транзакции?
Обновлять или добавлять схему расширяемой области хранения (Extensible Storage)
Вопрос: Я выпустил релиз своей надстройки, где я использую схему.
Сейчас я работаю над новой версией и мне нужно расширить схему области для хранения дополнительных параметров.
Когда я добавляю данные, я могу создать новую схему и скопировать все данные в новую схему, или же я могу создать совсем другую схему.
Создание другой схемы кажется довольно простым способом. Есть ли у этого способа какие-либо недостатки? Ведь если я постоянно буду продолжать создавать новые схемы, то в конце концов это повлияет на размер файла и на производительность.
Минимальный размер DirectShape
В Revit 2015 API появилась возможность импортировать геометрию элементов напрямую в проект. В API, класс DirectShape представляет собой геометрическую фигуру.
У одного из пользователей возник вопрос, касающийся использования данного класса
Вопрос: Я создаю фигуры (DirectShape) в Revit 2015 API из имеющегося набора поверхностей при помощи класса TessellatedShapeBuilder.
Проблема в том, что минимально допустимая длина грани, с которой Revit может работать равна 0,0026 фута. Если я пытаюсь использовать грань длиной 0,0025 фута, то Revit падает с ошибкой.
Можно ли изменить этот минимальный допуск?
Или может быть есть какой-то другой способ создания фигуры, где можно задать меньшую длину грани?
Обработка ошибок и предупреждений
Программная обработка диалогов с предупреждениями
Вопрос: Возможно ли с помощью Revit MEP 2011 API обрабатывать сообщения с предупреждениями?
Например, при обработке нескольких файлов, может появиться диалог с предупреждением. Я бы хотел перехватит это событие, извлечь текст сообщения и не показывать диалог.
И еще, если предупреждения могут быть перехвачены и обработаны, можно ли так же обработать сообщения об ошибках? Например, если при работе возникает ошибка, можно ли программно определить номер ошибки, выбрать подходящее действие для обработки этой ошибки и продолжить выполнение некоторых действий без фактического отображения диалога?
Новые примеры в Revit SDK 2015
Новые примеры в Revit SDK 2015
Первый релиз Revit SDK 2015 включает в себя 4 новых примера, демонстрирующих функциональность нового Revit API:
Идентификаторы элементов в Revit - Часть 4. Числовой и уникальный идентификатор меняется при повторном импорте
Предыдущие части:
- Часть 1 - Уникальный идентификатор (UniqueId) или числовой (Element.Id)
- Часть 2 - Уникальность уникального идентификатора UniqueId
- Часть 3 - Отрицательные значения ElementId
Вопрос: Мы столкнулись с проблемой при повторном импорте измененного IFC файла в Revit, так как числовой и уникальный идентификатор оказались не надежными.
В результате, все ссылки на связанную модель (вне IFC), такие как размерность, потерялись, после того, как мы заново импортировали отредактированную модель. Нам пришлось повторно подгонять импортированную модель.
Идентификаторы элементов в Revit - Часть 3. Отрицательные значения ElementId
Предыдущие части:
- Часть 1 - Уникальный идентификатор (UniqueId) или числовой (Element.Id)
- Часть 2 - Уникальность уникального идентификатора UniqueId
Вопрос: Иногда я вижу отрицательные значения ElementId. Что это, и почему такое может быть?
Revit как сервис
За довольно короткое время уже несколько человек задавали вопрос о том можно ли использовать приложение Revit как услугу (сервис). Видимо пришло время разобрать этот вопрос поподробней.
Доступ к Revit из внешнего приложенияАвтор: Виктор Чекалин
Как известно, официального API для доступа к Revit из внешнего приложения не существует.
Тем не менее, можно реализовать его самостоятельно, хоть и с некоторыми ограничениями.
Обращаться к методам Revit API можно только в определенных контекстах:
- открытие/закрытие приложения (IExternalApplication.OnStartup и IExternalApplication.OnShutdown)
- Выполнение внешней команды (IExternalCommand.Execute)
- Событие Idling (UIApplication.Idling)
- Внешние события (ExternalEvents)
Ни один из этих способов недоступен вне приложения Revit.
Идентификаторы элементов в Revit. Часть 2
Продолжаем серию статей об идентификаторах в Revit
Часть 1: Уникальный идентификатор (UniqueId) или числовой (Element.Id)
Уникальность уникального идентификатора UniqueId
Идентификаторы элементов в Revit. Часть 1
Начнем небольшую серия статей о различных идентификаторах элемента, существующих в Revit.
Некоторый из идентификаторов существуют уже давным-давно, некоторые же появились относительно недавно.
Определение размера и месторасположения видов на листе
Рассмотрим, как можно определить размер и месторасположение листа и всех видов на нем.
В предыдущих версиях Revit сделать это было довольно проблематично.
Вот несколько статей на эту тему:
- Список всех листов и видов на нем – CmdListViews (на англ.)
- Определение размера листа – CmdSheetSize (на англ.)
- Определение месторасположения вида на листе (на англ.)
- Точное позиционирование видового экрана (на англ.)
Как определить, находится ли точка внутри зоныАвтор: Виктор Чекалин
Определение категорий, поддерживающих привязку параметра типа или экземпляра
Вопрос: Я могу получить список категорий, поддерживающих привязку общих параметров, например, с помощью такого кода:
SortedList<string, Category> CatList= new SortedList<string, Category>();
Categories cats = doc.Settings.Categories;
foreach( Category cat in cats )
{
if( cat.AllowsBoundParameters )
{
CatList.Add( cat.Name, cat );
}
}
Но как мне из этого списка понять, поддерживает ли категория привязку параметра типа или экземпляра?