Ошибка непечатаемых листов при публикации

Автор Тема: Ошибка непечатаемых листов при публикации  (Прочитано 8696 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Всем доброе утро/день/вечер!

Недавно начал работать в autocad и C# как таковом, так что сильно не бейте по голове...

1. Из пространства модели создаю листы

Код - C# [Выбрать]
  1. public void CreateLayout(Entity rounds, Template tmpl)
  2.             {
  3.                 if (rounds != null)
  4.                 {
  5.                     try
  6.                     {
  7.  
  8.                         using (DocumentLock lockdoc = acadApp.DocumentManager.MdiActiveDocument.LockDocument())
  9.                         {
  10.  
  11.                             using (Transaction tr = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
  12.                             {
  13.                                 Layout layout = new Layout();
  14.                                 LayoutManager lm = LayoutManager.Current;
  15.                                 PlotSettings ps = new PlotSettings(false);
  16.                                 string layoutName = "LIRPOCAD_" + (lm.LayoutCount + 1);
  17.                                 try
  18.                                 {
  19.                                     layout = (Layout)tr.GetObject(lm.CreateLayout(layoutName), OpenMode.ForWrite);
  20.                                    
  21.                                     using (PlotSettings acPlSet = new PlotSettings(layout.ModelType))
  22.                                     {
  23.                                         acPlSet.CopyFrom(layout);
  24.                                         // Update the PlotConfigurationName property of the PlotSettings object
  25.                                         PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  26.                                         acPlSetVdr.SetPlotConfigurationName(acPlSet, tmpl.plotter.plotterName, tmpl.canonic.mediaName);
  27.                                         if (rounds.Bounds.Value.MaxPoint.X - rounds.Bounds.Value.MinPoint.X < rounds.Bounds.Value.MaxPoint.Y - rounds.Bounds.Value.MinPoint.Y) {
  28.                                             acPlSetVdr.SetPlotRotation( acPlSet, PlotRotation.Degrees090 );
  29.                                         } else {
  30.                                             acPlSetVdr.SetPlotRotation( acPlSet, PlotRotation.Degrees000 );
  31.                                         }
  32.                                         // acPlSetVdr.SetPlotRotation( acPlSet, PlotRotation.Degrees000 );
  33.                                         // Zoom to show the whole paper
  34.                                         acPlSetVdr.SetZoomToPaperOnUpdate(acPlSet, true);
  35.  
  36.                                         // Update the layout
  37.                                         layout.UpgradeOpen();
  38.                                         layout.CopyFrom(acPlSet);
  39.                                     }
  40.  
  41.                                     lm.CurrentLayout = layout.LayoutName;
  42.                                     CreateViewport(layout, rounds, tr, tmpl);
  43.                                     tr.Commit();
  44.                                     this.layout.Add(layout);
  45.                                 }
  46.                                 catch (System.Exception ex)
  47.                                 {
  48.                                     throw new System.Exception(String.Format("Cannot create layout {0}\n{1}", layoutName, ex.Message));
  49.                                 }
  50.                             }
  51.                         }
  52.                     } catch ( Autodesk.AutoCAD.Runtime.Exception e )
  53.                     {
  54.                         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  55.                         ed.WriteMessage(e.Message);
  56.                     }
  57.                 }
  58.             }
  59.  
  60.             static void CreateViewport(Layout layout, Entity borders, Transaction tr, Template tmpl)
  61.             {
  62.                 int vpCount = layout.GetViewports().Count;
  63.                 if (vpCount == 0)
  64.                 {
  65.                     throw new System.Exception(String.Format("Layout {0} не инициализирован", layout.LayoutName));
  66.                 }
  67.                 Viewport vp;
  68.                 if (vpCount == 1)
  69.                 {
  70.                     BlockTableRecord lbtr = (BlockTableRecord)tr.GetObject(layout.BlockTableRecordId, OpenMode.ForWrite);
  71.                     vp = new Viewport();
  72.                     vp.SetDatabaseDefaults();
  73.                     lbtr.AppendEntity(vp);
  74.                     tr.AddNewlyCreatedDBObject(vp, true);
  75.                     vp.On = true;
  76.                 }
  77.                 else
  78.                 {
  79.                     ObjectId vpId = layout.GetViewports()[vpCount - 1];
  80.                     if (vpId.IsNull)
  81.                         throw new System.Exception("Не удалось получить вьюпорт!");
  82.  
  83.                     vp = (Viewport)tr.GetObject(vpId, OpenMode.ForWrite);
  84.                     if (vp == null)
  85.                         throw new System.Exception("Не удалось получить вьюпорт!");
  86.                 }
  87.                 double h = borders.Bounds.Value.MaxPoint.Y - borders.Bounds.Value.MinPoint.Y;
  88.                 double w = borders.Bounds.Value.MaxPoint.X - borders.Bounds.Value.MinPoint.X;
  89.                 double ScaleH = Convert.ToInt32(layout.CanonicalMediaName.Split('(')[1].Split('_')[0].Split('.')[0]);
  90.                 double ScaleW = Convert.ToInt32(layout.CanonicalMediaName.Split('(')[1].Split('_')[2].Split('.')[0]);
  91.                 // Высоту и ширину вьюпорта выставляем в размер выделенной области
  92.                 if ( h > w )
  93.                 {
  94.                     vp.Height = h * (ScaleH / h) - 2;
  95.                     vp.Width = w * (ScaleW / w) - 2;
  96.                 } else
  97.                 {
  98.                     vp.Height = w * (ScaleW / w) - 2;
  99.                     vp.Width = h * (ScaleH / h) - 2;
  100.                 }
  101.                
  102.                 // h * (297 / h)-2
  103.                 vp.CenterPoint = new Point3d((vp.Width / 2),
  104.                                              vp.Height / 2,
  105.                                              0);
  106.                 vp.ViewTarget = new Point3d(borders.Bounds.Value.MinPoint.X, borders.Bounds.Value.MinPoint.Y, 0);
  107.                 vp.ViewHeight = h;
  108.                 vp.ViewCenter = new Point2d(w / 2, h / 2);
  109.                 /* vp.Locked = LayoutsFromModel.Configuration.AppConfig.Instance.LockViewPorts; */
  110.             }
  111.  

2. Пытаюсь распечатать эти листы, используя класс multisheetPdf от Александра Ривилиса http://adn-cis.org/forum/index.php?topic=4305.msg16139#msg16139

3. При попытке печати, выпадает ошибка:


Мои рассуждения по поводу ошибки:
1. Эта же ошибка вылетает при попытке "скормить" скрипту "правильный" (т.е. созданный средствами публикация самого Autocad) DSD файл. Значит ошибка в формировании DSD отпадает
2. При публикации средствами Autocad и при исключении остальных листов - все нормально. Значит листы, можно сказать "правильные"
3. Третья ошибка и, на мой взгляд, самая вероятная - это неправильные настройки Publisher.
Какие настройки ковырять, как исключить лишние, ненужные листы (модель и Лист1, которые идут по умолчанию)

Если что не так - ткните пожалуйста
« Последнее редактирование: 18-04-2018, 10:50:30 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
2. Пытаюсь распечатать эти листы, используя класс multisheetPdf от Александра Ривилиса http://adn-cis.org/forum/index.php?topic=4305.msg16139#msg16139
Попытайся распечатать вручную (не программно) один из этих листов. Что происходит?

P.S.: Внимательно прочитай у меня в подписи как следует выполнять форматирование кода у нас на форуме и соблюдай это правило.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Попытайся распечатать вручную (не программно)

При ручной печати "значок автокада"-"публикация" - все идет нормально, отсюда я думаю, что сами листы должны быть правильно построены...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попытайся распечатать вручную (не программно)

При ручной печати "значок автокада"-"публикация" - все идет нормально, отсюда я думаю, что сами листы должны быть правильно построены...
Не понял. Я говорю про ручную печать сформированных твоей программой листов. Они (т.е. созданные твоей программой листы) печатаются или нет?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

DSD-файл формируется (отсутствуют секции MRU и TARGET). Дальше, при попытке автоматической печати - вылетает ошибка

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Из того что я вижу в твоём код вот это лишнее и может приводить к ошибкам:
Код - C# [Выбрать]
  1. layout.UpgradeOpen();
Он у тебя уже открыт на запись. Кроме того
Код - C# [Выбрать]
  1.  tr.Commit();
выполняется не всегда.
Вот это полный бред:
Код - C# [Выбрать]
  1. this.layout.Add(layout);
после того как выполнено
Код - C# [Выбрать]
  1.  tr.Commit();
layout закрывается и становится невалидным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
layout закрывается и становится невалидным

А вот за это большое спасибо! Я по простоте своей наивной, полагал, что там будет храниться "ссылка" на этот лист.

Код - C# [Выбрать]
layout.UpgradeOpen();
Он у тебя уже открыт на запись.

Этот фрагмент кода я нашел на просторах интернета. Честно говоря, я так и не понял, что делает этот метод.

Насчет коммита, вроде бы одно открытие транзакции и одно закрытие. Почему, по вашему, он не всегда выполняется?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Этот фрагмент кода я нашел на просторах интернета. Честно говоря, я так и не понял, что делает этот метод.
Этот метод переводит объект из состояния "для чтения" (OpenMode.ForRead) в состояние "для записи" (OpenMode.ForWrite). Так вот если объект уже открыт "для записи" (а у тебя он уже открыт OpenMode.ForWrite) возникает исключение.
Насчет коммита, вроде бы одно открытие транзакции и одно закрытие. Почему, по вашему, он не всегда выполняется
В случае если у тебя возникает исключение tr.Commit() не вызывается. Посмотри внимательно свой код.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Спасибо, Александр, за объяснения, завтра на работе попробую сделать "переделки" в коде.  :D

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

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Заметил интересную закономерность - печать не работает ТОЛЬКО с НОВЫМИ сгенерированными листами

Т.е. если открыть файл с готовыми листами, которые были созданы ранее - все нормально печатается.
если попробовать печатать ТОЛЬКО ЧТО созданные листы - появляется ошибка.

Что подскажете, господа?

P.S.: я думаю, что
1. эти листы не успели где-то записаться/сохраниться и поэтому возникает ошибка.
2. Когда происходит регенерация вьюпортов? может это потому что видовые экраны не кэшировались? как это сделать программно?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Т.е. если открыть файл с готовыми листами, которые были созданы ранее - все нормально печатается.
если попробовать печатать ТОЛЬКО ЧТО созданные листы - появляется ошибка.
Попробуй разделить транзакции - в одной создаёшь листы, в другой печатаешь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Попробуй разделить транзакции - в одной создаёшь листы, в другой печатаешь.

Они у меня и так в разных транзакция сидят.

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

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

Отмечено как Решение garmayev 23-04-2018, 06:50:12

Оффлайн Dombrovsky

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Доброго времени суток!
Столкнулся с такой же "ошибкой".  Причем, в Ас 2012 вылетал код, который в 2013м работал на ура.
Обратил внимание, что в 2013м  во время выполнения метода PublishDsd (либо PublishExecute) происходит сохранение документа.
В 2012м такого не наблюдалось.
Попробовал непосредственно перед вызовом PublishDsd, программно выполнить сохранение чертежа. Работает.
Возможно, это решение сработает и в Вашем случае (при условии корректности кода).

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

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Попробовал непосредственно перед вызовом PublishDsd, программно выполнить сохранение чертежа.

Да, как раз в этом и была проблема =) Выполнил программное сохранение чертежа и все сработало =)))