Перейти к содержимому


vlax-invoke работает как-то не так

vlax-invoke lee-mac

Сообщений в теме: 3

#1 Антон Николаевич

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 02 Декабрь 2017 - 23:02

Есть такая функция от Lee Mac, которая устанавливает аттрибут блока
;; Set Attribute Value  -  Lee Mac
;; Sets the value of the first attribute with the given tag found within the block, if present.
;; blk - [vla] VLA Block Reference Object
;; tag - [str] Attribute TagString
;; val - [str] Attribute Value
;; Returns: [str] Attribute value if successful, else nil.
(defun LM:vl-setattributevalue ( blk tag val )
	(setq tag (strcase tag))
	(vl-some
	   '(lambda ( att )
			(if (= tag (strcase (vla-get-tagstring att)))
				(progn (vla-put-textstring att val) val)
			)
		)
		(vlax-invoke blk 'getattributes)
	)
)

При попытке использовать её под:
nanoCAD 8.1.3712.2221 - ДЕМО-РЕЖИМ
Сборка 3574
Выдает ошибку:
ошибка: неверный тип аргумента: LISTP: #<variant 8204 ...>
В процессе выполнения имеем такие значения:
blk=#<VLA-OBJECT IAcadBlockReference 000000003ECE0400>
vlax-invoke=#<variant 8204 ...>
Под автокадом 2011 имеем такие значения:
blk=#<VLA-OBJECT IAcadBlockReference2 000000000f8ac198>
vlax-invoke=(#<VLA-OBJECT IAcadAttributeReference 000000000fc990c8> #<VLA-OBJECT IAcadAttributeReference 000000000fc991f8>)
Видно, что автокад выдает какой-то список, который потом попадает в vl-some, а вот нанокад так почему-то не делает, вместо этого он выдает вариант, и vl-some это не нравится, объясните, пожалуйста, что не так.

#2 ISL

    Клуб разработчиков

  • nanoSoft
  • PipPipPipPip
  • 361 сообщений
  • Пол:Мужчина
  • Город:Москва
  • Интересы:Разработка САПР

Отправлено 08 Декабрь 2017 - 12:43

nanoCAD возвращает Variant, в котором массив Variant-ов c vla-объектами.

Вытащить vla-объекты можно при помощи следующего кода:

(vl-load-com)
(defun get_attr ( / e vle var arr i count lst)
  (setq e (car (entsel)))
  (setq vle (vlax-ename->vla-object e))
  (setq var (vla-getattributes vle))
  (setq arr (vlax-variant-value var))
  (setq list_vars (vlax-safearray->list arr))
  (setq
	i 0
	count (length list_vars)
	lst nil
  )
  (while (< i count)
	(setq lst (append (list (vlax-variant-value (nth i list_vars))) lst))
	(setq i (1+ i))
  )
  lst
)

Пишешь приложения под САПР на С++, .NET, COM, Lisp? Вступай в Клуб разработчиков nanoCAD.

#3 Антон Николаевич

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 12 Декабрь 2017 - 21:22

Просмотр сообщенияISL (08 Декабрь 2017 - 12:43) писал:

  (setq
	i 0
	count (length list_vars)
	lst nil
  )
  (while (< i count)
	(setq lst (append (list (vlax-variant-value (nth i list_vars))) lst))
	(setq i (1+ i))
  )
  lst
)
Большое спасибо за ответ! Но когда я вижу такой код, мне становится плохо. Пожалуйста не обижайтесь, но это же лисп, черт возьми, нельзя на нем так писать!

Весь приведенный выше код, переведенный на нормальный лисп будет выглядеть так:
(mapcar 'vlax-variant-value list_vars)
И все!

#4 ISL

    Клуб разработчиков

  • nanoSoft
  • PipPipPipPip
  • 361 сообщений
  • Пол:Мужчина
  • Город:Москва
  • Интересы:Разработка САПР

Отправлено 13 Декабрь 2017 - 11:50

Кто ж спорит, нет предела совершенству, а копипаст -- зло, даже копипаст работающего кода.
Пишешь приложения под САПР на С++, .NET, COM, Lisp? Вступай в Клуб разработчиков nanoCAD.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей