Para poder ingresar a aprender este tema, primero debemos tener claro a que nos referimos cuando hablamos sobre «base de datos» de una entidad de AutoCAD u otro programa de CAD.
En definición, cada entidad esta creada en base a una lista, que contiene sublistas de asociaciones; cada asociación contiene dos valores separados por un punto: el primer valor contiene el tipo de propiedad, y el segundo el valor de dicha propiedad.
Por ejemplo, observa este código:
((-1 . <Entity name: 28bb41a4150>) (0 . "LINE") (330 . <Entity name: 28bb30899f0>) (5 . "3BD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 447950.0 8.74357e+06 0.0) (11 447972.0 8.74358e+06 0.0) (210 0.0 0.0 1.0))
Aunque no parezca, lo que estas observando es una entidad tipo «línea» o, mejor dicho, la estructura de un «objeto LINEA de AutoCAD» vista desde AutoLisp.
Los paréntesis resaltados indican la lista que define la línea y los demás paréntesis de apertura y cierre definen las sublistas o elementos que contiene la asociación de indicador de propiedad y del valor de dicha propiedad, ejemplo:
La sublista (8 . «0») tiene 2 elementos separados por un punto, en ésta sublista o asociación, el número 8, es el identificar de la capa de la línea o en otras palabras en que capa se encuentra y el valor es “0”, que indica que se encuentra en la capa 0, este valor cambiará de acuerdo a la capa en que se encuentre la línea de este ejemplo.
Muy bien, ¿todo bien hasta ahí?, y ahora te preguntarás, ¿Cómo accedo a esas propiedades de una entidad?, la respuesta es; con la función ENTGET.
Función ENTGET
Esta función obtiene una lista con sublistas o asociaciones que conforman la estructura de una entidad seleccionada con las funciones complementarias ENTLAST, ENTSEL, etc. Entget es la función más importante para comenzar a trabajar con las propiedades de un objeto.
Por ejemplo vamos a obtener la propiedades de un círculo. Dibuja un círculo y digita el siguiente código en la línea de comandos de AutoCAD:
(entget(car(entsel)))
En esta línea de código vamos a obtener las propiedades de un círculo, pero para poder obtener las propiedades del círuclo, es necesario primero que lo seleccionesmos y lo haremos mediante código Lisp mediante la función entsel.
Función ENTSEL
La función entsel al seleccionar una entidad, devuelve dos valores (el nombre de la entidad y el punto de designación), entonces, para poder obtener el nombre de la entidad, tenemos que acceder al primer elemento de la lista y lo haremos con la función CAR, car nos devuelve el nombre de la entidad y posteriormente usamos la función entget para obtener las propiedades de esa entidad (el círculo).
La función ENTGET nos devolvió lo siguiente:
((-1 . <Entity name: 28bb41a4170>) (0 . "CIRCLE") (330 . <Entity name: 28bb30899f0>) (5 . "3BF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "F-SEC-TERRENO") (100 . "AcDbCircle") (10 447954.0 8.74358e+06 0.0) (40 . 3.45374) (210 0.0 0.0 1.0))
Aquí se muestra el código de la estructura del circulo seleccionado, a continuación te explico algunos de ellos:
(0 . "CIRCLE") ;El valor del código 0 indica el tipo de entidad. (8 . "F-SEC-TERRENO") ;El valor del código 8 indica la capa de la entidad. (10 447954.0 8.74358e+06 0.0) ;El valor del código 10 indica la coordenada del centro del círculo. (40 . 3.45374) ;El valor del código 40 indica el radio del círculo.
Si sigues ejecutando el código (entget (car (entsel) ) ) y seleccionando diferentes tipos de entidades (textos, hatch, etc), verás que algunos nuevos códigos aparecen y otros desaparecen de acuerdo al tipo de entidad que se seleccione.
¿Qué te pareció esta función?, te ayudará mucho en el futuro. A continuación veremos otra función tan importante y complementaria a entget.
Funciones que se han visto en este tema:
Dudas o aportes en los comentarios.
Mario, buen día:
Estuvimos corriendo el código (entget (car(entsel))) y corre perfectamente, nos arroja las propiedades internas del bloque dinámico:
Command: (entget (car (entsel)))
Select object: ((-1 . ) (0 . «INSERT») (5 . «CCB74») (102 . «{ACAD_XDICTIONARY») (360 . ) (102 . «}») (330 . ) (100 . «AcDbEntity») (67 . 0) (410 . «Model») (8 . «0») (100 . «AcDbBlockReference») (66 . 1) (2 . «*U468») (10 917975.0 1.70165e+06 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 5.49779) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Sin embargo, estamos necesitando una rutina LISP que nos arroje estas mismas propiedades, tanto las internas como las externas, ya que vamos a manejar más de 100 elementos insertados desde un CSV, y nos ahorraría tiempo para extraer la información de cada uno de los bloques dinámicos insertados con dicha rutina.
Actualmente lo estamos haciendo de esta manera:
(setq curretnStateOfDBlock ;ESTADO ACTUAL BLOQUE DINÁMICO.
(mapcar ‘(lambda (dbcs)
(cons (vlax-get dbcs ‘PropertyName) dbcs)) ;OBTIENE EL NOMBRE DE LA PROPIEDAD.
(vlax-invoke Dblock ‘GetDynamicBlockProperties) ;OBTIENE LAS PROPIEDADES DE BLOQUE DINÁMICO AL INVOCARLO.
))
Quedamos atentos a tus comentarios…
ASMITH
Buen día, Mario:
Estamos ejecutando este código (entget (car (entsel) ) ), y efectivamente funciona. Sin embargo, ¿hay manera de que al insertar un bloque LISP nos arroje las propiedades internas de dicho bloque sin necesidad de seleccionarlo?
Command: (entget (car (entsel) ) )
Select object: ((-1 . ) (0 . «INSERT») (5 . «C9CBA») (102 . «{ACAD_XDICTIONARY») (360 . ) (102 . «}») (330 . ) (100 . «AcDbEntity») (67 . 0) (410 . «Model») (8 . «0») (100 . «AcDbBlockReference») (66 . 1) (2 . «*U332») (10 917975.0 1.70165e+06 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 5.49779) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Actualmente, estamos desarrollando una rutina que inserta el bloque y nos piden que arroje las propiedades de dicho bloque. Le incluimos un ALERT:
(setq curretnStateOfDBlock ;ESTADO ACTUAL BLOQUE DINÁMICO.
(mapcar ‘(lambda (dbcs)
(cons (vlax-get dbcs ‘PropertyName) dbcs)) ;OBTIENE EL NOMBRE DE LA PROPIEDAD.
(vlax-invoke Dblock ‘GetDynamicBlockProperties) ;OBTIENE PROPIEDADES DE BLOQUE DINÁMICO.
))
(alert curretnStateOfDBlock) ;ALERTA ESTADO ACTUAL BLOQUE DINÁMICO.
…y este es el resultado del ALERT:
; error: bad argument type: stringp
((«Visibilidad» . #)
(«Longitud» . #)
(«Origin» . #)
(«Angle1» . #)
(«Origin» . #))
¿Cómo podemos obtener estas propiedades sin necesidad de clickear el bloque individualmente? Ya que vamos a trabajar con más de 100 puntos y tenemos que seleccionarlos al tiempo y cuantificarlos.
Quedo atento a sus comentarios…
ASMITH