示例#1
0
        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());
        }