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

ADN Club => AutoCAD .NET API => Тема начата: DimVer от 29-05-2025, 17:05:08

Название: Transparency
Отправлено: DimVer от 29-05-2025, 17:05:08
Добрый день, не знаю вопрос больше про класс Transparency или про C#:

Есть такой вот код, который свойства мапит в DTO.
Код - C# [Выбрать]
  1. namespace CadApp.Mapping.Shared
  2. {
  3.     public class TransparencyDtoMapper
  4.     {
  5.         private Transparency _transparency;
  6.         public TransparencyDtoMapper(Transparency transparency)
  7.         {
  8.             _transparency = transparency;
  9.         }
  10.         public TransparencyDto Map()
  11.         {
  12.             if (_transparency.IsInvalid)
  13.             {
  14.                 return new TransparencyDto
  15.                 {
  16.                     Alpha = 255,
  17.                     IsByAlpha = false,
  18.                     IsByBlock = false,
  19.                     IsByLayer = false,
  20.                     IsClear = false,
  21.                     IsInvalid = true,
  22.                     IsSolid = false
  23.                 };
  24.             };
  25.  
  26.             return new TransparencyDto
  27.                 {
  28.                     Alpha = _transparency.Alpha,
  29.                     IsByAlpha = _transparency.IsByAlpha,
  30.                     IsByBlock = _transparency.IsByBlock,
  31.                     IsByLayer = _transparency.IsByLayer,
  32.                     IsClear = _transparency.IsClear,
  33.                     IsInvalid = _transparency.IsInvalid,
  34.                     IsSolid = _transparency.IsSolid
  35.                 };
  36.         }
  37.     }
  38. }

Подскажите пожалуйста, правильно я понимаю объект класса Transparenсy может быть валидным, но некоторые свойства при попытке получить их значения выкидват исключения.
Единственный вариант вычитать сначала все свойства через try catch и потом только проинициализировать DTO? Нет более правильного способа?
Название: Re: Transparency
Отправлено: DimVer от 29-05-2025, 17:14:03
Или что то вроде такого:

Код - C# [Выбрать]
  1. public class TransparencyDtoMapper
  2. {
  3.     private Transparency _transparency;
  4.     public TransparencyDtoMapper(Transparency transparency)
  5.     {
  6.         _transparency = transparency;
  7.     }
  8.     public TransparencyDto Map()
  9.     {
  10.         var transparencyDto = new TransparencyDto();
  11.  
  12.         try { transparencyDto.Alpha = _transparency.Alpha; } catch { };
  13.         try { transparencyDto.IsByAlpha = _transparency.IsByAlpha; } catch { };
  14.         try { transparencyDto.IsByBlock = _transparency.IsByBlock; } catch { };
  15.         try { transparencyDto.IsByLayer = _transparency.IsByLayer; } catch { };
  16.         try { transparencyDto.IsClear = _transparency.IsClear; } catch { };
  17.         try { transparencyDto.IsInvalid = _transparency.IsInvalid;} catch { }
  18.         try { transparencyDto.IsSolid = _transparency.IsSolid; } catch { };
  19.  
  20.         return transparencyDto;
  21.     }
  22. }
Название: Re: Transparency
Отправлено: avc от 29-05-2025, 19:13:52
Да в API Автокада каждое первое свойство и метод могут вызвать исключения. А то и фатал Автокада. Надо по аккуратнее. Анализировать наиболее важные свойства прежде чем пытаться извлекать другие. Если IsInvalid, то зачем вы пытаетесь читать другие свойства? Transparency вроде не фаталит, но зачем? Зачем читать Alpha, если и так известно что IsClear, IsSolid, ByLayer или ByBlock ? Отлов исключений программу точно не ускорит.
Название: Re: Transparency
Отправлено: Привалов Дмитрий от 30-05-2025, 09:20:47
Нет более правильного способа?
Если задача считать все свойства у объекта, и куда-то записать то наверное try catch самый простой способ.
программа будет работать медленнее. Но возможно скорость будет на приемлемом уровне.
В каких-то случаях try catch может не спасти от вылета автокада.

