Печать листа в PDF, ограниченного рамкой

Автор Тема: Печать листа в PDF, ограниченного рамкой  (Прочитано 7099 раз)

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
Добрый день! Подскажите как ограничить содержимое листа рамкой?Версия автокада 2014. В классе PlotSettingsValidator нашел метод, позволяющий ограничивать содержимое по координатам границ окна, но это не то. Нужен именно аналог пункта в выпадающем списке - рамка. И второй вопрос: как программно записать свой формат в набор форматов?
Ниже приведен код примера из Autocad .net developers guide.
Код - C# [Выбрать]
  1.  [CommandMethod("DWGTOPDF")]
  2.     public static void PlotCurrentLayout()
  3.     {
  4.         Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.         Database acCurDb = acDoc.Database;
  6.         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  7.         {
  8.             // Reference the Layout Manager
  9.             LayoutManager acLayoutMgr;
  10.             acLayoutMgr = LayoutManager.Current;
  11.             // Get the current layout and output its name in the Command Line window
  12.             Layout acLayout;
  13.             acLayout =
  14.             acTrans.GetObject(acLayoutMgr.GetLayoutId(acLayoutMgr.CurrentLayout),
  15.             OpenMode.ForRead) as Layout;
  16.             // Get the PlotInfo from the layout
  17.             PlotInfo acPlInfo = new PlotInfo();
  18.             acPlInfo.Layout = acLayout.ObjectId;
  19.             // Get a copy of the PlotSettings from the layout
  20.             PlotSettings acPlSet = new PlotSettings(acLayout.ModelType);
  21.             acPlSet.CopyFrom(acLayout);
  22.             // Update the PlotSettings object
  23.             PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  24.             // Set the plot type
  25.             acPlSetVdr.SetPlotType(acPlSet,
  26.             Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
  27.             // Set the plot scale
  28.             acPlSetVdr.SetUseStandardScale(acPlSet, true);
  29.             acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit);
  30.             // Center the plot
  31.             acPlSetVdr.SetPlotCentered(acPlSet, true);
  32.             // Set the plot device to use
  33.             acPlSetVdr.SetPlotConfigurationName(acPlSet, "DWG To PDF.pc3",
  34.             "UserDefinedMetric (594.00 x 841.00мм)");
  35.             // Set the plot info as an override since it will
  36.             // not be saved back to the layout
  37.             acPlInfo.OverrideSettings = acPlSet;
  38.             // Validate the plot info
  39.             PlotInfoValidator acPlInfoVdr = new PlotInfoValidator();
  40.             acPlInfoVdr.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
  41.             acPlInfoVdr.Validate(acPlInfo);
  42.             // Check to see if a plot is already in progress
  43.             if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  44.             {
  45.                 using (PlotEngine acPlEng = PlotFactory.CreatePublishEngine())
  46.                 {
  47.                     // Track the plot progress with a Progress dialog
  48.                     PlotProgressDialog acPlProgDlg = new PlotProgressDialog(false,
  49.                     1,
  50.                     true);
  51.                     using (acPlProgDlg)
  52.                     {
  53.                         // Define the status messages to display when plotting starts
  54.                         acPlProgDlg.set_PlotMsgString(PlotMessageIndex.DialogTitle,
  55.                         "Plot Progress");
  56.                         acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage,
  57.                         "Cancel Job");
  58.                         acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage,
  59.                         "Cancel Sheet");
  60.                         acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption,
  61.                         "Sheet Set Progress");
  62.                         acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption,
  63.                         "Sheet Progress");
  64.                         // Set the plot progress range
  65.                         acPlProgDlg.LowerPlotProgressRange = 0;
  66.                         acPlProgDlg.UpperPlotProgressRange = 100;
  67.                         acPlProgDlg.PlotProgressPos = 0;
  68.                         // Display the Progress dialog
  69.                         acPlProgDlg.OnBeginPlot();
  70.                         acPlProgDlg.IsVisible = true;
  71.                         // Start to plot the layout
  72.                         acPlEng.BeginPlot(acPlProgDlg, null);
  73.                         // Define the plot output
  74.                         acPlEng.BeginDocument(acPlInfo,
  75.                         acDoc.Name,
  76.                         null,
  77.                         1,
  78.                         true,
  79.                         "C:\\Users\\admin\\Desktop\\Новая папка\\asdasd.pdf");
  80.                         // Display information about the current plot
  81.                         acPlProgDlg.set_PlotMsgString(PlotMessageIndex.Status,
  82.                         "Plotting: " + acDoc.Name + " - "
  83.                         +
  84.                         acLayout.LayoutName);
  85.                         // Set the sheet progress range
  86.                         acPlProgDlg.OnBeginSheet();
  87.                         acPlProgDlg.LowerSheetProgressRange = 0;
  88.                         acPlProgDlg.UpperSheetProgressRange = 100;
  89.                         acPlProgDlg.SheetProgressPos = 0;
  90.                         // Plot the first sheet/layout
  91.                         PlotPageInfo acPlPageInfo = new PlotPageInfo();
  92.                         acPlEng.BeginPage(acPlPageInfo,
  93.                         acPlInfo,
  94.                         true,
  95.                         null);
  96.                         acPlEng.BeginGenerateGraphics(null);
  97.                         acPlEng.EndGenerateGraphics(null);
  98.                         // Finish plotting the sheet/layout
  99.                         acPlEng.EndPage(null);
  100.                         acPlProgDlg.SheetProgressPos = 100;
  101.                         acPlProgDlg.OnEndSheet();
  102.                         // Finish plotting the document
  103.                         acPlEng.EndDocument(null);
  104.                         // Finish the plot
  105.                         acPlProgDlg.PlotProgressPos = 100;
  106.                         acPlProgDlg.OnEndPlot();
  107.                         acPlEng.EndPlot(null);
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.     }
  113.  

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Один вопрос - одна тема!
2. Вместо:
Код - C# [Выбрать]
  1.             acPlSetVdr.SetPlotType(acPlSet,
  2.             Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
должно быть:
Код - C# [Выбрать]
  1.             acPlSetVdr.SetPlotType(acPlSet,
  2.             Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
Код - C# [Выбрать]
  1.  
  2.    acPlSetVdr.SetPlotPaperUnits(acPlSet, PlotPaperUnit.Millimeters);
  3.    acPlSetVdr.SetPlotWindowArea(acPlSet, new Extents2d(0, 0, 10, 10));
  4.    acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
  5.  
В таком случае на печать выводит лист много больше указанных размеров. SetPlotWindowArea устанавливает область в координатах листа или окна? Мне нужно реализовать примерно такое поведение - выделил прямоугольную область на листе - и она печатается в пдф.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
SetPlotWindowArea устанавливает область в координатах листа или окна?
В координатах дисплея (DCS), как указано в документации.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
В координатах дисплея (DCS), как указано в документации.
А как сделать в координатах пространства листа?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В координатах дисплея (DCS), как указано в документации.
А как сделать в координатах пространства листа?
Тебе наоборот из координат листа нужно перейти к координатам дисплея.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
А есть какие нибудь адекватные методы в AutoCAD API для перевода координат из системы координат листа в ск дисплея?

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

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

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати есть такой недокументированный метод:
Код - C# [Выбрать]
  1. public unsafe static Point3d Autodesk.AutoCAD.Internal.Utils.UcsToDisplay(Point3d ucsPoint, [MarshalAs(UnmanagedType.U1)] bool bPaperSpace);
Думаю что он тебе подойдёт.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Павел55 22-04-2020, 10:14:45

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
Вроде разобрался, но выводит пустые листы PDF и почему то операция печати выволняется в разы дольше, чем вручную
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Geometry;
  10. using Autodesk.AutoCAD.PlottingServices;
  11. using Autodesk.AutoCAD.Runtime;
  12. using Ionic.Zlib;
  13.  
  14. public class pdf
  15. {
  16.  
  17.     [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
  18.     static extern int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result);
  19.     [CommandMethod("DWGTOPDF")]
  20.     public static void PlotCurrentLayout()
  21.     {
  22.         Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  23.         Database acCurDb = acDoc.Database;
  24.         Editor ed = acDoc.Editor;
  25.         double width = 0;
  26.         double height = 0;
  27.         double area = 0;
  28.         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  29.         {
  30.             PromptSelectionOptions ptopts = new PromptSelectionOptions();
  31.             PromptSelectionResult ptres = ed.GetSelection(ptopts);
  32.             Point2d upLeftPoint = new Point2d();
  33.             Point2d downRightPoint = new Point2d();
  34.             if (ptres.Status == PromptStatus.OK)
  35.             {
  36.                 List<double> xPoint = new List<double>();
  37.                 List<double> yPoint = new List<double>();
  38.                 Polyline frame = ptres.Value.GetObjectIds()[0].GetObject(OpenMode.ForRead) as Polyline;
  39.                 for(int i = 0; i < frame.NumberOfVertices; i++)
  40.                 {
  41.                     xPoint.Add(frame.GetPoint2dAt(i).X);
  42.                     yPoint.Add(frame.GetPoint2dAt(i).Y);
  43.                 }
  44.                 xPoint.Sort();
  45.                 yPoint.Sort();
  46.  
  47.                 upLeftPoint = new Point2d(xPoint[xPoint.Count - 1], yPoint[yPoint.Count - 1]);
  48.                 downRightPoint = new Point2d(xPoint[0], yPoint[0]);
  49.                 height = upLeftPoint.X - downRightPoint.X;
  50.                 width = upLeftPoint.Y - downRightPoint.Y;
  51.                 area = Math.Round(height * width,0);
  52.                 //редактируем pc3 и pmp файлы
  53.                 ChangePc3(width.ToString() + ".0", height.ToString() + ".0", area.ToString() + ".0");
  54.                 ChangePmp(width.ToString() + ".0", height.ToString() + ".0", area.ToString() + ".0");
  55.                 // устанавливаем настройки печати
  56.                 LayoutManager layoutMgr = LayoutManager.Current;
  57.                 Layout acLayout;
  58.                 acLayout = acTrans.GetObject(layoutMgr.GetLayoutId(layoutMgr.CurrentLayout), OpenMode.ForRead) as Layout;
  59.                 PlotInfo acPlInfo = new PlotInfo();
  60.                 acPlInfo.Layout = acLayout.ObjectId;
  61.                 PlotSettings acPlSet = new PlotSettings(acLayout.ModelType);
  62.                 acPlSet.CopyFrom(acLayout);
  63.                 PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  64.                 //конвертируем координаты листа в координаты экрана
  65.                 ResultBuffer rbFrom = new ResultBuffer(new TypedValue(5003, 1)), rbTo = new ResultBuffer(new TypedValue(5003, 2));
  66.                 double[] firres = new double[] { 0, 0, 0 };
  67.                 double[] secres = new double[] { 0, 0, 0 };
  68.                 acedTrans(upLeftPoint.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject, 0, firres);
  69.                 acedTrans(downRightPoint.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject, 0, secres);
  70.                 Extents2d window = new Extents2d(firres[0], firres[1], secres[0], secres[1]);
  71.  
  72.                 acPlSetVdr.SetPlotPaperUnits(acPlSet, PlotPaperUnit.Millimeters);
  73.                 acPlSetVdr.SetPlotWindowArea(acPlSet, window);
  74.                 acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
  75.                 acPlSetVdr.SetUseStandardScale(acPlSet, true);
  76.                 acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit);
  77.                 acPlSetVdr.SetPlotCentered(acPlSet, true);
  78.                 acPlSetVdr.SetPlotConfigurationName(acPlSet, "C:\\Users\\admin\\AppData\\Roaming\\Autodesk\\C3D 2014\\rus\\Plotters\\DWG To PDF.pc3", "UserDefinedMetric (100.00 x 500.00мм)");
  79.                 acPlInfo.OverrideSettings = acPlSet;
  80.                 PlotInfoValidator acPlInfoVdr = new PlotInfoValidator();
  81.                 acPlInfoVdr.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
  82.                 acPlInfoVdr.Validate(acPlInfo);
  83.                 if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  84.                 {
  85.                     using (PlotEngine acPlEng = PlotFactory.CreatePublishEngine())
  86.                     {
  87.                         PlotProgressDialog acPlProgDlg = new PlotProgressDialog(false, 1, true);
  88.                         using (acPlProgDlg)
  89.                         {
  90.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Plot Progress");
  91.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job");
  92.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet");
  93.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress");
  94.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress");
  95.                             acPlProgDlg.LowerPlotProgressRange = 0;
  96.                             acPlProgDlg.UpperPlotProgressRange = 100;
  97.                             acPlProgDlg.PlotProgressPos = 0;
  98.                             acPlProgDlg.OnBeginPlot();
  99.                             acPlProgDlg.IsVisible = true;
  100.                             acPlEng.BeginPlot(acPlProgDlg, null);
  101.                             acPlEng.BeginDocument(acPlInfo, acDoc.Name, null, 1, true, "C:\\Users\\admin\\Desktop\\Новая папка\\asdasd.pdf");
  102.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.Status, "Plotting: " + acDoc.Name + " - " + acLayout.LayoutName);
  103.                             acPlProgDlg.OnBeginSheet();
  104.                             acPlProgDlg.LowerSheetProgressRange = 0;
  105.                             acPlProgDlg.UpperSheetProgressRange = 100;
  106.                             acPlProgDlg.SheetProgressPos = 0;
  107.                             PlotPageInfo acPlPageInfo = new PlotPageInfo();
  108.                             acPlEng.BeginPage(acPlPageInfo, acPlInfo, true, null);
  109.                             acPlEng.BeginGenerateGraphics(null);
  110.                             acPlEng.EndGenerateGraphics(null);
  111.                             acPlEng.EndPage(null);
  112.                             acPlProgDlg.SheetProgressPos = 100;
  113.                             acPlProgDlg.OnEndSheet();
  114.                             acPlEng.EndDocument(null);
  115.                             acPlProgDlg.PlotProgressPos = 100;
  116.                             acPlProgDlg.OnEndPlot();
  117.                             acPlEng.EndPlot(null);
  118.                         }
  119.                     }
  120.                 }
  121.             }  
  122.         }
  123.     }
  124.  
  125.     public static void ChangePc3 (string width, string height, string area)
  126.     {
  127.         string fileName1 = "C:\\Users\\admin\\Desktop\\pdf\\Исходные\\DWG To PDF.pc3";
  128.         string content = "";
  129.         using (FileStream fs = File.Open(fileName1, FileMode.Open, FileAccess.Read))
  130.         {
  131.             fs.Seek(60L, SeekOrigin.Begin);
  132.             using (ZlibStream zs = new ZlibStream(fs, CompressionMode.Decompress))
  133.             {
  134.                 using (StreamReader sr = new StreamReader(zs, Encoding.GetEncoding(1251)))
  135.                 {
  136.                     content = sr.ReadToEnd();
  137.                     content = content.Replace("actual_printable_bounds_urx=100.0", $"actual_printable_bounds_urx={width}");
  138.                     content = content.Replace("actual_printable_bounds_ury=500.0", $"actual_printable_bounds_ury={height}");
  139.                     content = content.Replace("printable_bounds_urx=100.0", $"printable_bounds_urx={width}");
  140.                     content = content.Replace("printable_bounds_ury=500.0", $"printable_bounds_ury={height}");
  141.                     content = content.Replace("printable_area=50000.0", $"printable_area={area}");
  142.                     content = content.Replace("media_bounds{    urx = 100.0    ury = 500.0   }", "media_bounds{    urx = "+height+"    ury = "+width+"   }");
  143.                     using (FileStream fs_out = File.Open(fileName1 + ".txt", FileMode.Create, FileAccess.ReadWrite))
  144.                     {
  145.                         fs_out.Write(Encoding.Default.GetBytes(content), 0, Encoding.Default.GetBytes(content).Length);
  146.                     }
  147.                 }
  148.             }
  149.         }
  150.         string fileName = fileName1 + ".txt";
  151.         using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read))
  152.         {
  153.             using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1251)))
  154.             {
  155.                 String pref_s = "PIAFILEVERSION_2.0,PC3VER1,compress\r\npmzlibcodec";
  156.                 long decompresse_stream_size = fs.Length;
  157.                 long compressed_stream_size = fs.Length;
  158.                 string s = sr.ReadToEnd();
  159.                 using (FileStream fs_out = File.Open("C:\\Users\\admin\\AppData\\Roaming\\Autodesk\\C3D 2014\\rus\\Plotters\\DWG To PDF.pc3", FileMode.Create, FileAccess.ReadWrite))
  160.                 {
  161.                     using (ZlibStream zs = new ZlibStream(fs_out, CompressionMode.Compress,
  162.                                                              CompressionLevel.BestCompression, false))
  163.                     {
  164.                         fs_out.Write(Encoding.Default.GetBytes(pref_s), 0, Encoding.Default.GetBytes(pref_s).Length);
  165.                         fs_out.Write(BitConverter.GetBytes(new ZlibCodec(CompressionMode.Compress).Adler32), 0, 4);
  166.                         fs_out.Write(BitConverter.GetBytes(decompresse_stream_size), 0, 4);
  167.                         fs_out.Write(BitConverter.GetBytes(compressed_stream_size), 0, 4);
  168.  
  169.                         zs.Write(Encoding.Default.GetBytes(s), 0, Encoding.Default.GetBytes(s).Length);
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.     }
  175.     public static void ChangePmp(string width, string height, string area)
  176.     {
  177.         string fileName1 = "C:\\Users\\admin\\Desktop\\pdf\\Исходные\\DWG To PDF.pmp";
  178.         string content = "";
  179.         using (FileStream fs = File.Open(fileName1, FileMode.Open, FileAccess.Read))
  180.         {
  181.             fs.Seek(60L, SeekOrigin.Begin);
  182.             using (ZlibStream zs = new ZlibStream(fs, CompressionMode.Decompress))
  183.             {
  184.                 using (StreamReader sr = new StreamReader(zs, Encoding.GetEncoding(1251)))
  185.                 {
  186.                     content = sr.ReadToEnd();
  187.                     content = content.Replace("media_bounds_urx=100.0", $"media_bounds_urx={width}");
  188.                     content = content.Replace("media_bounds_ury=500.0", $"media_bounds_ury={height}");
  189.                     content = content.Replace("printable_bounds_urx=100.0", $"printable_bounds_urx={width}");
  190.                     content = content.Replace("printable_bounds_ury=500.0", $"printable_bounds_ury={height}");
  191.                     content = content.Replace("printable_area=50000.0", $"printable_area={area}");
  192.                     using (FileStream fs_out = File.Open(fileName1 + ".txt", FileMode.Create, FileAccess.ReadWrite))
  193.                     {
  194.                         fs_out.Write(Encoding.Default.GetBytes(content), 0, Encoding.Default.GetBytes(content).Length);
  195.                     }
  196.                 }
  197.             }
  198.         }
  199.         string fileName = fileName1 + ".txt";
  200.         using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read))
  201.         {
  202.             using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1251)))
  203.             {
  204.                 String pref_s = "PIAFILEVERSION_2.0,PC3VER1,compress\r\npmzlibcodec";
  205.                 long decompresse_stream_size = fs.Length;
  206.                 long compressed_stream_size = fs.Length;
  207.                 string s = sr.ReadToEnd();
  208.                 using (FileStream fs_out = File.Open("C:\\Users\\admin\\AppData\\Roaming\\Autodesk\\C3D 2014\\rus\\Plotters\\PMP Files\\DWG To PDF.pmp", FileMode.Create, FileAccess.ReadWrite))
  209.                 {
  210.                     using (ZlibStream zs = new ZlibStream(fs_out, CompressionMode.Compress,
  211.                                                              CompressionLevel.BestCompression, false))
  212.                     {
  213.                         fs_out.Write(Encoding.Default.GetBytes(pref_s), 0, Encoding.Default.GetBytes(pref_s).Length);
  214.                         fs_out.Write(BitConverter.GetBytes(new ZlibCodec(CompressionMode.Compress).Adler32), 0, 4);
  215.                         fs_out.Write(BitConverter.GetBytes(decompresse_stream_size), 0, 4);
  216.                         fs_out.Write(BitConverter.GetBytes(compressed_stream_size), 0, 4);
  217.                         zs.Write(Encoding.Default.GetBytes(s), 0, Encoding.Default.GetBytes(s).Length);
  218.                     }
  219.                 }
  220.             }
  221.         }
  222.     }
  223. }
  224.  

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
//конвертируем координаты листа в координаты экрана
Как минимум это не правильно:
Код - C# [Выбрать]
  1. //конвертируем координаты листа в координаты экрана
Ты конвертируешь из ПСК в координаты экрана, хотя точки берёшь из полилинии (т.е. точки в МСК).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
Ты конвертируешь из ПСК в координаты экрана, хотя точки берёшь из полилинии (т.е. точки в МСК).
А если полилиния на листе?

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

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

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Ты конвертируешь из ПСК в координаты экрана, хотя точки берёшь из полилинии (т.е. точки в МСК).

Небольшое уточнение. Если разговор, про:
41.       xPoint.Add(frame.GetPoint2dAt(i).X);
42.       yPoint.Add(frame.GetPoint2dAt(i).Y);

То точки он запрашивает в OCS:
This function returns the 2D location of the vertex index in the polyline's own object coordinate system (OCS).

А OCS не всегда совпадает с MCS, можно нарваться на неприятности.

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

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