在Visual Basic 2010中处理液塑限试验数据的方法

时间:2022-07-11 01:51:06

在Visual Basic 2010中处理液塑限试验数据的方法

摘要:液塑限联合测定法(76g锥)的标准处理方法为绘图法,试验成果需直接从图上读取。VB 2010编程方法可自动实现计算、绘图和读图功能,计算和绘图结果准确可靠,可大大提高数据处理的质量和效率。

关键词:液塑限试验VB 2010 Graphics对象坐标转换

中图分类号:P435 文献标识码:A 文章编号:

正文:

1.引言:

液塑限试验是土工试验中的一项重要试验。根据标准规范[1][2],采用液塑限联合测定法(76g锥)时,通过绘图法求取液、塑限值。Visual Basic面向对象编程语言编程方法采用事件驱动模式,且具有强大的数据计算和制图功能,通过合理的窗体布局设计和事件代码的编写,可以实现液塑限试验数据的高效处理。

2.程序设计

Visual Basic 2010(简称VB 2010)使用.NET技术,也叫做VB 。VB 2010编程开发在Visual Studio 2010集成开发环境中进行。在编程的基本步骤为:1)分析问题,确定目标;2)进行合理的窗体设计,建立用户界面的对象,3)设置对象属性;4)为其中的部分对象编写事件代码;5)运行、调试、保存文件并生成应用程序[3]。

2.1成果计算的程序实现

在成果计算部分的窗体布局如图1所示:

图1 液塑限数据处理程序的窗体布局

规范[1][2]采用绘图法求取塑限和液限的过程,可以归纳为在双对数坐标系中两个已知坐标点确定的直线上的求取另一点的坐标值的过程。在VB 2010中,该求值过程可以通过自定义函数实现。

先在VB 2010中创建一个模块,然后在模块中定义如下函数:

Public Function line_GetX(ByVal y As Single, ByVal s1 As OriginalData, ByVal s2 As OriginalData) As Single

Try

line_GetX = (Lg(s1.WaterContent) - Lg(s2.WaterContent)) / (Lg(s1.DropDepth) - _ Lg(s2.DropDepth)) * (Lg(y) - Lg(s1.DropDepth)) + Lg(s1.WaterContent)

Return CSng(10 ^ line_GetX)

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

End Function

函数line_GetX()返回双对数坐标系中两个数据点(值存储在变量s1、s2中)确定的直线上,某个已知的入锥深度(变量y的值)对应的含水率值,返回值为Single类型。s1、s2为自定义结构类型OriginalData:

Public Structure OriginalData‘定义结构变量OriginalData

Dim WaterContent As Single:Dim DropDepth As Single‘为结构变量定义两个Single类型成员

Sub New(ByVal h As Single, ByVal w As Single)‘定义构造函数

WaterContent = w:DropDepth = h

End Sub

End Structure

结构变量OriginalData包含WaterContent和DropDepth两个成员,分别表示含水率和对应的入锥深度值。Lg()函数用来返回数值的常用对数值,为Single类型,其定义如下:

Public Function Lg(ByVal x As Single) As Single‘返回x的常用对数值

ReturnCSng(Log10(x))

End Function

编程时,通过在Try代码块中执行可能抛出异常的代码,在Catch代码块中处理预料到的错误,Try … Catch …. End Try 语块可以捕获运行错误[4]。这样可以避免可能导致程序突然终止的运行错误的发生。

按照事件驱动模式,成果计算代码应在图1中“成果计算”按钮的Click事件下编写。

首先,需定义三个OriginalData类型变量(s1、s2、s3)来存储试验数据。 根据OriginalData的构造函数,定义变量s1语句为:Dim s1 as new OriginalData(CSng(txt_DropDepth_min.Text), CSng(txt_WaterContent_min.Text))

该语句表示将图1中输入的第一组含水率和入锥深度值分别赋值给变量s1的成员WaterContent和DropDepth,CSng()函数用于将文本内容的String类型转换为Single类型。

计算液、塑限的代码可按如下方法进行编写:

Dim wp1 as single,wp2 as single,testErr as single,wp as single,wl10 as single, wl17 as single’定义变量

wp1= line_GetX(2,s1,s3)’计算第1、3数据点连线在2mm处的含水率;

wp2= line_GetX(2,s2,s3)’计算第2、3数据点连线在2mm处的含水率;

testErr=ABS(wp1-wp2)‘计算试验误差值;

wp=average(wp1, wp2)‘塑限等于变量wp1和wp2的平均值;

Dim s4 As New OriginalData(wp,2)‘定义一个新的OriginalData变量;

wl10= line_GetX(10, s4, s3)‘计算10mm液限值

wl17= line_GetX(17, s4, s3)’ ‘计算17mm液限值;

代码前部分首先定义了一系列变量来存储成果计算值。变量s4用来存储塑限点的含水率和入锥深度值。液、塑限值直接通过line_GetX函数求得。由液、塑限值还可计算塑性指数和液性指数,计算代码为:

