Приведение единиц измерения листа к миллиметрам вызывает ошибку

Автор Тема: Приведение единиц измерения листа к миллиметрам вызывает ошибку  (Прочитано 5501 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
В том же коде, который я уже как-то выкладывал, который печатает лист, заметил такую штуку:
если пропустить 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
Функция, в которой возникает исключение:
Цитата: csharp
        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
Что-то в коде моей функции не предусмотрено или подобные случаи нужно просто пропускать? Или какие-то другие значения менять перед этим?

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

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

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
а как тогда этого лучше избегать? try {}catch{} ? Другие то листы до этого в миллиметрах изначально были

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
а как тогда этого лучше избегать? try {}catch{} ?
Ну видимо да, так как я не вижу способа проверить список допустимых единиц.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение