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