Dim Ip10 as Single,Il10 as Single ‘定义两个变量,它用来存储塑性指数和液性指数(10mm液限);

Dim w0 as single =CSng(txt_waterContent_Natural.text)‘定义存储天然含水率的变量并赋值

Ip10=wl10-wp:Il10=(w0-wp)/Ip10‘计算塑性指数和液性指数

17mm液限下的塑性指数和液性指数的计算代码的编写与此类似。

根据规范[5],黏性土的状态可根据IL值划分为坚硬、硬塑、可塑、软塑和流塑。为此,可采用IF条件判断语句,以 IL值(Il10)所在取值区间为条件判据,在图1的对应文本框中显示出塑性状态。

最后将成果变量值赋值给图1右侧的文本框的Text属性,让结果显示到对应文本框中。以塑限为例:

txt_PlasticLimit.Text=Format(wp,”#0.0”)‘显示塑限值到文本框,保留一位小数

其他文本框的赋值与此类似。运行程序,输入试验数据,单击“成果计算”按钮,结果如图2所示:

图2 程序处理结果(试验数据正常时)

2.2 绘图功能的程序实现

绘图程序需实现绘制含水率与入锥深度双对数关系图。

在中,图形绘制主要基于三个步骤:1)获取一个Graphics对象;2)定义一个Brush对象,并填充图形;3)定义一个Pen对象,并绘制图形。在中绘图必须使用Graphics对象,它代表绘图的平面,可以是Form、PictureBox、内存中的Bitmap、图元文件或打印机平面[6]。Graphics对象提供绘制和填充各类图形的方法,Pen和Brush对象用来确定线条和填充区域的外观[6]。

绘图程序的窗体布局如图3所示。图中的三个按钮控件分别用来执行绘图、清除图形和图形保存操作。

图3 绘图窗体布局

2.2.1图形的绘制

绘制图形的代码在“绘图”按钮的Click事件下编写,图形绘制到图3下方的图片框控件(Name属性pic_Lg_Lg)中。按绘图步骤,创建Graphics对象的代码如下:

Dim btm As New Bitmap(pic_Lg_Lg.Width, pic_Lg_Lg.Height)’创建一个Bitmao对象作为画板,其大小与图片框相同

Usinggrph as Graphics= Graphics.FromImage(btm)‘ 创建Graphics对象,并与btm关联

grph.Clear(Color.White)‘在绘图前,清除画板内容,并用白色填充

…‘绘图代码编写

End using ‘释放Grph对象占用的资源

pic_Lg_Lg.Image = btm‘将btm上绘制的图形显示到图片框中

代码中先创建一个Bitmap类型的绘图平面btm,其大小与图片框一致。然后使用Using语句定义Graphics对象Grph。接着调用了Graphics对象的Clear方法,将画板背景设置为白色。然后使用Graphics对象的绘图方法进行图形的绘制。绘制完成后,使用End Using语句释放Grph占用的资源,最后通过将btm赋值给图片框的Image属性,将图形显示到图片框中。

在绘图过程中,直线的绘制可以使用Graphics对象的DrawLine(Pen,PointF1,PointF2)方法。其中Pen对象用来确定直线的颜色、线宽和样式,PointF1和PointF2均为PointF结构类型,分别表示直线两端点在画板坐标系中的坐标值。例如,使用DrawLine方法绘制点P_1(200,400)到点P_2(200,400)的直线的代码为:

Dim p_1 as PointF,P_2 as PointF’定义两个PointF类型的点对象P_1.和P_2坐标;

P_1.x=200:P_1.y=400: P_2.x=400:P_2.y=200;‘确定点P_2的坐标值;

Dimpen1 as New Pen(Brushes.Black,1)‘定义一个Pen对象,它的颜色为Black,宽度为1

Grph.DrawLine(pen1,P_1,P_2)‘使用pen1在Graphics对象Grph上绘制连接两点的直线

在画板中绘制双对数坐标系图形的情况如图4所示。其中画板坐标系坐标轴用X、Y表示,对数坐标系坐标轴用x、y表示。对于任意点P在两坐标系中的坐标,可分别用P(x,y)和P(X,Y)表示,以示区别。图4以P1、P2、P3点为x、y轴的定位点,并可指定定位点在画板坐标系和对数坐标系中的坐标值。

图4 在画板中绘制双对数坐标系示意图

在使用绘图方法(如DrawLine)时,点坐标值必须基于画板坐标系,所以要绘制双对数坐标系中的两已知点间的直线,需将对数坐标点的坐标值(x,y)转换为画板坐标系下的坐标值(X,Y)。在VB 2010中,这个坐标转换求值过程可定义为函数,代码如下:

Public Function fucGetLgP(ByVal Scale_max As Single, ByVal Scale_min As Single, ByVal P_start As Single,_

ByVal P_end As Single, ByVal known_XYvalue As Single) As Single

fucGetLgP = (Lg(known_XYvalue / Scale_min) * (P_end - P_start) / Lg(Scale_max / Scale_min)) + P_start

