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

21/07/2016

Выгрузка и загрузка PDF-подложек

Следующий код показывает как выгрузить (загрузить) все PDF-подложки. Для того, чтобы они исчезли (появились) необходима регенерация всех вставок PDF в чертеже. Для получения всех PDF-вставок используется метод PdfDefinition.GetPersistentReactorIds.

Код - C#: [Выделить]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(PDFUnload.MyCommands))]
  10.  
  11. namespace PDFUnload
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("PdfUnload")]
  16.     static public void PdfUnload()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       Database db = doc.Database;
  20.       Editor ed = doc.Editor;
  21.  
  22.       using (Transaction Tx = db.TransactionManager.StartTransaction())
  23.       {
  24.         DBDictionary nod =
  25.           Tx.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;
  26.  
  27.         string defDictKey = UnderlayDefinition.GetDictionaryKey(typeof(PdfDefinition));
  28.  
  29.         if (!nod.Contains(defDictKey))
  30.           return;
  31.  
  32.         DBDictionary pdfDict =
  33.           Tx.GetObject(nod.GetAt(defDictKey), OpenMode.ForWrite) as DBDictionary;
  34.  
  35.         foreach (DBDictionaryEntry entry in pdfDict)
  36.         {
  37.           PdfDefinition entryObj =
  38.             Tx.GetObject(entry.Value, OpenMode.ForWrite) as PdfDefinition;
  39.  
  40.           entryObj.Unload(); // Выгружаем PdfDefinition
  41.  
  42.           ObjectIdCollection collection = entryObj.GetPersistentReactorIds();
  43.  
  44.           foreach (ObjectId id in collection)
  45.           {
  46.             DBObject temObject = Tx.GetObject(id, OpenMode.ForRead);
  47.  
  48.             if (temObject is PdfReference)
  49.             {
  50.               PdfReference pdfref = temObject as PdfReference;
  51.               //////////////////////////////////////////////////////////
  52.               // Чтобы не были видны выгруженные подложки
  53.               // мы выполняем их перерисовку.
  54.               //////////////////////////////////////////////////////////
  55.               // Внимание! Подложки остаются в чертеже, но невидимы
  56.               // Чтобы они стали видны, необходимо выполнить PdfReload
  57.               //////////////////////////////////////////////////////////
  58.               pdfref.UpgradeOpen();
  59.               pdfref.RecordGraphicsModified(true);
  60.             }
  61.           }
  62.         }
  63.         Tx.Commit();
  64.       }
  65.     }
  66.     [CommandMethod("PdfReload")]
  67.     static public void PdfReload()
  68.     {
  69.       Document doc = Application.DocumentManager.MdiActiveDocument;
  70.       Database db = doc.Database;
  71.       Editor ed = doc.Editor;
  72.  
  73.       using (Transaction Tx = db.TransactionManager.StartTransaction())
  74.       {
  75.         DBDictionary nod =
  76.           Tx.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;
  77.  
  78.         string defDictKey = UnderlayDefinition.GetDictionaryKey(typeof(PdfDefinition));
  79.  
  80.         if (!nod.Contains(defDictKey))
  81.           return;
  82.  
  83.         DBDictionary pdfDict =
  84.           Tx.GetObject(nod.GetAt(defDictKey),   OpenMode.ForWrite) as DBDictionary;
  85.  
  86.         foreach (DBDictionaryEntry entry in pdfDict)
  87.         {
  88.           PdfDefinition entryObj =
  89.             Tx.GetObject(entry.Value, OpenMode.ForWrite) as PdfDefinition;
  90.  
  91.           entryObj.Load(null); // Загружаем подложки
  92.  
  93.           ObjectIdCollection collection = entryObj.GetPersistentReactorIds();
  94.  
  95.           foreach (ObjectId id in collection)
  96.           {
  97.             DBObject temObject = Tx.GetObject(id, OpenMode.ForRead);
  98.  
  99.             if (temObject is PdfReference)
  100.             {
  101.               PdfReference pdfref = temObject as PdfReference;
  102.               //////////////////////////////////////////////////////////
  103.               // Чтобы были видны загруженные подложки
  104.               // мы выполняем их перерисовку.
  105.               //////////////////////////////////////////////////////////
  106.               pdfref.UpgradeOpen();
  107.               pdfref.RecordGraphicsModified(true);
  108.             }
  109.           }
  110.         }
  111.         Tx.Commit();
  112.       }
  113.     }
  114.   }
  115. }

 

Видео: http://autode.sk/2axfW7G

 

На основе: http://adndevblog.typepad.com/autocad/2016/07/unload-all-the-pdf-underlay.html

 

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

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

Опубликовано 21.07.2016
Отредактировано 21.07.2016 в 16:09:29