推薦一個可視化控件——ProEssentials

可視化是一個WSN後臺系統的一個重要方面,可視化效果直接影響着WSN的使用和分析。但是,大家都知道,好的可視化效果需要巨大的編程工作量。這裏向大家介紹一種很好的可視化編程控件——ProEssentials,它提供了2D3D數據的非常方便的可視化編程接口,它可以使你的可視化效果也堪比專業軟件,希望下面的一些介紹能對大家有所啓發,同時,我們開發的SNAMP軟件中也使用了該控件,希望該貼能對我們的用戶也有所幫助。

1 ProEssentials v5簡介:

ProEssentials v5是應用於windows 服務器端和客戶端開發的一系列圖表組件,它是對繪製圖表以及圖表分析功能所需要的數據和方法的簡單封裝。可以提供Winforms、Webforms、ActiveX、VCL和DLL五種界面。它的圖表類型很多,包括:一般圖表、科學圖表、
3維圖表、極座標圖表、餅狀圖表,幾乎覆蓋了所有常見的圖表類型。我們可以很方便的調用ProEssentials v5的函數庫,添加繪製圖表的功能,並可以對圖表進行分析,如:迴歸,求最大值,擬合曲線等。我們還可以很方便的將圖表文件的數據文件進行保存,或者導出我們希望格式的圖片,如bmp、jpg、png。注:一般圖表與科學圖表之間的區別在於,一般圖表僅提供一維座標數據繪圖,而另一維座標數據是等間距的。科學圖表提供二維座標數據,繪製任意的散點數據。

2 具體應用方法:
[separator]
1)無論開發的是OCX的應用程序、DLL的應用程序還是VCL的應用程序,首先要做的就是根據開發環境的操作系統類型,拷貝PEGRP32C.DLL到相應的在本地硬盤系統盤中去。如果是win95或者win98操作系統,拷貝PEGRP32C.DLL到System目錄下;如果是win2000操作系統,拷貝PEGRP32C.DLL到System32目錄下。PEGRAPHS.HLP文件是可選的

2)工程裏面添加頭文件Pegrpapi.h。

選擇需要調用的函數,完成圖表的繪製功能。在此簡介,ProEssentials v5函數和變量的命名規則。以PEP_爲前綴的變量類型如下:

PEP_b Boolean
(4 bytes)

PEP_n Integer (4 bytes)

PEP_dw Double Word (4 bytes)

PEP_sz Null Terminated array of characters.

PEP_f Single (4 bytes) or Double (8 bytes) floating point.

PEP_na Array of Integer (4 bytes)

PEP_dwa Array of Double Word (4 bytes)

PEP_sza Array of Null Terminated strings.

PEP_fa Array of Single (4 bytes) or Double (8 bytes) floating point.

PEP_struct Various structures

要用DLL調用來設定獲取以上變量類型的值,可以根據以上變量類型的前綴來判斷應該:

PEP_b PEnset
/ PEnget

PEP_n PEnset
/ PEnget

PEP_dw PElset
/ PElget (16 bit) PEnset / PEnget (32 bit)

PEP_sz PEszset / PEszget.

PEP_f PEvset / PEvget

PEP_na PEvset
, PEvsetcell, PEvsetcellEx / PEvget, PEvgetcell, PEvgetcellEx

PEP_dwa PEvset
, PEvsetcell, PEvsetcellEx / PEvget, PEvgetcell, PEvgetcellEx

PEP_sza PEvset
, PEvsetcell, PEvsetcellEx / PEvget, PEvgetcell, PEvgetcellEx

PEP_fa PEvset
, PEvsetcell, PEvsetcellEx / PEvget, PEvgetcell, PEvgetcellEx

PEP_struct PEvset
, / Pevget

3)選擇適當的變量,將數據賦予這些變量。

一般圖表需要給PEP_faYDATA 、PEP_szaPOINTLABELS賦值。

科學圖表和極座標圖表需要給PEP_faXDATA 、PEP_faYDATA和 PEP_faZDATA賦值。

