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