#region Namespaces
using System;
using System.Collections.Generic;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.UI;
#endregion
namespace RevitTestAddin
{
/// <summary>
/// 2 тестовых сценария:
///
/// 1. Открыть существующий проект
/// -> Создать 2-3 любых объекта (я создавал балки)
/// -> Сохранить проект
/// -> Закрыть проект
/// -> Открыть проект
/// -> Все работает нормально
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
///
/// 2. Создать новый проект или открыть существующий
/// -> Сохранить проект как с изменением расположения
/// -> Создать 2-3 любых объекта
/// -> Сохранить проект
/// -> Закрыть проект
/// -> Открыть проект
/// -> Созданные объекты исчезли!!!
/// </summary>
class App : IExternalApplication
{
public static Guid Guid { get; private set; }
public static Schema Schema { get; private set; }
/// <summary>
/// Создание схемы для сохранения данных о объектах чертежа
/// </summary>
static App()
{
Guid = new Guid("d05893e6-c01e-44e9-8fbb-0d140a26015b");
SchemaBuilder schemaBuilder = new SchemaBuilder(Guid);
schemaBuilder.SetReadAccessLevel(AccessLevel.Public);
schemaBuilder.SetWriteAccessLevel(AccessLevel.Public);
schemaBuilder.AddArrayField("ObjectArr", typeof(ElementId));
schemaBuilder.SetSchemaName("ObjectsSchema");
Schema = schemaBuilder.Finish();
}
public Result OnStartup(UIControlledApplication a)
{
a.ControlledApplication.ApplicationInitialized += OnApplicationInitialized;
return Result.Succeeded;
}
void OnApplicationInitialized(object sender, ApplicationInitializedEventArgs e)
{
Application app = sender as Application;
//Подпись на события сохранения чертежа и сохранения с новым именем
//Оба обработчика событий запускают метод, который создает Entity по схеме, описанной выше
app.DocumentSaving += DocumentSaving_EventHandler;
app.DocumentSavingAs += DocumentSavingAs_EventHandler;
}
public static void DocumentSaving_EventHandler(object sender, DocumentSavingEventArgs e)
{
Document doc = e.Document;
SaveDocumentObjectIds(doc);
}
public static void DocumentSavingAs_EventHandler(object sender, DocumentSavingAsEventArgs e)
{
Document doc = e.Document;
SaveDocumentObjectIds(doc);
}
/// <summary>
/// Создание Entity
/// Запись всех id объектов документа в Entity
/// Запись Entity в ProjectInfo
/// </summary>
/// <param name="doc"></param>
private static void SaveDocumentObjectIds(Document doc)
{
if (!doc.IsFamilyDocument)
{
Entity entity = new Entity(Schema);
IList<ElementId> objectArr = new List<ElementId>();
FilteredElementCollector familyInstanceCollector = new FilteredElementCollector(doc);
familyInstanceCollector.OfClass(typeof(FamilyInstance));
foreach (Element elem in familyInstanceCollector)
{
objectArr.Add(elem.Id);
}
entity.Set("ObjectArr", objectArr);
if (entity.IsValid())
{
using (Transaction trans = new Transaction(doc))
{
trans.Start("SaveDataIntoDocument");
doc.ProjectInformation.SetEntity(entity);
trans.Commit();
}
}
}
}
public Result OnShutdown(UIControlledApplication a)
{
return Result.Succeeded;
}
}
}