acad hispano
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Entidades dentro de Block

2 participantes

Ir abajo

Entidades dentro de Block Empty Entidades dentro de Block

Mensaje por Famax Jue Oct 13, 2016 12:12 am

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!!!


Ú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

Volver arriba Ir abajo

Entidades dentro de Block Empty Re: Entidades dentro de Block

Mensaje por nolo Jue Oct 13, 2016 9:30 pm

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

nolo

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

Volver arriba Ir abajo

Entidades dentro de Block Empty Continuación

Mensaje por Famax Lun Oct 17, 2016 9:21 pm

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.

Famax

Mensajes : 14
Fecha de inscripción : 12/10/2016

Volver arriba Ir abajo

Entidades dentro de Block Empty ENTIDADES DENTRO DE BLOCK

Mensaje por Famax Lun Oct 24, 2016 4:36 pm

Aqui pongo el link para el ejemlo !!!... Saludos!!!

https://www.dropbox.com/s/1ckq4wcz2zqhezc/Ejemplo.dwg?dl=0

Famax

Mensajes : 14
Fecha de inscripción : 12/10/2016

Volver arriba Ir abajo

Entidades dentro de Block Empty Re: Entidades dentro de Block

Mensaje por nolo Mar Oct 25, 2016 2:08 pm

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

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)
)
)
No tiene filtros de errores y hay que seleccionar uno a uno los bloque para obtener como resultado una lista del tipo :
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

Volver arriba Ir abajo

Entidades dentro de Block Empty ENTIDADES DENTRO DE BLOCK

Mensaje por Famax Miér Oct 26, 2016 3:40 am

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!!!

Famax

Mensajes : 14
Fecha de inscripción : 12/10/2016

Volver arriba Ir abajo

Entidades dentro de Block Empty ENTIDADES DENTRO DE BLOCK

Mensaje por Famax Jue Oct 27, 2016 2:43 am

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

Volver arriba Ir abajo

Entidades dentro de Block Empty Re: Entidades dentro de Block

Mensaje por nolo Lun Nov 07, 2016 1:57 pm

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.

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)
)

)
Prueba
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

Volver arriba Ir abajo

Entidades dentro de Block Empty Re: Entidades dentro de Block

Mensaje por Famax Jue Dic 29, 2016 7:18 pm

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

Volver arriba Ir abajo

Entidades dentro de Block Empty Re: Entidades dentro de Block

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

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