Тема: error: ActiveX Server returned an error: Неверный индекс

Данный лисп выдает в некоторых файлах ошибку,а вдругих корректно создает список атрибутов блоков вида
((1("таг1"."значение")("таг2"."значение"))
(1("таг "."значение")("таг2"."значение")))

(defun make_bd ( / adoc att att_list bd)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vlax-for i (vla-get-blocks adoc)
    (vlax-for sub_item (vla-item (vla-get-blocks adoc) (vla-get-name i))
      (if (vlax-property-available-p sub_item 'hasattributes)
    (foreach sub_item
          (foreach att (vlax-safearray->list(vlax-variant-value (vla-getattributes sub_item)))
        (setq att_list
            (cons(cons (vla-get-tagstring att)
                       (vla-get-textstring att))att_list)))
      (if(not(null att_list))
             (progn(setq bd (cons (cons 1 att_list)bd))(setq att_list nil)))))))bd)

В чем проблема, подскажите. Если надо вышлю файлы.

Re: error: ActiveX Server returned an error: Неверный индекс

> GADFly
Если очень грубо, то где-то так:

(defun make_bd ( / adoc att att_list bd)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vlax-for i (vla-get-blocks adoc)
    (vlax-for j i
      (if (eq (vla-get-objectname j) "AcDbAttributeDefinition")
(progn
      (setq att_list
            (cons (cons (vla-get-tagstring j)
                       (vla-get-textstring j))att_list))
         (setq bd (cons (cons 1 att_list) bd)) (setq att_list nil))))) bd )

~'J'~

Re: error: ActiveX Server returned an error: Неверный индекс

[Re:] Олег(jr.) (2005-12-07 10:42:17)
Твой lisp работает, но немного не так.А как изменить не могу дотумкать.Подскажи обиженному умишком.
Твой:((("MARK" . "Ï37-28-222")) (("VOLUME" . "1.53")) (("ALBUM" . "ÈÆ 1-3 ë.15")) (("CONCRETE" . "B25")) (("MARK" . "Ï37-28-1")) (("VOLUME" . "1.64")) (("ALBUM" . "ÈÆ 1-3 ë.14")) (("CONCRETE" . "B25")))
Мой:((("MARK" . "Ï37-28-2") ("VOLUME" . "1.53") ("ALBUM" . "ÈÆ 1-3 ë.15") ("CONCRETE" . "B25")) (("MARK" . "Ï37-28-1") ("VOLUME" . "1.64") ("ALBUM" . "ÈÆ 1-3 ë.14") ("CONCRETE" . "B25")))

(defun make_bd ( / adoc att att_list bd)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vlax-for i (vla-get-blocks adoc)
    (vlax-for sub_item (vla-item (vla-get-blocks adoc) (vla-get-name i))
      (if (vlax-property-available-p sub_item 'hasattributes)
    (foreach sub_item
          (foreach att (vlax-safearray->list(vlax-variant-value (vla-getattributes sub_item)))
        (setq att_list
            (cons(cons (vla-get-tagstring att)
                       (vla-get-textstring att))att_list)))
      (if(not(null att_list))
             (progn(setq bd(vl-remove att_list bd))
               (setq bd (cons att_list bd))
               (setq att_list nil)))))))bd)

Re: error: ActiveX Server returned an error: Неверный индекс

> GADFly
Не расстраивайся
Твоя функция по определению не может ни в каком случае
возвращать список. Во-первых (vla-get-blocks adoc) есть
коллекция вхождений блоков в рисунок, поэтому ни у одного объекта
коллекции не может быть свойства Hasattributes, это свойство может
быть только у вставки этого блока
Во-вторых ни у одного объекта не может быть метода Getattributes,
этот метод применим тоже только к вставке блока
Все это легко проверить, чтобы не тратить время напрасно с помощью
функции vlax-dump-object (золотое правило), например :

(vlax-dump-object (vla-item (vla-get-blocks adoc) "МойБлок") T)


или узнать свойства и методы сразу всех вхождений блока :

(vlax-map-collection (vla-get-blocks adoc)
              (function (lambda (x)
                (vlax-dump-object x T))))


и я тебя уверяю, ты сразу увидишь подтверждение моим словам
Поэтому, то что я предложил и есть правильное решение, единственно,
что можно добавить, это проверку на валидность (validity), т.е.
отсечь вкладку модели и вкладки листа, которые тоже являются
вхождениями блока, а также вхождения внешних ссылок (Xref) :

(defun make_bd ( / adoc att att_list bd)
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vlax-for i (vla-get-blocks adoc)
    (vlax-for j i
      (if (and (eq (vla-get-islayout i) :vlax-false); если блок не является вкладкой рисунка или листа
          (eq (vla-get-isxref i) :vlax-false); если блок не является внешней ссылкой
          (vlax-read-enabled-p i); если блок читабелен
      (eq (vla-get-objectname j) "AcDbAttributeDefinition"); если субобъект является определением атрибута
        );_and
      (progn
          (setq att_list
          (cons (cons (vla-get-tagstring j)
                      (vla-get-textstring j)) att_list))
          (setq bd (cons (cons 1 att_list) bd))
      (setq att_list nil)))))
        bd
        )
          ; TesT : (setq data (make_bd))

~'J'~

Re: error: ActiveX Server returned an error: Неверный индекс

> Олег(jr.)
Не много изменилась задача:не нужны единицы.
Но это мелочи.Важно вот что:
мой лисп(кстати, он работает, но не во всех чертежах.Может быть дело в проверках,не знаю.Но когда удаляешь все размеры-начинает работать.)выдает результат вида
((таги и значения блока1)(...блока2))
А твой
(таги и значения блоков)

Re: error: ActiveX Server returned an error: Неверный индекс

> GADFly
Единственно что мне жаль это моего потраченного времени, тебе даже выделил текст, и все напрасно, так что я умываюсь

Re: error: ActiveX Server returned an error: Неверный индекс

> [Re:] Олег(jr.)
Оно конечно легче...

Во-первых (vla-get-blocks adoc) есть
коллекция вхождений блоков в рисунок, поэтому ни у одного объекта
коллекции не может быть свойства Hasattributes, это свойство может
быть только у вставки этого блока

(vlax-for [b] sub_item  [/b]
(vla-item (vla-get-blocks adoc) (vla-get-name i))
(if (vlax-property-available-p[b] sub_item [/b]'hasattributes)