В том же коде, который я уже как-то выкладывал, который печатает лист, заметил такую штуку:
если пропустить psv.SetPlotConfigurationName, т.е. не указывать принтер, то список листов всё-равно откуда-то берётся.
И там среди них есть лист, который измеряется ни в миллиметрах, ни в дюймах, а в пикселах.
Попытка приведения его к миллиметрам вызывает исключение:
- exception {"eInvalidInput"} System.Exception {Autodesk.AutoCAD.Runtime.Exception}
+ [Autodesk.AutoCAD.Runtime.Exception] {"eInvalidInput"} Autodesk.AutoCAD.Runtime.Exception
_className null string
+ _data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
_dynamicMethods null object
_exceptionMethod null System.Reflection.MethodBase
_exceptionMethodString null string
_helpURL null string
_HResult -2146233088 int
+ _innerException null System.Exception
+ _ipForWatsonBuckets 8789500452428 System.UIntPtr
_message "eInvalidInput" string
_remoteStackIndex 0 int
_remoteStackTraceString null string
+ _safeSerializationManager {System.Runtime.Serialization.SafeSerializationManager} System.Runtime.Serialization.SafeSerializationManager
_source null string
+ _stackTrace {sbyte[192]} object {sbyte[]}
_stackTraceString null string
_watsonBuckets null object
_xcode -532462766 int
+ _xptrs 0 System.IntPtr
+ Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
HelpLink null string
HResult -2146233088 int
+ InnerException null System.Exception
+ IPForWatsonBuckets 8789500452428 System.UIntPtr
IsTransient false bool
Message "eInvalidInput" string
RemoteStackTrace null string
Source "Acdbmgd" string
StackTrace " в Autodesk.AutoCAD.DatabaseServices.PlotSettingsValidator.SetPlotPaperUnits(PlotSettings plotSet, PlotPaperUnit units)\r\n в AutocadTestProject.AutocadTestPrint.SetClosestMediaName(PlotSettings ps, Point2d need_layout_size, Boolean match_printable_area) в d:\\ClassLibrary1\\AutocadTestPrint.cs:строка 143\r\n в AutocadTestProject.AutocadTestPrint.SetPlotSettingsAndPrint(String plotter_name, Layout layout, Double scale, Int32 copy_count, String filename) в d:\\ClassLibrary1\\AutocadTestPrint.cs:строка 62\r\n в AutocadTestProject.AutocadTestPrint.Test1() в d:\\ClassLibrary1\\AutocadTestPrint.cs:строка 44" string
+ TargetSite {Void SetPlotPaperUnits(Autodesk.AutoCAD.DatabaseServices.PlotSettings, Autodesk.AutoCAD.DatabaseServices.PlotPaperUnit)} System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
WatsonBuckets null object
Функция, в которой возникает исключение:
public string SetClosestMediaName(PlotSettings ps, Point2d need_layout_size, bool match_printable_area = true) {
var psv = PlotSettingsValidator.Current;
psv.SetUseStandardScale(ps, false);
psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
psv.RefreshLists(ps);
var canonical_media_name_list = psv.GetCanonicalMediaNameList(ps);
var selected = new SelectedMedia {
Offset = 0.0,
Name = "",
Rotation = PlotRotation.Degrees000,
};
foreach (var name in canonical_media_name_list) {
var width = 0.0;
var height = 0.0;
var fast_size = true;
try {
var locale_name = psv.GetLocaleMediaName(ps, name);
var size = GetSizeByLocaleMediaName(locale_name);
width = size.X;
height = size.Y;
} catch {
psv.SetCanonicalMediaName(ps, name);
psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters);
width = ps.PlotPaperSize.X;
height = ps.PlotPaperSize.Y;
fast_size = false;
}
var rotation_type = width + 0.1 < need_layout_size.X || height + 0.1 < need_layout_size.Y ? PlotRotation.Degrees090 : PlotRotation.Degrees000;
var offset = Math.Abs(width * height - need_layout_size.X * need_layout_size.Y);
if (String.IsNullOrEmpty(selected.Name) || offset < selected.Offset) {
selected.Update(name, offset, rotation_type);
}
if (rotation_type == PlotRotation.Degrees090 && (height < need_layout_size.X || width < need_layout_size.Y)) continue;
if (fast_size) {
psv.SetCanonicalMediaName(ps, name);
psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters); // тут вылетает exception
width = ps.PlotPaperSize.X;
height = ps.PlotPaperSize.Y;
}
if (match_printable_area) {
width -= (ps.PlotPaperMargins.MinPoint.X + ps.PlotPaperMargins.MaxPoint.X);
height -= (ps.PlotPaperMargins.MinPoint.Y + ps.PlotPaperMargins.MaxPoint.Y);
}
offset = Math.Abs(width * height - need_layout_size.X * need_layout_size.Y);
if (String.IsNullOrEmpty(selected.Name) || offset < selected.Offset) {
selected.Update(name, offset, rotation_type);
if (Math.Abs(selected.Offset) < 0.01) break;
}
}
psv.SetCanonicalMediaName(ps, selected.Name);
psv.SetPlotRotation(ps, selected.Rotation);
return psv.GetLocaleMediaName(ps, selected.Name);
}
Значения ps при вылете ошибки:
- ps {Autodesk.AutoCAD.DatabaseServices.PlotSettings} Autodesk.AutoCAD.DatabaseServices.PlotSettings
+ base {Autodesk.AutoCAD.DatabaseServices.PlotSettings} Autodesk.AutoCAD.DatabaseServices.DBObject {Autodesk.AutoCAD.DatabaseServices.PlotSettings}
CanonicalMediaName "VGA_(480.00_x_640.00_Pixels)" string
CurrentStyleSheet "" string
+ CustomPrintScale {(1,7.43359355064858)} Autodesk.AutoCAD.DatabaseServices.CustomScale
DrawViewportsFirst true bool
ModelType true bool
PlotAsRaster false bool
PlotCentered false bool
PlotConfigurationName "Нет" string
PlotHidden false bool
+ PlotOrigin {(11.5499992370605,-13.6500000953674)} Autodesk.AutoCAD.Geometry.Point2d
+ PlotPaperMargins {((0,0),(-1,-1))} Autodesk.AutoCAD.DatabaseServices.Extents2d
+ PlotPaperSize {(479,639)} Autodesk.AutoCAD.Geometry.Point2d
PlotPaperUnits Pixels Autodesk.AutoCAD.DatabaseServices.PlotPaperUnit
PlotPlotStyles true bool
PlotRotation Degrees000 Autodesk.AutoCAD.DatabaseServices.PlotRotation
PlotSettingsName "" string
PlotTransparency false bool
PlotType Display Autodesk.AutoCAD.DatabaseServices.PlotType
PlotViewName "" string
PlotViewportBorders false bool
+ PlotWindowArea {((0,0),(0,0))} 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.13452443871009739 double
StdScaleType ScaleToFit Autodesk.AutoCAD.DatabaseServices.StdScaleType
UseStandardScale true bool
Что-то в коде моей функции не предусмотрено или подобные случаи нужно просто пропускать? Или какие-то другие значения менять перед этим?