Если без try, то в ряде случаев будут ошибки, придется хорошо изучить объект, прочитать документацию, провести тестирование.
На объектах с кучей свойств может уйти много времени.
Например BlockTableRecord может быть ссылкой, и логично проверить, является ли он ссылкой IsFromExternalReference, а потом считывать путь к файлу PathName.
Название: Re: Transparency
Отправлено: DimVer от 30-05-2025, 16:18:31
Да в API Автокада каждое первое свойство и метод могут вызвать исключения. А то и фатал Автокада. Надо по аккуратнее. Анализировать наиболее важные свойства прежде чем пытаться извлекать другие. Если IsInvalid, то зачем вы пытаетесь читать другие свойства? Transparency вроде не фаталит, но зачем? Зачем читать Alpha, если и так известно что IsClear, IsSolid, ByLayer или ByBlock ? Отлов исключений программу точно не ускорит.
Можно тогда узнать значение свойства IsInvalid?
Ради интереса написал такой кода:

public TransparencyDto Map()
{
    Document acDoc = Application.DocumentManager.MdiActiveDocument;

    if (_transparency.IsInvalid)
    {
        acDoc.Editor.WriteMessage($"\nTransparency is invalid");
        return new TransparencyDto
        {
            Alpha = 255,
            IsByAlpha = false,
            IsByBlock = false,
            IsByLayer = false,
            IsClear = false,
            IsInvalid = true,
            IsSolid = false
        };
    }
    else
    {
       
        acDoc.Editor.WriteMessage($"\nTransparency is valid:");
    }

    var transparencyDto = new TransparencyDto();

    try { transparencyDto.Alpha = _transparency.Alpha; } catch { acDoc.Editor.WriteMessage($"\nException 1"); }
    ;
    try { transparencyDto.IsByAlpha = _transparency.IsByAlpha; } catch { acDoc.Editor.WriteMessage($"\nException 2"); }
    ;
    try { transparencyDto.IsByBlock = _transparency.IsByBlock; } catch { acDoc.Editor.WriteMessage($"\nException 3"); }
    ;
    try { transparencyDto.IsByLayer = _transparency.IsByLayer; } catch { acDoc.Editor.WriteMessage($"\nException 4"); }
    ;
    try { transparencyDto.IsClear = _transparency.IsClear; } catch { acDoc.Editor.WriteMessage($"\nException 5"); }
    ;
    try { transparencyDto.IsInvalid = _transparency.IsInvalid;} catch { acDoc.Editor.WriteMessage($"\nException 6"); }
    try { transparencyDto.IsSolid = _transparency.IsSolid; } catch { acDoc.Editor.WriteMessage($"\nException 7"); }
    ;

    return transparencyDto;
}

Получает объект валидный, но в консоли автокада:
Transparency is valid:
Exception 1
Exception 5
Exception 7


Или валидный это значит, то он проиницилизирован, но при этом всегда есть свойства при обращении к которым будет эксцепшн?
Название: Re: Transparency
Отправлено: avc от 30-05-2025, 16:25:52
недействительные вы отсеяли, но остались, например, По Слою или По блоку. А вы у них опять пытаетесь получить прозрачность.
Название: Re: Transparency
Отправлено: Lemieux от 01-06-2025, 12:53:56
Нет более правильного способа?
Если задача считать все свойства у объекта, и куда-то записать то наверное try catch самый простой способ.
программа будет работать медленнее. Но возможно скорость будет на приемлемом уровне.
В каких-то случаях try catch может не спасти от вылета автокада.

Если без try, то в ряде случаев будут ошибки, придется хорошо изучить объект, прочитать документацию, провести тестирование.
На объектах с кучей свойств может уйти много времени.
Например BlockTableRecord может быть ссылкой, и логично проверить, является ли он ссылкой IsFromExternalReference, а потом считывать путь к файлу PathName.
А кто сказал, что построение систем лёгкое и весёлое занятие? Я сейчас занимаюсь разработкой под продукты другого разработчика. И архитектура AutoCAD и его API это верх совершенства.
Как по мне, автор топика в своих же вопросах даёт ответы.
И try-catch нужен только тогда, когда мы не можем предугадать результат. Например при HTTP запросе, связь может оборваться, или обращение к серверу на другой машине. А тут у Вас система, состояние которой, по идее, Вы должны знать.