Тема: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

Посмотрите пожалйста на этот код. Почему вот в этой строчке (vlax-safearray->list XDataType) Лисп ругается. Что не так то?

(defun c:con ()
  (vl-load-com)
  (setq old_echo (getvar "CMDECHO"))
  ;Получение указателя на объект AutoCADа
  (setq acad_object (vlax-get-acad-object))
  ;Получение указателя на приложение
  (setq acad_app (vla-get-application acad_object))
  ;Получение указателя на активный документ
  (setq active_doc (vla-get-activedocument acad_app))
  ;(vlax-dump-object acad_app)
  ;Получение указателя на текущий Стиль
  (setq family_style (vla-get-DimStyles active_doc))
  (vlax-dump-object family_style)
  (setq cnt (vla-get-count family_style) i 0)
  (while (< i cnt)
    (print "***************************************")
    (setq family_style_i (vla-item family_style i))
    (vlax-dump-object family_style_i 1)
    (vla-getXData family_style_i "" 'XDataType 'XDataValue)
    (vlax-safearray->list XDataType)
    (setq i (1+ i))
  );while |;
  (setvar "CMDECHO" old_echo)
  (princ)
)

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

Проверяй верхнюю границу safearray: https://www.caduser.ru/forum/topic28996.html

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

А зачем проверять границу массива, если все функции типа safearray вообще не воспринимают XDataType. Будьте добры, поясните, пожалуйста!

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

Если расширенных данных у объекта нет, то
(vla-getXData family_style_i "" 'XDataType 'XDataValue)
ничего не поместит в переменные xdatatype и xdatavalue. И соответственно:
(vlax-safearray->list XDataType)
вернет ругательство:
; error: bad argument type: safearrayp nil

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

Хе, а они там есть? В размерных стилях-то? По-моему, их там нет. Проверка на существование:

(defun c:con (/ adoc 'xtype 'xvalue)
  (vl-load-com)
  (setq    adoc      (vla-get-activedocument (vlax-get-acad-object))
    dimstyles (vla-get-dimstyles adoc)
    ) ;_ end of setq
  (vlax-for style dimstyles
    (vla-getxdata style vlax-vbnull 'xtype 'xvalue)
    (if    (and xtype xvalue)
      (princ (strcat "\nДля стиля " (vla-get-name style) " нет XData"))
      ) ;_ end of if
    ) ;_ end of vlax-for
  ) ;_ end of defun

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

В предыдущем коде ошибок как у дурака фантиков. Вроде как подправленный вариант:

(defun c:con (/ adoc xtype xvalue)
  (vl-load-com)
  (setq    adoc      (vla-get-activedocument (vlax-get-acad-object))
    dimstyles (vla-get-dimstyles adoc)
    ) ;_ end of setq
  (vlax-for style dimstyles
    (vla-getxdata style "" 'xtype 'xvalue)
    (if    (and xtype xvalue)
      (princ (strcat "\nДля стиля " (vla-get-name style) " нет XData"))
      ) ;_ end of if
    ) ;_ end of vlax-for
  ) ;_ end of defun

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

Дело в том, что в этих стилях написано при выводе методов GetXData(3). Ведь 3 чего-то значит. Я так полагаю, что 3 означает количество расширенных данных. Или я ошибаюсь?

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

> Julick
Вроде бы числа при методах показывают количество аргументов принимаемых этими самыми методами.

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

Благодаря коду проверки (кстати спасибо) выяснилось, данные есть. Но в принципе их не могло не быть. Тогда в чем проблема то?

Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?

Благодаря коду проверки (кстати спасибо) выяснилось, данные есть

KpbIc здесь опять поторопился (все с точностью до наоборот):

 (if  (and xtype xvalue)
      (princ (strcat "\nДля стиля " (vla-get-name style) " нет XData"))
      ) ;_ end of if

Но в принципе их не могло не быть.

Вопрос: А кто их туда прицепил? По умолчанию их там быть не должно.
Всвязи с отсутствием РД переменная XDataType имеет значение nil.Отсюда и ошибка.
Замечания по Вашему коду
1.Вы не используете встроенные автокадовские команды -отключать cmdecho нет смысла.
2.(vla-get-application acad_object) и (vlax-get-acad-object) это одно и тоже.
3.Семейства обрабатываются функцией vlax-for без ввода лишних переменных (i,cnt)
4.Какой смысл использования функции vlax-dump-object ?