Página 1 de 1

[AUTOLISP] Cómo obtener el código field de todos los atributos de mi bloque.

Publicado: Mar Jun 30, 2020 3:26 am
por Fernix
Hola gente, como están, tengo una consulta sobre un código lisp.

Lo que quisiera hacer con el codigo es que en lugar de obtener los valores de los atributos, obtenga los datos necesarios para insertarlo como un "field".

Paso a mostrar cómo obtengo lo que quiero manualmente:
-Primero en donde lo quiero insertar doy click derecho e insertar campo, objetos y para seleccionar ó CTRL+F
1.png
1.png (8.05 KiB) Visto 7158 veces
-Y acá ya obtengo el código:
3.png
3.png (30.3 KiB) Visto 7158 veces
%<\AcObjProp Object(%<\_ObjId 2768815267232>%).TextString>%
Lo que me gustaria saber es si con lisp hay alguna manera de generar ese código de todos los campos;insertarlo no seria mayor problema pero generarlo es mi duda; para que al cambiar uno de los bloques el otro se actualice automaticamente.

Desde ya muchas gracias, y saludos a todos.

Re: [AUTOLISP] Cómo obtener el código field de todos los atributos de mi bloque.

Publicado: Jue Jul 02, 2020 10:49 am
por javi lapina
No se si te sirve, pero este lisp copia el valor de un atributo a otro atributo, con campo.

Código: Seleccionar todo

;------------------COPIA EL CONTENIDO DE UN atributo y lo pega a otro atributo CON UN CAMPO ----------------
(princ "\nEjecuta la aplicacion con la oreden:  MTB2")
(defun C:MTB2 (/  ename enam data ss)
;;;	pBe Dec2014			;;;
  (while (not
	   (progn
	     (princ "\n<<<Select blocks to process>>>")
	     (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
       (princ "\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)
)
   

;;;		    <<< pBe >>>				;;;
;;; 	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)

Re: [AUTOLISP] Cómo obtener el código field de todos los atributos de mi bloque.

Publicado: Vie Jul 03, 2020 2:51 am
por Fernix
Me sirvio muy util.. aun intento entender esas funciones para poder modificarlo pero de momento me va muy bien.
Consulta rápida, que tan dificil sería meter una pausa en el codigo para poder selecionar bloques (ya que ahora no me estaria siendo posible) que estén en presentaciones diferentes ?

Un saludo.