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
	int nColX = wks.AddCol();
	int nColY = wks.AddCol();
	
	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.Add(wks, nColX, "X");
	xyDr.Add(wks, nColY, "Y");
	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
}

Remark

See Also

Header to Include

origin.h