28/01/2016
Вставка определённой страницы PDF-файла в качестве подложки в чертеж.
На форме возник вопрос как можно вставить в dwg-файл конкретную страницу из pdf-файла. По умолчанию вставляется первая (или единственная) страница. Оказалось, что это сделать не сложно. Достаточно задать PdfDefinition.ItemName, указав строковое представление номера страницы. Немного переработанный код из http://adn-cis.org/kak-sozdat-pdf-podlozhku-sredstvami-autocad-net.html будет выглядеть так:
Код - 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(Rivilis.PDFUtils))]
- namespace Rivilis
- {
- public class PDFUtils
- {
- [CommandMethod("pdfInsert")]
- static public void DoPdfInsert()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- // Запрашиваем имя pdf-файла
- PromptOpenFileOptions pfo = new PromptOpenFileOptions("Выберите pdf-файл: ");
- pfo.Filter = "pdf-файлы (*.pdf)|*.pdf";
- PromptFileNameResult pfr = ed.GetFileNameForOpen(pfo);
- if (pfr.Status != PromptStatus.OK) return;
- // Запрашиваем номер страницы
- PromptIntegerOptions pio = new PromptIntegerOptions("Укажите номер страницы ");
- pio.AllowNegative = false;
- pio.AllowZero = false;
- pio.DefaultValue = 1;
- pio.UseDefaultValue = true;
- PromptIntegerResult pir = ed.GetInteger(pio);
- if (pir.Status != PromptStatus.OK) return;
- PromptPointResult pr = ed.GetPoint("\nУкажите точку вставки: ");
- if (pr.Status != PromptStatus.OK) return;
- using (Transaction t = doc.TransactionManager.StartTransaction()) {
- DBDictionary nod =
- (DBDictionary)t.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
- string defDictKey =
- UnderlayDefinition.GetDictionaryKey(typeof(PdfDefinition));
- if (!nod.Contains(defDictKey)) {
- using (DBDictionary dict = new DBDictionary()) {
- nod.SetAt(defDictKey, dict);
- t.AddNewlyCreatedDBObject(dict, true);
- }
- }
- ObjectId idPdfDef = ObjectId.Null;
- DBDictionary pdfDict =
- (DBDictionary)t.GetObject(nod.GetAt(defDictKey), OpenMode.ForWrite);
- using (PdfDefinition pdfDef = new PdfDefinition()) {
- pdfDef.SourceFileName = pfr.StringResult; // Путь к pdf-файлу
- pdfDef.ItemName = pir.Value.ToString(); // Номер страницы
- // Проверка корректности номера страницы - идея Андрея Бушмана
- if (!pdfDef.Loaded) {
- ed.WriteMessage("Страницы {0} нет в этом pdf-файле.", pir.Value.ToString());
- t.Commit();
- return;
- }
- // Заменяем недопустимые символы
- string name = ReplaceStrings(pfr.StringResult, @"\/ :.|", "______");
- idPdfDef = pdfDict.SetAt(name + "_" + pdfDef.ItemName, pdfDef);
- t.AddNewlyCreatedDBObject(pdfDef, true);
- }
- BlockTable bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead);
- BlockTableRecord btr =
- (BlockTableRecord)t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
- using (PdfReference pdf = new PdfReference()) {
- pdf.Position = pr.Value; // Точка вставки
- // Здесь же можно задать и размеры (масштаб)
- pdf.ScaleFactors = new Scale3d(1, 1, 1);
- // и угол поворота и т.д.
- pdf.Rotation = 0;
- pdf.DefinitionId = idPdfDef;
- btr.AppendEntity(pdf);
- t.AddNewlyCreatedDBObject(pdf, true);
- }
- t.Commit();
- }
- }
- static string ReplaceStrings(string str, string aOldChars, string aNewChars)
- {
- string RetStr = str;
- if (aOldChars.Length != aNewChars.Length) return str;
- for (int i = 0; i < aOldChars.Length; i++) {
- RetStr = RetStr.Replace(aOldChars[i], aNewChars[i]);
- }
- return RetStr;
- }
- }
- }
Ну и видео как это работает:
Автор: Александр Ривилис
Отредактировано 29.01.2016 в 22:17:01
Обсуждение: http://adn-cis.org/forum/index.php?topic=3379
Опубликовано 28.01.2016Отредактировано 29.01.2016 в 22:17:01