Не печатает на принтере из модели

Автор Тема: Не печатает на принтере из модели  (Прочитано 12612 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
Сделал печать некоторых листов из модели - в основном работает, но вот попался файл, из которого не печатается.
Вот функция для печати PrintLayout. Я передаю в неё заранее сформированные настройки печати. Так же в данном случае передаётся id Модели и название листа Модели. Вызываю так: PrintLayout(ps, layout.ObjectId, layout.LayoutName);
Код - C# [Выбрать]
  1. public void PrintLayout(PlotSettings plot_settings, ObjectId layout_id, string layout_name, string filename = "") {
  2.             var bg_plot = Application.GetSystemVariable("BACKGROUNDPLOT");
  3.             try {
  4.                 Application.SetSystemVariable("BACKGROUNDPLOT", 0);
  5.  
  6.                 if (PlotFactory.ProcessPlotState != ProcessPlotState.NotPlotting) throw new Exception("Плоттер в данный момент занят");
  7.                 using (var plot_info = new PlotInfo {Layout = layout_id}) {
  8.                     plot_info.OverrideSettings = plot_settings;
  9.                     Print(layout_name, plot_info, filename);
  10.                 }
  11.  
  12.             } finally {
  13.                 Application.SetSystemVariable("BACKGROUNDPLOT", bg_plot);
  14.             }
  15.         }
  16.  
  17.         protected void Print(string layout_name, PlotInfo plot_info, string filename) {
  18.             using (var plot_info_validator = new PlotInfoValidator {MediaMatchingPolicy = MatchingPolicy.MatchEnabled}) {
  19.                 plot_info_validator.Validate(plot_info);
  20.             }
  21.             using (var plot_engine = PlotFactory.CreatePublishEngine()) {
  22.                 using (var plot_dialog = new PlotProgressDialog(false, 1, true)) {
  23.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Печать листа");
  24.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.SheetName, String.Format(" Печатается лист : {0}", layout_name));
  25.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Отмена печати");
  26.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Выполнение печати:");
  27.  
  28.                     plot_dialog.LowerPlotProgressRange = 0;
  29.                     plot_dialog.UpperPlotProgressRange = 100;
  30.                     plot_dialog.PlotProgressPos = 0;
  31.  
  32.                     plot_dialog.OnBeginPlot();
  33.                     plot_dialog.IsVisible = true;
  34.  
  35.                     plot_engine.BeginPlot(plot_dialog, null);
  36.                     plot_engine.BeginDocument(plot_info, Document.Name, null, 1, !String.IsNullOrEmpty(filename), filename);
  37.  
  38.                     plot_dialog.OnBeginSheet();
  39.                     plot_dialog.LowerSheetProgressRange = 0;
  40.                     plot_dialog.UpperSheetProgressRange = 100;
  41.                     plot_dialog.SheetProgressPos = 0;
  42.  
  43.                     using (var plot_page_info = new PlotPageInfo()) {
  44.                         plot_engine.BeginPage(plot_page_info, plot_info, true, null);
  45.                         plot_engine.BeginGenerateGraphics(null);
  46.                         plot_dialog.SheetProgressPos = 50;
  47.                         plot_engine.EndGenerateGraphics(null);
  48.                         plot_engine.EndPage(null);
  49.                     }
  50.  
  51.                     plot_dialog.SheetProgressPos = 100;
  52.                     plot_dialog.OnEndSheet();
  53.  
  54.                     plot_engine.EndDocument(null);
  55.  
  56.                     plot_dialog.PlotProgressPos = 100;
  57.                     plot_dialog.OnEndPlot();
  58.                     plot_engine.EndPlot(null);
  59.                 }
  60.             }
  61.         }

