Проблема при печати различных форматов листа из пространства модели

Автор Тема: Проблема при печати различных форматов листа из пространства модели  (Прочитано 8062 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Доброго времени суток, столкнулся с проблемой печати различных форматов листов из пространства модели. Для примера использовал код, приведенный в качестве решения на
https://forums.autodesk.com/t5/net/batching-export-to-pdf-from-acad-problem-c/td-p/3562450. В итоге на том же форуме наткнулся на то, что приведенный код может работать только при условии, что форматы листов не меняются. Есть ли примеры, реализующие пакетную печать из пространства модели различных форматов листов на встроенный принтер DWG To PDF или может есть способ изменить существующий код, чтобы требуемые условия выполнялись?
PS: В данном коде ругается на неверные параметры plotinfo начиная со второго листа, но больше интересует вопрос, не по тупиковому пути ли пошел. Про приведение координат знаю, но пока хочется разобраться с логикой процесса. Спасибо.
Код - C# [Выбрать]
  1.         static void PlotBlockColToPDF()
  2.         {
  3.  
  4.             String PrinterName = "DWG To PDF.pc3";
  5.             String OutPath = "f:\\333.pdf";
  6.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  7.             Editor ed = doc.Editor;
  8.             Database db = doc.Database;
  9.             Transaction tr = db.TransactionManager.StartTransaction();
  10.             Object SysVarBackPlot = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("BACKGROUNDPLOT");
  11.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0);
  12.  
  13.             using (tr)
  14.             {
  15.                 List<Entity> sortedPolylines = PrintAll();
  16.                 int polylineCount = sortedPolylines.Count;
  17.                 if (polylineCount < 1) return;
  18.  
  19.                 if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  20.                 {
  21.                     PlotEngine pe = PlotFactory.CreatePublishEngine();
  22.                     using (pe)
  23.                     {
  24.                         PlotProgressDialog ppd = new PlotProgressDialog(false, sortedPolylines.Count, true);
  25.                         using (ppd)
  26.                         {
  27.                             int numSheet = 1;
  28.                             // Setting up the PlotProgress dialog
  29.                             ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress");
  30.                             ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job");
  31.                             ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet");
  32.                             ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress");
  33.                             ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress");
  34.                             ppd.LowerPlotProgressRange = 0;
  35.                             ppd.UpperPlotProgressRange = 100;
  36.                             ppd.PlotProgressPos = 0;
  37.                             ppd.OnBeginPlot();
  38.                             ppd.IsVisible = true;
  39.  
  40.                             pe.BeginPlot(ppd, null);
  41.  
  42.                             foreach (Entity ent in sortedPolylines)
  43.                             {
  44.                                 // Starting new page
  45.                                 ppd.StatusMsgString = "Plotting block " + numSheet.ToString() + " of " + sortedPolylines.Count.ToString();
  46.                                 ppd.OnBeginSheet();
  47.                                 ppd.LowerSheetProgressRange = 0;
  48.                                 ppd.UpperSheetProgressRange = 100;
  49.                                 ppd.SheetProgressPos = 0;
  50.  
  51.                                 PlotInfoValidator piv = new PlotInfoValidator();
  52.                                 piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
  53.                                 PlotPageInfo ppi = new PlotPageInfo();
  54.                                 PlotInfo pi = new PlotInfo();
  55.                                 // We'll be plotting the current layout
  56.                                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  57.                                 Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead);
  58.  
  59.                                 Autodesk.AutoCAD.DatabaseServices.Layout acadLayout = (Autodesk.AutoCAD.DatabaseServices.Layout)lo;
  60.  
  61.                                 // получаем координаты для печати
  62.                                 Polyline polyline = (Polyline)ent;
  63.                                 // Get the bounding box of the polyline
  64.                                 Extents3d extents = polyline.GeometricExtents;
  65.                                 Point3d minPoint = extents.MinPoint;
  66.                                 Point3d maxPoint = extents.MaxPoint;
  67.                                 //подставляем полученные точки превращая их в 2д
  68.                                 Point2d first = new Point2d(minPoint.X, minPoint.Y);
  69.                                 Point2d second = new Point2d(maxPoint.X, maxPoint.Y);
  70.                                 Extents2d window = new Extents2d(first, second);
  71.                                 //получаем название листа из его размеров
  72.                                 string Format_lista = GetFormatList(minPoint, maxPoint);
  73.                                 string canonocalName = GetCanonicalName(Format_lista);
  74.                                 String PaperSize = canonocalName;
  75.  
  76.                                 // Get a copy of the PlotSettings from the layout
  77.                                 PlotSettings ps = new PlotSettings(lo.ModelType);
  78.                                 pi.Layout = btr.LayoutId;
  79.                                 ps.CopyFrom(lo);
  80.  
  81.                                 // The PlotSettingsValidator helps create a valid PlotSettings object
  82.                                 PlotSettingsValidator psv = PlotSettingsValidator.Current;
  83.                                 psv.SetPlotWindowArea(ps, window);
  84.                                 psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
  85.                                 psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
  86.                                 psv.SetUseStandardScale(ps, true);
  87.                                 psv.SetStdScaleType(ps, StdScaleType.StdScale1To1);
  88.                                 psv.SetPlotCentered(ps, true);
  89.                                 psv.SetPlotConfigurationName(ps, PrinterName, PaperSize);
  90.                                 // поворачиваем лист при печати в альбомном формате
  91.                                 if (Format_lista.Contains("_goriz"))
  92.                                 {
  93.                                     psv.SetPlotRotation(ps, PlotRotation.Degrees090);
  94.                                 }
  95.                                 else if (Format_lista.Contains("_vert"))
  96.                                 {
  97.                                     psv.SetPlotRotation(ps, PlotRotation.Degrees000);
  98.                                 }
  99.  
  100.                                 pi.OverrideSettings = ps;
  101.                                 piv.Validate(pi);
  102.  
  103.                                 if (numSheet == 1) pe.BeginDocument(pi, doc.Name, null, 1, true, OutPath); // Create document for the first page
  104.  
  105.                                 // Plot the window
  106.                                 pe.BeginPage(ppi, pi, numSheet == sortedPolylines.Count, null);
  107.                                 pe.BeginGenerateGraphics(null);
  108.                                 ppd.SheetProgressPos = 50;
  109.                                 pe.EndGenerateGraphics(null);
  110.  
  111.                                 // Finish the sheet
  112.                                 pe.EndPage(null);
  113.                                 ppd.SheetProgressPos = 100;
  114.                                 ppd.PlotProgressPos += Convert.ToInt32(100 / sortedPolylines.Count);
  115.                                 ppd.OnEndSheet();
  116.                                 numSheet++;
  117.  
  118.                             }
  119.                             // Finish the document and finish the plot
  120.                             pe.EndDocument(null);
  121.                             ppd.PlotProgressPos = 100;
  122.                             ppd.OnEndPlot();
  123.                             pe.EndPlot(null);
  124.                             ed.WriteMessage("\nPlot completed successfully!\n\n");
  125.  
  126.                         }
  127.                     }
  128.                 }
  129.                 else
  130.                 {
  131.                     ed.WriteMessage("\nAnother plot is in progress.\n\n");
  132.                 }
  133.                 tr.Commit();
  134.             }
  135.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", SysVarBackPlot);
  136.         }
  137.  
