21/07/2016
					Выгрузка и загрузка PDF-подложек
Следующий код показывает как выгрузить (загрузить) все PDF-подложки. Для того, чтобы они исчезли (появились) необходима регенерация всех вставок PDF в чертеже. Для получения всех PDF-вставок используется метод PdfDefinition.GetPersistentReactorIds.
Код - C#: [Выделить]
- using System;
 - using Autodesk.AutoCAD.Runtime;
 - using Autodesk.AutoCAD.ApplicationServices;
 - using Autodesk.AutoCAD.DatabaseServices;
 - using Autodesk.AutoCAD.Geometry;
 - using Autodesk.AutoCAD.EditorInput;
 - // This line is not mandatory, but improves loading performances
 - [assembly: CommandClass(typeof(PDFUnload.MyCommands))]
 - namespace PDFUnload
 - {
 - public class MyCommands
 - {
 - [CommandMethod("PdfUnload")]
 - static public void PdfUnload()
 - {
 - Document doc = Application.DocumentManager.MdiActiveDocument;
 - Database db = doc.Database;
 - Editor ed = doc.Editor;
 - using (Transaction Tx = db.TransactionManager.StartTransaction())
 - {
 - DBDictionary nod =
 - Tx.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;
 - string defDictKey = UnderlayDefinition.GetDictionaryKey(typeof(PdfDefinition));
 - if (!nod.Contains(defDictKey))
 - return;
 - DBDictionary pdfDict =
 - Tx.GetObject(nod.GetAt(defDictKey), OpenMode.ForWrite) as DBDictionary;
 - foreach (DBDictionaryEntry entry in pdfDict)
 - {
 - PdfDefinition entryObj =
 - Tx.GetObject(entry.Value, OpenMode.ForWrite) as PdfDefinition;
 - entryObj.Unload(); // Выгружаем PdfDefinition
 - ObjectIdCollection collection = entryObj.GetPersistentReactorIds();
 - foreach (ObjectId id in collection)
 - {
 - DBObject temObject = Tx.GetObject(id, OpenMode.ForRead);
 - if (temObject is PdfReference)
 - {
 - PdfReference pdfref = temObject as PdfReference;
 - //////////////////////////////////////////////////////////
 - // Чтобы не были видны выгруженные подложки
 - // мы выполняем их перерисовку.
 - //////////////////////////////////////////////////////////
 - // Внимание! Подложки остаются в чертеже, но невидимы
 - // Чтобы они стали видны, необходимо выполнить PdfReload
 - //////////////////////////////////////////////////////////
 - pdfref.UpgradeOpen();
 - pdfref.RecordGraphicsModified(true);
 - }
 - }
 - }
 - Tx.Commit();
 - }
 - }
 - [CommandMethod("PdfReload")]
 - static public void PdfReload()
 - {
 - Document doc = Application.DocumentManager.MdiActiveDocument;
 - Database db = doc.Database;
 - Editor ed = doc.Editor;
 - using (Transaction Tx = db.TransactionManager.StartTransaction())
 - {
 - DBDictionary nod =
 - Tx.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;
 - string defDictKey = UnderlayDefinition.GetDictionaryKey(typeof(PdfDefinition));
 - if (!nod.Contains(defDictKey))
 - return;
 - DBDictionary pdfDict =
 - Tx.GetObject(nod.GetAt(defDictKey), OpenMode.ForWrite) as DBDictionary;
 - foreach (DBDictionaryEntry entry in pdfDict)
 - {
 - PdfDefinition entryObj =
 - Tx.GetObject(entry.Value, OpenMode.ForWrite) as PdfDefinition;
 - entryObj.Load(null); // Загружаем подложки
 - ObjectIdCollection collection = entryObj.GetPersistentReactorIds();
 - foreach (ObjectId id in collection)
 - {
 - DBObject temObject = Tx.GetObject(id, OpenMode.ForRead);
 - if (temObject is PdfReference)
 - {
 - PdfReference pdfref = temObject as PdfReference;
 - //////////////////////////////////////////////////////////
 - // Чтобы были видны загруженные подложки
 - // мы выполняем их перерисовку.
 - //////////////////////////////////////////////////////////
 - pdfref.UpgradeOpen();
 - pdfref.RecordGraphicsModified(true);
 - }
 - }
 - }
 - Tx.Commit();
 - }
 - }
 - }
 - }
 
Видео: http://autode.sk/2axfW7G
На основе: http://adndevblog.typepad.com/autocad/2016/07/unload-all-the-pdf-underlay.html
                        
						Автор перевода: Александр Ривилис
						
Отредактировано 21.07.2016 в 16:09:29
				Обсуждение: http://adn-cis.org/forum/index.php?topic=7228
Опубликовано 21.07.2016Отредактировано 21.07.2016 в 16:09:29