Revit 2017 закрывается при закрытии вновь созданного документа - PullRequest
0 голосов
/ 15 января 2020

У меня есть повторяющаяся проблема, что Revit API (по крайней мере, некоторые версии 2017 года) будет сильно ломать sh во время, казалось бы, «невинной» попытки создать новый do c и сохранить его (код ниже) .)

cra sh происходит в точке, где мы пытаемся закрыть документ. Там, где это происходит, это кажется воспроизводимым,

, но, например, прямо сейчас это происходит не в 2017 МГ, а в коллегах 2017 (но я видел, что это * sh в разных комбинациях в разное время, например, для меня.)

Мы не получаем никаких исключений или чего-то еще, только полное немедленное отключение. Меня сбивает с толку то, что задействованные объекты очень просты - это только что созданный пустой do c, и, следовательно, не содержит никаких «неприятных данных». (основные «разные» данные - это 3dView, который мы добавляем.)

Плагин revit, в котором он живет, содержит много строк ДРУГОГО кода, которые не демонстрируют это неприятное поведение. Так что меня удивляет, что в этом одном углу со злым поведением мы (по-видимому) на самом деле не делаем ничего дикого.

Два эксперимента, которые я рассматриваю, это

  1. пропуск «добавить 3d вид», чтобы определить, является ли это причиной (проблема в том, что проблема не появляется постоянно, это может ничего не доказывать.)

  2. 'пузыриться 'this do c -создание до самого верха / передней части приложения, так что эта инициализация происходит "в значительной степени раньше всего". Таким образом, я полагаю, что мог бы исключить его зависимость от «всего, что последует после». Я боюсь, однако, что это может просто «раздувать» проблему вокруг, чтобы возникнуть где-то еще ..

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

В настоящее время мы собираем наш плагин в вариантах 2017-2018-2019-2020, для поддержки разных клиентов.

Я знаю, что у revit есть несколько внутренних файлов журнала, но я никогда не мог понять ничего, что они упоминают; в частности, я ничего не узнал от них во время тяжелых аварий. (под жестким cra sh я имею в виду завершение работы revit без предоставления каких-либо следов или исключений стека.)

using (Document newContainerDoc = app.NewProjectDocument(UnitSystem.Metric)) {
    SaveAsOptions opts = new SaveAsOptions();
    opts.OverwriteExistingFile = true;
    add3dView(newContainerDoc);
    newContainerDoc.SaveAs(newContainerDocPathName, opts);
    newContainerDoc.Close(); // crashes here.

Просто чтобы показать, add3dview не делает ничего гнусного, и я «обещаю», что TTransaction делает то, что вы ожидаете тоже (?)

private static ElementId add3dView(Document newContainerDoc) {
    var collector = new FilteredElementCollector(newContainerDoc);
    ViewFamilyType viewFamilyType =
     collector.OfClass(typeof(ViewFamilyType)).Cast<ViewFamilyType>()
        .FirstOrDefault(x => x.ViewFamily == ViewFamily.ThreeDimensional);

    using (TTransaction ttNew = new TTransaction(newContainerDoc, "Creating 3D View")) {
        ttNew.Start();
        View3D view3D = View3D.CreateIsometric(newContainerDoc, viewFamilyType.Id);

        ElementId viewId = view3D.Id; 
        Parameter p = view3D.get_Parameter(BuiltInParameter.MODEL_GRAPHICS_STYLE);
        p.Set(6);
        view3D.SaveOrientation();
        ttNew.Commit();
        return viewId;
    }
}
...