« Последнее редактирование: 31-01-2023, 20:06:57 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
brainstorm,
Приветствую на форуме!
Напоминаю правило форматирования кода на нашем форуме!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Спасибо, учту в дальнейшем.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
У меня вот такая реализация. Но я предварительно настраиваю Layout. Данная реализация печатает А4, А3 форматы (тестил), в теории должна печатать любые форматы, которые настроены в Layout.
Код - C# [Выбрать]
  1. public sealed class BatchPlot
  2.     {
  3.         public BatchPlot()
  4.         {
  5.             const string sectionName = "General";
  6.             const string propertyName = "DisplayPlotBubble";
  7.             string productKeyName = HostApplicationServices.Current.UserRegistryProductRootKey;
  8.             string profileName = Application.GetSystemVariable("CPROFILE").ToString();
  9.             string keyName = string.Format(@"{0}\Profiles\{1}\{2}", productKeyName, profileName, sectionName);
  10.             using (RegistryKey genKey = Registry.CurrentUser.OpenSubKey(keyName, true))
  11.             {
  12.                 genKey.SetValue(propertyName, 0, RegistryValueKind.DWord);
  13.             }
  14.  
  15.             Document doc = Application.DocumentManager.MdiActiveDocument;
  16.             if (!doc.IsNamedDrawing)
  17.                 return;
  18.             Database db = doc.Database;
  19.             short bgPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT");
  20.             Application.SetSystemVariable("BACKGROUNDPLOT", 0);
  21.             List<ObjectId> layoutIds = new List<ObjectId>();
  22.             string dwgFileName = (string)Application.GetSystemVariable("DWGNAME");
  23.             string dwgPath = (string)Application.GetSystemVariable("DWGPREFIX");
  24.             NaturalComparer comparer = new NaturalComparer();
  25.             using (Transaction tr = db.TransactionManager.StartTransaction())
  26.             {
  27.                 try
  28.                 {
  29.                     DBDictionary layoutDic = tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead, false) as DBDictionary;
  30.                     foreach (DBDictionaryEntry entry in layoutDic)
  31.                         layoutIds.Add(entry.Value);
  32.                     DsdEntryCollection collection = new DsdEntryCollection();
  33.                     layoutIds = layoutIds.OrderBy(l => (tr.GetObject(l, OpenMode.ForRead) as Layout).LayoutName, comparer).ToList();
  34.                     foreach (ObjectId layoutId in layoutIds)
  35.                     {
  36.                         Layout layout = tr.GetObject(layoutId, OpenMode.ForRead) as Layout;
  37.                         if (layout.LayoutName != "Model")
  38.                         {
  39.                             DsdEntry entry = new DsdEntry
  40.                             {
  41.                                 DwgName = dwgPath + dwgFileName,
  42.                                 Layout = layout.LayoutName,
  43.                                 Title = $"{dwgFileName.Substring(0, dwgFileName.Length - 4)}-{layout.LayoutName}"
  44.                             };
  45.                             collection.Add(entry);
  46.                         }
  47.                     }
  48.                     dwgFileName = dwgFileName.Substring(0, dwgFileName.Length - 4);
  49.                     DsdData dsdData = new DsdData
  50.                     {
  51.                         SheetType = SheetType.MultiPdf,
  52.                         ProjectPath = dwgPath,
  53.                         PromptForDwfName = false,
  54.                         DestinationName = $"{dwgPath}{dwgFileName}.pdf"
  55.                     };
  56.                     dsdData.SetDsdEntryCollection(collection);
  57.                     PlotConfig plotConfig = PlotConfigManager.SetCurrentConfig("AutoCAD PDF (General Documentation).pc3");
  58.                     Publisher publisher = Application.Publisher;
  59.                     publisher.PublishExecute(dsdData, plotConfig);
  60.                     LayoutManager layMgr = LayoutManager.Current;
  61.                     layMgr.CurrentLayout = "Model";
  62.                     tr.Commit();
  63.                 }
  64.                 catch (System.Exception)
  65.                 {
  66.  
  67.                 }
  68.             }
  69.             Autodesk.AutoCAD.ApplicationServices.Core.Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot);
  70.             using (RegistryKey genKey = Registry.CurrentUser.OpenSubKey(keyName, true))
  71.             {
  72.                 genKey.SetValue(propertyName, 1, RegistryValueKind.DWord);
  73.             }
  74.         }
  75.     }

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Вспомнил, почему я сделал такую реализацию. AutoCAD когда-то получил класс Publisher для облегчения публикации, и поэтому меньше кода получается.

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Lemieux, спасибо, посмотрю как это можно использовать.

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Сделал для каждого элемента новую настройку печати в пространстве модели, но запутался с тем, как передать их на печать.
Настройки печати корректны и при добавлении руками в публикацию печать происходит без ошибок.
Подскажите пожалуйста, где в коде ошибка. Количество листов для публикации определяет верно, но не переносит их настройки печати.

Код - C# [Выбрать]
  1.         static void PlotToPDF()
  2.         {
  3.  
  4.             // получаем место и имя сохраненяемого файла печати
  5.             String fileName = GetSaveFilePath();
  6.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  7.             Editor ed = doc.Editor;
  8.             Database db = doc.Database;
  9.             Transaction tr = db.TransactionManager.StartTransaction();
  10.             Object SysVarBackPlot = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("BACKGROUNDPLOT");
  11.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0);
  12.             List<ObjectId> PSIds = new List<ObjectId>();
  13.             string dwgPath = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGPREFIX");
  14.             string dwgFileName = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGNAME");
  15.  
  16.  
  17.             using (tr)
  18.             {
  19.                 try
  20.                 {
  21.                     DBDictionary PSDic = tr.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForRead, false) as DBDictionary;
  22.                     foreach (DBDictionaryEntry entry in PSDic)
  23.                         PSIds.Add(entry.Value);
  24.                     DsdEntryCollection collection = new DsdEntryCollection();
  25.                     PSIds = PSIds.OrderBy(l => (tr.GetObject(l, OpenMode.ForRead) as PlotSettings).PlotSettingsName).ToList();
  26.  
  27.                     foreach (ObjectId PSId in PSIds)
  28.                     {
  29.                         PlotSettings PS = tr.GetObject(PSId, OpenMode.ForRead) as PlotSettings;
  30.  
  31.                         if (PS.PlotSettingsName != "Model")
  32.                         {
  33.                             DsdEntry entry = new DsdEntry
  34.                             {
  35.                                 DwgName = dwgPath + dwgFileName,
  36.                                 Layout = "Model",
  37.                                 Title = PS.PlotSettingsName
  38.                             };
  39.                             collection.Add(entry);
  40.                         }
  41.                     }
  42.                     dwgFileName = dwgFileName.Substring(0, dwgFileName.Length - 4);
  43.                     DsdData dsdData = new DsdData
  44.                     {
  45.                         SheetType = SheetType.MultiPdf,
  46.                         ProjectPath = dwgPath,
  47.                         PromptForDwfName = false,
  48.                         DestinationName = fileName
  49.                     };
  50.  
  51.                     dsdData.SetDsdEntryCollection(collection);
  52.                     PlotConfig plotConfig = PlotConfigManager.SetCurrentConfig("DWG To PDF.pc3");
  53.                     //   Publisher publisher = Autodesk.AutoCAD.ApplicationServices.Application.Publisher;
  54.                     Autodesk.AutoCAD.ApplicationServices.Application.Publisher.PublishExecute(dsdData, plotConfig);
  55.                     LayoutManager layMgr = LayoutManager.Current;
  56.                     layMgr.CurrentLayout = "Model";
  57.  
  58.  
  59.                     tr.Commit();
  60.                 }
  61.                 catch (System.Exception)
  62.                 {
  63.  
  64.                 }
  65.             }
  66.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", SysVarBackPlot);
  67.         }
  68.  
