Есть устройство выдающее в 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 |