Revit API. Как задать параметры печати?

Автор Тема: Revit API. Как задать параметры печати?  (Прочитано 8395 раз)

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Мне нужно напечатать лист (или набор листов) на принтере или в ПДФ, причем параметры печати должны вычислиться автоматически. Начал тыкать и установку нужного принтера разобрался как делать:

Код - C# [Выбрать]
  1. doc.PrintManager.SelectNewPrintDriver("PDF24 PDF");

Не могу понять как установить например размер бумаги? Где этот параметр считывается я нашел:

Код - C# [Выбрать]
  1. string name1 = doc.PrintManager.PrintSetup.CurrentPrintSetting.PrintParameters.PaperSize.Name.ToString();

Но как этот параметр установить нужный мне?
« Последнее редактирование: 31-10-2016, 11:40:44 от Виктор Чекалин »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Revit API. Как задать параметры печати?
« Ответ #1 : 31-10-2016, 11:47:48 »
oskokos,
добрый день. Евгений вот тут решил подобную задачу. Строки 50-54.

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Revit API. Как задать параметры печати?
« Ответ #2 : 03-11-2016, 12:51:39 »
Опирасясь на ту статью написал такой код:

Код - C# [Выбрать]
  1.      doc.PrintManager.SelectNewPrintDriver("PDF24 PDF");
  2.       PrintManager  myPM= doc.PrintManager;
  3.       PaperSizeSet myPSize = myPM.PaperSizes;
  4.      
  5.      
  6.               foreach (PaperSize PiS in myPSize)
  7. {
  8.                 if (PiS.Name=="A3")
  9.                 {doc.PrintManager.PrintSetup.CurrentPrintSetting.PrintParameters.PaperSize=PiS;
  10.                 TaskDialog.Show("1",PiS.Name);
  11.                 doc.PrintManager.PrintSetup.SaveAs("А3");
  12.                 doc.PrintManager.Apply();
  13.                         break; }  
  14. }

новый профиль с именем А3 создается, но в нем размер бумаги не меняется на А3. В каком месте я не так что сделал?
« Последнее редактирование: 03-11-2016, 13:26:29 от Виктор Чекалин »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Revit API. Как задать параметры печати?
« Ответ #3 : 14-11-2016, 16:34:37 »
oskokos, ничего не могу понять пока.. упростил код на сколько мог, но действительно размер не меняется.
Код - C# [Выбрать]
  1. public void PrintTest()
  2. {
  3.     var doc = ActiveUIDocument.Document;
  4.     try
  5.     {
  6.         using (var t = new Transaction(doc, "Print setup"))
  7.         {
  8.             doc.PrintManager.SelectNewPrintDriver("Canon MF210 Series");
  9.  
  10.             var ps = doc.PrintManager.PaperSizes.OfType<PaperSize>().FirstOrDefault(x => x.Name.Equals("A4"));
  11.  
  12.  
  13.  
  14.  
  15.             t.Start();
  16.             doc.PrintManager.PrintSetup.CurrentPrintSetting.PrintParameters.PaperSize = ps;
  17.             doc.PrintManager.PrintSetup.CurrentPrintSetting.PrintParameters.PageOrientation = PageOrientationType.Portrait;
  18.             var res = doc.PrintManager.PrintSetup.Save();
  19.  
  20.             t.Commit();
  21.  
  22.             TaskDialog.Show("1", ps.Name + "\r\n" + doc.PrintManager.PrintSetup.CurrentPrintSetting.PrintParameters.PaperSize.Name);
  23.  
  24.         }
  25.  
  26.     }
  27.     catch (Exception ex)
  28.     {
  29.         TaskDialog.Show("Error", ex.ToString());
  30.     }
  31. }
Все бы ничего, но в примере ViewPrinter размер бумаги прекрасно меняется. На первый взгляд я делаю то же самое, но видимо где-то подвох.
Еще покопаюсь поглубже

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Revit API. Как задать параметры печати?
« Ответ #4 : 17-11-2016, 08:12:22 »
новый профиль с именем А3 создается, но в нем размер бумаги не меняется на А3. В каком месте я не так что сделал?

Вы всё сделали правильно, только PDF-принтер об этом не знает :)

Все бы ничего, но в примере ViewPrinter размер бумаги прекрасно меняется. На первый взгляд я делаю то же самое, но видимо где-то подвох.
Еще покопаюсь поглубже

