Graficar coordenadas por e y dentro de un datawindow

Nuevamente tengo otra consulta que hacerte y espero vuelvas ayudarme.
Cuando creo un freeform external, me muestra una ventana "define result set" donde me pide agregar las "descriptions" pero justamente ese es mi problema que no sé cuántas debo colocar. Pero primero te explico lo que intento hacer para que me ayudes.
Quiero crear un data window object de tipo freeform external, con la finalidad de poder insertar un gráfico de coordenadas por e y, pero para por cuestión de estética mis ejes de coordenadas son los lados de un "rectangle (llamado r_acc)" es decir el eje por es el lado inferior de mi rectangle y mi eje y es el lado izquierdo de ese mismo rectangle, en la parte superior de mi dw object, es decir arriba del rectangle de coordenadas, coloque un static text (llamado t_titulo) para que sea el titulo del gráfico, y coloque otros dos static text en los ejes de coordenadas (en los lados de mi rectangle), que en este caso son x=frecuencia e y=amplitud, agregue otro rectangle (llamado r_cursor) en medio del rectangle de coordenadas para que sea el cursor que se visualizara en la interfaz al momento de correr la aplicación.
Finalmente mi objetivo es que este data window lea los "enter" que haga una vez que ubique el cursor con ayuda de mi teclado (moverse a la derecha, izquierda, hacia arriba y abajo) en los ejes por e y, de tal manera que cuando presione "enter" se marque ese punto con un símbolo "X" o " 0 (circulo)" y que estos símbolos sean de color azul o rojo. Un detalle más, los puntos deben unirse con líneas del mismo color, es decir cuando se termine de graficar el segundo punto este debe estar unido al primer punto y así sucesivamente.
Mil disculpas experto si mi consulta esta fuera de lugar o si no me dejé entender.

1 respuesta

Respuesta
1
Todo lo que has creado en tu dw tiene que estar en la cabecera(header)
1. En shared variables pones esto
int ai_x , ai_y         //estas seran las coordenadas para el cursor y para los puntos
int li_enter = 0       //esta variable ira aumentando en 1 cada vez q se presiona enter
int x1 , y1 , x2 , y2  //estas variables seran las coordenadas para las lineas
2. en el evento open de tu ventana
ai_x = integer(dw_1.describe("r_cursor.x"))
ai_y = integer(dw_1.describe("r_cursor.y"))
3. Las sgts funciones los creas en tu window sin retorno
- wf_movercursor(integer ax, internet ay)
            dw_1.modify("r_cursor.x="+string(ax))
            dw_1.modify("r_cursor.y="+string(ay))
       - wf_punto(integer ax , integer ay)
            dw_1.modify("create ellipse(band=Header" + &
            " x='"+string(ax)+"' y='"+string(ay)+"' height='30' width='35'" + &
            " name=ov_l brush.color='"+ string(RGB(0,0,255))+"' pen.style='0'" + &
            " pen.width='1' pen.color='"+ string(RGB(0,0,0))+"' background.mode='0'" + &
            " background.color='"+ string(RGB(0,0,255))+"')")
       - wf_linea(integer ax1 , integer ay1 , integer ax2 , integer ay2)
   dw_1.modify("create line(band=Header pointer='' moveable=0 resizeable=0" + &
" x1='"+string(ax1)+"' y1='"+string(ay1)+"' x2='"+string(ax2)+"' y2='"+string(ay2)+"'"+&
       " name=l_n pen.style='0' pen.width='1' pen.color='"+ string(RGB(0,0,255))+"'" +&
       " background.mode='0' background.color='"+ string(RGB(0,0,255))+"')")