« Последнее редактирование: 05-02-2023, 16:38:31 от brainstorm »

Оффлайн doctorRAZ

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
  • Skype: doctorraz

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Сделал для каждого элемента новую настройку печати в пространстве модели, но запутался с тем, как передать их на печать.
Настройки печати корректны и при добавлении руками в публикацию печать происходит без ошибок.
Подскажите пожалуйста, где в коде ошибка. Количество листов для публикации определяет верно, но не переносит их настройки печати.

Если не разберёшься, то нужно будет выложить файл dwg для примера, что там настроено.

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Да в файлах нет ничего сверхъестественного, рамки на определенном слое, который учитывается для формирования списка листов для печати.
В приложении, файл после обработки командой внесения настроек для последующей печати.
PS: меня смущает тот факт, что в примерах использования Publisher присутствуют лейауты страниц, неужели нельзя обойтись без их создания, ведь настройки для печати сохранены и вполне съедаются автокадом при ручном выборе.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Да в файлах нет ничего сверхъестественного, рамки на определенном слое, который учитывается для формирования списка листов для печати.
В приложении, файл после обработки командой внесения настроек для последующей печати.
PS: меня смущает тот факт, что в примерах использования Publisher присутствуют лейауты страниц, неужели нельзя обойтись без их создания, ведь настройки для печати сохранены и вполне съедаются автокадом при ручном выборе.
Всё понятно, мой пример под Layout и Publisher вроде заточен под Layout.

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Добился того, чтобы происходила публикация файла, но происходит печать заданных вхождений без настроек. Добавил создание временного dsd файла и в нем видно, что настройки печати не передаются.