3D的科學圖表需要給PEP_faXDATA, PEP_faYDATA, PEP_faZDATA賦值,但是3D的柱狀圖僅需要PEP_faYDATA。

餅狀圖用PEP_faXDATA 來控制“餅”的厚度,

有以下的幾個DLL函數可以爲圖表賦值:

PEvset
():一次可以全部的完成所有數據的賦值。

PEvsetEx
():一次可以完成部分數據的賦值。.

Pevsetcell():一次僅可以爲一維數據賦值。

PevsetcellEx
():一次僅可以爲一個點賦值。

因此Pevset
()是最快的賦值方法。

(4)選擇選擇圖表中線(點)顏色的方法

顏色是由PEP_dwaSUBSETCOLORS控制的,線型是由PEP_naSUBSETLINETYPES控制的,點型是由PEP_naSUBSETPOINTTYPES控制的。

以下代碼是在C
/C++中實現線型設定方法。

int nTmpStyles[3];

nTmpStyles[0] = PELT_THINSOLID;

nTmpStyles[1] = PELT_DASH;

nTmpStyles[2] = PELT_DOT;

PEvset(hPE, PEP_naSUBSETLINETYPES, nTmpStyles, 3);

注:以上代碼使用的Pevset()函數,也可以使用Pevsetcell()函數來實現線型的設定方法。代碼如下:

int nTmpStyle;

nTmpStyle = PELT_THINSOLID;

PEvsetcell(hPE, PEP_naSUBSETLINETYPES, 0, &nTmpStyle);

nTmpStyle = PELT_DASH;

PEvsetcell(hPE, PEP_naSUBSETLINETYPES, 1, &nTmpStyle);

nTmpStyle = PELT_DOT;

PEvsetcell(hPE, PEP_naSUBSETLINETYPES, 2, &nTmpStyle);

其他設定顏色和點類型的方法與以上方法類似,在此不再贅述。

3 實現結果:

繪製了一個科學圖表,帶遊標和座標顯示功能,以下函數分別實現基本圖表功能和遊標顯示功能。

void CPEView::CreateSimpleSGraph()
{
  
RECT rect;
  
  
GetClientRect( &rect );
  
  
m_hPE = PEcreate(PECONTROL_SGRAPH, WS_VISIBLE, &rect, m_hWnd, 1001);
  
  
if( m_hPE )
    
  {
    
float fY;
    
float fX;
    
    
// 設置子集數和每個子集的點數 //
    
    
PEnset(m_hPE, PEP_nSUBSETS, 4);
    
PEnset(m_hPE, PEP_nPOINTS, 12);
    
for( int s=0; s<=3; s++ )
    {
      
for( int p=0; p<=11; p++ )
      {
        
fX = ((float) (p+1)) * 100.0F;
        
PEvsetcellEx (m_hPE, PEP_faXDATA, s, p, &fX);
        
fY = ((float) (p+1) * 1.0F) + GetRandom(1, 250);
        
PEvsetcellEx (m_hPE, PEP_faYDATA, s, p, &fY);
      }
    }
    
    
// 設置陰影
    
    
PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS);
    
    
PEszset(m_hPE, PEP_szMAINTITLE, "Example Data");
    
    
PEszset(m_hPE, PEP_szSUBTITLE, "");
// no subtitle
    
    
PEszset(m_hPE, PEP_szYAXISLABEL, "Units Sold");
    
    
PEszset(m_hPE, PEP_szXAXISLABEL, "Month");
    
    
PEnset(m_hPE, PEP_bFOCALRECT, FALSE);
    
    
PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE);
    
    
PEnset(m_hPE, PEP_bCACHEBMP, TRUE);
    
    
PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_POINTSPLUSSPLINE);
    
    
PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_NONE);
    
    
PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_HORZANDVERT);
    
    
PEnset(m_hPE, PEP_nZOOMSTYLE, PEZS_RO2_NOT);
    
    
// 子集的標識
    
    
PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 0, "Texas" );
    
PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 1, "Florida" );
    
PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 2, "Washington" );
    
PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 3, "California" );
    
    
// 子集點的顏色s
    