Эффект: принтер подготавливается к печати (начинает шуршать) и всё, печать не идёт. При этом, если я с теми же настройками печатаю вручную через автокад и устанавливаю все те же самые настройки, всё нормально распечатывается. Раньше у меня такое было однажды: там я передавал масштаб 1:1.004, тогда как лист в модели был в 100 раз больше действительного размера. Когда я сделал масштаб 1:100.4, лист начал печататься. В данном случае в 50 раз больше, но это уже учитывается.
Вот список настроек печати:
- ps {Autodesk.AutoCAD.DatabaseServices.PlotSettings} Autodesk.AutoCAD.DatabaseServices.PlotSettings
+ base {Autodesk.AutoCAD.DatabaseServices.PlotSettings} Autodesk.AutoCAD.DatabaseServices.DBObject {Autodesk.AutoCAD.DatabaseServices.PlotSettings}
CanonicalMediaName "A4" string
CurrentStyleSheet "monochrome.ctb" string
+ CustomPrintScale {(1,50.2)} Autodesk.AutoCAD.DatabaseServices.CustomScale
DrawViewportsFirst true bool
ModelType true bool
PlotAsRaster false bool
PlotCentered false bool
PlotConfigurationName "\\\\k45-vag-w8.tomgiprotrans.ru\\Epson Stylus TX410" string
PlotHidden false bool
+ PlotOrigin {(0,0)} Autodesk.AutoCAD.Geometry.Point2d
+ PlotPaperMargins {((3.75708317756653,3.757080078125),(3.757080078125,3.757080078125))} Autodesk.AutoCAD.DatabaseServices.Extents2d
+ PlotPaperSize {(209.973327636719,296.968322753906)} Autodesk.AutoCAD.Geometry.Point2d
PlotPaperUnits Millimeters Autodesk.AutoCAD.DatabaseServices.PlotPaperUnit
PlotPlotStyles true bool
PlotRotation Degrees180 Autodesk.AutoCAD.DatabaseServices.PlotRotation
PlotSettingsName "" string
PlotTransparency false bool
PlotType Window Autodesk.AutoCAD.DatabaseServices.PlotType
PlotViewName "" string
PlotViewportBorders false bool
+ PlotWindowArea {((231522.126985233,-306759.501646733),(242022.126985233,-291909.501646733))} Autodesk.AutoCAD.DatabaseServices.Extents2d
PlotWireframe true bool
PrintLineweights true bool
ScaleLineweights false bool
ShadePlot AsDisplayed Autodesk.AutoCAD.DatabaseServices.PlotSettingsShadePlotType
ShadePlotCustomDpi 300 short
+ ShadePlotId {(0)} Autodesk.AutoCAD.DatabaseServices.ObjectId
ShadePlotResLevel Normal Autodesk.AutoCAD.DatabaseServices.ShadePlotResLevel
ShowPlotStyles false bool
StdScale 0.0046483416265143858 double
StdScaleType ScaleToFit Autodesk.AutoCAD.DatabaseServices.StdScaleType
UseStandardScale false bool
Почему ещё может отменяться печать? Ошибок никаких не выдаёт. Работаю в Autocad 2014.
В какую сторону вообще копать?
« Последнее редактирование: 11-12-2014, 11:03:31 от JohnJ »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не печатает на принтере из модели
« Ответ #1 : 11-12-2014, 13:30:14 »
Попробуй печать на какой-нибудь виртуальный принтер. Типа DWG to PDF.pc3 или DWF6 ePlot.pc3
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не печатает на принтере из модели
« Ответ #2 : 11-12-2014, 13:36:11 »
Тебя ничего не смущает:
Цитировать
PlotOrigin   {(0,0)}   Autodesk.AutoCAD.Geometry.Point2d
PlotPaperMargins   {((3.75708317756653,3.757080078125),(3.757080078125,3.757080078125))}
Это при том, что у тебя сам чертеж находится в пределах:
Цитировать
Command: id Specify point:  X = 231522.1270     Y = -306759.5016     Z = 0.0000
Command: ID Specify point:  X = 242022.1270     Y = -291909.5016     Z = 0.0000
А еще намного ниже находится текст:
Цитировать
Command: id Specify point: _ins of  X = 420677.2759     Y = -644623.1420     Z = 0.0000
Так что похоже у тебя нечему печататься.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
Re: Не печатает на принтере из модели
« Ответ #3 : 11-12-2014, 14:13:56 »
а что должно смущать? PlotPaperMargins, как я понимаю - поля листа, настроенные в принтере, PlotOrigin - сдвиг печатаемой области (я поставил по нулям, но если сделать Centered, то он будет -3 по каждой оси примерно). Думаю, тут всё равно будет что напечатать, даже если со сдвигом.
А пределы чертежа указаны в рамке
 PlotWindowArea   {((231522.126985233,-306759.501646733),(242022.126985233,-291909.501646733))}
