VB 通过读取数据文件进行绘图 请教!!!

ajunajun 2017-03-23 07:28:39
说明:
1.数据文件abc.txt内容格式如下:
5663.0 1015.39 456.79 10.42
5663.0 1015.40 456.29 10.41
5663.5 1015.39 456.87 10.41
NULL NULL NULL10.40
NULL 1015.37 456.74 10.39
NULL 1015.37 456.68 10.38
NULL 1015.37 456.56 10.37
NULL 1015.39 456.48 10.36
NULL 1015.38 456.35 10.36
NULL 1015.39 456.54 10.35
NULL 1015.39 456.42 10.34
NULL 1015.40 456.53 10.34
NULL 1015.41 456.40 10.33
5651.1 1015.41 456.91 10.33
5641.8 1015.41 457.01 10.31
5637.6 1015.43 456.24 10.30
5642.9 1015.42 456.77 10.29
5643.0 1015.42 457.09 10.29
5642.8 1015.43 456.73 10.28
5641.2 1015.44 456.58 10.27
5644.8 1015.45 456.72 10.26
5636.8 1015.45 456.93 10.26
5640.2 1015.48 456.64 10.25
5643.9 1015.50 456.65 10.24
……
2.文件列数不确定,中间是以空格分开的,最少有一列,每一列代表一种数据(即每一列绘制一条曲线)。
3.数据长度(行数)不确定。
4.数据文件分为分钟值、小时值和秒值,分钟值为每分钟一行数(即60行代表1小时),小时值为1小时一行数,秒值为一秒钟1行数(即每3600行代表1小时)
5.文件第一行代表的起始时间:分钟值第一行是00:00分,小时值是00点,秒值是00:00:00秒。
6.文件最大行数为24小时(一天)的数据,比如,分钟值最多24小时×60行/小时=1440行,小时值最多24行,秒值最多24小时×3600行/小时=86400行。
请教问题:
1、 以调用函数方式调用绘图程序(不使用CommonDialog选择文件):

Private Sub Command1_Click()
Dim PlotDataFilename As String
PlotDataFilename = "D:\kk\abc.txt"
Call PlotTodayDataCurve(PlotDataFilename)
End Sub

2、 纵坐标的上下限为数据的最大值和最小值,横坐标以小时为单位,比如:
(1)、假设文件为分钟值(60行=1小时),现有912行(=15.2小时),则横坐标为16个小时。
(2)、假设文件为秒值(3600行=1个小时),现有15576行数据(>4小时),则横坐标为5个小时。
(3)、假设为小时值数据(1行=1小时),现有23行,则横坐标绘制23小时。
3、 文件中会有缺测(用NULL代替),绘图时应该显示为断点。
效果如下图(4列所以有4组图,在1个PictureBox上画出来。如果文件有1列整个PictureBox画1个图,其他同理):

4、 显示在一个填满主窗体的子窗体中,且整张图填满子窗体。如果每一张图四周用实线,中间的横竖线都用虚线就更好了。纵坐标处的红色字体“第1通道……”显示到每张图的上面,如“曲线图(16006)-第1通道”。
5、 我之前发过一个读取数据的帖子,有高手的回复,可以参考:http://bbs.csdn.net/topics/392131992
呵呵,比较复杂,愿以200分奉上,可能是我级别低,最多只能给100分,可以再发个帖子补上。
...全文
1121 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bill.NET 2021-03-02
  • 打赏
  • 举报
回复
line方法语句没有错误,怎么还显示无效的属性赋值和错误的参数号?
Bill.NET 2021-03-02
  • 打赏
  • 举报
回复
不使用TXT文档,直接读取数据库数据,绘制动态曲线可以实现吗?
tanta 2017-04-14
  • 打赏
  • 举报
回复
这是典型的外包么。
赵4老师 2017-03-29
  • 打赏
  • 举报
回复
引用 8 楼 bakw 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 bakw 的回复:] 搞搞要花一天,最近忙死了,没空。。。
原创作者竟然是大神你呀![/quote] 赵老师的IQ卡该充值了[/quote]
笨狗先飞 2017-03-29
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 bakw 的回复:] 搞搞要花一天,最近忙死了,没空。。。
原创作者竟然是大神你呀![/quote] 赵老师的IQ卡该充值了
赵4老师 2017-03-28
  • 打赏
  • 举报