End Function

函数fucGetLgP中定义了5个参数,其中known_XYvalue为待转换点的x或y值。转换x坐标时,参数Scale_max、Scale_min分别取P1、P2点的x值,P_start、P_end分别取P1、P2点的X值;转换y坐标时,参数Scale_max、Scale_min分别取点P1、P3点的y值,P_start、P_end分别取P1、P3点的Y值。可见,只要预先制定了三个定位点在两坐标系中的坐标值,就可以对任意点P(x,y)的坐标进行转换,以图4为例,转换任意点P(x、y)的坐标时,只需编写以下两行代码:

P.X= fucGetLgP( 90 , 10 , P1.X, P2.X, x )‘转换P点的x坐标(含水率值)

P.Y= fucGetLgP(20 , 1 , P1.Y, P3.Y ,y)‘转换P点的y坐标(入锥深度值)

坐标进行转换后,就可以使用DrawLine方法绘制双对数坐标系中任意两点间的直线了。在绘制刻度线时,为了简化代码的编写过程,还可使用For…Next循环语句,以刻度线的x或y值为循环变量,将坐标转换和绘直线制的代码编写到循环体中。另外,联合使line_GetX函数和fucGetLgP函数还可以计算出数据点连线的延伸线端点和液、塑限点到坐标轴的垂直直线的端点的X、Y坐标值,以绘制对应的直线。

Graphics对象的DrawString方法可在指定的坐标点位置绘制文本内容。如要在指定位置(如P(X,Y)点)绘制指定的文本内容(如P点对应的含水率值x),代码可编写为:

Dim font1 As New Font("宋体", 10, FontStyle.Bold)‘创建一个Font对象,设置字体属性

Grph.DrawString(x ,font1,Brushes.black,P)‘在P点显示P点的x(含水率) 值

这个方法可以用来绘出坐标系标题。联合使用DrawLine方法和DrawString方法,可在绘制坐标轴刻度线的同时,指示对应的坐标刻度值。运用以上坐标转换和直线、文本绘制方法,最终绘制出的含水率与入锥深度双对数关系图如图5、图6所示:

图5带网格线绘图效果图6 去除网格线绘图效果

其中还使用了RotateTransform()方法对y轴标题进行90°旋转;使用了DrawPolygon和FillPolygon方法绘制坐标轴箭头(其中DrawPolygon方法用于绘制多边形,FillPolygon用于对多边形进行颜色填充)。实心圆点(指示数据点位置)的绘制使用了DrawEllipse和FillEllipse方法(DrawEllipse用来绘制圆形,FillEllipse用于对圆形进行颜色填充),试验数据的显示使用了前述的DrawString方法。

2.2.2图形的清除

复制前述创建Graphics对象的代码,并粘贴到图3中的“清除图形”按钮的Click事件下,然后删除绘图代码部分,在运行时单击该按钮时可清空图片框。

2.2.3图形的保存

在“保存图形”按钮(Name属性btn_SaveLg_Lg)的Click事件下编写保存图片的代码如下:

Private Sub btn_SaveLg_Lg_Click( ) Handles btn_SaveLg_lg.Click

Dim SaveFile As New SaveFileDialog‘定义一个保存文件对话框对象的新实例

SaveFile.ShowDialog()‘打开保存文件对话框,以设置文件保存路径和文件名称

Dim fs = New System.IO.FileStream(SaveFile.FileName & “.Jpeg”, IO.FileMode.Create)‘创建一个文件

pic_Lg_Lg.Image.Save(fs, Imaging.ImageFormat.Jpeg)‘保存图片框中显示的图形到文件中

fs.Close()‘关闭文件,释放资源

End Sub

这样,在完成绘图后,单击“保存图形”按钮,就可弹出保存文件对话框,将图形按.Jpeg格式进行存档。

3.结论

采用VB 2010编程方法处理液塑限试验数据时,只需输入试验数据,通过点击相应的按钮控件,就可自动完成成果计算、绘图、存图等过程。成果计算过程可以求出全部的成果值,而绘图过程可直观地显示绘图、读图过程,两者同时使用,相互印证,可大大提高数据处理过程的准确性和效率。

参考文献:

[1] GB/T 50123-1999 土工试验方法标准[S].

[2] JTG E40-2007 公路土工试验规程[S].

[3] 沈建蓉,大学VB程序设计实践教程[M].复旦大学出版社,2006.01:8-9

[4] (美)Thearon Willis ,Bran Newsome 著,吴伟敏,李周芳译.Visual Basic 2010入门经典(第6版)[M].北京:清华大学出版社,2011.11

[5]GB 50021-2001岩土工程勘察规范(2009年版)[S].

[6] (美)Rod Stephens著,徐燕华译,Visual.Basic.2008编程参考手册[M].北京:清华大学出版社,2009:561-643

上一篇:浅谈湿陷性黄土路基工程质量监理控制要点 下一篇:如何做好项目部的工程结算控制