ADN Open CIS
Сообщество программистов Autodesk в СНГ

20/09/2013

Изменение имени Растрового изображения

В поле «имя» в палитре свойств AutoCAD для Растрового изображения отображается имя из записи словаря, используемого для хранения  RasterImageDef в словаре именованных объектов "ACAD_IMAGE_DICT". Чтобы изменить имя Растрового изображения мы создадим новый RasterImageDef и ассоциируем все существующие Растровые изображения с ним. Важно также отключить реакторы растрового изображения перед тем как RasterImageDef будет выгружен и удален.

Вот пример кода :

Код - C#: [Выделить]
  1. Document doc = Application.DocumentManager.MdiActiveDocument;
  2. Editor ed = doc.Editor;
  3. Database db = doc.Database;
  4.  
  5. PromptStringOptions pso1
  6.         = new PromptStringOptions("\nВведите старое имя растрового изображения: ");
  7. pso1.AllowSpaces = true;
  8. PromptResult pr1 = ed.GetString(pso1);
  9. if (pr1.Status != PromptStatus.OK)
  10.     return;
  11. String oldImageName = pr1.StringResult;
  12.  
  13. PromptStringOptions pso2
  14.         = new PromptStringOptions("\nВведите новое имя растрового изображения: ");
  15. pso2.AllowSpaces = true;
  16. PromptResult pr2 = ed.GetString(pso2);
  17. if (pr2.Status != PromptStatus.OK)
  18.     return;
  19. String newImageName = pr2.StringResult;
  20.  
  21. ObjectId oldridId = ObjectId.Null;
  22. ObjectId newridId = ObjectId.Null;
  23.  
  24. using (Transaction tr = db.TransactionManager.StartTransaction())
  25. {
  26.     ObjectId dictId = RasterImageDef.GetImageDictionary(db);
  27.     if (! dictId.IsNull)
  28.     {
  29.         DBDictionary dict = tr.GetObject(
  30.                                             dictId,
  31.                                             OpenMode.ForRead
  32.                                         ) as DBDictionary;
  33.         if (dict.Contains(oldImageName))
  34.         {
  35.             // Шаг 1: Создаём новый RasterImageDef на основе старого
  36.             // RasterImageDef
  37.             oldridId = dict.GetAt(oldImageName);
  38.             RasterImageDef oldrid = tr.GetObject(
  39.                                                     oldridId,
  40.                                                     OpenMode.ForWrite
  41.                                                 ) as RasterImageDef;
  42.             RasterImageDef newrid = new RasterImageDef();
  43.  
  44.             newrid.SourceFileName = oldrid.SourceFileName;
  45.             newrid.ActiveFileName = oldrid.ActiveFileName;
  46.             newrid.Load();
  47.             dict.UpgradeOpen();
  48.             newridId = dict.SetAt(newImageName, newrid);
  49.             tr.AddNewlyCreatedDBObject(newrid, true);
  50.  
  51.             // Шаг 2: Ассоциируем существующие растровые изображения
  52.             // с новым RasterImageDef
  53.             RasterImage.EnableReactors(true);
  54.  
  55.             BlockTable bt = tr.GetObject(
  56.                                             db.BlockTableId,
  57.                                             OpenMode.ForRead
  58.                                         ) as BlockTable;
  59.             foreach (ObjectId btrId in bt)
  60.             {
  61.                 BlockTableRecord btr = tr.GetObject
  62.                                         (
  63.                                             btrId,
  64.                                             OpenMode.ForRead
  65.                                         ) as BlockTableRecord;
  66.                 foreach (ObjectId id in btr)
  67.                 {
  68.                     if (id.ObjectClass.IsDerivedFrom(
  69.                         RXClass.GetClass(typeof(RasterImage))))
  70.                     {
  71.                         RasterImage ri = tr.GetObject
  72.                                             (
  73.                                                 id,
  74.                                                 OpenMode.ForRead
  75.                                             ) as RasterImage;
  76.                         if (ri.ImageDefId.Equals(oldridId))
  77.                         {
  78.                             ri.UpgradeOpen();
  79.                             ri.AssociateRasterDef(newrid);
  80.                             ri.ImageDefId = newridId;
  81.                         }
  82.                     }
  83.                 }
  84.             }
  85.  
  86.             // Шаг 3: Отключаем и удаляем старый RasterImageDef
  87.             RasterImage.EnableReactors(false);
  88.             oldrid.Unload(true);
  89.             oldrid.Erase();
  90.         }
  91.     }
  92.     tr.Commit();
  93. }
  94.  
  95. // Обновляем внешние ссылки
  96. 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