Свойство характерной линии о принадлежности поверхности

Автор Тема: Свойство характерной линии о принадлежности поверхности  (Прочитано 9102 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Привет,
Нужно получить из характерной линии информацию о принадлежности поверхности.
Команда _List считывает это (см. картинку).
Как она это делает?

В файле одна поверхность и одна характерная линия.
Civil 2016

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй воспользоваться MGDDBG для исследования взаимосвязей: http://adn-cis.org/forum/index.php?topic=7274.0
Если не получится - я попробую подключится, но у меня сейчас не установлен Civil 3D.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Мне не удалось найти прямого способа узнать у какой(-их) поверхности(-ей) характерная линия является структурной ни через .NET, ни через COM. Но самое печальное, что обратное действие - определить, какие характерные линии являются структурными для поверхности через .NET API тоже не удалось (видимо, разработчики API еще не добрались до этого):
Код - C# [Выбрать]
  1. // коллекция данных о структурных линиях
  2. SurfaceDefinitionBreaklines bLinesDef = surf.BreaklinesDefinition;
  3. // данные о группе структурных линий
  4. SurfaceOperationAddBreakline bLineAddDef = bLinesDef[0];
  5. // данные об отдельной структурной линии
  6. SurfaceBreakline surfBLine = bLineAddDef[0];
  7.  
  8. // а вот все свойства, что там есть:
  9. // Тип структурной линии: Standard, Wall, NonDestructive.
  10. SurfaceBreaklineType type = surfBLine.BreaklineType;
  11. // Описание
  12. string desk = surfBLine.Description;
  13. // Коллекция вершин
  14. Point3dCollection pts = surfBLine.Vertices;
  15. // и все!
Можно, конечно, сравнить полученный список вершин со списком вершин проверяемой характерной линии. Но как-то это слишком костыльно...
А вот через COM оказалось возможным получить эти характерные линии для поверхности. Проверял таким лиспом:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ts (vlax-ename->vla-object (car (entsel))))
  2.  
  3.  
  4. (vlax-for brln (vlax-get-property ts 'Breaklines)
  5.   (setq brlnents (vlax-safearray->list
  6.                    (vlax-variant-value
  7.                      (vlax-get-property brln 'BreaklineEntities)
  8.                    )
  9.                  )
  10.   )
  11.   (foreach brlnent brlnents
  12.     (if
  13.       (= (vla-get-ObjectName brlnent) "AeccDbFeatureLine")
  14.        (princ (strcat "\nFeatureLineName: "
  15.                       (vlax-get-property brlnent 'Name)
  16.               )
  17.        )
  18.     )
  19.   )
  20. )
  21. (princ)
Выводит названия для характерных линий выбранной поверхности. Проверок на ошибки не добавлял, поэтому, не промахнитесь при выборе поверхности :)
Раз до характерок поверхности добраться можно, то возможен такой вариант: пройтись по всем поверхностям чертежа, и определить для каких из них нужная характерная линия является структурной.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
смотрел через MGDDBG, зацепки не нашел (см.картинку):


У автокадовского класса Entity есть метод List:
Код - C# [Выбрать]
  1.        
  2.         // Сводка:
  3.         //     This function is intended to be called from AutoCAD whenever the entity is selected
  4.         //     during the LIST command. However, it can be called from ObjectARX applications
  5.         //     if desired.
  6.         public void List ();
Он выводит в ком строку то же что и команда List.
Можно как то перехватить/считать вывод этого метода?

Дмитрий Загорулькин, да спасибо большое за ответ. Из поверхности через Com мы получаем структурные линии.
Но, увидив вывод команды List для характерной линий, стало очень интересно где она берет инфу о поверхности. Думал, есть неизвестный мне способ, например как у всех автокадовских объектов есть OwnerId, так и у цивила есть что-то подобное (ссылка на родителя).

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
А в MGDDBG - Referenced by можно как то использровать, там еасть ссылка на поверхность:

Не очень представляю что такое Referenced by и References to. :-[

Посмотрел исходники MGDDBG, для получение "Referenced by" - они ищут ссылки из всех таблиц чертежа. Это не очень интересно   :(
« Последнее редактирование: 20-09-2016, 09:37:14 от vildar82 »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
там еасть ссылка на поверхность
Отлично! Можно использовать. Постараюсь сегодня предложить решение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Посмотрел исходники MGDDBG, для получение "Referenced by" - они ищут ссылки из всех таблиц чертежа. Это не очень интересно   :(
А кто тебя заставляет искать во всех таблицах, если можно искать только для всех TinSurface? Я так понимаю, что их в чертеже никогда не бывает много и все они в содержатся в какой-то одной таблице (CivilDocument.GetSurfaceIds()). Дальше для каждой из TinSurface используешь метод dwgOut в filer созданный по образцу и подобию с ReferenceFiler. После этого анализируешь нет ли в filer.m_hardPointerIds или filer.m_hardOwnershipIds ObjectId твоей характерной линии. Если есть, то это твоя TinSurface.
Мне кажется что я подробно расписал алгоритм и ты сам справишься.

« Последнее редактирование: 20-09-2016, 14:48:15 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно как то перехватить/считать вывод этого метода?
Считать можно (хак с использованием Win32 API). Перехватить чтобы не выводилось в консоль можно только средствами ObjectARX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Дальше для каждой из TinSurface используешь метод dwgOut в filer созданный по образцу и подобию с ReferenceFiler. После этого анализируешь нет ли в filer.m_hardPointerIds или filer.m_hardOwnershipIds ObjectId твоей характерной линии. Если есть, то это твоя TinSurface.
А возможно то же самое делать, но с объектом характерной линии? Потом в ее коллекции ссылок искать поверхности.
Вообще, очень интересный метод поиска связанных объектов - открывает новые возможности. Для Civil 3D, в .NET API которого еще пока много чего не хватает, это может быть решением некоторых задач. Возможно, что такой метод будет работать побыстрее COM-методов.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
С DwgOut в DwgFiler я кажется понял (как пользоваться понял, а как это работает не очень).
Меня интересуют все поверхности в пространстве модели. Поверхностей вроде немного бывает, а вот сами чертежи большие.
Пока, предполагается использовать это для отображения/скрытия пункта в контекстном меню характерной линии. Я так понимаю, что во время события Popup контекстного меню, нужно его как можно быстрее обработать.
Попробую реализовать таким способом. Будут перебор модели и отбор поверхностейCivilDocument.GetSurfaceIds(), далее для каждой вызов DwgOut и провекрка наличия объекта хар.линии среди жестких ссылок, причем при первом нахождении можно прекращать поиски, и вообще дальше первого уровня ссылок не лезть.

Дмитрий Загорулькин, от характерной линии не получилось найти ссылки на поверхности через DwgOut  :( было бы совсем хорошо.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А возможно то же самое делать, но с объектом характерной линии? Потом в ее коллекции ссылок искать поверхности.
Я не разбирался конкретно с этой структурой, но судя по картинкам, которые vildar82 выложил, связь односторонняя,  т.е. TinSurface хранит ссылку на FeatureLine, но не наоборот. Фактически ReferenceFiler выполняет туже функцию, что и (entget) в лисп или acedEntGet в ObjectARX, позволяя получить все коды DXF объекта.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Будут перебор модели и отбор поверхностей
Зачем перебирать модель? CivilDocument.GetSurfaceIds() возвращает все Civil'овские поверхности в документе. Или тебе что-то другое нужно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Да, я не знал (забыл)  :-[ Так лучше конечно. Думаю цивил их хранит и не перебирает всю базу каждый раз.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Меня интересуют все поверхности в пространстве модели.
Я сильно сомневаюсь, что получится поверхность сивила создать в листе. И если найдется кто-то, кто захочет/сможет это сделать, мне очень хочется посмотреть этому уникуму в глаза и спросить: "зачем?" :)
от характерной линии не получилось найти ссылки на поверхности через DwgOut
Печально.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: vildar82 от 20-09-2016, 16:09:27

    от характерной линии не получилось найти ссылки на поверхности через DwgOut

Печально.
Но ведь ты можешь сделать обратную процедуру. Не понимаю в чем проблема...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Просто, было бы красиво  ;)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Конкретно в этом случае - нет проблемы. Поверхностей в чертеже действительно относительно немного. Но бывают и другие случаи, когда надо найти связи между другими объектами Сивила, которых в чертеже может быть несколько сотен и более. Я думал, что с помощью этого способа можно найти все зависимости, как входящие, так и исходящие.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я думал, что с помощью этого способа можно найти все зависимости, как входящие, так и исходящие.
Ну может в других случаях есть и двойные зависимости. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение