AutoCAD Numerar automáticamente objetos

Hola a todos.
He tenido la oportunidad de ver algunos tutoriales de cómo numerar automáticamente objetos en AutoCAD y lo he intentado con bloques dinámicos, y con el comando Tcount, pero no he podido resolver lo que realmente me interesa. Tengo la siguiente duda:
¿Hay alguna manera que esta numeración se modifique automáticamente, al eliminar un elemento?, es decir, tengo diez elementos, pero si, por ejemplo, elimino el elemento 04, ¿existe la posibilidad que se vuelvan a ajustar la numeración de todos los elementos, por ejemplo, el que era el detector nº 10 pase a ser el nº 09, y el nº 05 se convierta en el nº 04, ya que se eliminó uno de la lista?

Muchas gracias.
 

ADAM

Diamante
Sí que se podría hacer, con alguna rutina LISP, pero no de forma automática al eliminar un elemento, sino ejecutando la rutina después de eliminar un elemento. Ese elemento tendría que ser un bloque con atributos.

Yo tengo algo parecido para "compactar" las referencias de carpintería.
Tengo creados bloques de carpintería que, al insertarse, insertan también un bloque con tres textos: la referencia, el tipo y la medida. Atributos que tiene ya predefinidos cada bloque (que, en realidad, es un dibujo externo en otro directorio).
Obviamente, en ningún dibujo inserto todos los tipos que tengo, así que me quedan numeraciones no correlativas en la tabla resumen: P1, P5, P7, V2, V13...
Y tengo una rutina que va "buscando" los números después de cada letra y los edita para que queden correlativos.

Supongo que también se podría hacer algo parecido a lo que tú quieres, restando una unidad en lugar de renumerando desde 1.
Pero no se me ocurre otra manera que no sea con LISP. ¿Te manejas algo en AutoLISP?
 
@ADAM, creo que podría intentarlo con AutoLISP, aunque para ser sincera no conozco mucho de estas rutinas, lo intenté con un tutorial para realizar lo mismo que comentábamos, pero no obtuve el resultado que esperaba. Me gustaría probar lo que me comentabas.
Si es posible, ¿me pudieras ayudar con la rutina LISP que utilizas para que los números después de cada letra queden editados y sean correlativos?
¡Gracias!
 
¡Hola de nuevo!
Ahora con la siguiente duda. Ya logré que cada uno de los bloques en mi plano se numeren automáticamente, pero la cuestión es la siguiente:
Tengo bloques de diferentes ingenierías/instalaciones y para cada uno de ellos realicé una rutina LISP. ¿Hay opción de que en un sólo archivo de AutoCAD se carguen todas esas rutinas o, forzosamente, sólo se debe cargar una rutina? La verdad es la primera vez que trabajo con ellas.
¡Gracias!
 

ADAM

Diamante
No puedes utilizar la misma rutina para dos tipos diferentes de bloques.
Y tampoco puedes cargar esa misma rutina dos veces dentro de la misma sesión de dibujo, si sólo modificas en cada una de ellas los parámetros que indican en las instrucciones.
Esas rutinas tienen variables locales que utilizan mientras se están ejecutando. En este caso, durante toda la sesión de dibujo si quieres, mientras no utilices el comando que las cierra.
Y supongo (1) que también hay subprocesos en ejecución mientras no se cierra la rutina, que son los que hacen que se cambien los textos de forma automática.
Si dos rutinas utilizaran las mismas variables y subprocesos, harían cosas imprevisibles. O quizá nada... error directamente.
Habría que replicar la rutina, cambiando todos los nombres de expresiones, variables... Laborioso, aunque posible.

