Elegir desde un Initget
2 participantes
Página 1 de 1.
Elegir desde un Initget
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....
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
Re: Elegir desde un Initget
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í:
O así con opción por defecto y opcion de salida.
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:
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
Re: Elegir desde un Initget
Muchas gracias maestro, como siempre además de resolver el problema, lo explicas claramente.
Saludos
Saludos
eliasp- Mensajes : 195
Fecha de inscripción : 17/03/2016
Re: Elegir desde un Initget
con gusto amigo.
Gerardo Calvo- Mensajes : 46
Fecha de inscripción : 29/10/2019
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|