Код - C# [Выбрать]
  1.         static void PlotToPDF()
  2.         {
  3.  
  4.             // получаем место и имя сохраняемого файла печати
  5.             String fileName = GetSaveFilePath();
  6.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  7.             Editor ed = doc.Editor;
  8.             Database db = doc.Database;
  9.             Transaction tr = db.TransactionManager.StartTransaction();
  10.             Object SysVarBackPlot = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("BACKGROUNDPLOT");
  11.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0);
  12.             List<ObjectId> PSIds = new List<ObjectId>();
  13.             string dwgPath = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGPREFIX");
  14.             string dwgFileName = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGNAME");
  15.  
  16.  
  17.             using (tr)
  18.             {
  19.                 try
  20.                 {
  21.                     DBDictionary PSDic = tr.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForRead, false) as DBDictionary;
  22.                     foreach (DBDictionaryEntry entry in PSDic)
  23.                         PSIds.Add(entry.Value);
  24.                     DsdEntryCollection collection = new DsdEntryCollection();
  25.                     PSIds = PSIds.OrderBy(l => (tr.GetObject(l, OpenMode.ForRead) as PlotSettings).PlotSettingsName).ToList();
  26.  
  27.                     foreach (ObjectId PSId in PSIds)
  28.                     {
  29.                         PlotSettings PS = tr.GetObject(PSId, OpenMode.ForRead) as PlotSettings;
  30.  
  31.                         if (PS.PlotSettingsName != "Model")
  32.                         {
  33.                             DsdEntry entry = new DsdEntry
  34.                             {
  35.                                 DwgName = dwgPath + dwgFileName,
  36.                                 Layout = "Model",                    
  37.                                 Title = PS.PlotSettingsName,
  38.                                 NpsSourceDwg = dwgPath + dwgFileName,
  39.                                 Nps = PS.PlotSettingsName,
  40.                             };
  41.                             collection.Add(entry);
  42.                         }
  43.                     }
  44.                     dwgFileName = dwgFileName.Substring(0, dwgFileName.Length - 4);
  45.                     DsdData dsdData = new DsdData
  46.                     {
  47.                         SheetType = SheetType.MultiPdf,
  48.                         ProjectPath = dwgPath,                 //dwgPath,          ,dwgFileName,
  49.                         PromptForDwfName = false,
  50.                         DestinationName = fileName
  51.                     };
  52.  
  53.                      if (System.IO.File.Exists(dsdData.DestinationName))
  54.  
  55.                         System.IO.File.Delete(dsdData.DestinationName);
  56.  
  57.                     dsdData.SetDsdEntryCollection(collection);
  58.  
  59.                     string dsdFile = dsdData.ProjectPath + dwgFileName + ".dsd";
  60.  
  61.  
  62.                     //StreamReader/StreamWriter
  63.                     dsdData.WriteDsd(dsdFile);
  64.                     System.IO.StreamReader sr = new System.IO.StreamReader(dsdFile);
  65.                     string str = sr.ReadToEnd();
  66.                     sr.Close();
  67.                     str = str.Replace("PromptForDwfName=TRUE", "PromptForDwfName=FALSE");
  68.                     System.IO.StreamWriter sw = new System.IO.StreamWriter(dsdFile);
  69.                     sw.Write(str);
  70.                     sw.Close();
  71.                     dsdData.ReadDsd(dsdFile);
  72.                     System.IO.File.Delete(dsdFile);
  73.  
  74.  
  75.                     PlotConfig plotConfig = PlotConfigManager.SetCurrentConfig("DWG To PDF.pc3");
  76.                     //   Publisher publisher = Autodesk.AutoCAD.ApplicationServices.Application.Publisher;
  77.  
  78.                     Autodesk.AutoCAD.ApplicationServices.Application.Publisher.PublishExecute(dsdData, plotConfig);
  79.                     LayoutManager layMgr = LayoutManager.Current;
  80.                     layMgr.CurrentLayout = "Model";
  81.  
  82.  
  83.                     tr.Commit();
  84.                 }
  85.                 catch (System.Exception)
  86.                 {
  87.  
  88.                 }
  89.             }
  90.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", SysVarBackPlot);
  91.         }
  92.  

Оффлайн doctorRAZ

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
  • Skype: doctorraz
