Как создать интерактивную диаграмму с Rebol - PullRequest
1 голос
/ 05 сентября 2010

У меня есть этот код для создания графика свечей в реболе.Теперь я хотел бы использовать сверхчувство http://www.rebol.com/how-to/feel.html#section-6, чтобы отобразить информацию о каждой свече, но моя коробка нарисована с использованием диалекта рисования, и он, кажется, не принимает событие?

plot: [
    pen green line 5x404 5x440 pen gold fill-pen 0.255.0 box 3x424 7x418 line 10x396 10x422 pen gold fill-pen 0.255.0 box 8x418 12x402 line 15x397 15x436 pen gold fill-pen 255.0.0 box 13x401 17x435 line 20x429 20x447 pen gold fill-pen 255.0.0 box 18x434 22x446 line 25x441 25x464 pen gold fill-pen 255.0.0 box 23x446 27x463 line 30x445 30x493 pen gold fill-pen 255.0.0 box 28x461 32x482 line 35x470 35x504 pen gold fill-pen 255.0.0 box 33x481 37x492 line 40x466 40x498 pen gold fill-pen 0.255.0 box 38x491 42x477
]

  grid: [1100 600]
  step-grid: 5
  max-n-points: (grid/1 / step-grid) - 1
  x-axis-border: 20
  Y-margin: 10
  X0: 5
  grid-color: coal


  main: layout [
      origin 20x0
      space 1x1
      panel1: box 1100x580 black effect reduce [
      'line-pattern 4 4
      'grid 30x30 0x0 (grid-color)
      'draw plot
      ]
      panel2: box 1100x0 black
      panel3: box 1100x20 black
  ]

  view main

alt text

1 Ответ

1 голос
/ 08 сентября 2010

Вот небольшое расширение моего предыдущего ответа, связанного с вашей программой просмотра диаграмм.

Есть много способов, которыми вы можете адаптировать его, но это должно дать вам некоторые идеи для решения вашей проблемы.

rebol []

plot: []
data: reduce [ ]

refresh: func [/local clr delta prev-pos pos] [
    clear plot
    prev-pos: 0x300
    foreach [clr delta] data [
        pos: prev-pos + (delta * 0x1) + 7x0
        append plot compose [
            pen (clr) line (prev-pos) (pos) fill-pen (clr) pen none circle dot-size (pos) 
        ]
        prev-pos: pos
    ]
    show panel1
]
add-data: func [i][loop i [append data reduce [(random white * .85) + (white * .15) (-20 + random 40)]] refresh]

grid: [800 600]
step-grid: 5
max-n-points: (grid/1 / step-grid) - 1
x-axis-border: 20
Y-margin: 10
X0: 5
grid-color: coal
dot-size: 3

viewer-size: 800x580

; open up console before vid window
main: layout [
    origin 20x0
    space 1x1
    field 800
    panel1: box viewer-size black rate 30 effect [
        line-pattern 4 4
        grid 30x30 0x0 grid-color
        draw plot
    ] feel [
        ;probe first panel1
        over: func [face over? offset /local d][
            panel1/pane: either over? [info-pane][none]

            if over? [
                d:  offset/x - face/offset/x - 1
                d: (to-integer d / 7) * 2 + 1
                either d: pick data d [
                    info-box/text: to-string d
                ][
                    panel1/pane: none
                ]
            ]
        ]
        engage: func [face action event] [
            switch action [
                down [
                    drag-start: event/offset
                ]
                up [
                    drag-end: event/offset
                    scroll-size: to-integer abs ((pick (drag-start - drag-end) 1) / 5)
                ]
                time [
                    info-box/offset: event/offset - 20x20 ; the offset is the main-window origin
                    show main
                ]
            ]
        ]
    ]
    panel2: box 800x0 black
    panel3: box 800x20 black
]

insert-event-func [
    either all [
        event/type = 'key 
        none? system/view/focal-face
    ][
        print ["shortcut: " event/key]
        switch event/key [
            ; escape
            #"^[" [quit]
            ; enter/return
            #"^M" [print "resampling data" clear data add-data 100]
            up [dot-size: dot-size + 1 show panel1]
            down [dot-size: dot-size - 1 show panel1]
            left [clear skip tail plot -12 clear skip tail data -2 show panel1]
            right [add-data 2]
        ]
        none
    ][
        event
    ]
]


info-box: make face [
    offset: 0x0
    color: white * .2
    size: 150x30
    text: "0.0.0"
    font: make font [valign: 'middle style: [bold italic]]
]
info-pane: reduce [info-box]

add-data 100
refresh
view/options main [all-over]
focus panel1

Обратите внимание, что при наведении мыши на график мы используем только компонент X мыши, чтобы выяснить, что отображать. Лучшие системы очевидны, но этого достаточно, чтобы проиллюстрировать, что нужно сделать, чтобы получить все события перемещения мыши и воздействовать на них.

Также обратите внимание, что перерасход получает смещения окна, поэтому вы должны удалить смещение лица, чтобы получить реальные координаты относительно лица.

alt text

PS: красная стрелка вверху - мой курсор мыши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...