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

26/11/2014

Сохранение семейства после его редактирования с помощью FamilyManager

Вопрос: Мы разрабатываем надстройку, в которой мы выгружаем файлы семейства в базу данных.

Сначала мы добавляем в семейство несколько общих параметров с помощью метода FamilyManager.AddParameter().

Все работает неплохо, до тех пор, пока мы не вызываем метод UploadOriginal в котором мы пытаемся сохранить измененное семейство в файл:

Код - C#: [Выделить]
  1.   string path = Path.GetTempPath();
  2.   string name = family.Name;
  3.   string fName = name + ".rfa";
  4.   string fPath = path + fName;
  5.  // Revit выбрасывает исключение на этой строчке
  6. // С описанием, что семейство не редактируемое.
  7. // Почему так?
  8. // Чтобы выгрузить семейство, мне его нужно сохранить предварительно,
  9. // но мешает ошибка.
  10.   Document famDoc = doc.EditFamily( family );
  11.   famDoc.SaveAs( fPath );
  12.   famDoc.Close( false );
  13.  
  14.   // остальной код...

Что может являться причиной этой ошибки?

Ответ: Недавно я реализовал надстройку, в которой я как раз обсуждал эту проблему. Для некоторых семейств Revit выбрасывает исключение «Семейство не является редактируемым».

Я добавил обработку исключения и просто пропускаю такие семейства:

Код - C#: [Выделить]
  1.   try
  2.   {
  3.     r1.FamilyDocument
  4.       = famdoc
  5.       = doc.EditFamily( f );
  6.   }
  7.   catch( Autodesk.Revit.Exceptions.ArgumentException ex )
  8.   {
  9.     r1.Skipped = true;
  10.     results.Add( r1 );
  11.     Debug.Print( "Семейство '{0}': {1}", f.Name, ex.Message );
  12.     continue;
  13.   }

Вот скриншот из той надстройки:

 

Я просто предположил, что это нормальная ситуация.

Ответ: Чтобы пропустить такие семейства, достаточно просто добавить проверку

Код - C#: [Выделить]
  1. if (family.IsEditable)
. Но, к сожалению, мы не можем просто так взять, и пропустить эти семейства. Нам их также нужно загрузить.

У меня есть две объяснения такого поведения:

1)      FamilyManager каким-то образм блокирует семейство, открытое в редакторе семейств и разрешает редактирование, только после освобождения ресурсов FamilyDocument. Однако, даже после вызова метода FamilyManager.Dispose(), метод EditFamily по прежнему падает с исключением.

2)      (Может быть связана с первой). Нельзя сохранить семейство в файл после того, как были изменены или добавлены параметры. Команда «Сохранить» должна быть вызвана с опциями разблокировки семейства. Но я не нашел подходящих методов ни в классе Family ни в классе FamilyManager.

Я плясал с бубном 3 дня, но так и не решил эту проблему. Поэтому буду благодарен любой помощи по «разблокировке» семейства.

Ответ: Спасибо что рассказали про метод IsEditable.

По поводу блокировки семейств. Вы уверены, что больше нет открытых документов с этим семейством, и что только одно семейство открыто для редактирования?

Ответ: Спасибо что упомянули об открытых документах. Я случайно осознал, что в своей программе у меня уже есть открытый FamilyDocument. И когда я вызывал метод UploadOriginal, я использовал этот документ в качестве входного параметра и использовал следующий код:

Т.е. здесь я создавал еще один FamilyDocument. Поэтому и выскакивало исключение.

В итоге я изменил код на следующий:

Код - C#: [Выделить]
  1.   doc.SaveAs( path );
  2.   // Закрыть документ нельзя, так как Revit не позволяет закрыть  
  3.  // видимый документ
  4.   //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