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

ADN Club => Civil 3D API => Тема начата: Алексей (IdeaSoft) от 31-07-2018, 18:08:02

Название: Что означает ошибка eNotApplicable
Отправлено: Алексей (IdeaSoft) от 31-07-2018, 18:08:02
Вот в этом коде исключение eNotApplicable
Что может быть?
Код - C# [Выбрать]
  1.  
  2. using CAD_DBS = Autodesk.AutoCAD.DatabaseServices;
  3. using CAD_GEO = Autodesk.AutoCAD.Geometry;
  4. using CAD_APS = Autodesk.AutoCAD.ApplicationServices;
  5.  
  6. using CIV_APS = Autodesk.Civil.ApplicationServices;
  7.  
  8. ...
  9.  
  10.                     CAD_APS.Document doc = CAD_APS.Application.DocumentManager.MdiActiveDocument;
  11.                     CAD_DBS.Database db = doc.Database;
  12.                     CIV_APS.CivilDocument civ_doc = CIV_APS.CivilDocument.GetCivilDocument(db);
  13.                     CAD_DBS.ObjectIdCollection alignColl = civ_doc.GetAlignmentIds();
  14.  
  15. ...
  16.  
  17.                       List<CAD_DBS.Entity> ents = new List<CAD_DBS.Entity>();
  18.                      // Точка в плане, которая лежит на трассе                      
  19.                      CAD_GEO.Point3d pntPlan
  20.  
  21.  
  22. ...
  23.  
  24.                     using (CAD_DBS.Transaction tr = db.TransactionManager.StartTransaction())
  25.                     {
  26.                         foreach (CAD_DBS.ObjectId alignId in alignColl)
  27.                         {
  28.                             CIV_DBS.Alignment trs = (CIV_DBS.Alignment)tr.GetObject(alignId, CAD_DBS.OpenMode.ForRead);
  29.                             try
  30.                             {
  31.                                // Расстояние в профиле по точке в плане
  32.                                double dist = trs.GetDistAtPoint(pntPlan);
  33.                                 // Цикл по видам профиля для трассы
  34.                                 ObjectIdCollection ids = trs.GetProfileViewIds();
  35.                                 foreach (ObjectId id in ids)
  36.                                 {
  37.                                     CIV_DBS.ProfileView pv = tr.GetObject(id, CAD_DBS.OpenMode.ForRead) as CIV_DBS.ProfileView;
  38.                                     if (pv != null)
  39.                                     {
  40.                                         try {
  41.                                             MY_SKV skv =  kkk[Convert.ToInt16(NUM) - 1];
  42.                                             double x = 0.0, y = 0.0;
  43.                                             pv.FindXYAtStationAndElevation(dist, skv.Ustie, ref x, ref y);
  44.                                             CAD_DBS.Entity e = (CAD_DBS.Entity)skv.blkref.Clone();
  45.                                             (e as CAD_DBS.BlockReference).Position = new CAD_GEO.Point3d(x, y - 100, 0);    
  46.                                             ents.Add(e);
  47.                                         }
  48.                                         catch { }
  49.                                     }
  50.                                 }
  51.                             }
  52.                             catch (System.Exception ex )
  53.                             {
  54.                                 MessageBox.Show(ex.Message); // ВЫВОД ТЕСТОВОГО СООБЩЕНИЯ ТЕКСТА ИСКЛЮЧЕНИЯ
  55.                             }
  56.                         }
  57.                     }
Название: Re: Что означает ошибка eNotApplicable
Отправлено: Дмитрий Загорулькин от 31-07-2018, 18:15:03
// ВОТ ТУТ ВОЗНИКАЕТ ИСКЛЮЧЕНИЕ
Исключение возникает не там, оно там обрабатывается. А возникает оно где-то выше. Надо пробежаться отладкой и посмотреть, где именно.
Название: Re: Что означает ошибка eNotApplicable
Отправлено: Александр Ривилис от 31-07-2018, 19:09:14
Вот в этом коде исключение eNotApplicable
Что может быть?
Это означает "неприменимо". А вот где и почему можно найти только отладкой/трассировкой, как написал Дмитрий Загорулькин.
Или убери try/catch и оно само покажет где возникло исключение.
Название: Re: Что означает ошибка eNotApplicable
Отправлено: Алексей (IdeaSoft) от 31-07-2018, 21:48:59
Спасибо, посмотрю что там не так.

Интересно, то что функция всегда отрабатывала хорошо.
А тут проектировщики дали еще один файл с видами профилей
И причем по некоторым видам профилей функция отработала хорошо, а по некоторым с этой вот ошибкой

Вообщем завтра в отладке гляну в чем причина.
Если нарою что-то интересное - отпишусь.

Название: Re: Что означает ошибка eNotApplicable
Отправлено: Алексей (IdeaSoft) от 31-07-2018, 22:12:41
А возникает оно где-то выше.
Где-то с 32 по 37 строки кода нужно смотреть причину.
Название: Re: Что означает ошибка eNotApplicable
Отправлено: Александр Ривилис от 01-08-2018, 00:41:45
Где-то с 32 по 37 строки кода нужно смотреть причину.
Очень может быть, что ошибка здесь:
Код - C# [Выбрать]
  1. double dist = trs.GetDistAtPoint(pntPlan);
Если точка не в точности лежит на линии, то будет исключение. Поэтому обычно сначала находят точку на линии, ближайшую к заданной, а затем уже вызывают метод GetDistAtPoint для полученной точки.
Название: Re: Что означает ошибка eNotApplicable
Отправлено: Алексей (IdeaSoft) от 01-08-2018, 10:44:00
Посмотрел я в отладчике ругается
на функцию GetDistAtPoint
вот в этой строке вычисления дистанции
double dist = trs.GetDistAtPoint(pntPlan)

Код - C# [Выбрать]
  1. CAD_DBS.Circle cir = ...;
  2. ...
  3. CAD_GEO.Point3d pntPlan = cir.Center;
  4. CIV_DBS.Alignment trs = ... ;
  5. ...
  6. double dist = trs.GetDistAtPoint(pntPlan)

Что с трассой может быть не так?


Кружочки на плане расставлял с объектной
привязкой точно на ось трассы.
И также пробовал расставлять их без привязки.

Название: Re: Что означает ошибка eNotApplicable
Отправлено: Александр Ривилис от 01-08-2018, 11:21:15
Что с трассой может быть не так?
Я всё написал выше. В том числе и что следует делать.
Название: Re: Что означает ошибка eNotApplicable
Отправлено: Дмитрий Загорулькин от 01-08-2018, 12:12:08
Вообще, у трассы есть свой собственный метод для определения пикетажа в точке. И применение GetDistAtPoint в данном случае может привести к ошибкам - трасса не всегда начинается с пикетажа 0.0. Так что, следует заменить этот метод на Alignment.StationOffset (http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/ac508ee5-fdeb-53a9-26cd-56fcfc1809ad.htm)
И ещё, мне встречались трассы, у которых в некоторых точках определить пикетаж невозможно. Так что, если не поможет замена, выкладывайте чертёж с трассой.
Название: Re: Что означает ошибка eNotApplicable
Отправлено: Алексей (IdeaSoft) от 01-08-2018, 12:21:07
Разобрался. Кружочки не привязал не верно.
Они не лежат на оси трассы.
Сместил их на трассу и все заработало.
Вообщем все Хорошо!!