回复
我最近不忙,给钱就做。 支付宝:zhao4zhong1@163.com
赵4老师 2017-03-28
  • 打赏
  • 举报
回复
引用 5 楼 bakw 的回复:
搞搞要花一天,最近忙死了,没空。。。
原创作者竟然是大神你呀!
笨狗先飞 2017-03-25
  • 打赏
  • 举报
回复
搞搞要花一天,最近忙死了,没空。。。
ajunajun 2017-03-25
  • 打赏
  • 举报
回复
谁能帮帮忙啊????
ajunajun 2017-03-24
  • 打赏
  • 举报
回复
这是别人写的代码,单独运行没问题,新建一个vb工程调用模块也没问题,可添加到我的程序里就是画不出图来。谁能帮忙按照帖子的需求改改,能读取分钟值、小时值和秒值,多加点注释的语句。我自己改了一天也没改好。

Private Sub Command1_Click()
               Dim PlotDataFilename As String
               PlotDataFilename = "D:\kk\abc.txt"
               Call PlotTodayDataCurve(PlotDataFilename)
End Sub

Private Sub Form_Load()
Pict.DrawWidth = 1
Me.Top = 0
Me.Left = 0
Me.Width = Screen.Width
Me.Height = Screen.Height - 500
Pict.Top = 200
Pict.Left = 200
Pict.Width = Me.Width - 500
Pict.Height = Me.Height - 1300
Cls
End Sub

Public Function PlotTodayDataCurve(sFile As String)

PlotTodayCurveForm.Pict.Cls

Dim xx1(1440) As String
Dim xx2 As String
'Dim sFile As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim shujuchd As Integer
i = 0
xx2 = ""
PlotTodayCurveForm.Print sFile
Open sFile For Input As #33
 Do While Not EOF(33)
    i = i + 1
    xx1(i) = ""
  Input #33, xx1(i)
  xx2 = xx2 + xx1(i)
 Loop
Close 33#
 shujuchd = i


'测试数据通道数
Dim length1 As Integer
Dim length2 As Integer
length2 = 1
length1 = Len(xx1(1))
For i = 1 To length1
If Mid$(xx1(1), i, 1) = " " Then
length2 = length2 + 1
End If
Next i
Dim xx3(1440, 6) As String
Dim xx4(1440, 6) As Double
Dim xx31 As Integer
Dim xx32 As Integer
xx37 = 0
j = 1
For i = 1 To shujuchd
   
        xx31 = Len(xx1(i))
        For k = 1 To xx31
            If k = xx31 Then
               xx3(i, j) = Mid$(xx1(i), xx37 + 1, k - xx37)
               GoTo loop1
            End If
            If Mid$(xx1(i), k, 1) = " " Then
               xx3(i, j) = Mid$(xx1(i), xx37 + 1, k - xx37 - 1)
               xx37 = k
               j = j + 1
            End If
        Next k      
loop1:
 xx37 = 0
        j = 1
Next i

Dim xmax(6) As Double
Dim xmin(6) As Double
For i = 1 To length2
       For k = 1 To shujuchd
            If xx3(k, i) <> "NULL" Then
               xmax(i) = Val(xx3(k, i))
               xmin(i) = Val(xx3(k, i))
        GoTo loop6:
        End If
        Next k
loop6:
    For j = 1 To shujuchd
        If xx3(j, i) = "NULL" Then
           xx4(j, i) = 9999
           Else
           xx4(j, i) = Val(xx3(j, i))
        End If
       ' If j = 1 Then
       '    xmax(i) = xx4(j, i)
       '    xmin(i) = xx4(j, i)
       ' End If
        If xx4(j, i) = 9999 Then
        GoTo loop2:
        End If
        If xmax(i) < xx4(j, i) Then   '求最大值
           xmax(i) = xx4(j, i)
        End If
        If xmin(i) > xx4(j, i) Then   '求最小值
           xmin(i) = xx4(j, i)
        End If        
loop2:
    Next j
