Graph控件应用
在工程项目中,经常会遇到显示图表、曲线和波形的情况,Labwindows/CVI提供了功能强大的图表控件,可以方便的实现数据的图形化展示,增强了用户界面的表达能力,极大方便了用户对上位机软件开发。
Labwindows/CVI中的图表控件不单功能丰富,最主要是性能强大,对实时性要求高的场合使用毫无压力。系统提供的图表控件有Graph、StripChart和DigitalGraph三种。本节介绍Graph控件的使用。
Graph的绘图功能
Graph控件可以使用不同类型的数据,绘制多种类型的图表。下面列举出了绘图功能函数如下:
函数名称 | 功能说明 |
---|---|
PlotX | 沿Y轴坐标绘制x轴数组的曲线图 |
PlotY | 沿Y轴坐标绘制x轴数组的曲线图 |
PlotXY | 绘制x、y轴数组的曲线 |
PlotBitmap | 将图像文件显示到Graph控件中 |
PlotIntensity | 绘制颜色强度图形 |
PlotLine | 绘制直线 |
PlotAre | 绘制圆弧 |
PlotOval | 绘制椭圆 |
PlotPoint | 绘制点 |
PlotPolygon | 绘制多角形 |
PlotRetangle | 绘制矩形 |
PlotScaledIntensity | 绘制比例变换颜色强度图形 |
PlotText | 绘制文字 |
PlotWaveform | 绘制波形 |
DeleteGraphPlot | 删除Graph控件中图形 |
RefreshGraph | 更新Graph 控件 |
SetPlotAttribute | 设置Graph控件属性 |
GetPlotAttribute | 读取Graph控件属性 |
常用函数介绍
这些函数中的参数含义大同小异,来看几个常用的函数。
1.PlotX函数:沿着y轴坐标绘制x轴数组的曲线图。
函数原型:
int PlotX (int Panel_Handle, int Control_ID, void *X_Array, size_t Number_of_Points, int X_Data_Type, int Plot_Style, int Point_Style, int Line_Style, int Point_Frequency, int Color);
- Panel_Handle:控件所在面板句柄。
- Control_ID:控件常量名。
- X_Array:沿x轴绘制数据的数组变量。
- Number_of_Points:绘制的数据点数。
- X_Data_Type:数据类型。
- Plot_Style:绘制图表的形式。
- Point_Style:点的形状。
- Line_Style:线的形状。
- Point_Frequency:指定点间隔。
- Color:曲线颜色。
2.PlotXY函数:绘制数组x相对于另一数组y的曲线图。
函数原型:
int PlotXY (int Panel_Handle, int Control_ID, void *X_Array, void *Y_Array, size_t Number_of_Points, int X_Data_Type, int Y_Data_Type, int Plot_Style, int Point_Style, int Line_Style, int Point_Frequency, int Color);
- X_Array:沿着x轴绘图的数组变量。
- Y_Array:沿着y轴绘图的数组变量。
- X_Data_Type:x轴数据类型。
- Y_Data_Type:y轴数据类型。
3.DeleteGraphPlot 函数:删除Graph控件中的所有图形。
函数原型:
int DeleteGraphPlot (int panelHandle, int controlID, int plotHandle, int refresh);
- panelHandle:控件所在面板句柄。
- controlID:控件常量名称。
- plotHandle:绘图曲线句柄,设置为-1则说明删除所有绘图。
- refresh:选择何时刷新Graph控件,可选择:VAL_DELAYED_DRAW、VAL_IMMEDIATE_DRAW或VAL_NO_DRAW。
4.RefreshGraph函数:刷新图表。
函数原型:
int RefreshGraph (int panelHandle, int controlID);
立即重新绘制绘图区。
应用实例
本实例使用上面介绍的绘图函数,展示Graph的绘图效果。软件运行界面如下:
image.png
虽然是入门,但码这些个代码还是很费时间的,喜欢就点个小红心,鼓励一下!
全部代码如下:
#include <ansi_c.h>
#include <advanlys.h>
#include <cvirte.h>
#include <userint.h>
#include "GraphDemo.h"
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
static int panelHandle;
float plotData[50]; //存储图形数据
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "GraphDemo.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK panelCB (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK btnExit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK btnPlotX (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double sin[1024];
switch (event)
{
case EVENT_COMMIT:
//生成正弦波数据
SinePattern(1024,10.0,0.0,1.0,sin);
//删除图形
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotX(panelHandle,PANEL_GRAPH,sin,1024,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);
break;
}
return 0;
}
int CVICALLBACK btnPlotY (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ double sin[1024];
switch (event)
{
case EVENT_COMMIT:
SinePattern(1024,10.0,0.0,1.0,sin);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotY(panelHandle,PANEL_GRAPH,sin,1024,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);
break;
}
return 0;
}
int CVICALLBACK btnPlotXY (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double sinx[1024];
double siny[1024];
switch (event)
{
case EVENT_COMMIT:
SinePattern(1024,10.0,0.0,1.0,sinx);
SinePattern(1024,10.0,0.0,2.0,siny);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotXY(panelHandle,PANEL_GRAPH,sinx,siny,1024,VAL_DOUBLE,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);
break;
}
return 0;
}
int CVICALLBACK btnPlotBitmap (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int i;
char filePath[MAX_PATHNAME_LEN];//图片文件路径
switch (event)
{
case EVENT_COMMIT:
i = FileSelectPopupEx ("", "*.bmp","*.wmf;*.pcx;*.bmp;*.rle;*.dib;*.ico", "Images",
VAL_LOAD_BUTTON, FALSE, FALSE, filePath);
if (i == 1)
{
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotBitmap (panel, PANEL_GRAPH, 1.0, 1.0,24.0, 24.0, filePath);
}
break;
}
return 0;
}
// ****************************************************************************
// 随机生成图形数据
// ****************************************************************************
static void GenerateSampleData (float *plotData)
{
int i = 0, factor = 50;
double rnd = 0;
for (i = 0; i < 50; i++)
{
rnd = (double)rand() / RAND_MAX;
plotData[i] = (float)rnd * factor;
}
}
int CVICALLBACK btnPlotIntensity (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int i;
ColorMapEntry colors[30];
int factor = 50;
switch (event)
{
case EVENT_COMMIT:
for (i = 1; i <= 30; i++)
{
colors[i-1].color = MakeColor (rand() % 255, rand() % 255,rand() % 255);
colors[i-1].dataValue.valFloat = i * factor / (30 + 1);
}
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotIntensity (panel, PANEL_GRAPH, plotData,
(int)sqrt (50),(int)sqrt (50),
VAL_FLOAT,colors,VAL_BLACK, 30, TRUE, TRUE);
break;
}
return 0;
}
int CVICALLBACK btnPlotLine (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotLine (panel, PANEL_GRAPH, (double)plotData[0], (double)plotData[1],
(double)plotData[2],(double)plotData[3], VAL_BLUE);
break;
}
return 0;
}
int CVICALLBACK btnPlotAre (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotArc (panel, PANEL_GRAPH, -100.0,100.0,100.0,-100.0, 450, 2700,VAL_RED, VAL_GREEN);//3600代表一圈
break;
}
return 0;
}
int CVICALLBACK btnPlotOval (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotOval (panel, PANEL_GRAPH, (double)plotData[0],(double)plotData[1],
(double)plotData[2],(double)plotData[3], VAL_RED, VAL_GREEN);
break;
}
return 0;
}
int CVICALLBACK btnPlotPoint (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotPoint (panel, PANEL_GRAPH, (double)plotData[0],(double)plotData[1], VAL_DOTTED_SOLID_SQUARE, VAL_YELLOW);
break;
}
return 0;
}
int CVICALLBACK btnPlotPolygon (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotPolygon (panel, PANEL_GRAPH, plotData, plotData + 5, 5, VAL_FLOAT, VAL_FLOAT, VAL_YELLOW, VAL_GREEN);
break;
}
return 0;
}
int CVICALLBACK btnPlotRetangle (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotRectangle (panel, PANEL_GRAPH, (double)plotData[0],(double)plotData[1],
(double)plotData[2],(double)plotData[3], VAL_YELLOW, VAL_GREEN);
break;
}
return 0;
}
int CVICALLBACK btnPlotScaledIntensity (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int i;
ColorMapEntry colors[30];
int factor = 50;
switch (event)
{
case EVENT_COMMIT:
for (i = 1; i <= 30; i++)
{
colors[i-1].color = MakeColor (rand() % 255, rand() % 255,rand() % 255);
colors[i-1].dataValue.valFloat = i * factor / (30 + 1);
}
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotScaledIntensity (panel, PANEL_GRAPH, plotData,(int)sqrt (50),(int)sqrt (50), VAL_FLOAT,
1.0, 0.0, 1.0, 0.0, colors,VAL_BLACK, 30, TRUE, TRUE);
break;
}
return 0;
}
int CVICALLBACK btnPlotText (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GenerateSampleData(plotData);
CreateMetaFont ("test font", "Ariel", 23, 1, 1, 0, 0);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotText (panel, PANEL_GRAPH, (double)plotData[0],(double)plotData[1],
"你好 \nLabwindows/CVI", "test font", VAL_BLUE, VAL_GREEN);
break;
}
return 0;
}
int CVICALLBACK btnPlotWaveform (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GenerateSampleData(plotData);
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotWaveform (panel, PANEL_GRAPH, plotData, 50,VAL_FLOAT,2.0, 50.0, 40.0, 0.5,
VAL_THIN_LINE, VAL_SOLID_SQUARE, VAL_SOLID, 5, VAL_GREEN);
break;
}
return 0;
}
int CVICALLBACK btnDeleteGraphPlot (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
break;
}
return 0;
}
int CVICALLBACK btnRefreshGraph (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
RefreshGraph(panelHandle,PANEL_GRAPH);
break;
}
return 0;
}
各种图形的效果图:
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png