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

ADN Club => Civil 3D API => Тема начата: Вильдар от 19-09-2016, 17:39:55

Название: Свойство характерной линии о принадлежности поверхности
Отправлено: Вильдар от 19-09-2016, 17:39:55
Привет,
Нужно получить из характерной линии информацию о принадлежности поверхности.
Команда _List считывает это (см. картинку).
Как она это делает?

В файле одна поверхность и одна характерная линия.
Civil 2016
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 00:58:36
Попробуй воспользоваться MGDDBG для исследования взаимосвязей: http://adn-cis.org/forum/index.php?topic=7274.0
Если не получится - я попробую подключится, но у меня сейчас не установлен Civil 3D.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Дмитрий Загорулькин от 20-09-2016, 04:07:17
Мне не удалось найти прямого способа узнать у какой(-их) поверхности(-ей) характерная линия является структурной ни через .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)
Выводит названия для характерных линий выбранной поверхности. Проверок на ошибки не добавлял, поэтому, не промахнитесь при выборе поверхности :)
Раз до характерок поверхности добраться можно, то возможен такой вариант: пройтись по всем поверхностям чертежа, и определить для каких из них нужная характерная линия является структурной.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Вильдар от 20-09-2016, 08:54:14
смотрел через MGDDBG, зацепки не нашел (см.картинку):
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs10.postimg.org%2Fjqxiv5h7p%2Ffl_mgddbg.png&hash=b66c53f43d1c6687c1c82edbc32bcc9b) (http://postimg.org/image/jqxiv5h7p/)

У автокадовского класса 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, так и у цивила есть что-то подобное (ссылка на родителя).
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Вильдар от 20-09-2016, 09:06:44
А в MGDDBG - Referenced by можно как то использровать, там еасть ссылка на поверхность:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs17.postimg.org%2Fjuv33lrtn%2Ffl_refby.png&hash=bdd01646270d2614ae3fa669c92151a5) (http://postimg.org/image/juv33lrtn/)
Не очень представляю что такое Referenced by и References to. :-[

Посмотрел исходники MGDDBG, для получение "Referenced by" - они ищут ссылки из всех таблиц чертежа. Это не очень интересно   :(
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 09:15:21
там еасть ссылка на поверхность
Отлично! Можно использовать. Постараюсь сегодня предложить решение.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 13:30:41
Посмотрел исходники MGDDBG, для получение "Referenced by" - они ищут ссылки из всех таблиц чертежа. Это не очень интересно   :(
А кто тебя заставляет искать во всех таблицах, если можно искать только для всех TinSurface? Я так понимаю, что их в чертеже никогда не бывает много и все они в содержатся в какой-то одной таблице (CivilDocument.GetSurfaceIds()). Дальше для каждой из TinSurface используешь метод dwgOut в filer созданный по образцу и подобию с ReferenceFiler. После этого анализируешь нет ли в filer.m_hardPointerIds или filer.m_hardOwnershipIds ObjectId твоей характерной линии. Если есть, то это твоя TinSurface.
Мне кажется что я подробно расписал алгоритм и ты сам справишься.

Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 14:50:42
Можно как то перехватить/считать вывод этого метода?
Считать можно (хак с использованием Win32 API). Перехватить чтобы не выводилось в консоль можно только средствами ObjectARX.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Дмитрий Загорулькин от 20-09-2016, 15:54:11
Дальше для каждой из TinSurface используешь метод dwgOut в filer созданный по образцу и подобию с ReferenceFiler. После этого анализируешь нет ли в filer.m_hardPointerIds или filer.m_hardOwnershipIds ObjectId твоей характерной линии. Если есть, то это твоя TinSurface.
А возможно то же самое делать, но с объектом характерной линии? Потом в ее коллекции ссылок искать поверхности.
Вообще, очень интересный метод поиска связанных объектов - открывает новые возможности. Для Civil 3D, в .NET API которого еще пока много чего не хватает, это может быть решением некоторых задач. Возможно, что такой метод будет работать побыстрее COM-методов.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Вильдар от 20-09-2016, 16:09:27
С DwgOut в DwgFiler я кажется понял (как пользоваться понял, а как это работает не очень).
Меня интересуют все поверхности в пространстве модели. Поверхностей вроде немного бывает, а вот сами чертежи большие.
Пока, предполагается использовать это для отображения/скрытия пункта в контекстном меню характерной линии. Я так понимаю, что во время события Popup контекстного меню, нужно его как можно быстрее обработать.
Попробую реализовать таким способом. Будут перебор модели и отбор поверхностейCivilDocument.GetSurfaceIds(), далее для каждой вызов DwgOut и провекрка наличия объекта хар.линии среди жестких ссылок, причем при первом нахождении можно прекращать поиски, и вообще дальше первого уровня ссылок не лезть.

Дмитрий Загорулькин, от характерной линии не получилось найти ссылки на поверхности через DwgOut  :( было бы совсем хорошо.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 16:11:21
А возможно то же самое делать, но с объектом характерной линии? Потом в ее коллекции ссылок искать поверхности.
Я не разбирался конкретно с этой структурой, но судя по картинкам, которые vildar82 выложил, связь односторонняя,  т.е. TinSurface хранит ссылку на FeatureLine, но не наоборот. Фактически ReferenceFiler выполняет туже функцию, что и (entget) в лисп или acedEntGet в ObjectARX, позволяя получить все коды DXF объекта.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 16:14:25
Будут перебор модели и отбор поверхностей
Зачем перебирать модель? CivilDocument.GetSurfaceIds() возвращает все Civil'овские поверхности в документе. Или тебе что-то другое нужно?
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Вильдар от 20-09-2016, 16:20:16
Да, я не знал (забыл)  :-[ Так лучше конечно. Думаю цивил их хранит и не перебирает всю базу каждый раз.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Дмитрий Загорулькин от 20-09-2016, 18:03:28
Меня интересуют все поверхности в пространстве модели.
Я сильно сомневаюсь, что получится поверхность сивила создать в листе. И если найдется кто-то, кто захочет/сможет это сделать, мне очень хочется посмотреть этому уникуму в глаза и спросить: "зачем?" :)
от характерной линии не получилось найти ссылки на поверхности через DwgOut
Печально.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 18:58:46
Цитата: vildar82 от 20-09-2016, 16:09:27

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

Печально.
Но ведь ты можешь сделать обратную процедуру. Не понимаю в чем проблема...
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Вильдар от 20-09-2016, 19:00:10
Просто, было бы красиво  ;)
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Дмитрий Загорулькин от 20-09-2016, 19:04:16
Конкретно в этом случае - нет проблемы. Поверхностей в чертеже действительно относительно немного. Но бывают и другие случаи, когда надо найти связи между другими объектами Сивила, которых в чертеже может быть несколько сотен и более. Я думал, что с помощью этого способа можно найти все зависимости, как входящие, так и исходящие.
Название: Re: Свойство характерной линии о принадлежности поверхности
Отправлено: Александр Ривилис от 20-09-2016, 20:18:49
Я думал, что с помощью этого способа можно найти все зависимости, как входящие, так и исходящие.
Ну может в других случаях есть и двойные зависимости. :)