Коллеги, добрый день. Я хочу сразу извиниться перед вами (забыл как-то об этом рассказать в своих темах), но подвох ещё заключается в том, что данный формат должен присутствовать в самом PDF-принтере. И это ещё полбеды :) Управление изменением формата бумаги внутри PDF-принтера может управляться исключительно параметрами в реестре. Я так понимаю, что oskokos, занимается созданием модулем для печати листов в Revit-е на PDF принтер. Я его уже сделал. И потому знаю, о чём говорю. Я сделал печать на принтер PDFCreator. Не сомневаюсь, что для принтера PDF24 PDF будет та же самая картина. Только не уверен, что в реестре такие параметры лежат в одном месте. Они могут быть взаимозависимы и находиться в разных ветках. Этот вопрос требует изучения.



В теме, в которой есть решение по данному вопросу я, кстати, создавал спойлер, в котором вскользь упомянул об этом.
« Последнее редактирование: 17-11-2016, 09:09:00 от Пашин Евгений »

Оффлайн ivmax

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 3
Re: Revit API. Как задать параметры печати?
« Ответ #5 : 28-02-2018, 15:31:09 »
Добрый день!
Подскажите пожалуйста как программно установить галочку "Цветная печать" (см. рисунок 1), и при этом в Настройках печати (см. рисунок 2) параметр печати "Цвета" должен остаться "Черные линии".

рис. 1


рис. 2




Печать выполняю так:
Код - C# [Выбрать]
  1. void PrintSheet(Document doc, ViewSheet sheet, PrintSetting f)
  2.         {          
  3.             var printManager = doc.PrintManager;
  4.             ViewSet vs = new ViewSet();
  5.             vs.Insert(sheet);
  6.             printManager.PrintRange = Autodesk.Revit.DB.PrintRange.Select;
  7.             printManager.Apply();
  8.             var viewSheetSetting = printManager.ViewSheetSetting;
  9.             viewSheetSetting.CurrentViewSheetSet.Views = vs;
  10.             Transaction tr = new Transaction(doc);
  11.             tr.Start("TestPrint");
  12.             doc.PrintManager.PrintSetup.CurrentPrintSetting = f;
  13.             viewSheetSetting.SaveAs("tempSetName");            
  14.             printManager.Apply();
  15.             printManager.SubmitPrint();            
  16.             viewSheetSetting.Delete();
  17.             tr.Commit();
  18.         }

« Последнее редактирование: 28-02-2018, 16:17:29 от ivmax »

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Revit API. Как задать параметры печати?
« Ответ #6 : 28-02-2018, 18:51:06 »
Отвечу завтра. На самом деле задача предельна проста.
Подключиться к текущей настройке печати и настроить их ColorDepth (те самые чёрные линии) и HiddenLineViews (растровая или векторная печать)!



Код - C# [Выбрать]
  1. PrintManager PM = Doc.PrintManager;
  2. PM.PrintRange = PrintRange.Current;
  3. PM.Apply();
  4. PM.SelectNewDrivePrintDriver("Ваш виртуальный принтер");
  5. PM.Apply();
  6.  
  7. PrintSetup PS = PM.PrintSetup;
  8. IPrintSetting IPS = PS.CurrentPrintSetting;
  9. IPS.PrintParameters.ColorDepth = ColorDepthType.Color;
  10.  
  11. // Затем указываете все остальные параметры печати и сохраните настройку
  12.  
  13. PM.PrintSetup.SaveAs("Имя новой настройки");
  14. PM.Apply();
  15.  
  16. // ищем в базе проекта все настройки по имени и затем
  17. PM.SubmitPrint();

Приду завтра на работу и поточнее напишу.

В вашем случае это будет:
IPS.PrintParameters.ColorDepth = ColorDepthType.BlackLine
IPS.PrintParameters.HiddenLineViews = HiddenLineViewsType.RasterProcessing
« Последнее редактирование: 01-03-2018, 08:42:10 от Пашин Евгений »

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Revit API. Как задать параметры печати?
« Ответ #7 : 01-03-2018, 08:22:02 »
Проще сослаться на ссылку: http://adn-cis.org/forum/index.php?topic=4284.msg15977#msg15977, там моё решение по данному вопросу уже описано (добавить нечего).

Строка 35.

Действительно есть проблема отображения линий при векторной печати листов, поэтому есть необходимость невидимые линии печатать в растр.

Скринкаст, демонстрирующий данную проблему:


Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Revit API. Как задать параметры печати?
« Ответ #8 : 01-03-2018, 08:43:59 »
Подскажите пожалуйста как программно установить галочку "Цветная печать" (см. рисунок 1), и при этом в Настройках печати (см. рисунок 2) параметр печати "Цвета" должен остаться "Черные линии".

рис. 1


рис. 2



Я немного сконфужен. Вот что значит невнимательно читать сообщения :) Вы желаете установить цветную печать, но чтобы линии были чёрно-белыми?

