У меня есть повторяющаяся проблема, что Revit API (по крайней мере, некоторые версии 2017 года) будет сильно ломать sh во время, казалось бы, «невинной» попытки создать новый do c и сохранить его (код ниже) .)
cra sh происходит в точке, где мы пытаемся закрыть документ. Там, где это происходит, это кажется воспроизводимым,
, но, например, прямо сейчас это происходит не в 2017 МГ, а в коллегах 2017 (но я видел, что это * sh в разных комбинациях в разное время, например, для меня.)
Мы не получаем никаких исключений или чего-то еще, только полное немедленное отключение. Меня сбивает с толку то, что задействованные объекты очень просты - это только что созданный пустой do c, и, следовательно, не содержит никаких «неприятных данных». (основные «разные» данные - это 3dView, который мы добавляем.)
Плагин revit, в котором он живет, содержит много строк ДРУГОГО кода, которые не демонстрируют это неприятное поведение. Так что меня удивляет, что в этом одном углу со злым поведением мы (по-видимому) на самом деле не делаем ничего дикого.
Два эксперимента, которые я рассматриваю, это
-
пропуск «добавить 3d вид», чтобы определить, является ли это причиной (проблема в том, что проблема не появляется постоянно, это может ничего не доказывать.)
'пузыриться '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;
}
}