Получить контуры TinSuface в Civil 2012

Автор Тема: Получить контуры TinSuface в Civil 2012  (Прочитано 8893 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 39
  • Карма: 0
Столкнулся с проблемой при попытке вытащить из поверхности(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 и увидел такую картину.

Но из всего этого так и не смог определить какого класса эти объекты.
Подскажите, как получить контуры в каком-либо операбельном виде?

« Последнее редактирование: 27-12-2014, 16:20:25 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить контуры TinSuface в Civil 2012
« Ответ #1 : 27-12-2014, 16:20:04 »
Похоже на COM-объект AcadPolyline (или Polyline)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 39
  • Карма: 0
Re: Получить контуры TinSuface в Civil 2012
« Ответ #2 : 27-12-2014, 18:41:13 »
Сейчас нет возможности проверить, но когда я пробовал делать так
var a = contours[0] as Polyline;
получал null, завтра проверю на AcadPolyline. Можно ли приводить COM-объекты к управляемым типам на прямую? А вообще такой способ получения контуров допустим? Единственный ли он?

Отмечено как Решение MikhailTAP 28-12-2014, 09:18:40

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить контуры TinSuface в Civil 2012
« Ответ #3 : 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")
« Последнее редактирование: 27-12-2014, 22:27:56 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить контуры TinSuface в Civil 2012
« Ответ #4 : 27-12-2014, 19:02:47 »
А вообще такой способ получения контуров допустим?
Не знаю. Ты задал вопрос не в разделе Civil 3D API и поэтому я отвечаю только на конкретно поставленный вопрос о получении типов объектов. Если, как ты написал, тот код, который работает в Civil 3D 2013 не работает в 2012, то это скорее всего единственный путь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Получить контуры TinSuface в Civil 2012
« Ответ #5 : 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.
Ну а про все остальное уже Александр Наумович исчерпывающе рассказал :)

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

  • ADN OPEN
  • Сообщений: 39
  • Карма: 0
Re: Получить контуры TinSuface в Civil 2012
« Ответ #6 : 28-12-2014, 09:19:17 »
Спасибо всем за помощь. Всё сработало:)