Comparación para filtro

Ver el tema anterior Ver el tema siguiente Ir abajo

Comparación para filtro

Mensaje por carlosmgilp el Dom Jun 19, 2016 6:54 pm

Hola muchachos como estan.

Disculpen como hago comparaciones para los filtros.

Por ejemplo.

Tengo este filtro para seleccionar una polilinea 3d

Código:
(setq filtro '((0 . "POLYLINE") (-4 . "&") (70 . 9)))

Con el entget de resultado me da la siguiente lista o en su defecto puedo tener el nombre de la entidad.

Código:
(setq lista '((-1 . <entity name: 1f422249520>)
              (0 . "POLYLINE")
              (330 . <entity name: 1f42225f1f0>)
              (5 . "26A")
              (100 . "AcDbEntity")
              (67 . 0)
              (410 . "Model")
              (8 . "0")
              (100 . "AcDb3dPolyline")
              (66 . 1)
              (10 0.0 0.0 0.0)
              (70 . 8)
              (40 . 0.0)
              (41 . 0.0)
              (210 0.0 0.0 1.0)
              (71 . 0)
              (72 . 0)
              (73 . 0)
              (74 . 0)
              (75 . 0)))

Como saber si se cumple lo que quiero obtener.

Gracias y un saludo.

carlosmgilp

Mensajes : 71
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Admin el Lun Jun 20, 2016 1:01 am

Cuando leas un ENTGET , consideralo como si fuera una AUTOPSIA DE LA ENTIDAD


Filtra por el codigo 100

100 Subclass marker (AcDb2dPolyline or AcDb3dPolyline)

