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

ADN Club => AutoCAD .NET API => Тема начата: Vns от 03-03-2017, 08:34:20

Название: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 03-03-2017, 08:34:20
Здравствуйте!

Проблема такая: когда мы сечем Solid3d плоскостью Plane (с целью получения региона), то в случае, когда Plane простирается вне Solid3d - происходит фатальная ошибка,
обработать которую не удается.
Почти уверен - вопрос банален, но ответа на него найти не смог.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Александр Ривилис от 03-03-2017, 08:47:19
Версия AutoCAD?
Fatal Error или обычный Exception?
Нужен тестовый чертеж с одним Solid3d и код.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 03-03-2017, 09:03:56


AutoCad 2016х64
Происходит Fatal Error. Пример кода приложу чуть позже.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 03-03-2017, 10:04:42
Вот пример кода:

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.Geometry
  5.  
  6. Namespace Test
  7.     Public Class MyCommands
  8.         <CommandMethod("Test")> _
  9.         Public Sub MyMain()
  10.             Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  11.             Dim db As Database = doc.Database
  12.             Using myTrans As Transaction = db.TransactionManager.StartTransaction()
  13.                 Dim bt As BlockTable = myTrans.GetObject(db.BlockTableId, OpenMode.ForRead)
  14.                 Dim btr As BlockTableRecord = myTrans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  15.                 '' создаем Solid3d
  16.                 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  17.                 Dim Wedge As Solid3d = New Solid3d()
  18.                 Wedge.CreateWedge(10, 15, 20)
  19.                 btr.AppendEntity(Wedge)
  20.                 myTrans.AddNewlyCreatedDBObject(Wedge, True)
  21.                 ''вариант 1 - секущая плоскость попадает на Solid3d - работает Ok
  22.                 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  23.                 Dim Plan As Plane = New Plane(Point3d.Origin, New Vector3d(1, 0, 0))
  24.                 Dim SectRegion As Region = Wedge.GetSection(Plan)
  25.                 SectRegion.ColorIndex = 1
  26.                 btr.AppendEntity(SectRegion)
  27.                 myTrans.AddNewlyCreatedDBObject(SectRegion, True)
  28.                 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  29.                 ''вариант 2 - секущая плоскость не попадает на Solid3d - происходит Fatal Error
  30.                 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  31.                 Plan = New Plane(New Point3d(7, 0, 0), New Vector3d(1, 0, 0))
  32.                 SectRegion = Wedge.GetSection(Plan)
  33.                 SectRegion.ColorIndex = 1
  34.                 btr.AppendEntity(SectRegion)
  35.                 myTrans.AddNewlyCreatedDBObject(SectRegion, True)
  36.                 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  37.                 myTrans.Commit()
  38.             End Using
  39.         End Sub
  40.  
  41.     End Class
  42.  
  43. End Namespace
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Александр Ривилис от 03-03-2017, 14:53:50
Похоже на баг.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 03-03-2017, 15:12:44
Обидно, однако...

Придется выкрутится иначе. Спасибо!
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Александр Ривилис от 03-03-2017, 15:14:07
Я отправлю в ADN DevHelp - возможно что-нибудь подскажут.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 03-03-2017, 15:26:35
Спасибо, Александр!

Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Александр Ривилис от 03-03-2017, 15:33:24
Проверил в AutoCAD 2017 - этой ошибки нет. Если плоскость не пересекает тело, то возникает исключение eNoIntersections, которое легко отлавливается и обрабатывается:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F5214%2F7842324.8%2F0_1517d2_61cce49b_orig.png&hash=2fd730ca6b4cebd45a10adec5a0f4779)
Это говорит о том, что разработчики в курсе и в AutoCAD 2017 эту ошибку исправили. Видимо в AutoCAD 2016 к ней решили не возвращаться. Так что на положительный ответ я бы не слишком рассчитывал.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 03-03-2017, 15:48:33
Теперь знаю и не рассчитываю. А свою проблему я уже почти решил по-другому.
Спасибо, Александр!
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Александр Ривилис от 03-03-2017, 15:56:46
Теперь знаю и не рассчитываю. А свою проблему я уже почти решил по-другому.
Спасибо, Александр!
Тем не менее запрос в ADN DevHelp я уже отправил. Подождём результата.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 03-03-2017, 16:09:06
Подождем...
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: avc от 05-03-2017, 18:10:13
Похоже та же ситуация как и со Slice http://adn-cis.org/forum/index.php?topic=7502.msg23754#msg23754 (http://adn-cis.org/forum/index.php?topic=7502.msg23754#msg23754)
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 05-03-2017, 19:27:04
Да, действительно... Проблема не нова.
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Александр Ривилис от 09-03-2017, 13:56:52
Получил ответ из ADN DevHelp. Баг признали. В качестве обходного пути предложили пользоваться Section.GenerateSectionGeometry
Пример использования здесь: http://through-the-interface.typepad.com/through_the_interface/2008/05/sectioning-an-a.html
Название: Re: Как поймать ошибку метода Solid3d.GetSection(Plane)
Отправлено: Vns от 10-03-2017, 10:42:01
Спасибо, огромное, Александр!