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

ADN Club => AutoCAD .NET API => Тема начата: JohnJ от 26-09-2014, 11:14:57

Название: Поиск подходящего размера листа
Отправлено: JohnJ от 26-09-2014, 11:14:57
Добрый день. При определённых обстоятельствах мне требуется изменить размер листа. В Автокаде нет возможности сделать произвольный размер листа, только выбрать из возможных для текущего принтера размеров.
Поэтому я написал метод для изменения размера листа, но вот доступный мне вызов подбора подходящего листа через PlotSettingsValidator.SetClosestMediaName выдаёт не понятную мне ошибку eInvalidInput, хотя, вроде бы, данные переданы верно. Подскажите, что именно я передал не правильно?

Код - C# [Выбрать]
  1.        public void SetLayoutSize(Size need_layout_size, ObjectId layout_id, string printer_device_name) {
  2.             var doc = Application.DocumentManager.MdiActiveDocument;
  3.             using (doc.LockDocument()) {
  4.                 using (var tr = doc.TransactionManager.StartTransaction()) {
  5.                     using (var layout = tr.GetObject(layout_id, OpenMode.ForWrite) as Layout) {
  6.                         if (layout == null) throw new Exception("Не найден только что созданный лист");
  7.                         var psv = PlotSettingsValidator.Current;
  8.                         psv.SetPlotConfigurationName(layout, printer_device_name, null);
  9.                         psv.RefreshLists(layout);
  10. //                        psv.SetClosestMediaName(layout, need_layout_size.Width, need_layout_size.Height, PlotPaperUnit.Millimeters, true); // не понятно почему, но тут постоянно вываливается с ошибкой eInvalidInput, поэтому пришлось писать свою функцию взамен стандартной
  11.                         var media_name = GetClosestMediaName(psv.GetCanonicalMediaNameList(layout), printer_device_name, need_layout_size);
  12.                         if (media_name == "") {
  13.                             throw new Exception("Лист с подходящим размером найти не удалось");
  14.                         }
  15.                         psv.SetCanonicalMediaName(layout, media_name);
  16.  
  17.                         psv.SetPlotPaperUnits(layout, PlotPaperUnit.Millimeters);
  18.                         psv.SetPlotRotation(layout, PlotRotation.Degrees000);
  19.                         psv.SetPlotOrigin(layout, Point2d.Origin);
  20.                         psv.SetPlotWindowArea(layout, new Extents2d(0, 0, need_layout_size.Width, need_layout_size.Height));
  21.                         psv.SetPlotType(layout, PlotType.Window);
  22. //                    layout.PlotPaperMargins = new Extents2d(0, 0, 0, 0);
  23.                         if (!layout.TabSelected) {
  24.                             LayoutManager.Current.CurrentLayout = layout.LayoutName;
  25.                         }
  26.                     }
  27.                     tr.Commit();
  28.                 }
  29.             }
  30.         }

Примеры используемых мною размеров, которые передаются через need_layout_size: 420х297, 594x420
Принтер printer_device_name: "DWG To PDF.pc3"
Название: Re: Поиск подходящего размера листа
Отправлено: Александр Ривилис от 26-09-2014, 12:00:50
Привествую на форуме!
PlotSettingsValidator.SetClosestMediaName выдаёт не понятную мне ошибку eInvalidInput, хотя, вроде бы, данные переданы верно. Подскажите, что именно я передал не правильно?
Ибо как сказано в документации (см. в ObjectARX SDK):
Цитировать
This function is not implemented.
Т.е. функция не реализована. Почему возвращается eInvalidInput, а не NotImplementedYet - это я сказать не могу.

Название: Re: Поиск подходящего размера листа
Отправлено: Александр Ривилис от 26-09-2014, 12:02:37
Есть такой способ: http://adndevblog.typepad.com/autocad/2012/05/how-to-implement-plotsettingsvalidatorsetclosestmedianame-in-net.html
Название: Re: Поиск подходящего размера листа
Отправлено: JohnJ от 26-09-2014, 12:11:18
Интересная информация. Примерно таким же способом этот метод реализовал и я, только возможность поворота не предусмотрел. Основной его недостаток: медленно работает, пока переберёт все листы.
Спасибо!