Копировать содержимое атрибута из одного блока в другой с сохранением "поля"

Olga94
отредактировано 30 Jun Раздел: API

Здравствуйте,

есть блок с разными атрибутами, в одном из которых "поле", например, имя текущего файла, либо в содержимом атрибута может быть "какой-то текст + поле".

Подскажите пожалуйста как кодом lisp скопировать содержимое такого атрибута в другой атрибут, сохранив поле (*id объекта должно поменяться на новый целевой блок)?

Код ниже позволяет скопировать содержимое всех атрибутов с одного блока в другой с полем, но проблема в том, что ObjectId передается с исходного блока, а нужно чтобы это был id целевого блока (*в который копируем).

(defun C:MTB2 (/ ename enam data ss)
(while (not
(progn
(prompt "\nSelect Source Block:")
(setq ename (ssget "_:S:E" '((0 . "INSERT") (66 . 1))))
)
)
(princ "\nInvalid or null selection")
)
(cond
((and
(setq enam (ssname ename 0))
(setq data (
FieldsVal enam t nil));<-- Get Mode & Fields mode
(prompt "\n<<<Select blocks to process>>>")
(setq ss (ssget "
:L" '((0 . "INSERT") (66 . 1))))
(repeat (setq i (sslength ss))
(_FieldsVal (ssname ss (setq i (1- i))) nil data);<-- Set Mode
)
)
)
)
(vla-regen (vla-get-ActiveDocument (vlax-get-acad-object))
acActiveViewport
)
(princ)
)
;;; Subfunction to Attribute Set/Get Fields/TEXT ;;;
;;; blk = The attribute block ;;;
;;; mode = T for Field Values ;;;
;;; = nil for String Values ;;;
;;; lst = If supplied, function in Set Mode ;;;
;;; = nil for Get Mode ;;;

(defun _FieldsVal (blk mode lst / m f)
(setq f (if mode
(lambda (e)
(strcat "%<\AcObjProp Object(%<\_ObjId "
(itoa (vla-get-ObjectId e))
">%).TextString>%")
)
(lambda (e) (vla-get-textstring e))
)
)
(mapcar '(lambda (at)
(if lst
(if (setq m (assoc (vla-get-tagstring at) lst))
(vla-put-textstring at (cadr m))
)
(list (vla-get-tagstring at) (f at))
)
)
(vlax-invoke (vlax-ename->vla-object blk) 'Getattributes)
)
)
;;; End of _FieldsVal ;;;

(vl-load-com)

Тэги темы:

Ответы

  • Сделала с заменой ObjId