DWORD dwArray[4] = { RGB(198,0,0), RGB( 0, 198, 198 ), RGB( 198,198,0 ), RGB( 0,198,0 ) };
    
PEvsetEx( m_hPE, PEP_dwaSUBSETCOLORS, 0, 4, dwArray, 0 );
    
    
// 子集點的線型
    
int nLineTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID };
    
PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, 4);
    
    
// 子集點的類型
    
int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID };
    
PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, 4);
    
    
// Version 4.0 功能 //
    
PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE);
    
PEnset(m_hPE, PEP_bSIMPLEPOINTLEGEND, TRUE);
    
PEnset(m_hPE, PEP_bSIMPLELINELEGEND, TRUE);
    
PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE);
    
PEnset(m_hPE, PEP_nMULTIAXISSTYLE, PEMAS_SEPARATE_AXES);
    
    
// 設置其他屬性 //
    
    
PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE);
    
PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_NO_BORDER);
    
PEnset(m_hPE, PEP_nGRADIENTBARS, 8);
    
PEnset(m_hPE, PEP_nTEXTSHADOWS, PETS_BOLD_TEXT);
    
PEnset(m_hPE, PEP_bMAINTITLEBOLD, TRUE);
    
PEnset(m_hPE, PEP_bSUBTITLEBOLD, TRUE);
    
PEnset(m_hPE, PEP_bLABELBOLD, TRUE);
    
PEnset(m_hPE, PEP_bLINESHADOWS, TRUE);
    
PEnset(m_hPE, PEP_nFONTSIZE, PEFS_LARGE);
    
PEnset(m_hPE, PEP_bSCROLLINGHORZZOOM, TRUE);
  }
}

void CPEView::CreateDataCursor()
{
  
CreateSimpleSGraph();
  
  
// 創建遊標 //
  
PEnset(m_hPE, PEP_nCURSORMODE, PECM_DATACROSS);
  
  
// 可以方便的查看數據點//
  
PEnset(m_hPE, PEP_bMARKDATAPOINTS, TRUE);
  
  
// 可以點擊數據點來移動遊標 //
  
PEnset(m_hPE, PEP_bMOUSECURSORCONTROL, TRUE);
  
PEnset(m_hPE, PEP_bALLOWDATAHOTSPOTS, TRUE);
  
  
// Cursor prompting in top left corner //
  
PEnset(m_hPE, PEP_bCURSORPROMPTTRACKING, TRUE);
  
PEnset(m_hPE, PEP_nCURSORPROMPTSTYLE, PECPS_XYVALUES);
  
PEnset(m_hPE, PEP_nCURSORPROMPTLOCATION, PECPL_TOP_RIGHT);
  
  
// 取消放大功能
  
PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_NONE);
  
  
// 其他可能的遊標模式如下:
  // PECM_NOCURSOR = 0
  // PECM_POINT = 1
  // PECM_DATACROSS = 2
  // PECM_DATASQUARE = 3
  // PECM_FLOATINGY = 4
  // PECM_FLOATINGXY = 5
  // 注意:必須重新初始化
  
else if ((m_nLastSelection == 105) && (HIWORD(wp) == PEWN_CURSORMOVE))
  {
int nSubset, nPoint;
  
float xvalue, yvalue;
  
char buffer[64];
  
nSubset = PEnget(m_hPE, PEP_nCURSORSUBSET);
  
nPoint = PEnget(m_hPE, PEP_nCURSORPOINT);
  
PEvgetcellEx(m_hPE, PEP_faXDATA, nSubset, nPoint, &xvalue);
  
PEvgetcellEx(m_hPE, PEP_faYDATA, nSubset, nPoint, &yvalue);
  
sprintf(buffer, "Cursor at %d,%d=(%.2f, %.2f)", nSubset, nPoint, xvalue, yvalue);
  
CWnd* pParent = GetParent()->GetParent();
  
if (pParent) {pParent->SetWindowText(buffer);}
  
pParent = AfxGetMainWnd();
  
if (pParent) {pParent->SetWindowText("PEWN_CURSORMOVE");}
  
return TRUE;
  
  }
  
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章