Возможно есть смысл перед печатью закрыть транзакцию?

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Похоже все-таки без создания Layout не обойтись (.

A PlotSettings object is similar to a Layout object, as both contain identical plot information and this is because the Layout class is derived from the PlotSettings class. The main difference is that a Layout object has an associated BlockTableRecord object containing the geometry to plot. A PlotSettings object is not associated with a particular BlockTableRecord object, but are stored in the PlotSettings dictionary in a drawing. PlotSettings objects are known as page setups in the AutoCAD user interface and are accessed from the Page Setup Manager. A page setup can be applied to a layout or used as a way to override the settings of a layout when plotting or publishing.

Или можно попробовать каждый из PlotSettings object по очереди перезаписывать к Layout модели и вносить в список для печати. Как думаете, сработает или при перезаписи предыдущие результаты потеряются? Хотя, копии же пространства модели в публикации с разными привязками настроек проходят.

PS: добавил ассоциацию с лейаутом модели для каждой настройки печати и... уперся в то, из-за чего создавал тему. Происходит перезапись настроек печати, хотя казалось бы в список для создания dsd передаются значения для каждого элемента списка. В итоге имею количество листов по количеству вхождений, но на всех из них лишь последний лист.
Прекращаю изобретать велосипед и буду сразу создавать лейауты с нужными настройками. Надеюсь их можно сделать невидимыми для пользователя ).
« Последнее редактирование: 06-02-2023, 18:18:29 от brainstorm »

