Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Ярослав от 26-02-2015, 20:28:30

Название: Ошибка в примере ViewPrinter из SDK
Отправлено: Ярослав от 26-02-2015, 20:28:30
Здравствуйте!
Подскажите пожалуйста, при тестировании надстройки ViewPrinter из SDK 2014(соответствует печати в Ревит), при попытке напечатать два и больше экземпляров печатается только один. Причем в локальных переменных значение свойства CopyNumber  равняется тому значению что задали в форме???
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Виктор Чекалин от 27-02-2015, 08:51:51
Ярослав,
Ошибку воспроизвести не удалось, так как задать значение копий можно только для физических принтеров, а у меня только виртуальные. Попробую позже, когда будет принтер под рукой.

Тем не менее, два вопроса к Вам:
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Ярослав от 27-02-2015, 10:02:02
Здравствуйте!
При печати стандартными средствами всё печатается!
В 2015 я запускал тот же пример (с 2014, так как похоже что примеры уже в 2012 версии VS) и такая же ошибка!
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Виктор Чекалин от 27-02-2015, 10:07:28
ОК, проверю видимо уже только завтра. Если ошибка повторится - скорее всего это баг. Отправлю запрос в поддержку.
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Ярослав от 27-02-2015, 12:35:23
Спасибо!
А у Вас нет примера реализующего печать?
С заданием количества копий?
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Виктор Чекалин от 27-02-2015, 12:48:36
Нет, примера нет.
Что Вам мешает создать такой пример? Он очень простой. Там использование всего лишь одного класса PrintManager
Или вот пример из файла справки:
Код - C# [Выбрать]
  1. private void CreateAndPrintViewSet(Document document, ViewSet viewSet)
  2. {
  3.     PrintManager printManager = document.PrintManager;
  4.     printManager.PrintRange = PrintRange.Select;
  5.     ViewSheetSetting viewSheetSetting = printManager.ViewSheetSetting;
  6.     viewSheetSetting.CurrentViewSheetSet.Views = viewSet;
  7.     viewSheetSetting.SaveAs("MyViewSet");
  8.     printManager.CombinedFile = true;
  9.     printManager.SubmitPrint();
  10. }
  11.  
Добавьте туда установку количества копий и тестируйте.
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Ярослав от 27-02-2015, 15:47:11
Беда!!!
Создал простенькую надстройку с:
Код - C# [Выбрать]
  1. private void CreateAndPrintViewSet(Document document, ViewSet viewSet)
  2.  
  3. {
  4.  
  5.     PrintManager printManager = document.PrintManager;
  6.  
  7.     printManager.PrintRange = PrintRange.Curent;
  8.  
  9.     printManager.CopyNumber = 2;
  10.  
  11.     printManager.SubmitPrint();
  12.  
  13. }
  14.  
  15.  
И при печати печатается только один экземпляр.
Неужели разработчики Ревита пользуются другими библиотеками???
Причем печатал на разных принтерах!
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Виктор Чекалин от 27-02-2015, 16:02:05
Ярослав,
В справке пометоду CopyNumberговорится следующее: Returns 0 if current printer does not support CopyNumber property.
The value of this property represents the global print setting property used for print operations on any document.
In order to make a change to this property, after setting it call the Apply() method, or one of the SubmitPrint() methods,
which save the local changes as modifications to the global print settings.
Т.е. принтер может не поддерживать печать нескольких копий (хотя лично мне кажется это странным). В этом случае, свойство CopyNumber возвращает 0. Посмотрите, чему равно значение этого свойства до присваивания значения и после.
Второе, на что нужно обратить внимание. После изменения свойства нужно выполнить метод Apply(). Добавьте его и проверьте реузльтат.
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Ярослав от 27-02-2015, 18:06:48
Добавил Apply() и ничего не получилось?!
Причем на трех разных принтерах.
Значение CopyNumber до операции Apply() 1 после 2.

Если через стандартную форму печати вбить 2 то это значение сохраняется и потом печатает 2.
Вот каким способом менять в стандартной форме значение???
Я так понимаю что это долен быть тот же PrintManager ?!?
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Виктор Чекалин от 28-02-2015, 15:26:21
Ярослав, попробовал. Действительно, свойство CopyNumber просто игнорируется.
Отправил запрос в поддержку Autodesk. Но думаю это действительно баг, причем не критичный, поэтому ожидать быстрого решения не стоит.
Пока можно применить альтернативный вариант и вызывать метод SubmitPrint несколько раз. Столько раз, сколько вам необходимо коий.
Например, вот так:
Код - C# [Выбрать]
  1.             printManager.CopyNumber = 2;
  2.             printManager.Apply();
  3.  
  4.             for (int i = 0; i < printManager.CopyNumber; i++)
  5.             {
  6.                 printManager.SubmitPrint();                
  7.             }
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Ярослав от 28-02-2015, 18:59:44
Спасибо за оперативность! Я пока так и решил эту проблему!
Только вот скорость печати на большом количестве листов в разы падает((((!!

Это что получается что разработчики пользуются другими библиотеками при создании Ревита???
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Виктор Чекалин от 02-03-2015, 10:08:35
Это что получается что разработчики пользуются другими библиотеками при создании Ревита???
И да и нет. Revit API является публичным API, с помощью которого стороние разработчики могут писать свои надстрройки. Публичный API является оберткой над тем кодом, что пишут и используют разработчики Revit. Но напрямую они вряд ли используют публичный API.

По теме. Запрос в поддержку передал. Проблема уже известна. А вот когда она будет исправлена - нет. Как я уже говорил, не думаю, что эта проблема будет стоять в приоритете. Баг не очень серьезный, и, прямо скажем, очень немногим нужен этот метод.
Название: Re: Ошибка в примере ViewPrinter из SDK
Отправлено: Ярослав от 02-03-2015, 14:52:10
Спасибо!
Будем ждать!