(setq filtro '((0 . "POLYLINE") (100 . "AcDb3dPolyline") ))


Y ni siquiera te hace falta el (0 . "POLYLINE")




Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por carlosmgilp el Lun Jun 20, 2016 2:27 am

Hola hermano como estas.

Podrías darme un ejemplo de como hacerlo, es que estoy bruto.

Es que si lo hago con un member me da un error.

Por ejemplo quiero una polilinea 3d cerrada.

Gracias.

carlosmgilp

Mensajes : 71
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Admin el Lun Jun 20, 2016 2:38 am

Puedes usar el DXF 70 1+8


Código:
(setq filtro '((0 . "POLYLINE") (100 . "AcDb3dPolyline") (70 . 9  ))

Esta variable se pueden sumar los valores para identificar 1+8=9
1 es una polyline cerrada
8 es una polilinea 3d
70 Polyline flag (bit-coded; default = 0):
1 = This is a closed polyline (or a polygon mesh closed in the M direction)
2 = Curve-fit vertices have been added
4 = Spline-fit vertices have been added
8 = This is a 3D polyline
16 = This is a 3D polygon mesh
32 = The polygon mesh is closed in the N direction
64 = The polyline is a polyface mesh
128 = The linetype pattern is generated continuously around the vertices of this polyline

Muestra el ENTGET que obtienes

Sube el DWG


Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Admin el Lun Jun 20, 2016 2:46 am

Otra , para qué usas esto ?

Código:
(-4 . "&")


Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por carlosmgilp el Lun Jun 20, 2016 2:57 am

Hola hermano lo de los códigos del 70 me lo se, lo que no logro comprender es hacer la comparación.

Lo de (-4 . "&") lo utilizo era cuando una selección ssget o entsel como filtro, pero en este caso no iba, se me fue cuando copie del archivo que estoy trabajando.

Pero en este caso tengo es el nombre de la entidad la cual puedo sacar sus códigos con entget

En todo caso el filtro seria este que es una polilinea, que es 3d y que es cerrada.

Código:
(setq filtro '((0 . "POLYLINE") (70 . 9)))

Y lo que me arroja el entget es

Código:
((-1 . <entity name: 17981f8fe30>)
              (0 . "POLYLINE")
              (330 . <entity name: 17981f8d9f0>)
              (5 . "283")
              (100 . "AcDbEntity")
              (67 . 0)
              (410 . "Model")
              (8 . "0")
              (100 . "AcDb3dPolyline")
              (66 . 1)
              (10 0.0 0.0 0.0)
              (70 . 9)
              (40 . 0.0)
              (41 . 0.0)
              (210 0.0 0.0 1.0)
              (71 . 0)
              (72 . 0)
              (73 . 0)
              (74 . 0)
              (75 . 0))

Como comparo el filtro con lo que me devolvió el entget.

carlosmgilp

Mensajes : 71
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Admin el Lun Jun 20, 2016 3:02 am

Los operadores lógicos , en el caso de los SSGET se usan abriendo y cerrando cada tipo de dxf buscado



Código:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(SSGET "_X" '((-4 . "<OR"); abre operador lógico OR , admite cualquiera 
                      (-4 . "<AND");_ abre un operador  AND da valido si se cumplen las 3 condiciones
                        (0 . "LINE") ;_ que sea  lineas
                        (-4 . "*,*,!=")(10 1 1 0) ;que tengan Pto inicio con Z distinta de 0
                        (-4 . "*,*,!=")(11 1 1 0) ; Y que tengan el Pto final con Z distinta de 0
                      (-4 . "AND>");Cierra el AND  para la linea con los dos Z distintos de 0
                      (-4 . "<AND"); Abre el AND para LWPOLYLINE con elevacion distinta de 0
                        (0 . "LWPOLYLINE")  ;_ que sean LWPOLYLINE
                        (-4 . "!=")(38 . 0) ;Elevación de polilínea distinta de 0
                      (-4 . "AND>");_ cierra el and para LWPOLYLINE con elevacion distinta de 0
                      (-4 . "<AND") ;_ abre para CÍRCULOS con centro cuyo centro tenga el z distinto de Z
                        (0 . "CIRCLE");_ los círculos
                        (-4 . "*,*,!=")(10 1 1 0) ;Pto centro con Z distinta de 0
                      (-4 . "AND>");_ cierra el and para CÍRCULOS con centro cuyo centro tenga el z distinto de Z
                (-4 . "OR>");_ cierra el OR
                )
) ;_fin de ssget
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

En suma busca las LÍNEAS, LWPOLYLINE, CÍRCULOS, basta conque cualquier de las entidades tenga Z distinto de Z .
Me falta saber explicar el uso de los  "*,*,!="


Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Uso del ASSOC

Mensaje por Admin el Lun Jun 20, 2016 3:07 am

No entiendo para qué quieres verificarlo , pero para encontrar un DXF se usa la función ASSOC  

Por ejemplo para saber el valor del DXF 70

Código:
(setq 3dpoly (car ( entsel)))

(setq 3dpoly-data( entget 3dpoly))


(setq valor-70 (Cdr (assoc 70 3dpoly-data)))



Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Explicación del uso del SSGET , Autor ROBIERZO

Mensaje por Admin el Lun Jun 20, 2016 3:30 am

;;;En este capítulo vamos a ver cómo podemos trabajar con las entidades de dibujo, accediendo a la base de datos de Autocad.
;;;En primer lugar veremos los comandos utilizados para seleccionar entidades.
;;;Después veremos los utilizados para editar y modificar estas entidades de dibujo.
;;;En la mayoría de los casos será preciso conocer el nombre de la entidad seleccionada para poder manipularla.
;;;Dicho nombre es un número hexadecimal y corresponde a la clave -1, de la lista de la entidad.
;;;Si echáis un vistazo a las listas que aparecen en el tema anterior, podéis observar que todas empiezan con una sublista cuyo primer elemento es -1 y el segundo es el nombre de la entidad.
;;;
;;;SELECCIÓN DE OBJETOS
;;;Los comandos de selección de entidades de dibujo comienzan pidiendo al usuario que Designe objeto.
;;;Tras esta operación de designación, los objetos seleccionados son introducidos en un conjunto, al que daremos nombre con una variable.
;;;En autolisp podemos tener abiertos simultáneamente hasta 128 conjuntos, siempre que la memoria nos lo permita.
;;;Cuando un conjunto creado ya no sea útil, es conveniente asignarle valor nil, para liberar espacio de la memoria.
;;;Cuando la operación que queremos realizar sólo requiere la designación de una entidad podemos usar:
;;;
;;;(ENTLAST) NOMBRE DE LA ÚLTIMA ENTIDAD DIBUJADA

;;;Devuelve el nombre de la última entidad dibujada y que no ha sido borrada.

;;;Código:
(COMMAND "_line" p1 p2 "")
(SETQ nombre (ENTLAST))


;;;En este caso dibujamos una línea y almacenamos el nombre en la variable nombre.
;;;El resultado podría ser: <Nombre entidad: 7ef5ef78>, que quedaría almacenado, tal cual, en la variable nombre.
;;;Si dibujas una entidad en Autocad y tecleas en la línea de comandos (SETQ nombre (ENTLAST)), pulsas INTRO.
;;;Y después tecleas !nombre, y pulsas INTRO, observarás que se produce el efecto indicado.
;;;

(ENTNEXT [<nom>]) ;;NOMBRE DE LA SIGUIENTE ENTIDAD

;;;Devuelve el nombre de la entidad que sigue a la indicada en <nom>, según aparece en la Base de Datos.
;;;Si no aparece <nom>, devuelve el nombre de la primera entidad que aparece en la Base de Datos y que no ha sido borrada.

(COMMAND "_line" p1 p2 "")
(SETQ nombre1 (ENTLAST))
(COMMAND "_circle" p1 rad)
(SETQ nombre2 (ENTLAST))
(SETQ nombre3 (ENTNEXT nombre1))


;;;En este caso nombre2 y nombre3 son iguales, ya que con el último comando lo que hemos hecho es asignar a la variable nombre3
;;;el nombre de la entidad que sigue a nombre1, en este caso nombre2.¿Alguien se ha perdido? Je,je,je.

(ENTSEL [<dialogo>]);;NOMBRE DE ENTIDAD Y PUNTO DE DESIGNACIÓN

;;;Devuelve una lista con dos elementos. El primero es el nombre de la entidad y el segundo es una sublista con las coordenadas del punto de designación.
;;;Si <dialogo> no aparece, mostrará el mensaje por defecto, que muestran siempre este tipo de funciones: Designe objeto.
;;;Si no acertamos en la designación,devuelve nil.

(SETQ listaent (ENTSEL "Designa una entidad:"))

;;;En este caso la variable listaent podría almacenar un resultado como este:

;(<Nombre entidad: 7ef5ef78> (50.456 75.002 0.0))


;;;Si ahora quisiéramos saber el nombre, recordando lo visto en el TEMA 7, haríamos:

(SETQ nombre (NTH 1 listaent))

;;;O también:

(SETQ nombre (CAR listaent))

;;;Con lo que almacenaríamos en la variable nombre el primer elemento de la lista listaent. Que es <Nombre entidad: 7ef5ef78>.
;;;
;;;Cuando la operación que queremos realizar requiere la designación de varias entidades, primero tendremos que crear un conjunto de designación,
;;;donde almacenaremos todas las entidades seleccionadas. Podemos usar:

(SSGET [<modo>] [<pt1>] [<pt2>] [<lista-pt>] [<lista-filtros>]) CREA UN CONJUNTO DE SELECCIÓN

;;;Este es un comando complicado pero muy interesante y con un amplísimo abanico de posibilidades de selección.
;;;Sin ningún argumento, solicita la designación mediante cualquier método.
;;;Sólo sirve para designar objetos visibles en el área de pantalla.

;;;El <modo> indica el tipo de selección elegida. Siempre debe ir entre comillas. Puede ser:
;;;"_C": Queda seleccionado todo aquello que esté dentro, total o parcialmente, de un rectángulo definido por <pt1> y <pt2>.
(SETQ conj (SSGET "_C" pt1 pt2))
;;;"_CP": Queda seleccionado todo aquello que esté dentro, total o parcialmente, de un polígono formado por la lista de puntos <lista-pt>.
(SETQ polig (LIST pt1 pt2 pt3 pt4 pt5))
(SETQ conj (SSGET "_CP" polig))
;;;"_F": Queda seleccionado todo aquello que intersecte con una poligonal definida por sus vértices.
(SETQ polig (LIST pt1 pt2 pt3 pt4 pt5 pt6))
(SETQ conj (SSGET "_F" polig))
;;;"_I": Si se utiliza con filtros de selección., sólo tiene en cuenta los objetos preseleccionados que muestran pinzamientos.
;;;La variable PICKFIRST debe estar activa.
;;;"_L": Selecciona la última entidad dibujada y no borrada.
;;;"_P": Vuelve a seleccionar el último conjunto creado.
;;;"_W": Queda seleccionado todo aquello que esté dentro, totalmente, de un rectángulo definido por <pt1> y <pt2>.
(SETQ conj (SSGET "_W" pt1 pt2))
;;"_WP": Queda seleccionado todo aquello que esté dentro, totalmente, de un polígono formado por la lista de puntos <lista-pt>.
(SETQ conj (SSGET "_WP" polig))
;;;"_X": Sirve para seleccionar todos los objetos del dibujo, estén dentro o fuera del área visible de pantalla,
;;estén en capas activadas o no, e incluso en capas inutilizadas.
;;Tiene la particularidad de que se pueden usar listas de filtros para seleccionar objetos con determinadas características.

(SETQ conj (SSGET "_X" (LIST (CONS 0 "ARC") (CONS 8 "rotura") (CONS 62 3))))

;;En este caso almacena todas las entidades que sean arcos, que estén en la capa "rotura" y que tengan color verde,
;;que es el numero 3. Como veis, hemos utilizado como filtros los códigos DXF 0,8 y 62.
;;Se pueden utilizar todos los códigos DXF excepto el -1, el 5, y los mayores de 1000.

(SETQ conj (SSGET '(0 . "CIRCLE"))); Solicita selección de entidades, y de todos los objetos seleccionados, sólo almacena los círculos.
(SETQ conj (SSGET "_X" '((0 . "LINE"))); Selecciona todas las líneas del dibujo.
(SETQ conj (SSGET "_I" '((0 . "LINE") (62 . 2)))); Almacena todas las líneas del dibujo que tengan color amarillo y que estén preseleccionadas.

;;;FILTROS DE SELECCIÓN
;;;Hay una serie de filtros que podemos utilizar con (SSGET) para realizar una selección más particular.
;;;"_:E": Queda seleccionado todo lo que se encuentra dentro de la caja del cursor.
;;;"_:N": Sólo se puede usar con selecciones gráficas(ventana, captura…). Selecciona subentidades de un bloque, polilinea 3D…
;;;"_:S": Una vez realizamos la primera selección, no continua pidiendo que designemos más objetos.
;;;"_:D": Acepta la selección de entidades repetidas.
;;;"_:P": No selecciona ventanas gráficas del Espacio Papel.
;;;"_:L": No selecciona objetos de capas bloqueadas.

;;;FILTROS DE COMPARACIÓN
;;;Mediante el código especial -4 podemos indicar una serie de operadores de comparación para realizar la selección.
;;; La comparación se aplica sólo a la sublista que sigue a la lista del código -4.
;;; Podemos agrupar varios operadores separados por comas.Siempre van entre comillas y pueden ser:
;;;"*": Comodín
;;;"=": Igualdad
;;;"!=": Desigualdad
;;;"/=": Desigualdad
;;;"<>": Desigualdad
;;;"<": Menor que
;;;"<=": Menor o igual que
;;;">": Mayor que
;;;">=": Mayor o igual que
;;;"&": AND binario. Se aplica para comprobar el bit asociado a la clave DXF de una sublista.
;;;"&=": Igualdad AND binario. Se aplica para comprobar el bit asociado a la clave DXF de una sublista.
;;;
(SSGET "_X" '((0 . "CIRCLE") (-4 . ">=") (40 . 50.4) (62 . 3)))

;;;En este caso se seleccionan los circulos -(0 . "CIRCLE")-, cuyo radio sea mayor o igual que 50.4 -(-4 . ">=") (40 . 50.4)-,
;;y cuyo color sea el verde -(62 . 3)-.

(SSGET "_X" '((0 . "LWPOLYLINE") (-4 . "&") (70 . 129)))

;;;En este caso se seleccionan las lwpolylines cerradas, bit 1 de la clave 70 de una lwpolyline,
;;; independientemente del patrón de tipo de linea que tengan activado, bit 128 de la clave 70 de una lwpolyline.
;;; Como veis, no es necesario que aparezca el bit 1 en la expresión de Autolisp. Éste está incluido en el bit 129, pero lo controla igual.
;;;
;;;AGRUPACIÓN DE FILTROS
;;;Como los filtros de comparación, también éstos se deben indicar mediante el código especial -4.
;;; Estos operadores van en pareja, y a cada operador de apertura le debe corresponder otro igual de cierre.
;;;"<AND" con "AND>": Deben cumplirse todos los criterios.
;;;"<OR" con "OR>": Debe cumplirse al menos un criterio.
;;;"<XOR" con "XOR>": de dos criterios existentes, debe cumplirse uno u otro, pero no los dos.
;;;"<NOT" con "NOT>": No debe cumplirse el criterio.

;;;En el ejemplo que sigue, seleccionamos todos los arcos, circulos, lineas y lwpolilineas cuya elevación sea distinta de cero.

Código:
(SETQ conj_dibujo (SSGET "_X" '((-4 . "<OR")
(-4 . "<AND")
(0 . "LINE")
(-4 . "*,*,!=")(10 1 1 0) ;Pto inicio con Z distinta de 0
(-4 . "*,*,!=")(11 1 1 0) ;Pto final con Z distinta de 0
(-4 . "AND>")
(-4 . "<AND")
(0 . "LWPOLYLINE")
(-4 . "!=")(38 . 0) ;Elevación de polilínea distinta de 0
(-4 . "AND>")
(-4 . "<AND")
(0 . "ARC")
(-4 . "*,*,!=")(10 1 1 0) ;Pto centro con Z distinta de 0
(-4 . "AND>")
(-4 . "<AND")
(0 . "CIRCLE")
(-4 . "*,*,!=")(10 1 1 0) ;Pto centro con Z distinta de 0
(-4 . "AND>")
(-4 . "OR>")
)
) ;_fin de SSGET
)


(SSADD [<nom> [conj>]]);; AÑADE ENTIDAD A CONJUNTO

;;;Añade una entidad a un conjunto designado. Empleado sin argumentos crea un conjunto vacío sin elementos.

(SSDEL <nom> <conj>);; BORRA ENTIDAD DE UN CONJUNTO

;;;Elimina la entidad <nom> de el conjunto <conj>.
;;;
;;;OTROS COMANDOS PARA OPERAR CON ENTIDADES

(SSLENGTH <conj>) ;;NUMERO DE ENTIDADES DE CONJUNTO

;;;Devuelve el número de entidades de un conjunto.

(SSNAME <conj> <posición>);; NOMBRE DE ENTIDAD

;;;Devuelve el nombre de una entidad perteneciente a un conjunto, situada en una posición determinada.
;;;Las entidades de un conjunto ocupan una posición que se empieza a contar desde cero. Un conjunto con 5 entidades estaría numerado de 0 a 4.

(SSMEMB <nom> <conj>) ;; COMPRUEBA SI ENTIDAD ESTÁ EN CONJUNTO

;;;Si el nombre indicado está en <conj>, devuelve ese nombre y si no está devuelve nil.

(NENTSEL [<mensaje>]);; SELECCIONA ENTIDAD COMPONENTE DE UNA ENTIDAD COMPUESTA.

;;Funciona igual que (ENTSEL) . Sirve para extraer datos de entidades que forman parte de otras entidades,
;;; como un bloque o una polilinea. Devuelve una lista con dos elementos.
;;; El primero es el nombre de la subentidad y el segundo es el punto de designación.

(NENTSELP [<mensaje>] [<punto>]);; SELECCIONA ENTIDAD COMPONENTE DE UNA ENTIDAD COMPUESTA MEDIANTE PUNTO DE DESIGNACIÓN

;;Es igual que (NENTSEL) pero con la posibilidad de indicar el punto de designación.

(ENTGET <nom>) ;;LISTA ENTIDAD

;;;Busca en la base de datos el nombre de la entidad indicada y devuelve una lista completa de dicha entidad.
;;; Lógicamente, debemos obtener el nombre previamente, mediante cualquiera de los comando que ya vimos para tal fin: SSNAME, ENTLAST, ENTNEXT…
;;;Una vez obtenida la lista, podemos acceder a todos los datos de la entidad mediante el comando (ASSOC) visto en el Tema 7.
;;;Supongamos que acabamos de dibujar un arco.

(SETQ lista_ent (ENTGET (ENTLAST)))

;;;Con esto almacenamos en la variable lista_ent la lista perteneciente al arco que acabamos de dibujar, que podría ser esta:

;;;Código:
((-1 . <Nombre entidad: 7272b6e8>)
(0 . "ARC")
(330 . <Nombre entidad: 7ef7acf8>)
(5 . "D62CD")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "Escollera")
(100 . "AcDbCircle")
(10 301.164 2023.47 0.0)
(40 . 494.779)
(210 0.0 0.0 1.0)
(100 . "AcDbArc")
(50 . 4.23078)
(51 . 5.82005)
)


;;;Si queremos saber la coordenada X del centro, debemos saber primero que la clave DXF 10 contiene las coordenadas del centro. Así:
;;;Código:
(SETQ Xcentro (CADR (ASSOC 10 lista_ent))); Coordenada X del centro del arco.Es el segundo elemento de la sublista.
(SETQ Ycentro (CADDR (ASSOC 10 lista_ent))); Coordenada Y del centro del arco. Es el tercer elemento de la sublista.
(SETQ Zcentro (CADDDR (ASSOC 10 lista_ent))); Coordenada Z del centro del arco. Es el cuarto elemento de la sublista.
(SETQ radio (CADR (ASSOC 40 lista_ent))); Valor del radio


(ENTDEL <nom>) ;;BORRA O RECUPERA ENTIDAD

;;;Si la entidad <nom> existe, es borrada.
;;; Pero si no existe es recuperada, siempre y cuando haya sido borrada con ENTDEL. Sólo vale para la actual sesión de dibujo.

(ENTMOD <lista-entidad>) ;;ACTUALIZA LISTA

;;;Sirve para actualizar una lista de una entidad, previa modificación de esta. Supongamos el caso visto antes, del arco.

;;;Código:
(SETQ lista_ent (ENTGET (ENTLAST)))
(SETQ nueva_lista (SUBST (CONS 8 "Muro") (ASSOC 8 lista_ent) lista_ent))
(ENTMOD nueva_lista)


;;;Lo que hemos hecho es, partiendo de la lista del arco lista_ent, hemos creado una nueva lista nueva_lista,
;;; donde hemos cambiado el arco de capa, pasándolo de la capa "Escollera" a la capa "Muro".

(ENTMAKE <lista>) ;;CONSTRUYE UNA ENTIDAD EN LA BASE DE DATOS
;;;Podemos construir una entidad de dibujo definiendo correctamente su lista completa,
;;; con todos los elementos necesarios. Si omitimos algún dato no imprescindible, como puede ser la capa, la entidad va a la capa actual.

(ENTMAKE ' ((0 . "line") (10 50 20 0) (11 100 200 0)))

;;;En este caso construimos una línea partiendo únicamente de los datos de sus coordenadas de los puntos inicial y final.
;;; Como no especificamos el color ni la capa, considera los actuales del dibujo.
;;;
;;;Nos quedaría por ver lo referente a tablas de símbolos, que aunque no son entidades de dibujo,
;;; también son accesibles y pueden ser modificadas. Lo dejamos para el próximo tema.
;;;
;;;He hecho una rutina sencillita para contar bloques.
;;; Aunque en las versiones más recientes de Autocad ya existe un comando que lo hace,
;;; y bastante más completo, supongo que para practicar servirá.
;;;
;;;Código:
;;;;;;;;;;;;; CUENTA BLOQUES ;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;
;;;;;;


(DEFUN c:cuenta(/ listaent)
(while (/= (cdr (assoc 0 listaent)) "INSERT")
(setq nomblist1 (entsel "\nSelecciona bloque:")); lista con nombre y punto de designacion, de la entidad seleccionada
(setq nomblist (car nomblist1)); Nombre de la entidad seleccionada
(setq listaent (ENTGET nomblist)); lista completa de la entidad seleccionada
(if (/= (cdr (assoc 0 listaent)) "INSERT")
(princ "\nEl elemento seleccionado no es un bloque")
)
); Fin while
(setq nombloc (cdr (assoc 2 listaent))); nombre del bloque

(SETQ conj1 (SSGET "_X" (LIST(CONS 0 "insert")))); Conjunto con todos los bloques del dibujo
(SETQ conj (SSGET "_X" (LIST
(CONS 0 "insert")
(CONS 2 nombloc)
)
)
); conjunto con los bloques de igual nombre que el seleccionado
(SETQ enti1 (SSLENGTH conj1))
(SETQ enti (SSLENGTH conj))

(prompt "\nDe los ") (prin1 enti1) (prompt " bloques existentes en el dibujo, ")
(prin1 enti) (prompt " son igual que el seleccionado")
(prompt "\n© Roberto González ;-)")
)


Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por carlosmgilp el Lun Jun 20, 2016 3:43 am

Hola hermano, gracias por la información, pero aún no doy con lo que quiero.
Podrías hacer un ejemplo de si se cumple el filtro con el entget que envíe de último.
Gracias.

carlosmgilp

Mensajes : 71
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Sigo sin entender el porqué quieres o qué quieres hacer

Mensaje por Admin el Lun Jun 20, 2016 4:45 am

No entiendo . Expláyate.
Explica sin dejar nada por entendido .
Considera que tu interlocutor es un neófito en el tema .










carlosmgilp escribió:Hola hermano lo de los códigos del 70 me lo se, lo que no logro comprender es hacer la comparación.

Lo de (-4 . "&") lo utilizo era cuando una selección ssget o entsel como filtro, pero en este caso no iba, se me fue cuando copie del archivo que estoy trabajando.

Pero en este caso tengo es el nombre de la entidad la cual puedo sacar sus códigos con entget

En todo caso el filtro seria este que es una polilinea, que es 3d y que es cerrada.

Código:
(setq filtro '((0 . "POLYLINE") (70 . 9)))

Y lo que me arroja el entget es

Código:
((-1 . <entity name: 17981f8fe30>)
              (0 . "POLYLINE")
              (330 . <entity name: 17981f8d9f0>)
              (5 . "283")
              (100 . "AcDbEntity")
              (67 . 0)
              (410 . "Model")
              (8 . "0")
              (100 . "AcDb3dPolyline")
              (66 . 1)
              (10 0.0 0.0 0.0)
              (70 . 9)
              (40 . 0.0)
              (41 . 0.0)
              (210 0.0 0.0 1.0)
              (71 . 0)
              (72 . 0)
              (73 . 0)
              (74 . 0)
              (75 . 0))

Como comparo el filtro con lo que me devolvió el entget.

Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por carlosmgilp el Mar Jun 21, 2016 6:38 pm

Hola hermano como estas, mira como lo estaba haciendo.
Pero no estoy seguro de que si cumple todo lo que esta en la variable filtro con la variable lista.
Yo se que puedo aplicar el filtro directo con ssget o entget, pero mi interés es la comparación de las dos variables anteriores y saber si se cumple.

Código:
(setq sel (ssget))
(setq ent (ssname sel 0))
(setq lista (entget ent))
(setq filtro '((0 . "POLYLINE")  (70 . 9)))
(foreach x filtro (member x lista))

Gracias.

carlosmgilp

Mensajes : 71
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Admin el Mar Jun 21, 2016 7:30 pm

Tal como te comenté , debes usar el massoc , me imagino que estas haciendo una rutina para que verifique y no te de error cuando hagas la selección.


usa esto

(assoc (car x) lista)








Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por nolo el Miér Jun 22, 2016 6:08 pm

O mucho me confundo o Carlos, estas hecho un lío.
No veo la necesidad de comprobación, si haces
Código:
(setq policerrada (ssget '((0 . "*POLYLINE") (-4 . "&") (70 . 1))))

Al seleccionar, con window, crosing o como sea, solo te seleccionará las polilineas 2d y 3d cerradas y si no seleccionaste ninguna cerrada, te devolverá nil en la variable policerrada.

Igual pasa si lo haces mediante una variable llamada filtro
Código:
(setq filtro '((0 . "*POLYLINE") (-4 . "&") (70 . 1)))
(setq policerrada (ssget filtro))

Es esa la duda ????

Un saludo

nolo

Mensajes : 105
Fecha de inscripción : 17/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Admin el Miér Jun 22, 2016 6:27 pm

Si pone (70 . 9), que es la suma de 1 por polilinea cerrada y 8 por 3Dpoly , el código 70 se designa como un "peso de bit" , donde a cada número le corresponde una condición y la suma de los mismo incluye todos las condiciones .
Algo parecido sucede con la VARIABLE de sistema OSMODE que tiene como números de PESO DE BIT : 0 1 2 4 8 16 32 64 y siguiendo los enteros cuadrados de 2 , 0 anula todos los OSMODE
por ejemplo

;;;0 NONe
;;;1 ENDpoint
;;;2 MIDpoint
;;;4 CENter
;;;8 NODe
;;;16 QUAdrant
;;;32 INTersection
;;;64 INSertion
;;;128 PERpendicular
;;;256 TANgent
;;;512 NEArest
;;;1024 QUIck
;;;2048 APParent Intersection
;;;4096 EXTension
;;;8192 PARallel


Lo mismo para INITGET Y otras tantas




Lo que no termino de entender, es que aplicación o propósito tiene el (-4 . "&")

Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por carlosmgilp el Miér Jun 22, 2016 9:44 pm

Hola muchachos como están.

Ya lo resolví con el assoc como recomendó Devit y un foreach para comparar.

Nolo gracias por tu ayuda también. Se que lo podía hacer así, pero la duda era comparar el filtro con la lista que me arrojaba el entget del objeto.

Mil gracias como siempre por compartir sus conocimientos.

carlosmgilp

Mensajes : 71
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por nolo el Jue Jun 23, 2016 12:47 am

Gabriel, creo que esta especificado en tu anterior explicación
"&": AND binario. Se aplica para comprobar el bit asociado a la clave DXF
(SSGET "_X" '((0 . "LWPOLYLINE") (-4 . "&") (70 . 129)))
;;;En este caso se seleccionan las lwpolylines cerradas, bit 1 de la clave 70 de una lwpolyline,
;;; independientemente del patrón de tipo de linea que tengan activado, bit 128 de la clave 70 de una lwpolyline.
;;; Como veis, no es necesario que aparezca el bit 1 en la expresión de Autolisp. Éste está incluido en el bit 129, pero lo controla igual.
Código:
(-4 . "&") (70 . 1)
Entiendo que así incluiría la lwpolilinea ( el 1) y la 3dpoli (9 = 1+8)

Un saludo

nolo

Mensajes : 105
Fecha de inscripción : 17/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Admin el Jue Jun 23, 2016 1:05 am

No hace falta poner el operador
con esta línea

Código:
(setq poly3d-cerrada(ssget  '( (0 . "polyline" ) ( 70 . 9))))
Puedes seleccionar unicamente una 3dpoly cerrada

Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Comparación para filtro

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.