Transparency

Автор Тема: Transparency  (Прочитано 3077 раз)

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

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 2
Transparency
« : 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? Нет более правильного способа?
« Последнее редактирование: 30-05-2025, 15:16:42 от Александр Ривилис »

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 2
Re: Transparency
« Ответ #1 : 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. }
« Последнее редактирование: 30-05-2025, 15:17:03 от Александр Ривилис »

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 845
  • Карма: 170
    • Мои плагины к Автокаду
Re: Transparency
« Ответ #2 : 29-05-2025, 19:13:52 »
Да в API Автокада каждое первое свойство и метод могут вызвать исключения. А то и фатал Автокада. Надо по аккуратнее. Анализировать наиболее важные свойства прежде чем пытаться извлекать другие. Если IsInvalid, то зачем вы пытаетесь читать другие свойства? Transparency вроде не фаталит, но зачем? Зачем читать Alpha, если и так известно что IsClear, IsSolid, ByLayer или ByBlock ? Отлов исключений программу точно не ускорит.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 563
  • Карма: 121
Re: Transparency
« Ответ #3 : 30-05-2025, 09:20:47 »
Нет более правильного способа?
Если задача считать все свойства у объекта, и куда-то записать то наверное try catch самый простой способ.
программа будет работать медленнее. Но возможно скорость будет на приемлемом уровне.
В каких-то случаях try catch может не спасти от вылета автокада.

Если без try, то в ряде случаев будут ошибки, придется хорошо изучить объект, прочитать документацию, провести тестирование.
На объектах с кучей свойств может уйти много времени.
Например BlockTableRecord может быть ссылкой, и логично проверить, является ли он ссылкой IsFromExternalReference, а потом считывать путь к файлу PathName.

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 2
Re: Transparency
« Ответ #4 : 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


Или валидный это значит, то он проиницилизирован, но при этом всегда есть свойства при обращении к которым будет эксцепшн?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 845
  • Карма: 170
    • Мои плагины к Автокаду
Re: Transparency
« Ответ #5 : 30-05-2025, 16:25:52 »
недействительные вы отсеяли, но остались, например, По Слою или По блоку. А вы у них опять пытаетесь получить прозрачность.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 394
  • Карма: 21
Re: Transparency
« Ответ #6 : 01-06-2025, 12:53:56 »
Нет более правильного способа?
Если задача считать все свойства у объекта, и куда-то записать то наверное try catch самый простой способ.
программа будет работать медленнее. Но возможно скорость будет на приемлемом уровне.
В каких-то случаях try catch может не спасти от вылета автокада.

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