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(); // Номер страницы
// Заменяем недопустимые символы
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;
}
}
}