Controlar selección de puntos en pantalla

Ir abajo

Controlar selección de puntos en pantalla

Mensaje por carlosmgilp el Vie Nov 02, 2018 5:07 am

Hola como están.
Me podrían ayudar a solucionar esto.

Estoy tratando de seleccionar cuatro puntos en pantalla, p1 p2 p3 p4

Estoy tratando de hacerlo de la siguiente manera.

Código:
(setq p1 (getpoint "\nSeleccione p1: "))

(while (null p2)
  (setq p2 (getpoint p1 "\nSeleccione p2: "))
  (cond ((equal p1 p2) (princ "Punto duplicado.") (setq p2 nil))))

(while (null p3)
  (setq p3 (getpoint p1 "\nSeleccione p3: "))
  (cond ((or (equal p3 p1) (equal p3 p2)) (princ "Punto duplicado.") (setq p3 nil))))

(if (eq (setq ptemp (getpoint p1 "\nSeleccione p4: ")) nil)
  (setq p4 p3)
  (setq p4 ptemp))

Que quiero hacer.

Seleccione p1 - no hay problema

Seleccione p2 - si p2 es igual que p1, vuelva a solicitar p2 y coloque el texto de que el punto esta duplicado, si doy enter deje de correr el programa

Seleccione p3 - si p3 es igual que p1 o igual que p2, vuelva a solicitar p3 y coloque el texto de que el punto esta duplicado, si doy enter deje de correr el programa

Seleccione p4 - si p4 es igual que p1, o igual que p2 o igual que p3, vuelva a solicitar p4 y coloque el texto de que el punto esta duplicado, pero si doy enter quiero que p4 sea igual que p3

No se que estoy haciendo mal o si hay alguna manera mejor de hacerlo.

Espero me hayan entendido y de antemano muchas gracias.

Saludos.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Controlar selección de puntos en pantalla

Mensaje por nolo el Vie Nov 02, 2018 1:42 pm

Se me ocurre utilizar una lista y comprobar la distancia entre puntos.
Yo he puesto cero en esta prueba pero podrías poner algo mas, por ejemplo 0,0001 o lo que quieras, dependiendo de la escala a la que estés trabajando
Código:
(defun c:pro( / lp p lpro)
(setq lp '())
(while (and
 (< (length lp) 4)
 (setq p (getpoint (strcat "Punto "(itoa (+ (length lp)1)) " : ")))
 )
(command "_point" p)
(if lp
 (setq lpro (mapcar '(lambda(a)(distance p a)) lp))
 (setq lp (cons p lp))
)
(if(member 0 lpro)
 (princ (strcat (chr 10)"punto repetido ......"))
 (if (not (member p lp)) (setq lp (cons p lp)))
)
)
(if (=(length lp)3) (setq lp (cons (last lp) lp)))

(princ lp)
(princ)
)

Un saludo

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Controlar selección de puntos en pantalla

Mensaje por carlosmgilp el Dom Nov 04, 2018 11:00 pm

Hola nolo como has estado, muchas gracias por la solución.

Funciona muy bien, pero de esta forma, no puedo ver la linea elástica que se hace desde p1 hasta cada punto que se necesita seleccionar.
Que se logra colocando el p1 después de la función getpoint (setq p2 (getpoint p1 "\nSeleccione p2: "))
Y lo otro que veo es que no puedo personalizar los textos cuando voy a informar sobre la selección de cada punto.
Porque en este caso lo dejaste incluido en el while y solo aumentas su valor de punto.
Pero si quiero indicar seleccione punto 1 en el origen, pero el punto dos va a decir seleccione su ubicación arriba, no se si me entiendes.

Y como siempre muchas gracias también por tu ayuda.
Saludos.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Controlar selección de puntos en pantalla

Mensaje por nolo el Lun Nov 05, 2018 11:26 am

Bueno ... es solo un camino que tiene mil soluciones para lo que planteas.
Por ejemplo
Código:
(defun c:pro( / lp p lpro c)
(setq lp '())
(while (and
 (< (setq c(length lp)) 4)
 (cond
 ((zerop c)
 (setq p (getpoint (strcat (chr 10)"Primer punto : ")))
 )((= c 1)
 (setq p (getpoint (car lp)(strcat (chr 10)"Segundo punto : ")))
 )((= c 2)
 (setq p (getpoint (car lp)(strcat (chr 10)"Tercer punto : ")))
 )((= c 3)
 (setq p (getpoint (car lp)(strcat (chr 10)"Punto final : ")))
 )( t nill)
 ))
(command "_point" p)
(if lp
 (setq lpro (mapcar '(lambda(a)(distance p a)) lp))
 (setq lp (cons p lp))
)
(if(member 0 lpro)
 (princ (strcat (chr 10)"punto repetido ......"))
 (if (not (member p lp)) (setq lp (cons p lp)))
)
)
(if (=(length lp)3) (setq lp (cons (last lp) lp)))

(princ lp)
(princ)
)

Un saludo

Nota.-
Yo utilizo el chr 10 en vez de la barra invertida n porque a veces la página del foro se me come la barra. Una vez copiado, es fácil de cambiar

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Controlar selección de puntos en pantalla

Mensaje por carlosmgilp el Miér Nov 07, 2018 6:38 am

Hola nolo, como estas.
Mil gracias por la ayuda, todo esta muy bueno.
Un saludo.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Controlar selección de puntos en pantalla

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.