4. en tu control dw t creas un evento, le asignas el id pbm_dwnkey y pones lo sgt
choose case key
 //esto es para el movimiento del cursor//////////
 case KeyUpArrow!
  ai_y -= 5 //en este caso el curssor se movera d 5 en 5
  wf_movercursor(ai_x , ai_y)
 case KeyDownArrow!
  ai_y += 5
  wf_movercursor(ai_x , ai_y)
 case KeyRightArrow!
  ai_x += 5
  wf_movercursor(ai_x , ai_y)
 case KeyLeftArrow!
  ai_x -= 5
  wf_movercursor(ai_x , ai_y)
 //////////////////////////////////////////////////////////
 case KeyEnter!
  wf_punto(ai_x , ai_y)
  li_enter ++ //cada vez q se presione enter su valor aumentara en 1
  if mod(li_enter , 2) <> 0 then//si el numero de presionadas es impar
   x1 = ai_x
   y1 = ai_y
  else
   x2 = ai_x
   y2 = ai_y
  end if
  /*verifica q se haya presionado enter en mas d una
  ocacion para q empiese a dibujar las lineas                  */
  if li_enter > 1 then
   wf_linea(x1 , y1 , x2 , y2)
   x1 = ai_x
   y1 = ai_y
  end if
end choose
... cualquier duda me avisas... suerte
Hola experto, muchas gracias por la ayuda, pero antes de cerrar sólo dos aclaraciones más por favor,
1. Cómo agrego los valores que toma mi eje por (frecuencia) e y (amplitud). Por ejemplo X puede tomar estos valores  X=12.5, 0.25, 1, etc igualmente  Y= -10, 0, 20, etc.
2. Cómo hago para que al momento de correr la aplicación, mi fondo (o base) donde van a ir mis coordenadas (puntos y líneas) se vea cuadriculado.
Muchas gracias y nuevamente quedo a la espera de tu respuesta.
En ese caso tendrías que hacer lo sgt...
Puedes ponerle 2 lineas... una que sea por y la otra Y para que representen los 4 cuadrantes. Para esto es necesario que sepas las coordenadas en donde esas 2 lineas se interceptan... ese punto sera el origen... es preferible tener esa coordenada un numero par... por ejemplo 2000,1000.
Para la primera pregunta... supongamos el punto de origen mencionado y que la distancia entre los valores de POR es 100 y los de Y son 90. En tu ventana tendrías 2 sle (sle_x, sle_y)para cada dato... para que dibuje el punto lo que tienes que hacer es esto...
X = 2000 + (long(sle_x.text)*100)
Y = 1000 - (long(sle_y.text)*90)
llamarias a la funcion wf_punto de la sgt manera....
wf_punto(2000 + (long(sle_x.text)*100) , 1000 - (long(sle_y.text)*90))
Para que dibujes cuadriculas utiliza for para ambos ejes... n el constructor de tu dw o en el evento open de tu window pones esto...
int li
for li = 1 to 10 //horizontales
 wf_linea(100 , 1000  - li*90 , 4000 , 1000 - li*90) 
 wf_linea(100 , 1000  + li*90 , 4000 , 1000 + li*90)
next
for li = 1 to 20 //verticales
 wf_linea(2000 - li*100 , 90 , 2000 - li*100 , 2000)
 wf_linea(2000 + li*100 , 90 , 2000 + li*100 , 2000)
next
... spero habert ayudado.
Experto respecto a las cuadrículas tengo un inconveniente, pues actualmente las cuadrículas están en todo el data window control y me gustaría que las cuadrículas se ajustaran al tamaño de mi data window object, para que se vea mejor mi interfaz.
Me disculparas pero el nivel que tengo es muy básico y no entendí lo de las líneas POR e Y ni tampoco lo de la coordenada inicial, en mi caso la coordenada inicial sería (X=1, Y=0).
Por favor si podrías explicarme un poquito más detallado lo que ue te solicito te lo agradecería. De repente si te digo que valores toman mis ejes, me pueda quedar más claro la idea, mis valores para el eje X= -10, 0, 10, 20, 30, 40, 50, 60,70, 80, 90,100,110, 120.  y para el eje  Y= 0.125, 0.25, 0.5, 1 1.5, 2, 3,4, 5, 6, 8, 10, 12.5.
¿Gracias nuevamente y con esto cerraría la pregunta?
Que se ajusten al tamaño de tu obj dw...¿? ¿?... pues... dejame decirte que el tamaño dl obj dw depende de los objetos que contenga.. dependiendo de la posición del objeto.. el obj dw se hace más grande.
Ahra... t decia q hagas q las 2 lineas se interseqten en este punto... 2000,1000.. ese punto sera tu origen... ese unto representara las coordenadas 0,0 de tu plano... weno... sorry... peo no se q mas podria hacer ti

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas