Есть устройство выдающее в com или USB некие данные. Очень бы хотелось рисовать графики по этим данным.
Существует ли готовый модуль, который можно включить в программу?
Готовый модуль рисования графиков
Сообщений 1 страница 12 из 12
Поделиться123.03.2011 18:35:44
Поделиться223.03.2011 18:56:07
Графики бывают разные и сложно сказать какой нужен вам.
Есть вот такой пример:
Structure Meter
PBimg.l
width.l
height.l
offset.l
values.l[1024]
EndStructure
#WM_UPDATEMETER = #WM_USER+1500
#WM_SETFGCOLOR = #WM_USER+1501
#WM_SETBGCOLOR = #WM_USER+1502
#WM_SETGDCOLOR = #WM_USER+1503
#WM_SETBDCOLOR = #WM_USER+1504
#WM_FILLED = #WM_USER+1506
#WM_PEAK = #WM_USER+1507
Procedure MeterProc(hwnd,msg,wParam,lParam)
Select msg
Case #WM_UPDATEMETER
*mr.Meter=GetWindowLong_(hwnd,#GWL_USERDATA)
If *mr\offset=10
*mr\offset=0
EndIf
For d=0 To *mr\width-1
*mr\values[d]=*mr\values[d+1]
Next
*mr\values[*mr\width-1]=lParam
StartDrawing(ImageOutput(*mr\PBimg))
Box(0,0,*mr\width,*mr\height,#Black)
For a=0 To *mr\height Step 10
LineXY(0,a,*mr\width,a,$7F00)
Next
For a=0 To *mr\width+*mr\offset Step 10
LineXY(a-*mr\offset,0,a-*mr\offset,*mr\height,$7F00)
Next
For d=0 To *mr\width
bottom.l=*mr\height
thepercent.f=(*mr\values[d]/100)
actualheight.l=Int(thepercent* *mr\height)
Y1.l=bottom-actualheight
thepercent.f=(*mr\values[d+1]/100)
actualheight.l=Int(thepercent* *mr\height)
Y2.l=bottom-actualheight
LineXY(d,Y1,d+1,Y2,$FF00)
Next
*mr\offset+1
StopDrawing()
SetWindowLong_(hwnd,#GWL_USERDATA,*mr)
SendMessage_(hwnd,#STM_SETIMAGE,#IMAGE_BITMAP,ImageID(*mr\PBimg))
EndSelect
ProcedureReturn CallWindowProc_(GetProp_(hwnd,"oldproc"),hwnd,msg,wParam,lParam)
EndProcedure
Procedure MeterControl(id.l,x,Y,width,height)
image=CreateImage(#PB_Any,width,height)
StartDrawing(ImageOutput(image))
Box(0,0,width,height,#Black)
For a=0 To height Step 10
LineXY(0,a,width,a,$7F00)
Next
For a=0 To width Step 10
LineXY(a,0,a,height,$7F00)
Next
StopDrawing()
imagegad.l=ImageGadget(id,x,Y,width,height,ImageID(image),#PB_Image_Border)
SetProp_(GadgetID(imagegad),"oldproc",SetWindowLong_(GadgetID(imagegad),#GWL_WNDPROC,@MeterProc()))
If id=#PB_Any
hwndreturn=imagegad
hwnd=GadgetID(imagegad)
Else
hwndreturn=imagegad
hwnd=imagegad
EndIf
*mtr.Meter=AllocateMemory(SizeOf(Meter))
*mtr\PBimg=image
*mtr\width=width
*mtr\height=height
SetWindowLong_(hwnd,#GWL_USERDATA,*mtr)
ProcedureReturn hwndreturn
EndProcedure
Procedure GetMeterImage(id.l)
*mr.Meter=GetWindowLong_(GadgetID(id),#GWL_USERDATA)
bitmapreturn.l=*mr\PBimg
ProcedureReturn bitmapreturn
EndProcedure
OpenWindow(0,0,0,470,460,"Meter Control",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
themeter.l=MeterControl(#PB_Any,90,10,290,200)
TrackBarGadget(20,110,300,260,30,0,100)
ButtonGadget(21,160,350,140,20,"Save Meter Image")
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
SendMessage_(GadgetID(themeter),#WM_UPDATEMETER,0,GetGadgetState(20))
Select EventGadget()
Case 21
Pattern$ + "Bitmap (*.bmp)|*.bmp|"
Pattern = 0
filename.s=SaveFileRequester("Please Choose The File Name To Save", "", Pattern$, Pattern)
If filename
If GetExtensionPart(filename)<>"bmp"
filename+".bmp"
EndIf
SaveImage(GetMeterImage(themeter),filename,#PB_ImagePlugin_BMP)
EndIf
EndSelect
Case #PB_Event_CloseWindow
Quit=1
EndSelect
Until Quit=1Нужно запустить программу и двигать ползунок.
Поделиться323.03.2011 18:57:51
Существует ли готовый модуль, который можно включить в программу?
В кодархиве много примеров CodeArchivPB4\Graphics\Graphs\
Есть готовая библиотека построения графиков в Droopy:
OpenWindow(0, 0, 0, 280, 360, "Graph", #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
CreateGadgetList(WindowID(0))
a=Graph(10,10,250,250,40,3000,6000,9000,RGB(255,0,0),color=RGB(255,255,0),color=RGB(0,255,0),255)
b=Graph(10,280,250,60,40,3000,6000,9000,RGB(255,0,0),color=RGB(255,255,0),color=RGB(0,255,0),0)
For n= 0 To 5000
toto+1
If toto=20
rnd=Random(9000)
GraphSet(a,rnd)
GraphSet(b,rnd)
toto=0
EndIf
Delay(1)
Event=WindowEvent()
If Event=#PB_Event_CloseWindow : End : EndIf
If Event=#PB_Event_Gadget
Select EventGadget()
Case GraphEvent(a)
Beep_(400,25)
EndSelect
EndIf
NextИ тут есть нормальный код ( без использования библиотек):
http://pbasic.spb.ru/phpBB2/viewtopic.p … 0%F4%E8%EA
Поделиться423.03.2011 20:32:03
Спасибо за примеры, вечером попробую разобраться. Если есть возможность - добавьте в тему скриншотов, получаемых с этим кодом.
По-максимуму хотелось бы следующее:
1. несколько осей У
2. быстрое масштабирование оси Х (минута/час/день...)
3. наложение архивных данных
4. автомасштабирование оси У
5. ну и "шоб было красиво" : )
Поделиться523.03.2011 20:43:51
Скриншот во вложении.
Поделиться623.03.2011 21:06:29
Ползунок, как я понимаю, перемещает по времени.
А это он в реалтайме рисует?
Поделиться723.03.2011 21:46:35
Как раз ползунок и рисует.
Поделиться824.03.2011 00:22:40
Посмотрел примеры "живьем". Применение ползунка впечатлило : )
Пётр, а вот этот график можете показать чем рисовали?

Поделиться924.03.2011 00:47:36
Это график из проги, отображающей состояние телефонной линии при использовании интернета по технологии ADSL.
#GrafikLine_Color=$8A9B3A
Structure SNR_Info
CountTone.l
Tone.c[1000]
EndStructure
LoadFont(2,"Lucida Console",8)
LoadFont(3,"Courier New",8)
Procedure SNR_CreateGrafik(State)
kHz=34
kHz_Step=69
Tone=8
Tone_Step=16
If State=1
kHz=kHz*2
kHz_Step=kHz_Step*2
Tone=Tone*2
Tone_Step=Tone_Step*2
EndIf
If StartDrawing(ImageOutput(10))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(2))
Box(1,1,578,118,RGB(240, 240, 240))
DrawText(4, 2, "SNR", RGB(132, 0, 0))
DrawText(4, 12, "dB", RGB(132, 0, 0))
Number=60
LineXY(28,25,538,25,RGB(150, 150, 150))
For x = 20 To 70 Step 10 ; Создание горизонтальных линий
LineXY(28,x+15,538,x+15,RGB(200, 200, 200)) ; Линия
DrawText(8, x+9, Str(Number), RGB(132, 0, 0)) ; Текст скраю графика
DrawText(546, x+9, Str(Number), RGB(132, 0, 0))
Number-10
Next x
LineXY(28,x+15,538,x+15,RGB(150, 150, 150))
DrawingFont(FontID(3))
p=0 : n=1
LineXY(28,25,28,x+15,RGB(150, 150, 150))
For y = 44 To 528 Step 16 ; Создание вертикальных линий
LineXY(y,26,y,x+14,RGB(200, 200, 200)) ; Линия
If p=0 And y<528
p=1
If n=1
n=0
Else
n=1
EndIf
DrawText(y-8, 100, Str(kHz+n), RGB(3, 2, 208))
DrawText(y-4, 10, Str(Tone), RGB(31, 125, 94))
kHz+kHz_Step
Tone+Tone_Step
Else
p=0
EndIf
Next y
LineXY(y-1,25,y-1,x+15,RGB(150, 150, 150)) ; Линия
DrawText(550, 100, "кГц", RGB(3, 2, 208))
DrawText(550, 10, "Тон", RGB(31, 125, 94))
StopDrawing()
EndIf
EndProcedure
Procedure SNR_Info()
; Отображаем в виде графика соотвношение сигнал/шум.
Protected Info.s, CountTone=0, ToneInfo.SNR_Info
SNR_CreateGrafik(1)
For i=1 To 512
ToneInfo\Tone[i] = 40+(Random(20)-16)
Next i
CountTone=512
ToneInfo\CountTone = CountTone
x=1
If StartDrawing(ImageOutput(10))
If CountTone<257
For i=1 To CountTone
SizeLine=ToneInfo\Tone[i]
If SizeLine>0
Line(x+28,95-SizeLine,1,70-(94-SizeLine)+24,#GrafikLine_Color)
Line(x+29,95-SizeLine,1,70-(94-SizeLine)+24,#GrafikLine_Color)
EndIf
x+2
Next i
Else
If CountTone>512 : CountTone=512 : EndIf
For i=1 To CountTone
SizeLine=ToneInfo\Tone[i]
If SizeLine>0
Line(x+28,95-SizeLine,1,70-(94-SizeLine)+24,#GrafikLine_Color)
EndIf
x+1
Next i
EndIf
For x = 28 To 538 Step 16 ; Создание горизонтальных линий
For y=25 To 70+20 Step 10
Plot(x,y,RGB(200, 200, 200)) ; Точка
Plot(x+4,y,RGB(200, 200, 200))
Plot(x+8,y,RGB(200, 200, 200))
Plot(x+12,y,RGB(200, 200, 200))
Plot(x,y+3,RGB(200, 200, 200))
Plot(x,y+6,RGB(200, 200, 200))
Next y
Next x
LineXY(28,25,538,25,RGB(150, 150, 150))
LineXY(28,95,538,95,RGB(150, 150, 150))
LineXY(28,25,28,95,RGB(150, 150, 150))
LineXY(539,25,539,95,RGB(150, 150, 150))
StopDrawing()
SetGadgetState(154, ImageID(10))
EndIf
EndProcedure
OpenWindow(0,0,0,596,170,"",#PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered)
ImageGadget(154,8,10,580,120,0)
CreateImage(10,580,120) ; Здесь будет отображатся график SNR тонов
SNR_CreateGrafik(1)
SetGadgetState(154, ImageID(10))
ButtonGadget(2,10,140,80,24,"Рисовать")
HideWindow(0,0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 2
SNR_Info()
EndIf
EndIf
Until Event = #PB_Event_CloseWindowПоделиться1024.03.2011 01:31:00
Текст с комментариями это очень хорошо. Спасибо.
Поделиться1124.03.2011 22:02:44
В кодархиве много примеров CodeArchivPB4\Graphics\Graphs\
А где, собственно, находится кодархив? На диске у меня его нет.
И еще: кто нибудь работал с такой библиотекой? http://www.purearea.net/pb/download/use … _PB402.zip Она умеет рисовать в реальном времени?
Поделиться1224.03.2011 22:05:44
А где, собственно, находится кодархив?
http://www.purearea.net/pb/CodeArchiv/CodeArchiv.html
И еще: кто нибудь работал с такой библиотекой?
Посмотрел.
Довольно интересная библиотека.
Похожие темы
| помогите построить график | Вопросы по PureBasic | 23.01.2013 |