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

28/01/2016

Вставка определённой страницы PDF-файла в качестве подложки в чертеж.

На форме возник вопрос как можно вставить в dwg-файл конкретную страницу из pdf-файла. По умолчанию вставляется первая (или единственная) страница. Оказалось, что это сделать не сложно. Достаточно задать PdfDefinition.ItemName, указав строковое представление номера страницы. Немного переработанный код из http://adn-cis.org/kak-sozdat-pdf-podlozhku-sredstvami-autocad-net.html будет выглядеть так:

Код - 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(Rivilis.PDFUtils))]
  10.  
  11. namespace Rivilis
  12. {
  13.   public class PDFUtils
  14.   {
  15.     [CommandMethod("pdfInsert")]
  16.     static public void DoPdfInsert()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Database db = doc.Database;
  21.       Editor ed = doc.Editor;
  22.  
  23.       // Запрашиваем имя pdf-файла
  24.       PromptOpenFileOptions pfo = new PromptOpenFileOptions("Выберите pdf-файл: ");
  25.       pfo.Filter = "pdf-файлы (*.pdf)|*.pdf";
  26.       PromptFileNameResult pfr = ed.GetFileNameForOpen(pfo);
  27.       if (pfr.Status != PromptStatus.OK) return;
  28.  
  29.       // Запрашиваем номер страницы
  30.       PromptIntegerOptions pio = new PromptIntegerOptions("Укажите номер страницы ");
  31.       pio.AllowNegative = false;
  32.       pio.AllowZero = false;
  33.       pio.DefaultValue = 1;
  34.       pio.UseDefaultValue = true;
  35.       PromptIntegerResult pir = ed.GetInteger(pio);
  36.       if (pir.Status != PromptStatus.OK) return;
  37.  
  38.       PromptPointResult pr = ed.GetPoint("\nУкажите точку вставки: ");
  39.       if (pr.Status != PromptStatus.OK) return;
  40.  
  41.       using (Transaction t = doc.TransactionManager.StartTransaction()) {
  42.         DBDictionary nod =
  43.           (DBDictionary)t.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
  44.         string defDictKey =
  45.           UnderlayDefinition.GetDictionaryKey(typeof(PdfDefinition));
  46.  
  47.         if (!nod.Contains(defDictKey)) {
  48.           using (DBDictionary dict = new DBDictionary()) {
  49.             nod.SetAt(defDictKey, dict);
  50.             t.AddNewlyCreatedDBObject(dict, true);
  51.           }
  52.         }
  53.  
  54.         ObjectId idPdfDef = ObjectId.Null;
  55.  
  56.         DBDictionary pdfDict =
  57.           (DBDictionary)t.GetObject(nod.GetAt(defDictKey), OpenMode.ForWrite);
  58.  
  59.         using (PdfDefinition pdfDef = new PdfDefinition()) {
  60.           pdfDef.SourceFileName = pfr.StringResult; // Путь к pdf-файлу
  61.           pdfDef.ItemName = pir.Value.ToString(); // Номер страницы
  62.           // Проверка корректности номера страницы - идея Андрея Бушмана
  63.           if (!pdfDef.Loaded) {
  64.             ed.WriteMessage("Страницы {0} нет в этом pdf-файле.", pir.Value.ToString());
  65.             t.Commit();
  66.             return;
  67.           }
  68.           // Заменяем недопустимые символы
  69.           string name = ReplaceStrings(pfr.StringResult, @"\/ :.|", "______");
  70.           idPdfDef = pdfDict.SetAt(name + "_" + pdfDef.ItemName, pdfDef);
  71.           t.AddNewlyCreatedDBObject(pdfDef, true);
  72.         }
  73.  
  74.         BlockTable bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead);
  75.  
  76.         BlockTableRecord btr =
  77.           (BlockTableRecord)t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  78.  
  79.         using (PdfReference pdf = new PdfReference()) {
  80.           pdf.Position = pr.Value; // Точка вставки
  81.           // Здесь же можно задать и размеры (масштаб)
  82.           pdf.ScaleFactors = new Scale3d(1, 1, 1);
  83.           // и угол поворота и т.д.
  84.           pdf.Rotation = 0;
  85.           pdf.DefinitionId = idPdfDef;
  86.           btr.AppendEntity(pdf);
  87.           t.AddNewlyCreatedDBObject(pdf, true);
  88.         }
  89.         t.Commit();
  90.       }
  91.     }
  92.     static string ReplaceStrings(string str, string aOldChars, string aNewChars)
  93.     {
  94.       string RetStr = str;
  95.       if (aOldChars.Length != aNewChars.Length) return str;
  96.       for (int i = 0; i < aOldChars.Length; i++) {
  97.         RetStr = RetStr.Replace(aOldChars[i], aNewChars[i]);
  98.       }
  99.       return RetStr;
  100.     }
  101.   }
  102.  
  103. }


 

Ну и видео как это работает:

 

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

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

Опубликовано 28.01.2016
Отредактировано 29.01.2016 в 22:17:01