(1) No entiendo nada de Visual LISP, sólo un poco de AutoLISP, pero he estado viendo la estructura de la rutina y hay bastantes cosas comunes. Una de ellas es la declaración de variables propias suyas al final de cada instrucción (defun.
 

ADAM

Diamante
¿me pudieras ayudar con la rutina LISP que utilizas para que los números después de cada letra queden editados y sean correlativos?
Hola, perdona por no haber contestado antes, pero no había visto este mensaje.
Aunque @miguel_pm ya te ha puesto el enlace de una rutina bastante más potente que la que yo te decía, te la pongo aquí, por si te puede ser útil. Si tantos bloques diferentes tienes, quizá te pueda ser útil para "pasarla" una vez que hayas terminado de trabajar con ellos, si te quedan con la numeración desordenada.

(defun ciclo ( / conj num conjb numb n1 ctrl)
(setq conj (ssadd)) (setq ctrl T)
(setq conj (ssget "X" (list (cons 0 "INSERT") (cons 2 "REFGEN")))
conjb (ssget "X" (list (cons 0 "INSERT") (cons 2 "REFGEN2")))
)
(if (/= conjb nil)
(progn (setq numb (sslength conjb)) (setq n1 0)
(repeat numb
(ssadd (ssname conjb n1) conj)
(setq n1 (+ n1 1))
)
)
)
(if (= conj nil)
(alert "NO HAY REFERENCIAS DE CARPINTERIA")
(progn (setq num (sslength conj))
(while ctrl
(sel2)
(setq num (sslength conj))
(if (= num 0)
(setq ctrl nil)
)
)
)
)
)
(defun sel2 ( / n2 conj1 entc ent1 ent1b ident)
(setq n2 0) (setq conj1 (ssadd)) (setq num (sslength conj))
(if (= num 1)
(progn (setq entc (ssname conj 0))
(act2)
(ssdel entc conj)
)
(progn (setq ent1 (ssname conj n2))
(ssadd ent1 conj1) (ssdel ent1 conj)
(setq ent1b (entnext ent1))
(setq ident (substr (cdr (assoc 1 (entget ent1b))) 1 1))
(repeat (- num 1)
(setq ent1 (ssname conj n2))
(setq ent1b (entnext ent1))
(if (= ident (substr (cdr (assoc 1 (entget ent1b))) 1 1))
(progn (ssadd ent1 conj1)
(ssdel ent1 conj) (setq n2 (- n2 1))
)
)
(setq n2 (+ n2 1))
)
(act1)
)
)
)
(defun act1 ( / num1 n3 n4 n5 ctrl2 entcb tipoc tipo ent2 ent2b conj2)
(setq num1 (sslength conj1)) (setq ctrl2 T) (setq n5 1)
(while ctrl2
(setq n3 0)
(setq entc (ssname conj1 n3)) (setq entcb (entnext entc))
(setq tipoc (atoi (substr (cdr (assoc 1 (entget entcb)))
2 (strlen (cdr (assoc 1 (entget entcb))))
)
)
)
(repeat num1
(setq ent2 (ssname conj1 n3)) (setq ent2b (entnext ent2))
(act4)
(if (< tipo tipoc)
(progn (setq entc ent2)
(setq tipoc tipo)
)
)
(setq n4 0)
(repeat num1
(setq ent2 (ssname conj1 n4)) (setq ent2b (entnext ent2))
(act4)
(if (< tipo tipoc)
(progn (setq entc ent2)
(setq tipoc tipo)
)
)
(setq n4 (+ n4 1))
)
(setq n3 (+ n3 1))
)
(setq n3 0) (setq conj2 (ssadd))
(repeat num1
(setq ent2 (ssname conj1 n3)) (setq ent2b (entnext ent2))
(if (= (cdr (assoc 1 (entget ent2b))) (cdr (assoc 1 (entget (entnext entc)))))
(progn (ssadd ent2 conj2)
(ssdel ent2 conj1) (setq n3 (- n3 1))
)
)
(setq n3 (+ n3 1))
)
(act3)
(setq n5 (+ n5 1))
(setq num1 (sslength conj1))
(if (= num1 0)
(setq ctrl2 nil)
)
)
)
(defun act2 ()
(setq entcb (entnext entc))
(setq tipo (atoi (substr (cdr (assoc 1 (entget entcb)))
2 (strlen (cdr (assoc 1 (entget entcb))))
)
)
)
(if (/= tipo 1)
(progn (entmod (subst (cons 1 (strcat (substr (cdr (assoc 1 (entget entcb))) 1 1) "1"))
(assoc 1 (entget entcb))
(entget entcb)
)
)
(entupd entcb)
)
)
)
(defun act3 ( / ctrl3 num2 ent3 ent3b n6)
(setq n6 0) (setq ctrl3 T)
(setq num2 (sslength conj2))
(setq ent3 (ssname conj2 0)) (setq ent3b (entnext ent3))
(setq tipo (atoi (substr (cdr (assoc 1 (entget ent3b)))
2 (strlen (cdr (assoc 1 (entget ent3b))))
)
)
)
(if (/= tipo n5)
(repeat num2
(setq ent3 (ssname conj2 n6)) (setq ent3b (entnext ent3))
(entmod (subst (cons 1 (strcat (substr (cdr (assoc 1 (entget ent3b))) 1 1)
(itoa n5)
)
)
(assoc 1 (entget ent3b))
(entget ent3b)
)
)
(entupd ent3b)
(setq n6 (+ n6 1))
)
)
)
(defun act4 ()
(setq tipo (atoi (substr (cdr (assoc 1 (entget ent2b)))
2 (strlen (cdr (assoc 1 (entget ent2b))))
)
)
)
)
(defun c:inicio ()
(setvar "cmdecho" 0)
(ciclo)
(setvar "cmdecho" 1) (prin1)
)

He remarcado en color rojo los nombres de los bloques que tienes que buscar y editar, que en mi caso son dos. No pasa nada si sólo está en el dibujo uno de ellos.
Hay que editarlo y poner (en lugar de "refgen") el nombre de bloque que tú quieras (y entre comillas). De "refgen2" no hagas caso.

Puedes utilizar esta rutina con los diferentes tipos de bloques que tengas, siempre que incluyan un atributo.
Tiene la limitación de que el atributo ha de tener un formato preciso, con una sola letra antes del número. Y los dígitos de cada número son variables, no escribe 01, 02... sino 1, 2... 10, 11...

Para utilizarla con diferentes bloques, puedes sustituir "refgen" por una variable, por ejemplo blq (sin comillas).
Y teclear la siguiente secuencia: (setq blq "nombre_de_tu_bloque")(load"nombre_de_tu_rutina")(inicio)
(Esto se puede automatizar e incluirlo en el menú, pero no vamos a entrar ahora en eso).

EDITO: en la ventana de código, no se han remarcado en color rojo los nombres de los bloque a editar. Están en las líneas 3 y 4.
 
Buenos días @SindyOlvera, también tengo que numerar detectores y el hacerlo manual es muy laborioso.
He leído vuestros comentarios pero me pierdo. ¿Podrías poner o enviarme la rutina que utilizas finalmente?
En mi caso tengo que poner Lx/Mxx, las x son números que varían.

Muchas gracias.
 
Arriba