Сохранение семейства после его редактирования с помощью FamilyManager
Вопрос: Мы разрабатываем надстройку, в которой мы выгружаем файлы семейства в базу данных.
Сначала мы добавляем в семейство несколько общих параметров с помощью метода FamilyManager.AddParameter().
Все работает неплохо, до тех пор, пока мы не вызываем метод UploadOriginal в котором мы пытаемся сохранить измененное семейство в файл:
- string path = Path.GetTempPath();
- string name = family.Name;
- string fName = name + ".rfa";
- string fPath = path + fName;
- // Revit выбрасывает исключение на этой строчке
- // С описанием, что семейство не редактируемое.
- // Почему так?
- // Чтобы выгрузить семейство, мне его нужно сохранить предварительно,
- // но мешает ошибка.
- Document famDoc = doc.EditFamily( family );
- famDoc.SaveAs( fPath );
- famDoc.Close( false );
- // остальной код...
Что может являться причиной этой ошибки?
Ответ: Недавно я реализовал надстройку, в которой я как раз обсуждал эту проблему. Для некоторых семейств Revit выбрасывает исключение «Семейство не является редактируемым».
Я добавил обработку исключения и просто пропускаю такие семейства:
- try
- {
- r1.FamilyDocument
- = famdoc
- = doc.EditFamily( f );
- }
- catch( Autodesk.Revit.Exceptions.ArgumentException ex )
- {
- r1.Skipped = true;
- results.Add( r1 );
- Debug.Print( "Семейство '{0}': {1}", f.Name, ex.Message );
- continue;
- }
Вот скриншот из той надстройки:
Я просто предположил, что это нормальная ситуация.
Ответ: Чтобы пропустить такие семейства, достаточно просто добавить проверку
- if (family.IsEditable)
У меня есть две объяснения такого поведения:
1) FamilyManager каким-то образм блокирует семейство, открытое в редакторе семейств и разрешает редактирование, только после освобождения ресурсов FamilyDocument. Однако, даже после вызова метода FamilyManager.Dispose(), метод EditFamily по прежнему падает с исключением.
2) (Может быть связана с первой). Нельзя сохранить семейство в файл после того, как были изменены или добавлены параметры. Команда «Сохранить» должна быть вызвана с опциями разблокировки семейства. Но я не нашел подходящих методов ни в классе Family ни в классе FamilyManager.
Я плясал с бубном 3 дня, но так и не решил эту проблему. Поэтому буду благодарен любой помощи по «разблокировке» семейства.
Ответ: Спасибо что рассказали про метод IsEditable.
По поводу блокировки семейств. Вы уверены, что больше нет открытых документов с этим семейством, и что только одно семейство открыто для редактирования?
Ответ: Спасибо что упомянули об открытых документах. Я случайно осознал, что в своей программе у меня уже есть открытый FamilyDocument. И когда я вызывал метод UploadOriginal, я использовал этот документ в качестве входного параметра и использовал следующий код:
Т.е. здесь я создавал еще один FamilyDocument. Поэтому и выскакивало исключение.
В итоге я изменил код на следующий:
- doc.SaveAs( path );
- // Закрыть документ нельзя, так как Revit не позволяет закрыть
- // видимый документ
- //doc.Close(false);
Правда теперь я столкнулся с другой проблемой. Family.Name из doc.OwnerFamily.Name всегда возвращает пустую строку. Поэтому файлы теперь выглядят как «/folder/.rfa» вместо «/folder/NightLamp.rfa»
Ответ: Отлично.
Можно использовать Document.Title, вместо Family.Name.
Ответ: Да, это вариант. Но это выглядит странно, что Family.Name возвращает пустую строку.
Источник: http://thebuildingcoder.typepad.com/blog/2014/09/modifying-saving-and-reloading-families.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=1108
Опубликовано 26.11.2014