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

ADN Club => Civil 3D API => Тема начата: MikhailTAP от 27-12-2014, 13:14:14

Название: Получить контуры TinSuface в Civil 2012
Отправлено: MikhailTAP от 27-12-2014, 13:14:14
Столкнулся с проблемой при попытке вытащить из поверхности(TinSurface) контуры (мажорные и минорные). Во-первых, насколько я понял в Civil 2012 .net API нет возможности их получить, хотя поиски меня приводили к статьях http://adndevblog.typepad.com/infrastructure/2012/08/extract-surface-contours-using-civil-3d-net-api.html, http://civilizeddevelopment.typepad.com/civilized-development/2012/09/21wojpweek-16-extracting-major-and-minor-contours.html за 2012 год. Однако получить контуры указанными способами через интерфейс IAeccTinSurface не получилось, т.к. нужных методов не оказалось в интерфейсе, и посмотрев описание на сайте автодеска данного метода я увидел версию AeccDbMgd v10. У меня же в проекте 9.
Перебирая различные варианты остановился на таком коде:
Код - C# [Выбрать]
  1.                         var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  2.                         var editor = doc.Editor;
  3.                         var db = doc.Database;
  4.  
  5.                         var selRes = editor.GetSelection();
  6.                         if (selRes.Status != PromptStatus.OK)
  7.                                 return;
  8.  
  9.                         var objId = selRes.Value.GetObjectIds()[0];
  10.                         using (var trans = db.TransactionManager.StartTransaction())
  11.                         {
  12.                                 using (var surface = (TinSurface)trans.GetObject(objId, OpenMode.ForRead))
  13.                                 {
  14.                                         var sur = (AeccTinSurface)surface.AcadObject;
  15.                                         IAeccSurface ss = sur;
  16.                                         var contours = (object[])ss.ExtractContour(
  17.                                                 AeccDisplayOrientation.aeccDisplayOrientationModel,
  18.                                                 AeccSurfaceFilterType.aeccSFMinorContours,
  19.                                                 double.MinValue,
  20.                                                 double.MaxValue);
  21.                                 }
  22.                                 trans.Commit();
  23.                         }
  24.                 }
  25.  
в полученном массиве лежат объекты (COM-объекты), тип которых я не могу определить, чтобы преобразовать к ним. Ни к AeccSurfaceContour, AeccSurfaceContourClass, AeccEntity, ни к каким другим типам я преобразовать не смог. Однако  при отладке попытавшись посмотреть объекты открыл Dynamic view и увидел такую картину.
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs18.postimg.org%2Fn8c88mr3p%2F27_12_2014_16_08_40.jpg&hash=8314b1a6ffddf60c9fde2d8a60dd7aa3) (http://postimg.org/image/n8c88mr3p/)
Но из всего этого так и не смог определить какого класса эти объекты.
Подскажите, как получить контуры в каком-либо операбельном виде?

Название: Re: Получить контуры TinSuface в Civil 2012
Отправлено: Александр Ривилис от 27-12-2014, 16:20:04
Похоже на COM-объект AcadPolyline (или Polyline)
Название: Re: Получить контуры TinSuface в Civil 2012
Отправлено: MikhailTAP от 27-12-2014, 18:41:13
Сейчас нет возможности проверить, но когда я пробовал делать так
var a = contours[0] as Polyline;
получал null, завтра проверю на AcadPolyline. Можно ли приводить COM-объекты к управляемым типам на прямую? А вообще такой способ получения контуров допустим? Единственный ли он?
Название: Re: Получить контуры TinSuface в Civil 2012
Отправлено: Александр Ривилис от 27-12-2014, 19:00:36
Можно ли приводить COM-объекты к управляемым типам на прямую?
Автокадовские можно. Получаешь ObjectId объекта по COM-объекту:
Код - C# [Выбрать]
  1. ObjectId id = DBObject.FromAcadObject(/* AcadObject */ obj); // статический метод
Сейчас нет возможности проверить, но когда я пробовал делать так
Код: [Выделить]

var a = contours[0] as Polyline;

получал null, завтра проверю на AcadPolyline.
Не Autodesk.AutoCAD.DatabaseServices.Polyline (как у тебя), а Autodesk.AutoCAD.Interop.Common.AcadLWPolyline
(скорее всего именно эта, а не AcadPolyline) так как именно AcadLWPolyline соответствует AcDbPolyline в ObjectARX, а именно этот класс у тебя виден на картинке в поле "EntityName")
Название: Re: Получить контуры TinSuface в Civil 2012
Отправлено: Александр Ривилис от 27-12-2014, 19:02:47
А вообще такой способ получения контуров допустим?
Не знаю. Ты задал вопрос не в разделе Civil 3D API и поэтому я отвечаю только на конкретно поставленный вопрос о получении типов объектов. Если, как ты написал, тот код, который работает в Civil 3D 2013 не работает в 2012, то это скорее всего единственный путь.
Название: Re: Получить контуры TinSuface в Civil 2012
Отправлено: Дмитрий Загорулькин от 27-12-2014, 22:03:31
Во-первых, насколько я понял в Civil 2012 .net API нет возможности их получить, хотя поиски меня приводили к статьях http://adndevblog.typepad.com/infrastructure/2012/08/extract-surface-contours-using-civil-3d-net-api.html, http://civilizeddevelopment.typepad.com/civilized-development/2012/09/21wojpweek-16-extracting-major-and-minor-contours.html за 2012 год.
Да, год 2012. Но в статьях речь идет про Civil 2013 (Jay Peak) и добавленный в нем функционал в NET API, который Вам как раз нужен. Если 2012 версия - то да, похоже, только через COM. Есть смысл переходить на новую версию ;), т.к. (цитата из статьи): In the COM API, this functionality was very rudimentary and inflexibleКстати, "мажорные и минорные контуры" - это не основные и вспомогательные горизонтали случаем? Так как-то привычнее и понятнее.
Цитировать
Ни к AeccSurfaceContour, AeccSurfaceContourClass, AeccEntity, ни к каким другим типам я преобразовать не смог.
Судя по статьям, даже новые NET методы создают и добавляют в чертеж новый объект Polyline.
Ну а про все остальное уже Александр Наумович исчерпывающе рассказал :)
Название: Re: Получить контуры TinSuface в Civil 2012
Отправлено: MikhailTAP от 28-12-2014, 09:19:17
Спасибо всем за помощь. Всё сработало:)