Revit: установка параметра типа в связанных моделях

Наша надстройка Revit позволяет пользователю просматривать и устанавливать параметры типа, в том числе в связанных моделях. Он отлично работал в Revit 2011 и более ранних версиях, но в Revit 2012 и 2013 мы больше не можем их устанавливать. При построении транзакции в связанном документе я получаю: «Autodesk.Revit.Exceptions.ArguementException: документ является связанным файлом. Транзакции могут использоваться только в первичных документах (проектах или семействах)».

Итак, мы не можем использовать транзакции для связанных моделей. Поэтому я попытался установить параметр без транзакции, но затем получил исключение, в котором говорилось, что мы не можем изменять модель вне транзакции.

Невозможно создать транзакцию для связанных моделей и изменить модель вне транзакции - так как же изменить связанную модель в Revit 2012/2013? Он отлично работал в 2011 году с тем же кодом. Провел много поисков в Интернете, в том числе в блоге The Building Coder, но не нашел упоминания об этом критическом изменении или о том, как его обойти. Кто-нибудь может протянуть руку помощи?

Наш код прост - мы получаем параметр в модели, запускаем транзакцию и пытаемся установить значение параметра. Опять же, тот же код работает без ошибок в Revit 2011.

// elementType is an ElementType in document doc 
// for which we want to set a type parameter.
Parameter typeParameter = elementType.get_Parameter(pararmeterName);
Transaction transaction = new Transaction(doc, "Update Revit Type"); // Exception thrown here if doc is a linked model
transaction.Start();

typeParameter.Set("FooValue");

transaction.Commit();

person System.Cats.Lol    schedule 10.07.2012    source источник


Ответы (3)


Начиная с Revit 2014, вы можете выгружать связанные файлы. Поэтому просто выгрузите файлы перед началом транзакции, а затем перезагрузите их после завершения транзакции.

// Unload all links
var loadedExternalFilesRef = new List<RevitLinkType>();
var collector = new FilteredElementCollector(document);
foreach (Element element in collector.OfClass(typeof(RevitLinkType)))
{
    ExternalFileReference extFileRef = element.GetExternalFileReference();
    if (null == extFileRef || extFileRef.GetLinkedFileStatus() != LinkedFileStatus.Loaded) 
        continue;
    var revitLinkType = (RevitLinkType)element;
    loadedExternalFilesRef.Add(revitLinkType);
    revitLinkType.Unload(null);
}

// Do your stuff in a transaction

// Reload links
foreach (RevitLinkType revitLinkType in loadedExternalFilesRef)
    revitLinkType.Load();
person Maxence    schedule 29.02.2016

Я начал работать с Revit 2012 и не знал, как ведут себя транзакции в связанных файлах. Но мне также нужно было установить параметр для связанных файлов, и я не нашел способа, как это сделать правильно. Справка RevitAPI сообщает, что Транзакции можно использовать только в первичных документах (проектах или семействах).

Я могу предположить, что установка параметров в связанном файле в Revit 2011 была ошибкой, а не функцией, потому что это потенциально небезопасно.

person Victor Chekalin    schedule 11.07.2012

2 года спустя ... Я думаю, вам придется открыть рассматриваемый документ, сделать его активным, а затем попробовать применить там код, который вы хотите. если вам нужен пример кода, дайте мне знать, и я попробую что-нибудь придумать

person prestonsmith    schedule 15.04.2015