Печать Layout по его имени из модели или другого листа.

Автор Тема: Печать Layout по его имени из модели или другого листа.  (Прочитано 4854 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Добрый день.  Код печатает, находясь в текущем листе, из другого - eLayoutNotCurrent. Есть вариант печати по имени из другого пространства?
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using System.IO;
  7. using Autodesk.AutoCAD.PlottingServices;
  8.  
  9. namespace ClassTest
  10. {
  11.     public class ClassTest
  12.     {
  13.         [CommandMethod("PAVPLOT")]
  14.         public void PAVPLOT()
  15.         {
  16.             Document doc = Application.DocumentManager.MdiActiveDocument;
  17.             Editor ed = doc.Editor;
  18.             Database db = doc.Database;
  19.  
  20.             string path = Path.GetDirectoryName(doc.Name);
  21.             string name = Path.GetFileNameWithoutExtension(doc.Name);
  22.  
  23.             // LayoutManager acLayoutMgr = acLayoutMgr = LayoutManager.Current;
  24.  
  25.  
  26.             using (Transaction acTrans = db.TransactionManager.StartTransaction())
  27.             {
  28.                 DBDictionary dbl = acTrans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
  29.  
  30.                 //  Layout acLayout = acTrans.GetObject(acLayoutMgr.GetLayoutId("1"), OpenMode.ForRead) as Layout;
  31.                 Layout acLayout = acTrans.GetObject(dbl.GetAt("1"), OpenMode.ForRead) as Layout;
  32.  
  33.                 // Get the PlotInfo from the layout
  34.                 PlotInfo acPlInfo = new PlotInfo();
  35.                 acPlInfo.Layout = acLayout.ObjectId;
  36.  
  37.                 //PlotSettings acPlSet = new PlotSettings(acLayout.ModelType);
  38.                 //acPlSet.CopyFrom(acLayout);
  39.                 //PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  40.  
  41.                 //acLayout.UpgradeOpen();
  42.                 //acLayout.CopyFrom(acPlSet);
  43.  
  44.                 // Validate the plot info
  45.                 PlotInfoValidator acPlInfoVdr = new PlotInfoValidator();
  46.  
  47.                 acPlInfoVdr.Validate(acPlInfo);
  48.  
  49.                 if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  50.                 {
  51.                     using (PlotEngine acPlEng = PlotFactory.CreatePublishEngine())
  52.                     {
  53.                         acPlEng.BeginPlot(null, null);
  54.                         // Define the plot output
  55.                         acPlEng.BeginDocument(acPlInfo,
  56.                             doc.Name,
  57.                             null,
  58.                             1,
  59.                             true,
  60.                             path + @"\" + name + "_" + acLayout.LayoutName);
  61.  
  62.                         // Plot the first sheet/layout
  63.                         PlotPageInfo acPlPageInfo = new PlotPageInfo();
  64.  
  65.                         acPlEng.BeginPage(acPlPageInfo,
  66.                         acPlInfo,
  67.                         true,
  68.                         null);
  69.                         acPlEng.BeginGenerateGraphics(null);
  70.                         acPlEng.EndGenerateGraphics(null);
  71.                         // Finish plotting the sheet/layout
  72.                         acPlEng.EndPage(null);
  73.  
  74.                         // Finish plotting the document
  75.                         acPlEng.EndDocument(null);
  76.                         // Finish the plot
  77.  
  78.                         acPlEng.EndPlot(null);
  79.  
  80.                     }
  81.  
  82.                 }
  83.  
  84.                 acTrans.Commit();
  85.             }
  86.         }
  87.     }
  88. }
  89.  
  90.  
  91.  
  92.  

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Это имеете ввиду:  acLayoutMgr.CurrentLayout="1"?
Без переключений никак?

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это имеете ввиду:  acLayoutMgr.CurrentLayout="1"?
Без переключений никак?
Или:
Код - C# [Выбрать]
  1. LayoutManager.Current.SetCurrentLayoutId(acLayout.ObjectId);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
SetCurrentLayoutId только в 2016 появился (дома 2013), я так понимаю он тоже физически переключает на вкладку с именем?

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
SetCurrentLayoutId только в 2016 появился (дома 2013), я так понимаю он тоже физически переключает на вкладку с именем?
Да. Метод PlotEngine.BeginPage работает только с текущим листом:
Цитировать
Returns Acad::eLayoutNotCurrent if the layout referenced by the AcPlPlotInfo object is not the current layout in the AutoCAD editor.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
С этим ясно.
А существуют другие методы печати?

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А существуют другие методы печати?
В конечном итоге это всё сводится к этому же методу. А в чем проблема?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Увеличивается время печати, переключаясь с вкладки на вкладку.

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можешь попробовать метод Publisher.PublishDsd, но насколько я помню переключение между листами происходит в любом случае.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Раз переключения неизбежны, примем как данность. Спасибо большое за ответы.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Что-то смутно припоминаю, что была какая-то возможность печати в бекграунде. Вроде даже у Кина Волмсли был пример. Сейчас времени нет даже погуглить  :(. Попробуйте поискать в этом направлении.

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин,
LayoutManager.SetCurrentLayoutId  работает даже с базой, которая не загружена в редактор AutoCAD, но установлена текущей. Так что возможны варианты.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Что-то смутно припоминаю, что была какая-то возможность печати в бекграунде. Вроде даже у Кина Волмсли был пример. Сейчас времени нет даже погуглить  :(. Попробуйте поискать в этом направлении.

Посмотрел по диагонали блог Kean Walmsley. Там везде BeginPage. (Может не нашел).

Дмитрий Загорулькин,
LayoutManager.SetCurrentLayoutId  работает даже с базой, которая не загружена в редактор AutoCAD, но установлена текущей. Так что возможны варианты.

Остановился на печати из консоли. Так побыстрей получается.