Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
ObjectId imageDict = RasterImageDef.GetImageDictionary(db);
if (imageDict == ObjectId.Null)
{
ed.WriteMessage("No images in the drawing.\n");
return;
}
RasterImage.EnableReactors(false);//Отключаем реакторы во избежание возможных проблем при изменении и удалении растровых вхождений
using (Transaction Tx = db.TransactionManager.StartTransaction())
{
DBDictionary ImageDic = (DBDictionary)Tx.GetObject(imageDict, OpenMode.ForWrite);
foreach (DBDictionaryEntry ImageDef in ImageDic)
{
//Получаем определение растрового изображения
RasterImageDef imageDef = (RasterImageDef)Tx.GetObject(ImageDef.Value, OpenMode.ForWrite);
//Посчитаем количество вхождений изображения
int ImageCount = 0;
ObjectIdCollection ids = imageDef.GetPersistentReactorIds();
foreach (ObjectId id in ids)
{
DBObject reactor = Tx.GetObject(id, OpenMode.ForRead);
string name = reactor.GetRXClass().DxfName;
if (string.Compare(name, "IMAGEDEF_REACTOR", true) == 0)
{
if (!reactor.OwnerId.IsErased)
{
DBObject obj = Tx.GetObject(reactor.OwnerId, OpenMode.ForRead);
if (obj is RasterImage) ImageCount++;
}
}
}
//Растровое изображение имеет статус "Не используется"
if (ImageCount == 0)
{
ed.WriteMessage(imageDef.SourceFileName + " : не используется.\n");
//удалить
imageDef.Unload(true);
imageDef.Erase();
continue;
}
//Растровое изображение имеет статус "Загружено"
if (imageDef.IsLoaded)
{
ed.WriteMessage(imageDef.ActiveFileName + " : загружено и имеет " + ImageCount + " вхождений.\n");
//Проверить пути и при необходимости изменить
}
else
{
//изображение может иметь статус "не найдено" или "выгружено"
if (imageDef.ActiveFileName.Length == 0)
{
ed.WriteMessage(imageDef.SourceFileName + " : не найдено" + "\n");
//Здесь будет поиск файла изображения в определенном каталоге и,
//в случае удачи, изменение imageDef.SourceFileName
}
else
{
ed.WriteMessage(imageDef.ActiveFileName + " : выгружено" + "\n");
imageDef.Erase();
}
}
}
Tx.Commit();
}
RasterImage.EnableReactors(true);//Включаем реакторы
db.ResolveXrefs(false, false);