Aquellos que conocen programas de dibujo como AutoCAD o MicroStation deben saber que podemos realizar pequeñas personalizaciones o comandos personalizados, que pueden llegar a ser muy útiles y acelerar bastante el trabajo, pudiendo incluso hasta automatizar algunas tareas manuales rutinarias. Para hacer estos programas y comandos podemos utilizar el Editor de Visual Basic, y programar en VBA, hay un montón de ejemplos en la web de VBA. En el caso particular de AutoCAD podemos programar también en AutoLISP, LISP es un lenguaje de programación de alrededor de los 60 (si mal no recuerdo) que se basa en paréntesis, y que es muy potente para algunas cosas, sobre todo para funciones recursivas. AutoCAD adoptó una versión del lenguaje llamada AutoLISP, podemos acceder al compilador a través del menu tools/AutoLISP/Visual LISP Editor, incluso AutoCAD tiene unos ejemplos y tutoriales muy buenos de este lenguaje.
Este ejemplo está hecho en Visual LISP, es bastante sencillo, lo único que hace es buscar todas las polilíneas del dibujo, e insertar un texto que dice el layer en el cuál está dibujada la polilínea en el su punto inicial.
(defun insertartexto (pto texto layer) ;función que inserta el texto
(if (= (tblsearch "LAYER" layer) nil)
(command "_LAYER" "_N" layer "_C" 3 layer "")
)
(setq x (car pto))
(setq y (car(cdr pto)))
(setq z 0.0)
;(setq z (car(cdr (cdr pto))))
(setq tx (cons '(73 . 0) tx ))
(setq tx (cons '(100 . "AcDbText") tx ))
(setq tx (cons '(210 0.0 0.0 1.0) tx ))
(setq tx (cons '(11 0.0 0.0 0.0) tx ))
(setq tx (cons '(72 . 0) tx ))
(setq tx (cons '(71 . 0) tx ))
(setq tx (cons '(7 . "STANDARD") tx ))
(setq tx (cons '(51 . 0.0) tx ))
(setq tx (cons '(41 . 1.0) tx ))
(setq tx (cons '(50 . 0.0) tx ))
(setq tx (cons (cons 1 texto) tx ))
(setq tx (cons '(40 . 1.5) tx ))
(setq tx (cons (list 10 x y z) tx ))
(setq tx (cons '(100 . "AcDbText") tx ))
(setq tx (cons '(6 . "Continuous") tx ))
(setq tx (cons (cons 8 layer) tx ))
(setq tx (cons '(410 . "Model") tx ))
(setq tx (cons '(67 . 0) tx ))
(setq tx (cons '(100 . "AcDbEntity") tx ))
(setq tx (cons '(5 . "F290") tx ))
(setq tx (cons '(0 . "TEXT") tx ))
(entmake tx)
(setq tx nil)
)
;==============================================================================
(defun c:test()
(setq conj (ssget "x" '((0 . "LWPOLYLINE")))) ;Selecciona todas las polilíneas del dibujo
(if (= conj nil)
(progn
(alert "\nNo se encuentra ninguna polilínea en el dibujo")
(exit)
)
)
(setq lar (sslength conj) no 0)
(while (< no lar)
(setq ent (ssname conj no)) ;Selecciona una polilínea
(setq pto (cdr (assoc 10 (entget ent)))) ;Obtiene el primer punto de la Polilínea
(setq txt (cdr (assoc 8 (entget ent)))) ;Obtiene el nombre del layer de la polilínea
(insertartexto pto txt "0" ) ;Llama a la función que inserta el texto
(setq no (+ 1 no))
)
)
El ejemplo tiene una función que se encarga de generar una entidad texto e insertarla, la función insertartexto recibe como parámetros el punto de inserción del texto, la cadena (el texto en si que vamos a ver) y el nombre del layer en el cual se va a insertar el texto. Si bien este ejemplo quizás es un poco avanzado para alguien que recién comienza la idea es mostrar una función un poco más profunda, ya que ejemplos simples hay en el tutorial de AutoCAD.
Breve descripción: primero hay que cargar el comando ya sea a través del comando load (si tenemos todo el código en un txt) o tipeandolo en el editor VisualLisp y usando el boton load active window .Una vez que tenemos el comando en memoria para ejecutarlo hay que tipear test.
Lo primero que hace es un conjunto con todas las polilíneas del dibujo mediante la función ssget, luego con sslength obtenemos el largo de este conjunto, establecemos un contador en cero y con un bucle while recorremos una por una las polilíneas del conjunto, asignando la actual a una variable llamada ent a través de la función ssname. De la polilínea actual obtenemos el nombre del layer y su primer punto, luego llamamos a la función insertartexto mandandole como parametros el punto de inserción, el texto en si y el layer en el que se va a insertar.
La función insertartexto utiliza entmake para generar el texto, previamente cargamos todos sus atributos en una lista. Cualquier duda o por algún otro ejemplo del tema pueden escribir acá.
Este ejemplo está hecho en Visual LISP, es bastante sencillo, lo único que hace es buscar todas las polilíneas del dibujo, e insertar un texto que dice el layer en el cuál está dibujada la polilínea en el su punto inicial.
(defun insertartexto (pto texto layer) ;función que inserta el texto
(if (= (tblsearch "LAYER" layer) nil)
(command "_LAYER" "_N" layer "_C" 3 layer "")
)
(setq x (car pto))
(setq y (car(cdr pto)))
(setq z 0.0)
;(setq z (car(cdr (cdr pto))))
(setq tx (cons '(73 . 0) tx ))
(setq tx (cons '(100 . "AcDbText") tx ))
(setq tx (cons '(210 0.0 0.0 1.0) tx ))
(setq tx (cons '(11 0.0 0.0 0.0) tx ))
(setq tx (cons '(72 . 0) tx ))
(setq tx (cons '(71 . 0) tx ))
(setq tx (cons '(7 . "STANDARD") tx ))
(setq tx (cons '(51 . 0.0) tx ))
(setq tx (cons '(41 . 1.0) tx ))
(setq tx (cons '(50 . 0.0) tx ))
(setq tx (cons (cons 1 texto) tx ))
(setq tx (cons '(40 . 1.5) tx ))
(setq tx (cons (list 10 x y z) tx ))
(setq tx (cons '(100 . "AcDbText") tx ))
(setq tx (cons '(6 . "Continuous") tx ))
(setq tx (cons (cons 8 layer) tx ))
(setq tx (cons '(410 . "Model") tx ))
(setq tx (cons '(67 . 0) tx ))
(setq tx (cons '(100 . "AcDbEntity") tx ))
(setq tx (cons '(5 . "F290") tx ))
(setq tx (cons '(0 . "TEXT") tx ))
(entmake tx)
(setq tx nil)
)
;==============================================================================
(defun c:test()
(setq conj (ssget "x" '((0 . "LWPOLYLINE")))) ;Selecciona todas las polilíneas del dibujo
(if (= conj nil)
(progn
(alert "\nNo se encuentra ninguna polilínea en el dibujo")
(exit)
)
)
(setq lar (sslength conj) no 0)
(while (< no lar)
(setq ent (ssname conj no)) ;Selecciona una polilínea
(setq pto (cdr (assoc 10 (entget ent)))) ;Obtiene el primer punto de la Polilínea
(setq txt (cdr (assoc 8 (entget ent)))) ;Obtiene el nombre del layer de la polilínea
(insertartexto pto txt "0" ) ;Llama a la función que inserta el texto
(setq no (+ 1 no))
)
)
El ejemplo tiene una función que se encarga de generar una entidad texto e insertarla, la función insertartexto recibe como parámetros el punto de inserción del texto, la cadena (el texto en si que vamos a ver) y el nombre del layer en el cual se va a insertar el texto. Si bien este ejemplo quizás es un poco avanzado para alguien que recién comienza la idea es mostrar una función un poco más profunda, ya que ejemplos simples hay en el tutorial de AutoCAD.
Breve descripción: primero hay que cargar el comando ya sea a través del comando load (si tenemos todo el código en un txt) o tipeandolo en el editor VisualLisp y usando el boton load active window .Una vez que tenemos el comando en memoria para ejecutarlo hay que tipear test.
Lo primero que hace es un conjunto con todas las polilíneas del dibujo mediante la función ssget, luego con sslength obtenemos el largo de este conjunto, establecemos un contador en cero y con un bucle while recorremos una por una las polilíneas del conjunto, asignando la actual a una variable llamada ent a través de la función ssname. De la polilínea actual obtenemos el nombre del layer y su primer punto, luego llamamos a la función insertartexto mandandole como parametros el punto de inserción, el texto en si y el layer en el que se va a insertar.
La función insertartexto utiliza entmake para generar el texto, previamente cargamos todos sus atributos en una lista. Cualquier duda o por algún otro ejemplo del tema pueden escribir acá.
Comentarios