PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Готовый модуль рисования графиков


Готовый модуль рисования графиков

Сообщений 1 страница 12 из 12

1

Есть устройство выдающее в com или USB некие данные. Очень бы хотелось рисовать графики по этим данным.
Существует ли готовый модуль, который можно включить в программу?

0

2

Графики бывают разные и сложно сказать какой нужен вам.
Есть вот такой пример:

Код:
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

Нужно запустить программу и двигать ползунок.

0

3

Civil написал(а):

Существует ли готовый модуль, который можно включить в программу?

В кодархиве много примеров 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

0

4

Спасибо за примеры, вечером попробую разобраться. Если есть возможность - добавьте в тему скриншотов, получаемых с этим кодом.
По-максимуму хотелось бы следующее:
1. несколько осей У
2. быстрое масштабирование оси Х (минута/час/день...)
3. наложение архивных данных
4. автомасштабирование оси У
5. ну и "шоб было красиво" : )

0

5

Скриншот во вложении.

0

6

Ползунок, как я понимаю, перемещает по времени.
А это он в реалтайме рисует?

0

7

Как раз ползунок и рисует.

0

8

Посмотрел примеры "живьем". Применение ползунка впечатлило : )
Пётр, а вот этот график можете показать чем рисовали?

http://s48.radikal.ru/i119/0909/87/35d19a1b5463.png

0

9

Это график из проги, отображающей состояние телефонной линии при использовании интернета по технологии 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

0

10

Текст с комментариями это очень хорошо. Спасибо.

0

11

ВиниПур написал(а):

В кодархиве много примеров CodeArchivPB4\Graphics\Graphs\

А где, собственно, находится кодархив?  На диске у меня его нет.

И еще: кто нибудь работал с такой библиотекой? http://www.purearea.net/pb/download/use … _PB402.zip Она умеет рисовать в реальном времени?

0

12

Civil написал(а):

А где, собственно, находится кодархив?

http://www.purearea.net/pb/CodeArchiv/CodeArchiv.html

Civil написал(а):

И еще: кто нибудь работал с такой библиотекой?

Посмотрел.
Довольно интересная библиотека.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Готовый модуль рисования графиков