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

ADN Club => AutoCAD .NET API => Тема начата: avc от 07-12-2016, 18:10:43

Название: Есть ли способ обхода Fatal Error
Отправлено: avc от 07-12-2016, 18:10:43
Я нашел уже несколько ситуаций когда функция API стабильно вызывает фатал Автокада. Например, сейчас мучаюсь с тем что Solid3d.Slice(Surface, bool) убивает Автокад, если поверхность и солид не пересекаются). try не спасает. Проверить ВСЕ возможные варианты заранее как правило невозможно. Может есть какой-то способ безопасного вызова подобных функций? Чтоб получить обычное исключение, а не фатал. Есть панацея?
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: Александр Ривилис от 07-12-2016, 18:26:26
Может есть какой-то способ безопасного вызова подобных функций? Чтоб получить обычное исключение, а не фатал. Есть панацея?
Нет. Fatal Error невозможно обработать на уровне .NET. Да и в чистом C++ перехват этого исключения тебя бы не спас. В любом случае или память AutoCAD уже испорчена, или чертеж или и то и другое.
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: Андрей Бушман от 07-12-2016, 18:30:21
В ветке уже была тема, где обсуждались алгоритмы разрезки солидов, насколько я помню. Тема создавалась мною, _Дима показывал более оптимальный вариант, но написанный на F#. Юзай поиск.
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: Александр Ривилис от 07-12-2016, 18:33:52
В ветке уже была тема, где обсуждались алгоритмы разрезки солидов, насколько я помню.
У тебя резка шла плоскостью (Plane), у него поверхностью Surface - разница существенна.
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: Александр Ривилис от 07-12-2016, 18:35:04
Например, сейчас мучаюсь с тем что Solid3d.Slice(Surface, bool) убивает Автокад, если поверхность и солид не пересекаются
Нужен правильно оформленный пример для отправки в Autodesk.
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: avc от 07-12-2016, 18:45:37
Да, при резке плоскостью будет обычное исключение. А при резке поверхностью обязательны как минимум 2 проверки:
Код - C# [Выбрать]
  1.           if (!solid.Check()) return false; // первая обязательная проверка - иначе ФАТАЛ!
  2.           using (Solid3d test = surface.Thicken(-0.00001, false)) // А вот тут танцуйте с бубном. "Минус чуть чуть" сработает только в моем коде, но НЕ ВСЕГДА
  3.             using (Solid3d clone = solid.Clone() as Solid3d)
  4.             {
  5.               clone.BooleanOperation(BooleanOperationType.BoolIntersect, test);
  6.               if (clone.IsNull) return false; // вторая проверка. если не пересеклись (и даже если просто касались) - будет ФАТАЛ!
  7.             }
  8.           Solid3d sloy = solid.Slice(surface, true); // Крайне опасный вызов. Избегать всеми способами!
  9.  
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: Александр Ривилис от 07-12-2016, 18:55:31
Я так понимаю, что ты это написал для себя, так как такой код в Autodesk отправлять бессмысленно. Где пример чертежа? Где полный код примера? Где указание на версию AutoCAD? Где видео, которое подтверждает получение ошибки?
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: avc от 07-12-2016, 19:00:04
При чем тут Автодеск? Я для читателей форума пишу. По слову Slice тут больше статей нет. Пусть люди будут в курсе. Разве не для этого форум?
Название: Re: Есть ли способ обхода Fatal Error
Отправлено: Александр Ривилис от 07-12-2016, 19:23:38
Пусть люди будут в курсе. Разве не для этого форум?
Всё правильно. Я просто думал, что кроме как поделится сведениями, тебе еще не помешала бы помощь от Autodesk. Но если в этом нет необходимости, то и не надо... :)