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

11/09/2013

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

Чтобы поменять пути к внешним ссылкам (XREF) из абсолютных в относительные нужно просто изменить строку BlockTableRecord.PathName так, чтобы она определяла относительный путь (или вообще без пути если мы полагаемся на то, что FindFile может найти наш Xref). Ниже приведен код, написанный Balaji в ответ на аналогичный вопрос от ADN-партнера:

Код - C#: [Выделить]
  1. [CommandMethod("ChangeXRefPath")]
  2. public void ChangeXRefPathMethod()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   Editor ed = doc.Editor;
  6.   ObjectIdCollection collection = new ObjectIdCollection();
  7.   using (Database db = new Database(false, true))
  8.   {
  9.     db.ReadDwgFile("c:\\Temp\\Test.dwg",
  10.                 FileOpenMode.OpenForReadAndWriteNoShare, false, "");
  11.     using (Transaction tr = db.TransactionManager.StartTransaction())
  12.     {
  13.       BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
  14.                                                         as BlockTable;
  15.       foreach (ObjectId btrId in bt)
  16.       {
  17.         BlockTableRecord btr = tr.GetObject(btrId, OpenMode.ForRead)
  18.                                                 as BlockTableRecord;
  19.         if (btr.IsFromExternalReference)
  20.         {
  21.           btr.UpgradeOpen();
  22.           String oldPath = btr.PathName;
  23.           String newPath = oldPath.Replace(@"C:\Temp", ".");
  24.           btr.PathName = newPath;
  25.           collection.Add(btrId);
  26.           ed.WriteMessage(String.Format("{0}Old Path : {1} New Path : {2}",
  27.             Environment.NewLine, oldPath, newPath));
  28.         }
  29.       }
  30.       tr.Commit();
  31.     }
  32.     if (collection.Count > 0)
  33.     {
  34.       // Выполняем обновление внешних ссылок
  35.       db.ReloadXrefs(collection);
  36.     }
  37.     db.SaveAs(db.OriginalFileName, true, db.OriginalFileVersion,
  38.                                             db.SecurityParameters);
  39.   }
  40. }

Код настолько прост по той причине, что мы предполагаем, что файл чертежа находится в каталоге c:\temp, а все внешние ссылки в его подкаталогах. Чертеж загружается в AutoCAD как внешняя база, что предполагает, что он не открыт в редакторе AutoCAD во время выполнения команды ChangeXRefPath.

Источник: http://adndevblog.typepad.com/autocad/2012/07/changing-xref-paths-from-absolute-to-relative.html

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

Опубликовано 11.09.2013