То что текст ниже - видел, но разве он тут может играть роль? В Модели может быть несколько листов, но они никак не мешают обычно печатать по указанной рамке.
А то, что печатать получается нечего - подозреваю что так и есть. Но вот почему - не понимаю пока.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не печатает на принтере из модели
« Ответ #4 : 11-12-2014, 14:30:08 »
Перенеси всю рамку поближе к 0,0 в положительную область по X и Y
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
Re: Не печатает на принтере из модели
« Ответ #5 : 11-12-2014, 14:54:33 »
Перенёс в чертеже и отцентровал через psv.SetPlotCentered(ps, true);, настройки получились такими:
- ps {Autodesk.AutoCAD.DatabaseServices.PlotSettings} Autodesk.AutoCAD.DatabaseServices.PlotSettings
+ base {Autodesk.AutoCAD.DatabaseServices.PlotSettings} Autodesk.AutoCAD.DatabaseServices.DBObject {Autodesk.AutoCAD.DatabaseServices.PlotSettings}
CanonicalMediaName "A4" string
CurrentStyleSheet "monochrome.ctb" string
+ CustomPrintScale {(1,50.2)} Autodesk.AutoCAD.DatabaseServices.CustomScale
DrawViewportsFirst true bool
ModelType true bool
PlotAsRaster false bool
PlotCentered true bool
PlotConfigurationName "\\\\k45-vag-w8.tomgiprotrans.ru\\Epson Stylus TX410" string
PlotHidden false bool
+ PlotOrigin {(-3.3520911162593,-3.18128523503643)} Autodesk.AutoCAD.Geometry.Point2d
+ PlotPaperMargins {((3.75708317756653,3.757080078125),(3.757080078125,3.757080078125))} Autodesk.AutoCAD.DatabaseServices.Extents2d
+ PlotPaperSize {(209.973327636719,296.968322753906)} Autodesk.AutoCAD.Geometry.Point2d
PlotPaperUnits Millimeters Autodesk.AutoCAD.DatabaseServices.PlotPaperUnit
PlotPlotStyles true bool
PlotRotation Degrees180 Autodesk.AutoCAD.DatabaseServices.PlotRotation
PlotSettingsName "" string
PlotTransparency false bool
PlotType Window Autodesk.AutoCAD.DatabaseServices.PlotType
PlotViewName "" string
PlotViewportBorders false bool
+ PlotWindowArea {((0.126985232607694,-0.501646732562222),(10500.1269852326,14849.4983532674))} Autodesk.AutoCAD.DatabaseServices.Extents2d
PlotWireframe true bool
PrintLineweights true bool
ScaleLineweights false bool
ShadePlot AsDisplayed Autodesk.AutoCAD.DatabaseServices.PlotSettingsShadePlotType
ShadePlotCustomDpi 300 short
+ ShadePlotId {(0)} Autodesk.AutoCAD.DatabaseServices.ObjectId
ShadePlotResLevel Normal Autodesk.AutoCAD.DatabaseServices.ShadePlotResLevel
ShowPlotStyles false bool
StdScale 0.0045624424199137894 double
StdScaleType ScaleToFit Autodesk.AutoCAD.DatabaseServices.StdScaleType
UseStandardScale false bool
Без центровки меняется только
PlotCentered на false
и PlotOrigin на 0,0

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не печатает на принтере из модели
« Ответ #6 : 11-12-2014, 15:34:29 »
И всё равно не печатает? Если нет, то давай полностью код (проект). Посмотрю и если не получится - отправлю в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
Re: Не печатает на принтере из модели
« Ответ #7 : 12-12-2014, 10:34:04 »
Реакция та же - принтер начинает шуршать, подготавливаясь к печати, и замолкает.
Функционал вынес в отдельный проект - все настройки печати те же, реакция та же, dwg файл тот же.

