public static string Remover(Database database) { StringBuilder result = new StringBuilder(); ObjectIdCollection forPurge = new ObjectIdCollection(); int erase = 0; //using (DocumentLock dl = mdiActiveDocument.LockDocument()) //{ List <string> siberiaStylesUsed = new List <string>(); using (RegAppTable regAppTable = database.RegAppTableId.Open(OpenMode.ForRead) as RegAppTable) { if (regAppTable.Has(AppName)) { ObjectId regTablId = regAppTable[AppName]; using (RegAppTableRecord regAppTableRecord = regTablId.Open(OpenMode.ForWrite) as RegAppTableRecord) { if (regAppTableRecord != null) { //Получаем список объектов Siberia ObjectIdCollection m_hardPointerIds = new ReferencedBy(database, regTablId).m_hardPointerIds; if (m_hardPointerIds.Count == 0) { result.AppendLine("Чистим таблицу приложений от " + AppName); regAppTableRecord.Erase(); forPurge.Add(regTablId); erase++; } else { foreach (ObjectId id in m_hardPointerIds) { using (DBObject obj = id.Open(OpenMode.ForRead) as DBObject) { //Ищем используемые стили string json = obj.GetXData(); if (!string.IsNullOrEmpty(json) && !siberiaStylesUsed.Contains(json)) { siberiaStylesUsed.Add(json); } } } } //erased.Add(regTablId); } } } } using (DBDictionary dBDictionary = database.NamedObjectsDictionaryId.Open(OpenMode.ForWrite) as DBDictionary) { if (dBDictionary.Contains(AppName)) { result.AppendLine($"Чистим NOD от {AppName}"); ObjectId SiberiaDicId = (ObjectId)dBDictionary[AppName]; using (DBDictionary SiberiaDic = SiberiaDicId.Open(OpenMode.ForWrite) as DBDictionary) { foreach (DBDictionaryEntry id in SiberiaDic) { int dicCount = 0; using (DBDictionary SiberiaDic0 = id.Value.Open(OpenMode.ForWrite) as DBDictionary) { foreach (DBDictionaryEntry idd in SiberiaDic0) { if (!siberiaStylesUsed.Contains(idd.Key)) { //Удаляем только то, на что нет ссылок в объектах в зарегестрированных приложениях SiberiaDic0.Remove(idd.Value); forPurge.Add(idd.Value); erase++; } } dicCount = SiberiaDic0.Count; } if (dicCount == 0) { SiberiaDic.Remove(id.Value); erase++; } } } } } result.AppendLine($"Удалено {erase} записей"); database.Purge(forPurge); //Правим ошибки с выводом в консоль #if (!ACAD2014) //result.AppendLine($"Проводим аудит файла"); database.Audit(true, false); #else result.AppendLine($"Поведите очистку и аудит файла!!!"); #endif //} return(result.ToString()); }