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

14/04/2015

Изменение путей к растрам в чертеже с абсолютных на относительные

Ниже показан пример кода, который позволяет изменить абсолютные пути к файлам растров на относительные пути (по отношению к пути к файлу чертежа). Те же пути к растрам, которые уже были относительными, остаются неизменными.

Код - C#: [Выделить]
  1. using  System.IO;
  2.  
  3.  Document doc
  4.  = Application.DocumentManager.MdiActiveDocument;
  5.  Editor ed = doc.Editor;
  6.  
  7.  string  dwgFilePath = null ;
  8.  dwgFilePath = @"D:\Temp\Test.dwg" ;
  9.  
  10.  using  (Database db = new  Database(false , true ))
  11.  {
  12.      db.ReadDwgFile(dwgFilePath,
  13.          FileOpenMode.OpenForReadAndWriteNoShare,
  14.          false , "" );
  15.  
  16.      using  (Transaction tr
  17.          = db.TransactionManager.StartTransaction())
  18.      {
  19.          DBDictionary nod = tr.GetObject(
  20.              db.NamedObjectsDictionaryId,
  21.              OpenMode.ForRead) as  DBDictionary;
  22.          ObjectId imageDictId = nod.GetAt("ACAD_IMAGE_DICT" );
  23.          DBDictionary imageDict
  24.              = tr.GetObject(imageDictId, OpenMode.ForRead)
  25.                  as  DBDictionary;
  26.  
  27.          foreach  (DBDictionaryEntry dbDictEntry in  imageDict)
  28.          {
  29.              RasterImageDef rasterImageDef = tr.GetObject(
  30.                  dbDictEntry.Value,
  31.                  OpenMode.ForWrite) as  RasterImageDef;
  32.  
  33.              ed.WriteMessage("{0} Старый путь : {1}" ,
  34.              Environment.NewLine, rasterImageDef.SourceFileName);
  35.  
  36.              try
  37.              {
  38.                  if  (File.Exists(rasterImageDef.SourceFileName))
  39.                  {
  40.                      dynamic dwgPathUri
  41.                              = new  Uri(dwgFilePath);
  42.                      dynamic rasterImagePathUri
  43.                          = new  Uri(rasterImageDef.SourceFileName);
  44.  
  45.                      // Делаем путь к растру относительным
  46.                      // к пути чертежа
  47.                      dynamic relativeRasterPathUri
  48.                          = dwgPathUri.MakeRelativeUri
  49.                                  (rasterImagePathUri);
  50.  
  51.                      // Устанавливаем путь как относительный
  52.                      rasterImageDef.SourceFileName
  53.                      = Uri.UnescapeDataString(
  54.                          relativeRasterPathUri.ToString());
  55.  
  56.                      ed.WriteMessage(
  57.                          "{0} Путь к растру изменен на: {1}" ,
  58.                          Environment.NewLine,
  59.                          rasterImageDef.SourceFileName);
  60.  
  61.                      // Перезагружаем растр в AutoCAD, чтобы обновить
  62.                      // активный путь к файлу
  63.                      rasterImageDef.Load();
  64.  
  65.                      // Проверяем нашли ли мы его
  66.                      ed.WriteMessage("{0} Растр найден по пути: {1}" ,
  67.                      Environment.NewLine,
  68.                      rasterImageDef.ActiveFileName);
  69.                  }
  70.              }
  71.              catch  (UriFormatException ex)
  72.              {
  73.                  // Можем проигнорировать это.
  74.                  // Если путь к растру уже был относительный,
  75.                  // то мы можем пропустить это исключение
  76.              }
  77.          }
  78.  
  79.          tr.Commit();
  80.      }
  81.  
  82.      db.SaveAs(db.OriginalFileName,
  83.              true ,
  84.              db.OriginalFileVersion,
  85.              db.SecurityParameters);
  86.  }

 

Источник: http://adndevblog.typepad.com/autocad/2015/04/changing-raster-image-paths-in-drawing-to-relative-paths.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2632

Опубликовано 14.04.2015
Отредактировано 14.04.2015 в 01:18:13