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

Elegir desde un Initget

2 participantes

Ir abajo

Elegir desde un Initget Empty Elegir desde un Initget

Mensaje por eliasp Jue Jun 15, 2023 8:59 pm

Buen día señores.

Hace algunos años, me ayudaron a armar una rutina haciendo acciones, según se seleccione una palabra. Ahora he tratado de volver a hacer una, pero por alguna razón que obviamente desconozco, no me queda.
¿Serían tan amables de sacarme de mi error?

Muchas gracias maestros....
Código:

(defun c:circulos(/ texto)
  (initget 129 "Arbol CFE Luminaria Tel")
  (while
    (/=(setq texto(getkword "\n Dibujar...{Arbol CFE Luminaria Tel} <Arbol>: "))nil)
    (if (and
         (= texto "Arbol")(arbol)
         (= texto "CFE")(postecfe)
         (= texto "Luminaria")(postelum)
         (= texto "Tel")(postetel)
         )
      (setq texto"Arbol")
      )
    (initget 129 "Arbol CFE Luminaria Tel")
    )  
  )
;-------------------------
(defun arbol()(alert "ARBOL"))
;----------------------------
(defun postecfe()(alert "POSTE CFE"))
;----------------------------
(defun postelum()(alert "LUMINARIA EXISTENTE"))
;----------------------------
(defun postetel()(alert "POSTE TEL"))
;----------------------------

eliasp

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

Volver arriba Ir abajo

Elegir desde un Initget Empty Re: Elegir desde un Initget

Mensaje por Gerardo Calvo Jue Jun 15, 2023 10:43 pm

Hola

Tu initget y tu getkword tienen alguna inconsistencia lógica, pero igual están bien puestos semánticamente así que funcionarán bien.
(Esa inconsistencia es el bitcode 129. Con el valor 1 que previene responder solo con intro y a la vez incluyes en el mensaje la opción <Arbol> por defecto, porque la opción por defecto aplica cuando el usuario mete un intro y el 128 admite valores arbitrarios, pero eso solo tiene sentido si tuvieras posteriormente una accion para valores arbitrarios, por ejemplo una función que lance el alert con la cadena exacta que el usuario digite)

Lo que no tiene sentido del todo es el and dentro del if, porque la variable texto no puede tener 4 valores diferentes simultáneamente por lo tanto ese and nunca se cumple porque tiene 8 condiciones (4 = y 4 funciones) de las cuales solo 1 será verdadera, y and es verdadero cuando las 8 sean verdaderas. Me parece que lo que querías hacer requiere más de un cond.

Luego, en el initget, la letra que pones en mayúscula es importante, porque se toma como "caracter mnemonico", es decir, pones A y se traduce a Arbol, por eso cada palabra debería tener una sola letra mayúscula y que sea una diferente en cada palabra, o de lo contrario todo en minúscula para omitir esa asociación. En resumen, poner "Cfe" en vez de "CFE" XD

Otra más. Si estás pretendiendo que un intro se interprete como Arbol,  o sea, un valor por defecto y a la vez tienes la variable texto como condición de continuación del while, tu bucle es eterno. Seguirá pidiendo entradas y solo aceptará esas 4 opciones. Debes agregar un mecanismo de salida. Este puede ser una opción adicional de Salir. Recuerda que nunca se debe cortar una rutina con escape, porque terminará justo en ese punto omitiendo cualquier codigo siguiente como restauracion de variables, y además disparará la función *error*.

Podrías ponerlo así:
Código:
(defun c:circulos(/ texto)
   (while
      (progn
         (initget 1 "Arbol Cfe Luminaria Tel")
         (setq texto(getkword "\n Dibujar...(Arbol Cfe Luminaria Tel): "))
      )
      (cond
         (   (= texto "Arbol")         (arbol)      )
         (   (= texto "Cfe")         (postecfe)   )
         (   (= texto "Luminaria")   (postelum)   )
         (   (= texto "Tel")         (postetel)   )
      )
   )
)

O así con opción por defecto y opcion de salida.
Código:
(defun c:circulos(/ texto)
   (while
      (progn
         (initget "Arbol Cfe Luminaria Tel Salir")
         (/=
            (setq texto (getkword "\n Dibujar...(Arbol Cfe Luminaria Tel Salir) <Arbol>: "))
            "Salir"
         )
      )
      (cond
         (   (or
               (= texto "Arbol")
               (null texto)
            )
             (arbol)
         )
         (   (= texto "Cfe")         (postecfe)   )
         (   (= texto "Luminaria")   (postelum)   )
         (   (= texto "Tel")         (postetel)   )
      )
   )
)

Y algo más.
Initget se puede adaptar a la entrada dinámica según la activas. Es decir, te puede mostrar las opciones en un desplegable en el cursor o resaltar el caracter mnemonico en la linea de comandos como vínculo en azul para que elijas las opciones con el puntero. Para esto se separa la lista con barras y se ponen corchetes cuadrados en vez de llaves o paréntesis. Te recomiendo ponerlo así [Arbol/Cfe/Luminaria/Tel/Salir]
Prueba esto:

Código:
(defun c:circulos(/ dynmode texto)
   (setq dynmode (getvar "dynmode"))
   (setvar "dynmode" 1)
   (while
      (progn
         (initget "Arbol Cfe Luminaria Tel Salir")
         (/=
            (setq texto (getkword "\n Dibujar...[Arbol/Cfe/Luminaria/Tel/Salir] <Arbol>: "))
            "Salir"
         )
      )
      (alert (cond (texto) ("Arbol")))
   )
   (setvar "dynmode" dynmode)
)

Gerardo Calvo

Mensajes : 46
Fecha de inscripción : 29/10/2019

A robierzo le gusta esta publicaciòn

Volver arriba Ir abajo

Elegir desde un Initget Empty Re: Elegir desde un Initget

Mensaje por eliasp Jue Jun 15, 2023 11:01 pm

Muchas gracias maestro, como siempre además de resolver el problema, lo explicas claramente.

Saludos

eliasp

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

Volver arriba Ir abajo

Elegir desde un Initget Empty Re: Elegir desde un Initget

Mensaje por Gerardo Calvo Vie Jun 16, 2023 12:44 am

con gusto amigo.

Gerardo Calvo

Mensajes : 46
Fecha de inscripción : 29/10/2019

Volver arriba Ir abajo

Elegir desde un Initget Empty Re: Elegir desde un Initget

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.