Отмечено как Решение JohnJ 15-12-2014, 05:52:18

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не печатает на принтере из модели
« Ответ #8 : 14-12-2014, 03:34:03 »
В этот раз обойдемся без ADN DevHelp. Вот переделанный код:
Код - C# [Выбрать]
  1. using System;
  2. using System.Globalization;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.LayerManager;
  9. using Autodesk.AutoCAD.PlottingServices;
  10. using Autodesk.AutoCAD.Runtime;
  11. using System.Runtime.InteropServices;
  12. using Exception = System.Exception;
  13. using PlotType = Autodesk.AutoCAD.DatabaseServices.PlotType;
  14.  
  15. namespace AutocadTestProject {
  16.     public class AutocadTest : IExtensionApplication {
  17.       [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
  18.       static extern int acedTrans13(double[] point, IntPtr fromRb,  IntPtr toRb, int disp, double[] result);
  19.       [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
  20.       static extern int acedTrans12(double[] point, IntPtr fromRb, IntPtr toRb,  int disp, double[] result);
  21.       static int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result)
  22.       {
  23.         return Application.Version.Major > 12 ?
  24.           acedTrans13(point, fromRb, toRb, disp, result) :
  25.           acedTrans12(point, fromRb, toRb, disp, result);
  26.       }
  27.  
  28.         public string DocumentName;
  29.  
  30.         [CommandMethod("PrintTest1")]
  31.         public void Test1() {
  32.             var scale = 50;
  33.             var doc = Application.DocumentManager.MdiActiveDocument;
  34.             DocumentName = doc.Name;
  35.             try {
  36.                 using (doc.LockDocument()) {
  37.                     using (var tr = doc.TransactionManager.StartTransaction()) {
  38.                         var db = doc.Database;
  39.                         using (var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable) {
  40.                             if (bt == null) throw new Exception("block table is null");
  41.                             using (var model_space = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord) {
  42.                                 if (model_space == null) throw new Exception("model space is null");
  43.                                 using (var layout = tr.GetObject(model_space.LayoutId, OpenMode.ForRead) as Layout) {
  44.                                     if (layout == null) throw new Exception("layout is null");
  45.                                     SetPlotSettingsAndPrint(@"DWG to PDF.pc3", layout, scale);
  46.                                 }
  47.                             }
  48.                         }
  49.                         tr.Commit();
  50.                     }
  51.                 }
  52.             } catch (Exception exception) {
  53.                 doc.Editor.WriteMessage("Exception: " + exception.Message);
  54.             }
  55.         }
  56.  
  57.         public void SetPlotSettingsAndPrint(string plotter_name, Layout layout, double scale, int copy_count = 1) {
  58.             var psv = PlotSettingsValidator.Current;
  59.             using (var ps = new PlotSettings(layout.ModelType)) {
  60.                 ps.CopyFrom(layout);
  61.                 psv.SetPlotConfigurationName(ps, plotter_name, null);
  62.                 psv.RefreshLists(ps);
  63.                 var media_name = SetClosestMediaName(ps, new Point2d(210, 297));
  64.                 if (String.IsNullOrEmpty(media_name)) {
  65.                     throw new Exception("Paper format not found");
  66.                 }
  67.                 psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
  68.                 psv.SetPlotOrigin(ps, Point2d.Origin);
  69.                 psv.SetUseStandardScale(ps, false);
  70.                 psv.SetCustomPrintScale(ps, new CustomScale(1, 1.004 * scale));
  71.                 psv.SetPlotRotation(ps, ps.PlotRotation == PlotRotation.Degrees000 ? PlotRotation.Degrees180 : PlotRotation.Degrees270);
  72.                 Point3d p1 = new Point3d(0.126985232607694, -0.501646732562222, 0);
  73.                 Point3d p2 = new Point3d(10500.1269852326, 14849.4983532674, 0);
  74.  
  75.                 ResultBuffer rbFrom = new ResultBuffer(new TypedValue(5003, 0)),
  76.                              rbTo =   new ResultBuffer(new TypedValue(5003, 2));
  77.                 double[] p1res = new double[] { 0, 0, 0 };
  78.                 double[] p2res = new double[] { 0, 0, 0 };
  79.                 acedTrans(p1.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject,  0, p1res);
  80.                 acedTrans(p2.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject,  0, p2res);
  81.                 psv.SetPlotWindowArea(ps, new Extents2d(p1res[0], p1res[1], p2res[0], p2res[1]));
  82.                 psv.SetPlotType(ps, PlotType.Window);
  83. //                psv.SetPlotCentered(ps, info.PrintCenteredUse);
  84.                 ps.PrintLineweights = true;
  85.                 for (var i = 0; i < copy_count; i++) {
  86.                     PrintLayout(ps, layout.ObjectId, layout.LayoutName, @"c:\temp.pdf");
  87.                 }
  88.             }
  89.         }
  90.  
  91.         private class SelectedMedia {
  92.             public double Offset = 0.0;
  93.             public string Name = "";
  94.             public PlotRotation Rotation = PlotRotation.Degrees000;
  95.  
  96.             public void Update(string name, double offset, PlotRotation rotation_type) {
  97.                 Name = name;
  98.                 Offset = offset;
  99.                 Rotation = rotation_type;
  100.             }
  101.         }
  102.  
  103.         public string SetClosestMediaName(PlotSettings ps, Point2d need_layout_size, bool match_printable_area = true) {
  104.             var psv = PlotSettingsValidator.Current;
  105.             psv.SetUseStandardScale(ps, false);
  106.             psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
  107.             psv.RefreshLists(ps);
  108.  
  109.             var canonical_media_name_list = psv.GetCanonicalMediaNameList(ps);
  110.             var selected = new SelectedMedia {
  111.                 Offset = 0.0,
  112.                 Name = "",
  113.                 Rotation = PlotRotation.Degrees000,
  114.             };
  115.  
  116.             foreach (var name in canonical_media_name_list) {
  117.                 var width = 0.0;
  118.                 var height = 0.0;
  119.                 var fast_size = true;
  120.                 try {
  121.                     var locale_name = psv.GetLocaleMediaName(ps, name);
  122.                     var size = GetSizeByLocaleMediaName(locale_name);
  123.                     width = size.X;
  124.                     height = size.Y;
  125.                 } catch {
  126.                     psv.SetCanonicalMediaName(ps, name);
  127.                     psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
  128.                     width = ps.PlotPaperSize.X;
  129.                     height = ps.PlotPaperSize.Y;
  130.                     fast_size = false;
  131.                 }
  132.  
  133.                 var rotation_type = width + 0.1 < need_layout_size.X || height + 0.1 < need_layout_size.Y ? PlotRotation.Degrees090 : PlotRotation.Degrees000;
  134.                 var offset = Math.Abs(width * height - need_layout_size.X * need_layout_size.Y);
  135.                 if (String.IsNullOrEmpty(selected.Name) || offset < selected.Offset) {
  136.                     selected.Update(name, offset, rotation_type);
  137.                 }
  138.                 if (rotation_type == PlotRotation.Degrees090 && (height < need_layout_size.X || width < need_layout_size.Y)) continue;
  139.                 if (fast_size) {
  140.                     psv.SetCanonicalMediaName(ps, name);
  141.                     psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
  142.                     width = ps.PlotPaperSize.X;
  143.                     height = ps.PlotPaperSize.Y;
  144.                 }
  145.                 if (match_printable_area) {
  146.                     width -= (ps.PlotPaperMargins.MinPoint.X + ps.PlotPaperMargins.MaxPoint.X);
  147.                     height -= (ps.PlotPaperMargins.MinPoint.Y + ps.PlotPaperMargins.MaxPoint.Y);
  148.                 }
  149.                 offset = Math.Abs(width * height - need_layout_size.X * need_layout_size.Y);
  150.  
  151.                 if (String.IsNullOrEmpty(selected.Name) || offset < selected.Offset) {
  152.                     selected.Update(name, offset, rotation_type);
  153.                     if (Math.Abs(selected.Offset) < 0.01) break;
  154.                 }
  155.             }
  156.  
  157.             psv.SetCanonicalMediaName(ps, selected.Name);
  158.             psv.SetPlotRotation(ps, selected.Rotation);
  159.             return psv.GetLocaleMediaName(ps, selected.Name);
  160.         }
  161.  
  162.         private Point2d GetSizeByLocaleMediaName(string locale_media_name) {
  163.             var reg = new Regex(@"^.+?\((\d+(?:[,.]\d*)?)[^\d]+(\d+(?:[,.]\d*)?)[^\d]+\)$");
  164.             if (!reg.IsMatch(locale_media_name)) {
  165.                 locale_media_name = String.Format("temp({0})", locale_media_name);
  166.             }
  167.             var matches = reg.Matches(locale_media_name);
  168.             var x = Convert.ToDouble(matches[0].Groups[1].Value.Replace(",", "."), NumberFormatInfo.InvariantInfo);
  169.             var y = Convert.ToDouble(matches[0].Groups[2].Value.Replace(",", "."), NumberFormatInfo.InvariantInfo);
  170.             var point = new Point2d(x, y);
  171.             return point;
  172.         }
  173.  
  174.         public void PrintLayout(PlotSettings plot_settings, ObjectId layout_id, string layout_name, string filename = "") {
  175.             var bg_plot = Application.GetSystemVariable("BACKGROUNDPLOT");
  176.             try {
  177.                 Application.SetSystemVariable("BACKGROUNDPLOT", 0);
  178.  
  179.                 if (PlotFactory.ProcessPlotState != ProcessPlotState.NotPlotting) throw new Exception("Плоттер в данный момент занят");
  180.                 using (var plot_info = new PlotInfo {Layout = layout_id}) {
  181.                     plot_info.OverrideSettings = plot_settings;
  182.                     Print(layout_name, plot_info, filename);
  183.                 }
  184.  
  185.             } finally {
  186.                 Application.SetSystemVariable("BACKGROUNDPLOT", bg_plot);
  187.             }
  188.         }
  189.  
  190.         protected void Print(string layout_name, PlotInfo plot_info, string filename) {
  191.             using (var plot_info_validator = new PlotInfoValidator {MediaMatchingPolicy = MatchingPolicy.MatchEnabled}) {
  192.                 plot_info_validator.Validate(plot_info);
  193.             }
  194.             using (var plot_engine = PlotFactory.CreatePublishEngine()) {
  195.                 using (var plot_dialog = new PlotProgressDialog(false, 1, true)) {
  196.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Печать листа");
  197.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.SheetName, String.Format(" Печатается лист : {0}", layout_name));
  198.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Отмена печати");
  199.                     plot_dialog.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Выполнение печати:");
  200.  
  201.                     plot_dialog.LowerPlotProgressRange = 0;
  202.                     plot_dialog.UpperPlotProgressRange = 100;
  203.                     plot_dialog.PlotProgressPos = 0;
  204.  
  205.                     plot_dialog.OnBeginPlot();
  206.                     plot_dialog.IsVisible = true;
  207.  
  208.                     plot_engine.BeginPlot(plot_dialog, null);
  209.                     plot_engine.BeginDocument(plot_info, DocumentName, null, 1, !String.IsNullOrEmpty(filename), filename);
  210.  
  211.                     plot_dialog.OnBeginSheet();
  212.                     plot_dialog.LowerSheetProgressRange = 0;
  213.                     plot_dialog.UpperSheetProgressRange = 100;
  214.                     plot_dialog.SheetProgressPos = 0;
  215.  
  216.                     using (var plot_page_info = new PlotPageInfo()) {
  217.                         plot_engine.BeginPage(plot_page_info, plot_info, true, null);
  218.                         plot_engine.BeginGenerateGraphics(null);
  219.                         plot_dialog.SheetProgressPos = 50;
  220.                         plot_engine.EndGenerateGraphics(null);
  221.                         plot_engine.EndPage(null);
  222.                     }
  223.  
  224.                     plot_dialog.SheetProgressPos = 100;
  225.                     plot_dialog.OnEndSheet();
  226.  
  227.                     plot_engine.EndDocument(null);
  228.  
  229.                     plot_dialog.PlotProgressPos = 100;
  230.                     plot_dialog.OnEndPlot();
  231.                     plot_engine.EndPlot(null);
  232.                 }
  233.             }
  234.         }
  235.  
  236.         public void Initialize() {
  237.                
  238.         }
  239.  
  240.         public void Terminate() {
  241.            
  242.         }
  243.     }
  244. }

