Entidades dentro de Block
2 participantes
Página 1 de 1.
Entidades dentro de Block
Que tal amigos!!... despues de tiempo y bucandolos di con ustedes ya que lamentablemente comos saben se cerro la pagina de Hispacad!... pues bueno aprendi mucho de esa pagina pero aun no soy un master en autolisp ni en vlisp pero seguimos aprendiendo...
Les traigo por aqui una pregunta pero primero explico lo que deseo:
Adjunto un plano de una vivienda pequeña como ejemplo:
1.- En el plano de la vivienda la mayoria de simbolos eléctricos son bloques los cuales ya tengo predeterminados; como se ve en dichos bloques están intercomunicados entre lineas algunos bloques tienen mas de dos lineas que se conectan o se unen por así decirlo... dichas lineas representan un codigo....lo que deseo es ver como puedo hacer para que con una rutina lisp o vlisp pueda contar las lineas deacuerdo a su codigo que se conectan a cada bloque esto con la finalidad que no importe que se le de escala al bloque y cuidando que no todos los bloques a utilizar tienen la misma figura geometrica ya que pueden ser circulares, rectangulares prismaticas etc..
Actualmente tengo la idea de ir dando de alta en cada proyecto cada uno de los bloques guardando puntos en ldata en cada bloque para que por medio de polar y selecciones ssget con filtros pueda realizar dicho trabajo solo que quisiera ver si pudiera haber otra posibilidad poco mas practica.. otras de los problemas es el angulo que se tiene que cuidar por que varia de acuerdo al insertado en el dibujo conforme al angulo a utilizar...
les agradecería de antemano su ayuda saludos!!!
Les traigo por aqui una pregunta pero primero explico lo que deseo:
Adjunto un plano de una vivienda pequeña como ejemplo:
1.- En el plano de la vivienda la mayoria de simbolos eléctricos son bloques los cuales ya tengo predeterminados; como se ve en dichos bloques están intercomunicados entre lineas algunos bloques tienen mas de dos lineas que se conectan o se unen por así decirlo... dichas lineas representan un codigo....lo que deseo es ver como puedo hacer para que con una rutina lisp o vlisp pueda contar las lineas deacuerdo a su codigo que se conectan a cada bloque esto con la finalidad que no importe que se le de escala al bloque y cuidando que no todos los bloques a utilizar tienen la misma figura geometrica ya que pueden ser circulares, rectangulares prismaticas etc..
Actualmente tengo la idea de ir dando de alta en cada proyecto cada uno de los bloques guardando puntos en ldata en cada bloque para que por medio de polar y selecciones ssget con filtros pueda realizar dicho trabajo solo que quisiera ver si pudiera haber otra posibilidad poco mas practica.. otras de los problemas es el angulo que se tiene que cuidar por que varia de acuerdo al insertado en el dibujo conforme al angulo a utilizar...
les agradecería de antemano su ayuda saludos!!!
Última edición por Famax el Vie Oct 14, 2016 3:24 am, editado 1 vez
Famax- Mensajes : 14
Fecha de inscripción : 12/10/2016
Re: Entidades dentro de Block
Hola Famax ¡¡
No has subido el ejemplo, pero si las líneas las dejas en una sola capa sería muy sencillo contarlas.
El menú del foro da problemas al subir archivos, aqui puedes ver una posible solución.
https://acadhispano.foroargentina.net/t78-limite-de-curvas-de-nivel#580
Un saludo
No has subido el ejemplo, pero si las líneas las dejas en una sola capa sería muy sencillo contarlas.
El menú del foro da problemas al subir archivos, aqui puedes ver una posible solución.
https://acadhispano.foroargentina.net/t78-limite-de-curvas-de-nivel#580
Un saludo
nolo- Mensajes : 182
Fecha de inscripción : 17/03/2016
Continuación
No he podido subir el link de donde esta el archivo no me lo permite sal esto:
Los nuevos usuarios no son autorizados enviar vínculos externos o emailes durante 7 días. Por favor, contacta el admin del foro para tener más informaciones.
Los nuevos usuarios no son autorizados enviar vínculos externos o emailes durante 7 días. Por favor, contacta el admin del foro para tener más informaciones.
Famax- Mensajes : 14
Fecha de inscripción : 12/10/2016
ENTIDADES DENTRO DE BLOCK
Aqui pongo el link para el ejemlo !!!... Saludos!!!
https://www.dropbox.com/s/1ckq4wcz2zqhezc/Ejemplo.dwg?dl=0
https://www.dropbox.com/s/1ckq4wcz2zqhezc/Ejemplo.dwg?dl=0
Famax- Mensajes : 14
Fecha de inscripción : 12/10/2016
Re: Entidades dentro de Block
Te ha faltado subir un ejemplo de como quieres el resultado del conteo, pero para empezar yo tiraría de dos rutinas típicas:
Una que calcula el boundingbox (caja horizontal que contiene a la entidad) y otra la de eliminar duplicados en lista para la que he tomado una de YMG que me pareció super-bonita
Te lo dejo aquí para que pruebes y propongas ...
Un saludo
Una que calcula el boundingbox (caja horizontal que contiene a la entidad) y otra la de eliminar duplicados en lista para la que he tomado una de YMG que me pareció super-bonita
- Código:
(defun c:contar( / bbi distinct ent p ss ssi)
;; By Nolo oct 2016
; lista con los puntos del boundingbox de un objeto
(defun bbi(obj / lp)
(if (=(type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj)))
(if (vlax-method-applicable-p obj 'GetBoundingBox)
(progn
(vla-GetBoundingBox obj 'minimo 'maximo )
(setq lp(list
(vlax-safearray->list minimo)
(vlax-safearray->list maximo)
))
))
)
;;; elimina duplicados en lista YMG
(defun distinct(l)
(if l
(cons(car l)(distinct (vl-remove (car l) l)))
))
(setq ent (car (entsel "\nSeleccionar bloque Ar- : "))
p (bbi (vlax-ename->vla-object ent ))
ss (ssget "_c" (car p) (cadr p)'((8 . "codigo *")))
ss (apply 'append (ssnamex ss))
ss (vl-remove-if-not '(lambda(a)(=(type a)'ename)) ss)
ss (mapcar '(lambda(a)(cdr(assoc 8 (entget a)))) ss)
ssi (acad_strlsort(distinct ss))
ss (mapcar '(lambda(a)(cons (length (vl-remove-if '(lambda(b)(/= b a)) ss))a))ssi)
)
)
- Código:
((16 . "Codigo 1") (8 . "Codigo 2") (1 . "Codigo 3") (2 . "Codigo 4") (3 . "Codigo 5") (1 . "Codigo 7") (1 . "Codigo 8"))
Te lo dejo aquí para que pruebes y propongas ...
Un saludo
nolo- Mensajes : 182
Fecha de inscripción : 17/03/2016
ENTIDADES DENTRO DE BLOCK
Es excelente nolo exactamente lo que requería ni mas ni menos!!!... Muchas gracias maestro nunca fallas!!!... lo voy a estudiar para comprender su funcionamiento pero de aqui me has resuelto muchas cosas en mis proyectos de autolisp y visualisp!!
Saludos!!!
Saludos!!!
Famax- Mensajes : 14
Fecha de inscripción : 12/10/2016
ENTIDADES DENTRO DE BLOCK
Que tal!!... me encuentro dentro de la rutina con el que me apoyo nolo pero tengo otra dificultad esta rutina es excelente solo que presenta una problemilla para mi objetivo, lo que pasa es que se selecciona todo lo que pasa dentro del rectangulo que se forma con los puntos del vla-GetBoundingBox, lo que intento es ver que solo se seleccionen aquellas lineas, polilineas, lwpolilineas, curvas que terminen o su punto final toque el bloque quisera saber alguna idea de como resolver este punto!!!...saludos
Famax- Mensajes : 14
Fecha de inscripción : 12/10/2016
Re: Entidades dentro de Block
Disculpa, he tardado en volver a leer el post.
Como veo que los bloques estan contenidos en un cuadrado, creo que la solución mas fácil es un filtro que mire los puntos extremos de polilineas, arcos o líneas que corten al boundinbox y vean si están o no a una distancia del centro menor que la mitad de la diagonal.
Igual que la anterior, la rutina te la dejo sin control de errores para que te la personalices.
Un saludo
Como veo que los bloques estan contenidos en un cuadrado, creo que la solución mas fácil es un filtro que mire los puntos extremos de polilineas, arcos o líneas que corten al boundinbox y vean si están o no a una distancia del centro menor que la mitad de la diagonal.
- Código:
(defun c:contar2( / bbi distinct ent p d ss ssi)
;; By Nolo oct 2016
; lista con los puntos del boundingbox de un objeto
(defun bbi(obj / lp)
(if (=(type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj)))
(if (vlax-method-applicable-p obj 'GetBoundingBox)
(progn
(vla-GetBoundingBox obj 'minimo 'maximo )
(setq lp(list
(vlax-safearray->list minimo)
(vlax-safearray->list maximo)
))
))
)
;;; elimina duplicados en lista YMG
(defun distinct(l)
(if l
(cons(car l)(distinct (vl-remove (car l) l)))
))
(defun mirar (name / pc p1 p2)
;; rutina para extremos aue compara distancias y da T interior nil exterior
(cons (cdr (assoc 8 name))(vl-remove nil
(cond
((= (cdr (assoc 0 name)) "ARC")(setq pc (cdr (assoc 10 name)))(list
(<=(distance p (polar pc (cdr(assoc 50 name))(cdr(assoc 40 name))))d)
(<=(distance p (polar pc (cdr(assoc 51 name))(cdr(assoc 40 name))))d)
))
((= (cdr (assoc 0 name)) "LWPOLYLINE")
(setq pc(vl-remove-if-not'(lambda(b)(=(car b)10))name))
(list (<=(distance p (car pc))d)(<=(distance p (last pc))d))
)
((= (cdr (assoc 0 name)) "LINE")
(list (<=(distance p (cdr(assoc 10 name)))d)
(<=(distance p (cdr(assoc 11 name)))d))
)
(T (list nil nil))
)
)))
(setq ent (car (entsel "\nSeleccionar bloque Ar- : "))
p (bbi (vlax-ename->vla-object ent )) ;; puntos diagonal
d (*(/(apply 'distance p) 2)1.1) ;; distancia incrementada un 10%
ss (ssget "_c" (car p) (cadr p)'((8 . "codigo *")))
p (mapcar '/ (apply 'mapcar (cons '+ p))'(2 2 2)) ;;; punto centro diagonal
ss (apply 'append (ssnamex ss))
ss (vl-remove-if-not '(lambda(a)(=(type a)'ename)) ss)
ss (mapcar '(lambda(a) (mirar (entget a))) ss)
ss (mapcar 'car(vl-remove-if-not '(lambda(a) (cdr a)) ss)) ;; elimina los nil de mirar
ssi (acad_strlsort(distinct ss))
ss (mapcar '(lambda(a)(cons (length (vl-remove-if '(lambda(b)(/= b a)) ss)) a))ssi)
)
)
Igual que la anterior, la rutina te la dejo sin control de errores para que te la personalices.
Un saludo
nolo- Mensajes : 182
Fecha de inscripción : 17/03/2016
Re: Entidades dentro de Block
Que tal nolo era exactamente lo que necesitaba por fin pude resolver mucho mas problemas de lo que requeria saludos!!!
Famax- Mensajes : 14
Fecha de inscripción : 12/10/2016
Temas similares
» Crear un block con dos entidades.
» Listado de entidades en un dibujo
» Insertar Block en Tabla
» EXTRAER BLOCK DE TABLA
» Seleccion con and dentro de un while....
» Listado de entidades en un dibujo
» Insertar Block en Tabla
» EXTRAER BLOCK DE TABLA
» Seleccion con and dentro de un while....
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|