Как удалить неиспользуемые и необработанные ссылки на данные (DataLink)?
Для необработанных ссылок на данные свойство IsValid всегда равно false. А вот с неиспользуемыми ссылками на данные несколько сложнее. Метод DataLink.GetTargets() возвращает коллекцию ObjectId объектов/примитивов, которые используют эту связь. Если таблица (Table) использовала связь, то её ObjectId содержится в коллекции DataLink.GetTargets(). Если эту таблицу стереть, то DataLink.GetTargets() не будет содержать ObjectId таблицы, а будет содержать ObjectId для объекта TableContent (это не примитив, т.е. не является наследником Entity). Таким образом, если DataLink.GetTargets() не содержит ObjectId ни одного примитива, то соответственно он не используется и его можно удалить. Следующий код это и показывает:
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- using AcRx = Autodesk.AutoCAD.Runtime;
- using AcAp = Autodesk.AutoCAD.ApplicationServices;
- using AcDb = Autodesk.AutoCAD.DatabaseServices;
- using AcGe = Autodesk.AutoCAD.Geometry;
- using AcEd = Autodesk.AutoCAD.EditorInput;
- [assembly: CommandClass(typeof(TestUnref.MyCommands))]
- namespace TestUnref
- {
- public class MyCommands
- {
- // Печать и удаление неиспользуемых/ненайденных
- // свзяей с данными (DataLink)
- [CommandMethod("RemoveUnusedDlink")]
- public void RemoveUnusedDlink()
- {
- AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
- AcDb.Database db = doc.Database;
- AcEd.Editor ed = doc.Editor;
- AcDb.ObjectIdCollection ids = new AcDb.ObjectIdCollection();
- // Имена DataLink
- ed.WriteMessage("\nНеиспользуемые/ненайденные связи с данными (DataLink): ");
- AcDb.ObjectId idLinkDict = db.DataLinkDictionaryId;
- if (!idLinkDict.IsNull) {
- using (AcDb.DBDictionary dLinkDict = db.DataLinkDictionaryId.Open(OpenMode.ForRead) as AcDb.DBDictionary) {
- foreach (AcDb.DBDictionaryEntry ent in dLinkDict) ids.Add(ent.Value);
- }
- foreach (AcDb.ObjectId id in ids) {
- using (AcDb.DataLink dLink = id.Open(OpenMode.ForRead) as AcDb.DataLink) {
- if (!dLink.IsValid) {
- ed.WriteMessage("\n\tНенайденая связь: Имя={0} Связь={1}", dLink.Name, dLink.ConnectionString);
- dLink.UpgradeOpen();
- dLink.Erase(); // Удаляем её
- } else {
- bool bIsFound = false;
- foreach (AcDb.ObjectId id_target in dLink.GetTargets()) {
- if (id_target.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(AcDb.Entity)))) {
- bIsFound = true;
- break;
- }
- if (!bIsFound) {
- ed.WriteMessage("\n\tНеиспользуемая связь: Имя={0} Связь={1}", dLink.Name, dLink.ConnectionString);
- dLink.UpgradeOpen();
- dLink.Erase(); // Удаляем её
- }
- }
- }
- }
- }
- }
- }
- }
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=953
Опубликовано 10.09.2014Отредактировано 11.09.2014 в 00:31:23