Запись данных в файл в плагине для Revit
Сегодня рассмотрим интересную тему: запись данных в файл. В этой статье будет мало новой информации непосредственно про Revit API: рассмотрим интересные вещи из других библиотек.
При создании плагина для Revit мы подключаем 2 обязательные DLL-ссылки: RevitAPI и RevitAPIUI.
В общем-то, большая часть того, что мы делаем, завязана на классы и методы, присутствующие в этих библиотеках (и описанных на https://www.revitapidocs.com/).
Но, помимо прочего, во всех вновь создаваемых проектах присутствует ссылка на базовую сборку system
(это там хранятся string, int, double и многие другие базовые типы), и мы можем добавить любые другие сторонние сборки для наших целей (например EPPlus или ClosedXML для записи данных в Excel)
Сегодня мы рассмотрим работу с файлами и файловой системой с помощью классов из пространства имён System.IO (IO означает Input-Output, ввод-вывод). На сайте Microsoft можно изучать документацию на его классы так же, как и на revitapidocs.
Итак, рассмотрим код целиком, потом разберём его и представим результат:
public class FirstRevitCommand : IExternalCommand
{
static AddInId addinId = new AddInId(
new Guid("0F296157-A2DC-4532-BB1B-6D6D3462F15A"));
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
var walls = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.ToElements()
.Cast<Wall>();
string filename =
$"C:\\Users\\{Environment.UserName}\\Documents\\Revit API Blog\\Data.txt";
if (File.Exists(filename))
{
File.Delete(filename);
}
using (StreamWriter writer = new StreamWriter(filename))
{
foreach (Wall wall in walls)
{
var lengthParam =
wall.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH);
string data =
$"Element ID: {wall.Id.ToString()}, Type name: {wall.Name}, Length: {lengthParam.AsValueString()}";
writer.WriteLine(data);
}
writer.Close();
}
return Result.Succeeded;
}
}
Чтобы вам было удобнее, в этот раз я выложил код на свой GitHub. Там нет addin-файла, я запускаю через Addin-Manager.
Напоминаю, что код лучше не копировать — лучше переписать с нуля даже точно такой же, это будет полезнее, а ещё лучше — модифицировать и добавить что-то своё.
Итак, что же тут мы имеем:
-
Записываем имя файла в строковую переменную (строка 30). Для этого я создал файл в папке “Документы”, скопировал его путь, а затем заменил имя пользователя конструкцией
Environment.UserName. Не то чтобы я хочу сохранить анонимность, просто показываю один из способов того, что можно сделать, если будете устанавливать свои плагины другим людям в папку%username%\AppData\Roaming\Autodesk\Revit\Addins -
Далее я проверяю существование файла, и, если он существует, удаляю его. Зачем? Чтобы информация каждый раз записывалась заново.
-
А далее собственно то, что является темой статьи. В конструкции
usingсоздаём новыйStreamWriter, передавая емуfilename. Далее проводим манипуляции с данными из проекта: я беру у каждой стеныId, имя типа и параметр “Длина” (почему я беру параметр именно так, читайте в статье о параметрах в Revit API), и записываю в строку. Затем эту строку записываю через метод WriteLine(string data).
- Метод
WriteLineзаписывает данные с новой строки (либо переносит строку) - Метод
Writeзаписывает данные в ту же строку - В самом конце я закрываю
StreamWriterметодомClose(). Информация сохраняется.
Запускаем плагин в Sample Project Revit 2023:
Результаты
В общем-то, и всё. Зная эти нехитрые штуки, можно извлечь очень много информации из файла Revit. И даже применять эту информацию при отладке.
Мой телеграм-канал. Подписывайтесь и до новых встреч!