Labwindows/CVI 2019入门(7)——Graph控件使用

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 5,216评论 3 23
  • 第一章 HTML5 (2014年10月29日发布)新特性: 10个 (1)新的语义标签 (2)增强型表单 (3)视...
    fastwe阅读 979评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,160评论 1 32
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,653评论 0 17
  • 今天加入了EdwithU,晚上参加了豫籍在沪金融论坛的筹备会。 感恩有机会可以一直努力向前。 考试加油!加油!
    花园小白阅读 129评论 0 0