Оффлайн brainstormАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
С "изобретением велосипеда", поторопился ).
В теме https://adn-cis.org/forum/index.php?topic=10371.0, наткнулся на несколько ссылок от Александра Ривилиса, среди которых была https://adndevblog.typepad.com/autocad/2013/10/publishing-model-views-to-a-multi-sheet-dwfpdf.html. Переписал под свои условия, но "отображение" кириллицы не могу победить (.
Уже и программно заменил текст на кириллицу, чтобы в файле dsd все отображалось корректно, но при скармливании его автокаду, в названии снова нечитаемые символы.
Видимо из-за них и не подхватывает настройки (сравнивал с файлом dsd, получаемым при сохранении в среде автокад). Хотя есть мысль, что стоит строки
IsSheetSet=FALSE поменять на TRUE и в пустой строке SheetSet Name= принудительно указать файл конфигурации.
На данный момент код выглядит так:
Код - C# [Выбрать]
  1.         static void PlotToPDF()
  2.         {
  3.  
  4.             // получаем место и имя сохраняемого файла печати
  5.             String fileName = GetSaveFilePath();
  6.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  7.             Editor ed = doc.Editor;
  8.             Database db = doc.Database;
  9.             Transaction tr = db.TransactionManager.StartTransaction();
  10.             Object SysVarBackPlot = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("BACKGROUNDPLOT");
  11.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0);
  12.             List<ObjectId> PSIds = new List<ObjectId>();
  13.             string dwgPath = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGPREFIX");
  14.             string dwgFileName = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGNAME");
  15.  
  16.             using (tr)
  17.             {
  18.                 try
  19.                 {
  20.                     DBDictionary PSDic = tr.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForRead, false) as DBDictionary;
  21.                     foreach (DBDictionaryEntry entry in PSDic)
  22.                         PSIds.Add(entry.Value);
  23.                     DsdEntryCollection collection = new DsdEntryCollection();
  24.                     PSIds = PSIds.OrderBy(l => (tr.GetObject(l, OpenMode.ForRead) as PlotSettings).PlotSettingsName).ToList();
  25.                     List<string> PS_Name = new List<string>();
  26.                     int numS = 1;
  27.                     foreach (ObjectId PSId in PSIds)
  28.                     {
  29.                         PlotSettings PS = tr.GetObject(PSId, OpenMode.ForRead) as PlotSettings;
  30.  
  31.                         PS_Name.Add(PS.PlotSettingsName);
  32.  
  33.                         // привязываем настройки печати к пространству модели
  34.                         AssignPageSetupToLayout(PS.PlotSettingsName);
  35.  
  36.                         if (PS.PlotSettingsName != "Model")
  37.                         {
  38.  
  39.                             string Title = dwgFileName.Substring(0, dwgFileName.Length - 4);
  40.  
  41.                             DsdEntry entry = new DsdEntry
  42.                             {
  43.                                 DwgName = dwgPath + dwgFileName,
  44.                                 Layout = "Model",                    
  45.                                 Title = Title + "-Stroka na zamenu-" + numS,                      
  46.                                 Nps = PS.PlotSettingsName,              
  47.                                 NpsSourceDwg = dwgPath + dwgFileName,
  48.                             };
  49.                             collection.Add(entry);
  50.                             numS++;
  51.                         }
  52.                     }
  53.                     dwgFileName = dwgFileName.Substring(0, dwgFileName.Length - 4);
  54.                     DsdData dsdData = new DsdData
  55.                     {
  56.                         SheetType = SheetType.MultiPdf,
  57.                         ProjectPath = dwgPath,              
  58.                         PromptForDwfName = false,
  59.                         DestinationName = fileName
  60.                     };
  61.  
  62.                      if (System.IO.File.Exists(dsdData.DestinationName))
  63.  
  64.                         System.IO.File.Delete(dsdData.DestinationName);
  65.  
  66.                     dsdData.SetDsdEntryCollection(collection);
  67.  
  68.                     string dsdFile = dsdData.ProjectPath + dwgFileName + ".dsd";
  69.  
  70.                     //StreamReader/StreamWriter
  71.                     dsdData.WriteDsd(dsdFile);
  72.                     System.IO.StreamReader sr = new System.IO.StreamReader(dsdFile);
  73.                     string str = sr.ReadToEnd();
  74.                     sr.Close();
  75.  
  76.  
  77.  
  78.                     // Replace PromptForDwfName
  79.  
  80.                     str = str.Replace("PromptForDwfName=TRUE", "PromptForDwfName=FALSE");
  81.  
  82.                     // меняем еще некоторые строки во входном dsd
  83.                     str = str.Replace("NoOfCopies=0", "NoOfCopies=1");
  84.                     str = str.Replace("PWD=", "PWD=" +"\n[PdfOptions]" + "\nIncludeHyperlinks = TRUE" +
  85.                         "\nCreateBookmarks = TRUE" + "\nCaptureFontsInDrawing = TRUE" +
  86.                         "\nConvertTextToGeometry = FALSE" + "\nVectorResolution = 1200" + "\nRasterResolution = 400");
  87.                     str = str.Replace("-Stroka na zamenu-", "-Модель-");
  88.  
  89.                     string SheetPatch = dsdData.ProjectPath + dwgFileName + ".dwg";
  90.                     str = str.Replace("OriginalSheetPath=", "OriginalSheetPath="+ SheetPatch);
  91.  
  92.                     // Workaround to have the page setup names included in the DSD file
  93.                     // Replace Setup names based on the created page setups
  94.                     // May not be required if Nps is output to the DSD
  95.  
  96.                     int occ = 0;
  97.                     int index = str.IndexOf("Setup=");
  98.                     int startIndex = 0;
  99.                     StringBuilder dsdText = new StringBuilder();
  100.                     while (index != -1)
  101.                     {
  102.                         // 6 for length of "Setup="
  103.                         String str1 = str.Substring(startIndex, index + 6 - startIndex);
  104.                         dsdText.Append(str1);
  105.                         dsdText.Append(String.Format("{0}{1}", PS_Name[occ], ""));
  106.                         startIndex = index + 6;
  107.                         index = str.IndexOf("Setup=", index + 6);
  108.                         if (index == -1)
  109.                         {
  110.                            dsdText.Append(str.Substring(startIndex, str.Length - startIndex));
  111.                         }
  112.                         occ++;
  113.                     }
  114.  
  115.                     System.IO.StreamWriter sw = new System.IO.StreamWriter(dsdFile);
  116.  
  117.                     sw.Write(dsdText.ToString());
  118.                     sw.Close();
  119.  
  120.                     dsdData.ReadDsd(dsdFile);
  121.                     System.IO.File.Delete(dsdFile);
  122.  
  123.  
  124.                     PlotConfig plotConfig = PlotConfigManager.SetCurrentConfig("DWG To PDF.pc3");
  125.  
  126.                     Autodesk.AutoCAD.ApplicationServices.Application.Publisher.PublishExecute(dsdData, plotConfig);
  127.                     LayoutManager layMgr = LayoutManager.Current;
  128.                     layMgr.CurrentLayout = "Model";
  129.  
  130.                     tr.Commit();
  131.                 }
  132.                 catch (System.Exception)
  133.                 {
  134.  
  135.                 }
  136.             }
  137.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", SysVarBackPlot);
  138.         }
  139.  
Приветствуются любые мысли о том, куда копать дальше. Пробовал и явно кодировку задавать, но StreamWriter по умолчанию в UTF-8 пишет, что вроде поддерживает кириллицу.
PS: на корявый код просьба не ругаться, я всего-лишь инженер, в программировании совсем новичок, в школе только на бейсике кружочки рисовали ).