2.2.4.8.5 DataPlot::ExtractContourData

Description

Extract the data of contour lines in the contour plot.

Syntax

int ExtractContourData(vector& vX, vector& vY, vector<int>& vCounts, vector& vLevels)

Parameters

vX
[output] X values of the extracted contour data.
vY
[output] Y values of the extracted contour data.
vCounts
[output] the number of the extracted contour data points for each level.
vLevels
[output] the value of each level.

Return

If success, return the number of levels, otherwise return 0.

Examples

EX1

This example shows how to use this method to extract contour lines from a contour plot, and then put the data to a worksheet. Also, the function ocmath_d_polygon_area is used to calculate the area of the extracted contour lines.

// To run this example, import the data "<Origin Installation Directory>\Samples
// \Matrix Conversion and Gridding\3D XYZ.dat" first. Then set column C as Z column
// and highlight it to make a contour graph by selecting menu "Plot: Contour: XYZ Contour".
// Activate this graph.
#include <ocmath.h>  // need to include this header file for using ocmath_d_polygon_area
void DataPlot_ExtractContourData_ex1()
{
GraphLayer gl = Project.ActiveLayer();  // get the active graph
if(!gl)
{
out_str("Get no graph!");
return;
}

DataPlot dp = gl.DataPlots(0);  // get the data plot

vector vX, vY, vLevels;
vector<int> vCounts;

int nRet = dp.ExtractContourData(vX, vY, vCounts, vLevels);  // extract contour data of the plot

// if success, put contour data to worksheet
if(nRet>0)
{
WorksheetPage wp;  // create workbook
wp.Create();
Worksheet wks = wp.Layers(0);  // get worksheet
if(!wks)
{
out_str("Get no worksheet!");
return;
}

// loop all levels
for(int iLevel=0; iLevel<vLevels.GetSize(); iLevel++)
{
vector vOutputX, vOutputY;
int nSize = vCounts[iLevel];
vOutputX.SetSize(nSize);
vOutputY.SetSize(nSize);

// get specific level data
if(get_specific_level(iLevel, vX, vY, vCounts, vLevels, vOutputX, vOutputY, nSize))
{
// calculate area, use fabs function to avoid negative area
double dArea = fabs(ocmath_d_polygon_area(vOutputX, vOutputY, nSize));
// set data to worksheet
set_specific_level_to_worksheet(wks, vOutputX, vOutputY, vLevels, iLevel, dArea);
}
}
}
}

// get data of specific level from the extracted contour data
// iLevel: int, specific level
// vInputXs, vInputYs: vector, the extracted contour data
// vCounts: vector, nubmer of points in each level
// vLevels: vector, Z values of each level
// vOutputX, vOutputY: vector&, data of the specific level
// nSize: int, number of data in the specific level
bool get_specific_level(int iLevel, vector vInputXs, vector vInputYs, vector vCounts, vector vLevels, vector& vOutputX, vector& vOutputY, int nSize)
{
if(iLevel>=vLevels.GetSize() || iLevel<0)  // invalid level index, return false
{
out_str("Invalid iLevel!");
return false;
}
int nBeginIndex = 0;  // begin index of the specific level in the extracted contour data
if(iLevel != 0)  // set begin index according to the specific level
{
for(int iCount=0; iCount<iLevel; iCount++)
nBeginIndex = nBeginIndex + vCounts[iCount];
}

for(int iIndex=0; iIndex<nSize; iIndex++)  // get data of the specific level
{
vOutputX[iIndex] = vInputXs[nBeginIndex+iIndex];
vOutputY[iIndex] = vInputYs[nBeginIndex+iIndex];
}
return true;
}

// set the data of specific level to worksheet, including data points, Z values of the levels, and areas
// wks: Worksheet, data will be put to this worksheet
// vX, vY: vector, data points of specific level
// vLevels: vector, Z values of all levels
// iLevel: int, the specific level index
// dArea: double, the area of the specific level
void set_specific_level_to_worksheet(Worksheet wks, vector vX, vector vY, vector vLevels, int iLevel, double dArea)
{
// add two columns for spcific level data

bool bLabel = false;  // use for checking whether exist Z-Level & Area label
Grid grid;  // grid of the worksheet
grid.Attach(wks);
vector<string> vsLabelNames;
if(grid.GetUserDefinedLabelNames(vsLabelNames))  // get all user-defined label names
{
for(int iName=0; iName<vsLabelNames.GetSize(); iName++)
{
// if exist Z-Level or Area label
if(0 == vsLabelNames[iName].CompareNoCase("Z-Level") || 0 == vsLabelNames[iName].CompareNoCase("Area"))
{
bLabel = true;
break;
}
}
}

if(!bLabel)  // not exist Z-Level and Area label, create them
{
vector<int> vnTypes = {RCLT_UDL, RCLT_UDL+1};
grid.SetShowLabels(vnTypes);
vector<string> vsLabel = {"Z-Level", "Area"};
grid.SetUserDefinedLabelNames(vsLabel);
}

// set data to created two columns
XYRange xyDr;
xyDr.SetData(&vY, &vX);

Column colX = wks.Columns(nColX);  // X column
Column colY = wks.Columns(nColY);  // Y column
colX.SetType(OKDATAOBJ_DESIGNATION_X);  // set type to X
colX.SetExtendedLabel((string)vLevels[iLevel], RCLT_UDL);  // set Z-Level value
colX.SetExtendedLabel((string)dArea, RCLT_UDL+1);  // set area
colY.SetExtendedLabel((string)vLevels[iLevel], RCLT_UDL);  // set Z-Level value
colY.SetExtendedLabel((string)dArea, RCLT_UDL+1);  // set area
}