Next i        
'***************绘图***************************************
h2 = 0
i = 0
j = 1
k = 0
           h1 = (PlotTodayCurveForm.Pict.Height - length2 * 120 - 350) / (length2 * 11)
           While i < length2
               h3 = h2 + i * 100 + 350
               PlotTodayCurveForm.Pict.CurrentX = 100
               PlotTodayCurveForm.Pict.CurrentY = h2 + i * 100 + 350
               PlotTodayCurveForm.Pict.ForeColor = RGB(0, 0, 255)
               PlotTodayCurveForm.Pict.Print Format(xmax(i + 1), "@@@@@@@@@") '打印最大值
               PlotTodayCurveForm.Pict.CurrentX = 100
               PlotTodayCurveForm.Pict.CurrentY = h2 + i * 100 + 350 + length2 * h1
               PlotTodayCurveForm.Pict.ForeColor = RGB(255, 155, 0)
               PlotTodayCurveForm.Pict.Print "第" + Str(i + 1) + " 通道"     '打印通道数
               While j < 12
                      '画横线
                   PlotTodayCurveForm.Pict.Line (1100, h2 + i * 100 + 350)-(PlotTodayCurveForm.Pict.Width - 300, h2 + i * 100 + 350), RGB(0, 230, 0)
                   j = j + 1
                   h2 = h2 + h1
               Wend
               PlotTodayCurveForm.Pict.CurrentX = 100
               PlotTodayCurveForm.Pict.CurrentY = h2 - 1.5 * h1 + i * 100 + 350
               PlotTodayCurveForm.Pict.ForeColor = RGB(0, 0, 255)
               PlotTodayCurveForm.Pict.Print Format(xmin(i + 1), "@@@@@@@@@") '打印最小值
               While k < Int(shujuchd / 60) + 1  '画竖线
                   PlotTodayCurveForm.Pict.Line ((PlotTodayCurveForm.Pict.Width - 1400) / Int(shujuchd / 60) * k + 1100, h3)-((PlotTodayCurveForm.Pict.Width - 1400) / Int(shujuchd / 60) * k + 1100, h2 + i * 100 + 350 - h1), RGB(0, 200, 200)
                   hh3 = (h2 + i * 100 + 350 - h1) - h3
                   PlotTodayCurveForm.Pict.CurrentX = (PlotTodayCurveForm.Pict.Width - 1400) / Int(shujuchd / 60) * k + 950
                   PlotTodayCurveForm.Pict.ForeColor = RGB(0, 0, 255)
                   PlotTodayCurveForm.Pict.Print k   '打印小时数
                   k = k + 1
               Wend
                             
               '画图
               j31 = shougeshu + 1
               HangShu2 = j1
               j = 1
               k = 0
               i = i + 1
           Wend
Dim xmaxmin(6) As Double
Dim xxa As Double
Dim xmaxmin1(6) As Double
xxa = hh3
For i = 1 To length2
    xmaxmin(i) = xmax(i) - xmin(i)
    If xmaxmin(i) = 0 Then
    xmaxmin1(i) = 0
    Else
    xmaxmin1(i) = xxa / xmaxmin(i)
    End If
    For j = 1 To shujuchd
    If j = shujuchd Then
    GoTo loop5
    End If
    
    If xx4(j, i) = 9999 Or xx4(j + 1, i) = 9999 Then
    GoTo loop5:
    End If
    '数据画线
    PlotTodayCurveForm.Pict.DrawWidth = 2
       PlotTodayCurveForm.Pict.Line (1100 + (PlotTodayCurveForm.Pict.Width - 1400) / shujuchd * (j - 1), xmaxmin1(i) * (xmax(i) - xx4(j, i)) + (i - 1) * (xxa + 100 + h1) + 350)-(1100 + (PlotTodayCurveForm.Pict.Width - 1400) / shujuchd * j, xmaxmin1(i) * (xmax(i) - xx4(j + 1, i)) + (i - 1) * (xxa + 100 + h1) + 350), RGB(250, 0, 0)
    PlotTodayCurveForm.Pict.DrawWidth = 1
loop5:
   Next j
Next i

'***************************************************************

End Function

ajunajun 2017-03-24
  • 打赏
  • 举报
回复
真的是水平不行,实在写不出来。
Tiger_Zhao 2017-03-24
  • 打赏
  • 举报
回复
自己什么都没写。
直接出钱找人做。

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