Вспомогательный инструмент для получения дампа COM-свойств объекта

Автор Тема: Вспомогательный инструмент для получения дампа COM-свойств объекта  (Прочитано 8563 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
В работе довольно часто приходится изучать дампы различных объектов из вертикальных приложений. В общем-то, для меня не так уж и сложно быстренько в редакторе накидать лисп для этого. Но тут встала необходимость доступа к списку свойств объектов для людей, которые в программировании на LISP не разбираются. В Civil 3D относительно недавно появился инструмент, позволяющие добавлять наборы характеристик к объектам. В этом инструменте есть возможность использовать COM. Пример такого использования - в этой статье: https://autodesk.typepad.com/bimtoolbox/2016/02/autodesk-2016-aec-showreel-call-for-submissions.html
Конечно же, они могут постоянно просить меня помочь, но лучше всё-таки дать какой-то инструмент, чтобы они могли самостоятельно это делать. В сети какого-то COM Reference для Civil 3D мне не удалось найти. Поэтому, у меня появилась идея написать небольшую утилиту, которая могла бы выдавать дамп свойств произвольного объекта. Максимально простую - с запросами и выводами через командную строку. В связи с этим, возникает вопрос: а нет ли где уже готового инструмента для этого? Или может быть, есть возможность раздобыть Civil 3D COM Reference?
Далее, если писать такую утилиту, то:
1. Надо как-то получать объект, который будем исследовать. Больше всего мне нравится идея использовать строковое значение Handle как входной параметр. Получить его можно с помощью команды _LIST, либо через ARXMGD/MGDDBG. Так что, с этим проблем не должно быть.
2. Самое пока непонятное для меня - как организовать получение свойств вложенных объектов? К примеру, у объекта TINSurface надо посмотреть список свойств, найти в нём Statistics, посмотреть список его свойств и найти там Area3D. Запускаем утилиту, в запрос вводим "<Handle>" для TINSurface, выводится дамп его свойств в комстроку, видим там Statistics. Как быть дальше? Есть идея такая: запускаем заново команду и в запрос вводим: "<Handle>.Statistics". Код внутри будет разбивать такую строку и через vlax-get-property запрашивать свойства, отделённые точкой.
Может есть более интересные идеи на этот счёт?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть идея такая: запускаем заново команду и в запрос вводим: "<Handle>.Statistics". Код внутри будет разбивать такую строку и через vla-get-property запрашивать свойства, отделённые точкой.
Идея неплохая, но требует набирать длинный текст, в котором легко ошибиться...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Ну раз Вы одобряете, значит, так тому и быть :)
Как использовать утилиту:

Лисп прикрепляю. Код ниже.
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:getdump (/
  2.                   do$-string-to-list
  3.                   do$-get-string-no-space
  4.                   sel
  5.                   lst
  6.                   ent
  7.                   vlobj
  8.                   prop
  9.                  )
  10.   (defun do$-string-to-list (str del / i rez)
  11.     (while (setq i (vl-string-search del str))
  12.       (setq rez (cons (substr str 1 i) rez)
  13.             str (substr str (+ 1 i (strlen del)))
  14.       ) ;_ end of setq
  15.     ) ;_ end of while
  16.     (reverse (cons str rez))
  17.   ) ;_ end of defun
  18.  
  19.   (defun do$-get-string-no-space (msg / str)
  20.     ;;(do$-get-string-no-space "\n¬ведите значение:")
  21.     (setq
  22.       str (vl-catch-all-apply (function (lambda () (getstring msg))))
  23.     ) ;_ end of setq
  24.     (cond
  25.       ((or (vl-catch-all-error-p str) (= str "")) nil)
  26.       (T str)
  27.     ) ;_ end of cond
  28.   ) ;_ end of defun
  29.  
  30.  
  31.   (vl-load-com)
  32.   (if (and (setq sel (do$-get-string-no-space
  33.                        "Enter handle or handle with properties: "
  34.                      ) ;_ end of do$-get-string-no-space
  35.            ) ;_ end of setq
  36.            (setq ent (handent (car (setq
  37.                                      lst (do$-string-to-list sel ".")
  38.                                    ) ;_ end of setq
  39.                               ) ;_ end of car
  40.                      ) ;_ end of handent
  41.            ) ;_ end of setq
  42.       ) ;_ end of and
  43.     (progn
  44.       (setq vlobj (vlax-ename->vla-object ent))
  45.       (foreach item (cdr lst)
  46.         (if (and (vlax-property-available-p vlobj item)
  47.                  (= (type (setq prop (vlax-get-property vlobj item)))
  48.                     'VLA-OBJECT
  49.                  ) ;_ end of =
  50.             ) ;_ end of and
  51.           (setq vlobj prop)
  52.         ) ;_ end of if
  53.       ) ;_ end of foreach
  54.       (vlax-dump-Object vlobj T)
  55.     ) ;_ end of progn
  56.   ) ;_ end of if
  57. ) ;_ end of defun
  58.