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

dudas y consultas sobre AutoCad

Moderador: Moderadores

Responder
Fernix
En prácticas
Mensajes: 2
Registrado: Mar Jun 30, 2020 3:05 am

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

Mensaje por Fernix » Mar Jun 30, 2020 3:26 am

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 162 veces
-Y acá ya obtengo el código:
3.png
3.png (30.3 KiB) Visto 162 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.

Avatar de Usuario
javi lapina
Calcador
Mensajes: 34
Registrado: Sab Abr 14, 2018 7:33 pm
Contactar:

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

Mensaje por javi lapina » Jue Jul 02, 2020 10:49 am

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)
Master en AutoCad y sigo aprendiendo.....

Fernix
En prácticas
Mensajes: 2
Registrado: Mar Jun 30, 2020 3:05 am

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

Mensaje por Fernix » Vie Jul 03, 2020 2:51 am

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.

Responder