У Вас на выбор есть три типа печати:
IPS.PrintParameters.ColorDepth = ColorDepthType.Color; // Цветные линии
IPS.PrintParameters.ColorDepth = ColorDepthType.GrayScale; // Оттенки серого
IPS.PrintParameters.ColorDepth = ColorDepthType.BlackLine; // Чёрные линии

Оффлайн ivmax

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 3
Re: Revit API. Как задать параметры печати?
« Ответ #9 : 01-03-2018, 09:55:17 »
Я немного сконфужен. Вот что значит невнимательно читать сообщения  Вы желаете установить цветную печать, но чтобы линии были чёрно-белыми?

Наверное я не полностью описал свою проблему.
Сейчас в пользовательском интерфейсе я делаю так:
1. Файл печать, выбираю листы, которые необходимо напечатать (кажется это ViewSet)
2. Устанавливаю уже существующий объект PrintSetting (например он называется "Adobe_PDF_A1_альбомная")
3. Захожу в свойства принтера (это был рисунок 1) и устанавливаю там флажок в "Цветная печать" на вкладке "Бумага и качество печати"
4. Затем нажимаю кнопку печать

Эти манипуляцию дают возможность делать элементы модели цветными (например арматура стен выделена цветом А, арматура плит -Б), но при печати все линии будут черно-белыми;
 а установка флажка "Цветная печать" (рис. 1) дает возможность напечатать цветной Логотип компании и подписи в цвете (подписи и логитип выполнены импортом из автокада) :)

как то так, надеюсь понятно описал

И теперь я хочу сделать все это программно. И получается все кроме установка флажка в "Цветная печать" в настройках принтера на вкладке "Бумага и качество печати"

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Revit API. Как задать параметры печати?
« Ответ #10 : 01-03-2018, 12:11:33 »
3. Захожу в свойства принтера (это был рисунок 1) и устанавливаю там флажок в "Цветная печать" на вкладке "Бумага и качество печати"

Хм... тут я вижу диалоговое окно Adobe PDF-принтера. Могу ошибаться, но возможно, этим флажком можно управлять через реестр. Надо проверить!!! Под рукой не имею Adobe PDF.
Если нет, то потребуется попробовать подключить его библиотеки в проект и поизучать их на предмет наличия в них нужного функционала. Однако это может быть чревато: вдруг эти библиотеки имеют другую версию NET Framework-а и не захотят собираться в единый проект библиотеки. Однако и даже в этом случае можно попробовать динамическое подключение библиотек, но увы, тут я не силён.

Как вариант, сменить PDF-принтер, если нужный функционал не будет найден.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Revit API. Как задать параметры печати?
« Ответ #11 : 01-03-2018, 14:15:48 »
ivmax
Боюсь, что это на .NET будет достаточно трудоёмко. Делаются такие вещи при помощи Spooler API: https://msdn.microsoft.com/en-us/library/windows/desktop/ff686807(v=vs.85).aspx
Еще чуть-чуть тут: http://www.pinvoke.net/default.aspx/winspool.documentproperties
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Re: Revit API. Как задать параметры печати?
« Ответ #12 : 06-03-2018, 11:18:09 »
IPS.PrintParameters.ColorDepth = ColorDepthType.Color;
 
// Затем указываете все остальные параметры печати и сохраните настройку
 
PM.PrintSetup.SaveAs("Имя новой настройки");

Добрый день подскажите пожалуйста а обязательно сохранять настройку?
А если хочется при данной настройке поменять только ColorDepthType и распечатать?
« Последнее редактирование: 06-03-2018, 12:28:34 от Ярослав »

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Revit API. Как задать параметры печати?
« Ответ #13 : 06-03-2018, 17:12:09 »
Добрый день подскажите пожалуйста а обязательно сохранять настройку?
А если хочется при данной настройке поменять только ColorDepthType и распечатать?

Рекомендую. Ведь настройку ещё затем нужно будет найти.
Ссылка на решение http://adn-cis.org/forum/index.php?topic=4284.msg15977#msg15977, строки 60-66.

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Re: Revit API. Как задать параметры печати?
« Ответ #14 : 07-03-2018, 10:19:39 »
Просто у меня есть уже настройка, но она для цветной печати, и для разных форматов бумаги а если еще учесть что в системе 5 принтеров с разной областью печати!?
Так вот для одного принтера я хочу просто при выводе на печать менять ColorDepthType.
Вот если в ручном режиме (с программы): мы можем выбрать настройку, что то в ней поменять, и потом запустить на печать не сохраняя. И програмно так же хочется...