20/09/2013
Изменение имени Растрового изображения
В поле «имя» в палитре свойств AutoCAD для Растрового изображения отображается имя из записи словаря, используемого для хранения RasterImageDef в словаре именованных объектов "ACAD_IMAGE_DICT". Чтобы изменить имя Растрового изображения мы создадим новый RasterImageDef и ассоциируем все существующие Растровые изображения с ним. Важно также отключить реакторы растрового изображения перед тем как RasterImageDef будет выгружен и удален.
Вот пример кода :
Код - C#: [Выделить]
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- PromptStringOptions pso1
- = new PromptStringOptions("\nВведите старое имя растрового изображения: ");
- pso1.AllowSpaces = true;
- PromptResult pr1 = ed.GetString(pso1);
- if (pr1.Status != PromptStatus.OK)
- return;
- String oldImageName = pr1.StringResult;
- PromptStringOptions pso2
- = new PromptStringOptions("\nВведите новое имя растрового изображения: ");
- pso2.AllowSpaces = true;
- PromptResult pr2 = ed.GetString(pso2);
- if (pr2.Status != PromptStatus.OK)
- return;
- String newImageName = pr2.StringResult;
- ObjectId oldridId = ObjectId.Null;
- ObjectId newridId = ObjectId.Null;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- ObjectId dictId = RasterImageDef.GetImageDictionary(db);
- if (! dictId.IsNull)
- {
- DBDictionary dict = tr.GetObject(
- dictId,
- OpenMode.ForRead
- ) as DBDictionary;
- if (dict.Contains(oldImageName))
- {
- // Шаг 1: Создаём новый RasterImageDef на основе старого
- // RasterImageDef
- oldridId = dict.GetAt(oldImageName);
- RasterImageDef oldrid = tr.GetObject(
- oldridId,
- OpenMode.ForWrite
- ) as RasterImageDef;
- RasterImageDef newrid = new RasterImageDef();
- newrid.SourceFileName = oldrid.SourceFileName;
- newrid.ActiveFileName = oldrid.ActiveFileName;
- newrid.Load();
- dict.UpgradeOpen();
- newridId = dict.SetAt(newImageName, newrid);
- tr.AddNewlyCreatedDBObject(newrid, true);
- // Шаг 2: Ассоциируем существующие растровые изображения
- // с новым RasterImageDef
- RasterImage.EnableReactors(true);
- BlockTable bt = tr.GetObject(
- db.BlockTableId,
- OpenMode.ForRead
- ) as BlockTable;
- foreach (ObjectId btrId in bt)
- {
- BlockTableRecord btr = tr.GetObject
- (
- btrId,
- OpenMode.ForRead
- ) as BlockTableRecord;
- foreach (ObjectId id in btr)
- {
- if (id.ObjectClass.IsDerivedFrom(
- RXClass.GetClass(typeof(RasterImage))))
- {
- RasterImage ri = tr.GetObject
- (
- id,
- OpenMode.ForRead
- ) as RasterImage;
- if (ri.ImageDefId.Equals(oldridId))
- {
- ri.UpgradeOpen();
- ri.AssociateRasterDef(newrid);
- ri.ImageDefId = newridId;
- }
- }
- }
- }
- // Шаг 3: Отключаем и удаляем старый RasterImageDef
- RasterImage.EnableReactors(false);
- oldrid.Unload(true);
- oldrid.Erase();
- }
- }
- tr.Commit();
- }
- // Обновляем внешние ссылки
- db.ResolveXrefs(false, false);
Источник: http://adndevblog.typepad.com/autocad/2013/07/changing-rasterimage-name.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=221
Опубликовано 20.09.2013