02/02/2017
Как реализовать PlotSettingsValidator.SetClosestMediaName в .NET
Комментарий в документации о методе "PlotSettingsValidator.SetClosestMediaName" гласит:"Эта функция не реализована."
Ниже предложение того, как можно реализовать этот метод в C# используя AutoCAD .NET API:
Код - C#: [Выделить]
- [CommandMethod("SetClosestMediaNameCmd")]
- public void SetClosestMediaNameCmd()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- PlotSettingsValidator psv = PlotSettingsValidator.Current;
- // Сначала выберем устройство печати
- StringCollection devlist = psv.GetPlotDeviceList();
- ed.WriteMessage("\n--- Устройства печати ---");
- for (int i = 0; i < devlist.Count; ++i)
- {
- ed.WriteMessage("\n{0} - {1}", i+1, devlist[i]);
- }
- PromptIntegerOptions opts = new PromptIntegerOptions(
- "\nУкажите номер устройства: ");
- opts.LowerLimit = 1;
- opts.UpperLimit = devlist.Count;
- PromptIntegerResult pir = ed.GetInteger(opts);
- if(pir.Status != PromptStatus.OK)
- return;
- string device = devlist[pir.Value - 1];
- PromptDoubleOptions pdo1 = new PromptDoubleOptions(
- "\nУкажите высоту носителя(мм): ");
- PromptDoubleResult pdr1 = ed.GetDouble(pdo1);
- if (pdr1.Status != PromptStatus.OK)
- return;
- PromptDoubleOptions pdo2 = new PromptDoubleOptions(
- "\nУкажите ширину носителя (мм): ");
- PromptDoubleResult pdr2 = ed.GetDouble(pdo2);
- if (pdr2.Status != PromptStatus.OK)
- return;
- using (Transaction Tx = db.TransactionManager.StartTransaction())
- {
- LayoutManager layoutMgr = LayoutManager.Current;
- Layout layout = Tx.GetObject(
- layoutMgr.GetLayoutId(layoutMgr.CurrentLayout),
- OpenMode.ForWrite)
- as Layout;
- setClosestMediaName(
- psv, device, layout,
- pdr1.Value, pdr2.Value,
- PlotPaperUnit.Millimeters, true);
- Tx.Commit();
- }
- }
- void setClosestMediaName(PlotSettingsValidator psv,
- string device,
- Layout layout,
- double pageWidth,
- double pageHeight,
- PlotPaperUnit units,
- bool matchPrintableArea)
- {
- psv.SetPlotType(
- layout,
- Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
- psv.SetPlotPaperUnits(layout, units);
- psv.SetUseStandardScale(layout, false);
- psv.SetStdScaleType(layout, StdScaleType.ScaleToFit);
- psv.SetPlotConfigurationName(layout, device, null);
- psv.RefreshLists(layout);
- StringCollection mediaList =
- psv.GetCanonicalMediaNameList(layout);
- double smallestOffset = 0.0;
- string selectedMedia = string.Empty;
- PlotRotation selectedRot = PlotRotation.Degrees000;
- foreach(string media in mediaList)
- {
- psv.SetCanonicalMediaName(layout, media);
- psv.SetPlotPaperUnits(layout, units);
- double mediaPageWidth = layout.PlotPaperSize.X;
- double mediaPageHeight = layout.PlotPaperSize.Y;
- if(matchPrintableArea)
- {
- mediaPageWidth -=
- (layout.PlotPaperMargins.MinPoint.X +
- layout.PlotPaperMargins.MaxPoint.X);
- mediaPageHeight -=
- (layout.PlotPaperMargins.MinPoint.Y +
- layout.PlotPaperMargins.MaxPoint.Y);
- }
- PlotRotation rotationType = PlotRotation.Degrees090;
- // Проверим что мы в пределах области печати носителя
- if(mediaPageWidth < pageWidth ||
- mediaPageHeight < pageHeight)
- {
- // Проверим, что при угле поворота 90° мы помещаемся в область
- // печати, в противном случае переходим к следующему носителю
- if(mediaPageHeight < pageWidth ||
- mediaPageWidth >= pageHeight)
- {
- // Слишком маленький – переходим к следующему
- continue;
- }
- // Устроит поворот на 90°
- rotationType = PlotRotation.Degrees090;
- }
- double offset = Math.Abs(
- mediaPageWidth * mediaPageHeight -
- pageWidth * pageHeight);
- if (selectedMedia == string.Empty || offset < smallestOffset)
- {
- selectedMedia = media;
- smallestOffset = offset;
- selectedRot = rotationType;
- // Нашли подходящее соответствие – можем выйти
- if (smallestOffset == 0)
- break;
- }
- }
- psv.SetCanonicalMediaName(layout, selectedMedia);
- psv.SetPlotRotation(layout, selectedRot);
- string localMedia = psv.GetLocaleMediaName(
- layout,
- selectedMedia);
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- ed.WriteMessage("\n – Ближайший носитель: " + localMedia);
- ed.WriteMessage("\n - смещение: " + smallestOffset.ToString());
- ed.WriteMessage("\n – угол поворота: " + selectedRot.ToString());
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7599
Опубликовано 02.02.2017