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

02/02/2017

Как реализовать PlotSettingsValidator.SetClosestMediaName в .NET

Комментарий в документации о методе "PlotSettingsValidator.SetClosestMediaName" гласит:

"Эта функция не реализована."

Ниже предложение того, как можно реализовать этот метод в C# используя AutoCAD .NET API:

Код - C#: [Выделить]
  1. [CommandMethod("SetClosestMediaNameCmd")]
  2. public void SetClosestMediaNameCmd()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     PlotSettingsValidator psv = PlotSettingsValidator.Current;
  9.  
  10.     // Сначала выберем устройство печати
  11.     StringCollection devlist = psv.GetPlotDeviceList();
  12.  
  13.     ed.WriteMessage("\n--- Устройства печати ---");
  14.  
  15.     for (int i = 0; i < devlist.Count; ++i)
  16.     {
  17.         ed.WriteMessage("\n{0} - {1}", i+1, devlist[i]);
  18.     }
  19.  
  20.     PromptIntegerOptions opts = new PromptIntegerOptions(
  21.         "\nУкажите номер устройства: ");
  22.  
  23.     opts.LowerLimit = 1;
  24.     opts.UpperLimit = devlist.Count;
  25.     PromptIntegerResult pir = ed.GetInteger(opts);
  26.  
  27.     if(pir.Status != PromptStatus.OK)
  28.         return;
  29.  
  30.     string device = devlist[pir.Value - 1];
  31.  
  32.     PromptDoubleOptions pdo1 = new PromptDoubleOptions(
  33.         "\nУкажите высоту носителя(мм): ");
  34.    
  35.     PromptDoubleResult pdr1 = ed.GetDouble(pdo1);
  36.  
  37.     if (pdr1.Status != PromptStatus.OK)
  38.         return;
  39.  
  40.     PromptDoubleOptions pdo2 = new PromptDoubleOptions(
  41.         "\nУкажите ширину носителя (мм): ");
  42.    
  43.     PromptDoubleResult pdr2 = ed.GetDouble(pdo2);
  44.  
  45.     if (pdr2.Status != PromptStatus.OK)
  46.         return;
  47.  
  48.     using (Transaction Tx = db.TransactionManager.StartTransaction())
  49.     {
  50.         LayoutManager layoutMgr = LayoutManager.Current;
  51.  
  52.         Layout layout = Tx.GetObject(
  53.             layoutMgr.GetLayoutId(layoutMgr.CurrentLayout),
  54.             OpenMode.ForWrite)
  55.                  as Layout;
  56.  
  57.         setClosestMediaName(
  58.             psv, device, layout,
  59.             pdr1.Value, pdr2.Value,
  60.             PlotPaperUnit.Millimeters, true);
  61.  
  62.         Tx.Commit();
  63.     }
  64. }
  65.  
  66. void setClosestMediaName(PlotSettingsValidator psv,
  67.     string device,
  68.     Layout layout,
  69.     double pageWidth,
  70.     double pageHeight,
  71.     PlotPaperUnit units,
  72.     bool matchPrintableArea)   
  73. {
  74.     psv.SetPlotType(
  75.         layout,
  76.         Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
  77.  
  78.     psv.SetPlotPaperUnits(layout, units);
  79.     psv.SetUseStandardScale(layout, false);
  80.     psv.SetStdScaleType(layout, StdScaleType.ScaleToFit);
  81.     psv.SetPlotConfigurationName(layout, device, null);
  82.     psv.RefreshLists(layout);
  83.  
  84.     StringCollection mediaList =
  85.         psv.GetCanonicalMediaNameList(layout);
  86.  
  87.     double smallestOffset = 0.0;
  88.     string selectedMedia = string.Empty;
  89.     PlotRotation selectedRot = PlotRotation.Degrees000;
  90.  
  91.     foreach(string media in mediaList)
  92.     {
  93.         psv.SetCanonicalMediaName(layout, media);
  94.         psv.SetPlotPaperUnits(layout, units);
  95.  
  96.         double mediaPageWidth = layout.PlotPaperSize.X;
  97.         double mediaPageHeight = layout.PlotPaperSize.Y;
  98.  
  99.         if(matchPrintableArea)
  100.         {
  101.               mediaPageWidth  -=
  102.                   (layout.PlotPaperMargins.MinPoint.X +
  103.                    layout.PlotPaperMargins.MaxPoint.X);
  104.  
  105.               mediaPageHeight -=
  106.                   (layout.PlotPaperMargins.MinPoint.Y +
  107.                    layout.PlotPaperMargins.MaxPoint.Y);
  108.         }
  109.  
  110.         PlotRotation rotationType = PlotRotation.Degrees090;
  111.  
  112.         // Проверим что мы в пределах области печати носителя
  113.         if(mediaPageWidth < pageWidth ||
  114.            mediaPageHeight < pageHeight)
  115.         {
  116.               // Проверим, что при угле поворота 90° мы помещаемся в область
  117.               // печати, в противном случае переходим к следующему носителю
  118.               if(mediaPageHeight < pageWidth ||
  119.                  mediaPageWidth >= pageHeight)
  120.               {
  121.                     // Слишком маленький – переходим к следующему
  122.                     continue;
  123.               }
  124.  
  125.               // Устроит поворот на 90°
  126.               rotationType = PlotRotation.Degrees090;
  127.         }
  128.  
  129.         double offset = Math.Abs(
  130.             mediaPageWidth * mediaPageHeight -
  131.             pageWidth * pageHeight);
  132.  
  133.         if (selectedMedia == string.Empty || offset < smallestOffset)
  134.         {
  135.             selectedMedia = media;
  136.             smallestOffset = offset;
  137.             selectedRot = rotationType;
  138.  
  139.             // Нашли подходящее соответствие – можем выйти
  140.             if (smallestOffset == 0)
  141.                 break;
  142.         }
  143.     }
  144.  
  145.     psv.SetCanonicalMediaName(layout, selectedMedia);
  146.     psv.SetPlotRotation(layout, selectedRot);
  147.  
  148.     string localMedia = psv.GetLocaleMediaName(
  149.         layout,
  150.         selectedMedia);
  151.  
  152.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  153.  
  154.     ed.WriteMessage("\n – Ближайший носитель: " + localMedia);
  155.     ed.WriteMessage("\n - смещение: " + smallestOffset.ToString());
  156.     ed.WriteMessage("\n – угол поворота: " + selectedRot.ToString());
  157. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/05/how-to-implement-plotsettingsvalidatorsetclosestmedianame-in-net.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7599

Опубликовано 02.02.2017