vlax-property-available-p не работает чем заменить?

Автор Тема: vlax-property-available-p не работает чем заменить?  (Прочитано 4208 раз)

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

Оффлайн alex-63Автор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Почему то не срабатывает функция vlax-property-available-p :
$ curCase
#<VLA-OBJECT IRobotSimpleCase 0000000039ec5588>
_$ (vlax-property-available-p curCase 'Records)
nil
_$ (vlax-dump-object curCase T)
; IRobotSimpleCase: IRobotSimpleCase Interface
; Property values:
;   AnalizeType = 1
;   IsAuxiliary = 0
;   label = "SW"
;   MainMode = 0
;   ModesCount = 0
;   Name = "SW"
;   Nature = 0
;   NatureName (RO) = "постоянная"
;   Number = 1
;   Records (RO) = #<VLA-OBJECT IRobotLoadRecordMngr 0000000039d06b68>
;   TimeStepCount (RO) = 0
;   Type (RO) = 0
;   UniqueId (RO) = 707
; Methods supported:
;   GetAnalysisParams ()
;   GetSeismicCode ()
;   SetAnalysisParams (1)
;   SetNatureExt (1)
T
(vlax-property-available-p curCase 'Records)
nil

Но можно считать свойство
(vlax-get-property curCase 'Records)
#<VLA-OBJECT IRobotLoadRecordMngr 0000000039d13d68>
Не понятны причины. Может кто сталкивался с этой проблемой ? :-\
« Последнее редактирование: 22-04-2020, 10:39:44 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
alex-63,
А для этого объекта остальные свойства возвращаются нормально?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Похоже, объект из вертикалки (возможно, Robot). Не могу сказать, что с ними всегда все было хорошо.
Во-первых, необходимо подгружать соответсвующие ObjectEnabler'ы (и не факт, что они загрузятся автоматом)
Во-вторых, когда я воевал с ADT (нынешний АА), мне приходилось просто "оборачивать" попытки получения свойств в vl-catch-all-apply, если мне не изменяет память.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alex-63Автор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Не могу понять почему свойство есть в окне Inspect или когда использую vlax-dump-object  свойство есть
а в  vlax-property-available-p его нет.
Если удалить все сочетания нагрузки и оставить только отдельные загружения прогамма отработает (тк там records есть). Все свойства доступны для чтения.Но функция vlax-property-available-p всегда возвращает nil, а свойство Records не всегда присутствует.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Как вариант:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun get-prop (obj prop / res)
  2.   (if (and obj
  3.            (= (type obj) 'vla-object)
  4.            (not (vl-catch-all-error-p
  5.                   (setq res (vl-catch-all-apply (function (lambda () (vlax-get-property obj 'prop)))))
  6.                   ) ;_ end of vl-catch-all-error-p
  7.                 ) ;_ end of not
  8.            ) ;_ end of and
  9.     res
  10.     ) ;_ end of if
  11.   ) ;_ end of defun
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alex-63Автор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Похоже помогло.  Только quote убрать  необходимо.
Код - Auto/Visual Lisp [Выбрать]
  1. (defun get-prop (obj prop / res)
  2.       (if (and obj
  3.                (= (type obj) 'vla-object)
  4.                (not (vl-catch-all-error-p
  5.                       (setq res (vl-catch-all-apply (function (lambda () (vlax-get-property obj prop)))))
  6.                       ) ;_ end of vl-catch-all-error-p
  7.                     ) ;_ end of not
  8.                ) ;_ end of and
  9.         res
  10.         nil ;<-------
  11.         ) ;_ end of if ;)
  12.      
  13.       ) ;_ end of defun
  14.  
и nil добавил тк  ret -> наверно может быть объект и поэтому надо дополнительные усилия для анализа. Спасибо ;) всем.
« Последнее редактирование: 22-04-2020, 10:39:03 от Александр Ривилис »

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Да, про апостроф - мой косяк. А вот nil не нужен. res локальная переменная, и на внешние значения влияния не окажет.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alex-63Автор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Позволю с Вами не согласиться т.к get-prop  возвращает  res   с типом <%catch-all-apply-error%> или <VLA-OBJECT IRobotLoadRecordMngr 0000000039d13d68>
и мне кажется (if (setq rec (get-prop obj prop)) (proc1 rec)) proc1 будет выполняться всегда.  Хотя сейчас верить ничему нельзя,  все проверять надо.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Не-а:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun get-prop (obj prop / res)
  2.   (if (and obj
  3.            (= (type obj) 'vla-object)
  4.            (not (vl-catch-all-error-p
  5.                   (setq res (vl-catch-all-apply (function (lambda () (vlax-get-property obj prop)))))
  6.                   ) ;_ end of vl-catch-all-error-p
  7.                 ) ;_ end of not
  8.            ) ;_ end of and
  9.     res
  10.     ) ;_ end of if ;)
  11.   ) ;_ end of defun
  12.  
  13. (defun c:test (/ ent)
  14.   (setq ent (car (entsel "\nВыберите любой примитив : ")))
  15.   (foreach prop (vl-sort '("length" "visible" "width" "coordinates") (function <))
  16.     (princ (strcat "\n"
  17.                    (cdr (assoc 0 (entget ent)))
  18.                    "; Property = "
  19.                    prop
  20.                    "; Value = "
  21.                    (vl-princ-to-string (get-prop (vlax-ename->vla-object ent) prop))
  22.                    ) ;_ end of strcat
  23.            ) ;_ end of princ
  24.     ) ;_ end of foreach
  25.   (princ)
  26.   ) ;_ end of defun
И результат выполнения:
Выберите любой примитив :
ACAD_TABLE; Property = coordinates; Value = nil
ACAD_TABLE; Property = length; Value = nil
ACAD_TABLE; Property = visible; Value = :vlax-true
ACAD_TABLE; Property = width; Value = 317.5

Command: TEST

Выберите любой примитив :
CIRCLE; Property = coordinates; Value = nil
CIRCLE; Property = length; Value = nil
CIRCLE; Property = visible; Value = :vlax-true
CIRCLE; Property = width; Value = nil

Command:  TEST

Выберите любой примитив :
LWPOLYLINE; Property = coordinates; Value = #<variant 8197 ...>
LWPOLYLINE; Property = length; Value = 230.486
LWPOLYLINE; Property = visible; Value = :vlax-true
LWPOLYLINE; Property = width; Value = nil
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alex-63Автор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Действительно  vl-catch-all-apply  возвращает nil.
Хотя в документации черным по белому написано “Return Values
The result of the function call, if successful. If an error occurs, vl-catch-all-apply returns an error object.”
Наверно это на совести тех кто создает com модель (те будет ли исключение  ошибка или нет) .

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Тут надо смотреть вместе с vl-catch-all-error-p
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!