Проблема твоего кода в том, что ты не преобразовывал координаты в DCS (Систему Координат Дисплея). Странно, что у тебя вообще когда-нибудь этот код работал. Скажем так, что тебе всё время везло. :) Я проверял с виртуальным принтером, так как твоего у меня нет. Результат работы программы во вложении.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
Re: Не печатает на принтере из модели
« Ответ #9 : 15-12-2014, 06:52:31 »
Спасибо! Так распечаталось. Но появилось много вопросов, объяснить можете? Ну или ссылку на объяснение дать.... Я поискал в интернете acedTrans, кое-что почитал.
Осталось не понятным, почему эта функция не доступна без импорта? И откуда взялось вот это: new TypedValue(5003, 0), что за числа?
У Кеана используется new TypedValue(5003, 1). С чем это связано?
Кроме того, не пойму, почему вообще требуется преобразовывать во что-то координаты, если мы наводим мышкой на точку и внизу указаны именно используемые координаты? Я слышал, что в автокаде существует мировая система координат и пользовательская, про систему координат дисплея вроде тоже слыхал, но считал, что это система координат окна, отображающего чертёж, либо система координат видового экрана. При чём тут печать из модели - не понятно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не печатает на принтере из модели
« Ответ #10 : 15-12-2014, 11:06:07 »
Спасибо! Так распечаталось.
Отлично!
Но появилось много вопросов, объяснить можете? Ну или ссылку на объяснение дать....
Постараюсь.
У Кеана используется new TypedValue(5003, 1). С чем это связано?
Нужно смотреть описание функции acedTrans в ObjectARX: ObjectARX Reference Guide > Global Functions > AcEd Global Functions > acedTrans Function
В его коде рамка для печати выбирается вручную, т.е. точки возвращаются в ПСК (UCS). У тебя же точки в МСК (WCS).
RTSHORT в ObjectARX эквивалентно числу 5003.
Кроме того, не пойму, почему вообще требуется преобразовывать во что-то координаты, если мы наводим мышкой на точку и внизу указаны именно используемые координаты?
Во-первых, в этом случае ты видишь координаты в ПСК.
Во-вторых, это вопрос не по адресу. Так было изначально задумано инженерами Autodesk. Возможно это связано с тем, что этот метод ориентирован на листы, а не на модель (смотри описание метода SetPlotWindowArea в документации).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение